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: | **Please do not share screenshots or settings containing sensitive information (i.e. domains, credentials, files, etc)** 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: | **Please do not share screenshots or settings containing sensitive information (i.e. domains, credentials, files, etc)** 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=` (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..json` and `l10/bundle.l10n..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=`. This will update `package.nls..json` and `l10/bundle.l10n..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 For example: Signed-off-by: Random J. Developer 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 ## 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 | 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 => { 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 { 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 { 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 { 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 { 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 { 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 { const result: string[] = []; async function pushBlock(line: number, col: number) { const block = await client.sendRequest( "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 { await _run(); } export async function runSelected(uri: Uri): Promise { await _run(true, uri); } export async function runRegion(client: BaseLanguageClient): Promise { 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, closeEmitter?: EventEmitter, taskLabel?: string, ): Promise { 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, closeEmitter?: EventEmitter, taskLabel?: string, ): Promise { 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 { 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( "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(); get onDidChangeSessions(): Event { 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(SECRET_KEY); } dispose(): void { for (const d of this._disposables) { d.dispose(); } } async getSessions(): Promise { 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 { 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 { 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 { this.secretStorage.store(session.id, session); } async removeSession(sessionId: string, silent?: boolean): Promise { 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, FileSystemProvider, TextDocumentContentProvider, SubscriptionProvider, TreeDragAndDropController { private _onDidManipulateFile: EventEmitter; private _onDidChangeFile: EventEmitter; private _onDidChangeTreeData: EventEmitter; private _onDidChange: EventEmitter; private _treeView: TreeView; private _dropEditProvider: Disposable; private model: ContentModel; private extensionUri: Uri; private mimeType: string; public dropMimeTypes: string[]; public dragMimeTypes: string[]; private uriToParentMap = new Map(); get treeView(): TreeView { return this._treeView; } constructor( model: ContentModel, extensionUri: Uri, { mimeType, treeIdentifier }: ContentNavigatorConfig, ) { this._onDidManipulateFile = new EventEmitter(); this._onDidChangeFile = new EventEmitter(); this._onDidChangeTreeData = new EventEmitter(); this._onDidChange = new EventEmitter(); 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 { 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 { const dataTransferItem = new DataTransferItem(source); dataTransfer.set(this.dragMimeTypes[0], dataTransferItem); } public async provideDocumentDropEdits( document: TextDocument, position: Position, dataTransfer: DataTransfer, token: CancellationToken, ): Promise { 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 { return this._onDidChangeFile.event; } get onDidChangeTreeData(): Event { return this._onDidChangeTreeData.event; } get onDidChange(): Event { return this._onDidChange.event; } get onDidManipulateFile(): Event { return this._onDidManipulateFile.event; } public async connect(baseUrl: string): Promise { await this.model.connect(baseUrl); this.refresh(); } public async getTreeItem(item: ContentItem): Promise { 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 { // 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 { return this.model.getChildren(item); } public watch(): Disposable { // ignore, fires for all changes... return new Disposable(() => {}); } public async stat(uri: Uri): Promise { return await this.model .getResourceByUri(uri) .then((resource): FileStat => resource.fileStat); } public async readFile(uri: Uri): Promise { return await this.model .getContentByUri(uri) .then((content) => new TextEncoder().encode(content)); } public async createFolder( item: ContentItem, folderName: string, ): Promise { 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 { const newItem = await this.model.createFile(item, fileName, buffer); if (newItem) { this.refresh(); return newItem.vscUri; } } public async renameResource( item: ContentItem, name: string, ): Promise { 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 { return this.model.saveContentToUri(uri, new TextDecoder().decode(content)); } public async deleteResource(item: ContentItem): Promise { 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 { 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 { if (!(await closeFileIfOpen(item))) { return false; } const success = await this.model.restoreResource(item); if (success) { this.refresh(); } return success; } public async emptyRecycleBin(): Promise { 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 { const success = await this.model.addFavorite(item); if (success) { this.refresh(); } return success; } public async removeFromMyFavorites(item: ContentItem): Promise { const success = await this.model.removeFavorite(item); if (success) { this.refresh(); } return success; } public async handleCreationResponse( resource: ContentItem, newUri: Uri | undefined, errorMessage: string, ): Promise { 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 { return await this.model.getParent(element); } public async delete(): Promise { throw new Error("Method not implemented."); } public rename(): void | Promise { throw new Error("Method not implemented."); } public readDirectory(): | [string, FileType][] | Thenable<[string, FileType][]> { throw new Error("Method not implemented."); } public createDirectory(): void | Thenable { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { // 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 | 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 { await this.contentAdapter.connect(baseURL); } public getAdapter() { return this.contentAdapter; } public async getChildren(item?: ContentItem): Promise { 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 { return await this.contentAdapter.getParentOfItem(item); } public async getResourceByUri(uri: Uri): Promise { return await this.contentAdapter.getItemOfUri(uri); } public async getContentByUri(uri: Uri): Promise { 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 { 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 { 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 { return await this.contentAdapter.createNewFolder(item, name); } public async renameResource( item: ContentItem, name: string, ): Promise { return await this.contentAdapter.renameItem(item, name); } public async saveContentToUri(uri: Uri, content: string): Promise { await this.contentAdapter.updateContentOfItem(uri, content); } public async getUri(item: ContentItem, readOnly: boolean): Promise { return await this.contentAdapter.getUriOfItem(item, readOnly); } public async delete(item: ContentItem): Promise { return await this.contentAdapter.deleteItem(item); } public async addFavorite(item: ContentItem): Promise { return await this.contentAdapter.addItemToFavorites(item); } public async removeFavorite(item: ContentItem): Promise { return await this.contentAdapter.removeItemFromFavorites(item); } public async moveTo( item: ContentItem, targetParentFolderUri: string, ): Promise { return await this.contentAdapter.moveItem(item, targetParentFolderUri); } public getDelegateFolder(name: string): ContentItem | undefined { return this.contentAdapter.getRootFolder(name); } public async getFileFolderPath(contentItem: ContentItem): Promise { 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 { 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 = { 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 = { 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 { 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 { 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 = {}, ) { 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.tencent.tap", tar: "application/x-tar", tcap: "application/vnd.3gpp2.tcap", tcl: "application/x-tcl", td: "application/urc-targetdesc+xml", teacher: "application/vnd.smart.teacher", tei: "application/tei+xml", teicorpus: "application/tei+xml", tex: "application/x-tex", texi: "application/x-texinfo", texinfo: "application/x-texinfo", text: "text/plain", tfi: "application/thraud+xml", tfm: "application/x-tex-tfm", tfx: "image/tiff-fx", tga: "image/x-tga", thmx: "application/vnd.ms-officetheme", tif: "image/tiff", tiff: "image/tiff", tk: "application/x-tcl", tmo: "application/vnd.tmobile-livetv", toml: "application/toml", torrent: "application/x-bittorrent", tpl: "application/vnd.groove-tool-template", tpt: "application/vnd.trid.tpt", tr: "text/troff", tra: "application/vnd.trueapp", trig: "application/trig", trm: "application/x-msterminal", ts: "video/mp2t", tsd: "application/timestamped-data", tsv: "text/tab-separated-values", ttc: "font/collection", ttf: "font/ttf", ttl: "text/turtle", ttml: "application/ttml+xml", twd: "application/vnd.simtech-mindmapper", twds: "application/vnd.simtech-mindmapper", txd: "application/vnd.genomatix.tuxedo", txf: "application/vnd.mobius.txf", txt: "text/plain", u32: "application/x-authorware-bin", u3d: "model/u3d", u8dsn: "message/global-delivery-status", u8hdr: "message/global-headers", u8mdn: "message/global-disposition-notification", u8msg: "message/global", ubj: "application/ubjson", udeb: "application/x-debian-package", ufd: "application/vnd.ufdl", ufdl: "application/vnd.ufdl", ulx: "application/x-glulx", umj: "application/vnd.umajin", unityweb: "application/vnd.unity", uo: "application/vnd.uoml+xml", uoml: "application/vnd.uoml+xml", uri: "text/uri-list", uris: "text/uri-list", urls: "text/uri-list", usda: "model/vnd.usda", usdz: "model/vnd.usdz+zip", ustar: "application/x-ustar", utz: "application/vnd.uiq.theme", uu: "text/x-uuencode", uva: "audio/vnd.dece.audio", uvd: "application/vnd.dece.data", uvf: "application/vnd.dece.data", uvg: "image/vnd.dece.graphic", uvh: "video/vnd.dece.hd", uvi: "image/vnd.dece.graphic", uvm: "video/vnd.dece.mobile", uvp: "video/vnd.dece.pd", uvs: "video/vnd.dece.sd", uvt: "application/vnd.dece.ttml+xml", uvu: "video/vnd.uvvu.mp4", uvv: "video/vnd.dece.video", uvva: "audio/vnd.dece.audio", uvvd: "application/vnd.dece.data", uvvf: "application/vnd.dece.data", uvvg: "image/vnd.dece.graphic", uvvh: "video/vnd.dece.hd", uvvi: "image/vnd.dece.graphic", uvvm: "video/vnd.dece.mobile", uvvp: "video/vnd.dece.pd", uvvs: "video/vnd.dece.sd", uvvt: "application/vnd.dece.ttml+xml", uvvu: "video/vnd.uvvu.mp4", uvvv: "video/vnd.dece.video", uvvx: "application/vnd.dece.unspecified", uvvz: "application/vnd.dece.zip", uvx: "application/vnd.dece.unspecified", uvz: "application/vnd.dece.zip", vbox: "application/x-virtualbox-vbox", "vbox-extpack": "application/x-virtualbox-vbox-extpack", vcard: "text/vcard", vcd: "application/x-cdlink", vcf: "text/x-vcard", vcg: "application/vnd.groove-vcard", vcs: "text/x-vcalendar", vcx: "application/vnd.vcx", vdi: "application/x-virtualbox-vdi", vds: "model/vnd.sap.vds", vhd: "application/x-virtualbox-vhd", vis: "application/vnd.visionary", viv: "video/vnd.vivo", vmdk: "application/x-virtualbox-vmdk", vob: "video/x-ms-vob", vor: "application/vnd.stardivision.writer", vox: "application/x-authorware-bin", vrml: "model/vrml", vsd: "application/vnd.visio", vsf: "application/vnd.vsf", vss: "application/vnd.visio", vst: "application/vnd.visio", vsw: "application/vnd.visio", vtf: "image/vnd.valve.source.texture", vtt: "text/vtt", vtu: "model/vnd.vtu", vxml: "application/voicexml+xml", w3d: "application/x-director", wad: "application/x-doom", wadl: "application/vnd.sun.wadl+xml", war: "application/java-archive", wasm: "application/wasm", wav: "audio/x-wav", wax: "audio/x-ms-wax", wbmp: "image/vnd.wap.wbmp", wbs: "application/vnd.criticaltools.wbs+xml", wbxml: "application/vnd.wap.wbxml", wcm: "application/vnd.ms-works", wdb: "application/vnd.ms-works", wdp: "image/vnd.ms-photo", weba: "audio/webm", webapp: "application/x-web-app-manifest+json", webm: "video/webm", webmanifest: "application/manifest+json", webp: "image/webp", wg: "application/vnd.pmi.widget", wgsl: "text/wgsl", wgt: "application/widget", wif: "application/watcherinfo+xml", wks: "application/vnd.ms-works", wm: "video/x-ms-wm", wma: "audio/x-ms-wma", wmd: "application/x-ms-wmd", wmf: "image/wmf", wml: "text/vnd.wap.wml", wmlc: "application/vnd.wap.wmlc", wmls: "text/vnd.wap.wmlscript", wmlsc: "application/vnd.wap.wmlscriptc", wmv: "video/x-ms-wmv", wmx: "video/x-ms-wmx", wmz: "application/x-msmetafile", woff: "font/woff", woff2: "font/woff2", wpd: "application/vnd.wordperfect", wpl: "application/vnd.ms-wpl", wps: "application/vnd.ms-works", wqd: "application/vnd.wqd", wri: "application/x-mswrite", wrl: "model/vrml", wsc: "message/vnd.wfa.wsc", wsdl: "application/wsdl+xml", wspolicy: "application/wspolicy+xml", wtb: "application/vnd.webturbo", wvx: "video/x-ms-wvx", x32: "application/x-authorware-bin", x3d: "model/x3d+xml", x3db: "model/x3d+fastinfoset", x3dbz: "model/x3d+binary", x3dv: "model/x3d-vrml", x3dvz: "model/x3d+vrml", x3dz: "model/x3d+xml", x_b: "model/vnd.parasolid.transmit.binary", x_t: "model/vnd.parasolid.transmit.text", xaml: "application/xaml+xml", xap: "application/x-silverlight-app", xar: "application/vnd.xara", xav: "application/xcap-att+xml", xbap: "application/x-ms-xbap", xbd: "application/vnd.fujixerox.docuworks.binder", xbm: "image/x-xbitmap", xca: "application/xcap-caps+xml", xcs: "application/calendar+xml", xdf: "application/xcap-diff+xml", xdm: "application/vnd.syncml.dm+xml", xdp: "application/vnd.adobe.xdp+xml", xdssc: "application/dssc+xml", xdw: "application/vnd.fujixerox.docuworks", xel: "application/xcap-el+xml", xenc: "application/xenc+xml", xer: "application/patch-ops-error+xml", xfdf: "application/xfdf", xfdl: "application/vnd.xfdl", xht: "application/xhtml+xml", xhtm: "application/vnd.pwg-xhtml-print+xml", xhtml: "application/xhtml+xml", xhvml: "application/xv+xml", xif: "image/vnd.xiff", xla: "application/vnd.ms-excel", xlam: "application/vnd.ms-excel.addin.macroenabled.12", xlc: "application/vnd.ms-excel", xlf: "application/xliff+xml", xlm: "application/vnd.ms-excel", xls: "application/vnd.ms-excel", xlsb: "application/vnd.ms-excel.sheet.binary.macroenabled.12", xlsm: "application/vnd.ms-excel.sheet.macroenabled.12", xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", xlt: "application/vnd.ms-excel", xltm: "application/vnd.ms-excel.template.macroenabled.12", xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template", xlw: "application/vnd.ms-excel", xm: "audio/xm", xml: "text/xml", xns: "application/xcap-ns+xml", xo: "application/vnd.olpc-sugar", xop: "application/xop+xml", xpi: "application/x-xpinstall", xpl: "application/xproc+xml", xpm: "image/x-xpixmap", xpr: "application/vnd.is-xpr", xps: "application/vnd.ms-xpsdocument", xpw: "application/vnd.intercon.formnet", xpx: "application/vnd.intercon.formnet", xsd: "application/xml", xsf: "application/prs.xsf+xml", xsl: "application/xslt+xml", xslt: "application/xslt+xml", xsm: "application/vnd.syncml+xml", xspf: "application/xspf+xml", xul: "application/vnd.mozilla.xul+xml", xvm: "application/xv+xml", xvml: "application/xv+xml", xwd: "image/x-xwindowdump", xyz: "chemical/x-xyz", xz: "application/x-xz", yaml: "text/yaml", yang: "application/yang", yin: "application/yin+xml", yml: "text/yaml", ymp: "text/x-suse-ymp", z1: "application/x-zmachine", z2: "application/x-zmachine", z3: "application/x-zmachine", z4: "application/x-zmachine", z5: "application/x-zmachine", z6: "application/x-zmachine", z7: "application/x-zmachine", z8: "application/x-zmachine", zaz: "application/vnd.zzazz.deck+xml", zip: "application/zip", zir: "application/vnd.zul", zirz: "application/vnd.zul", zmm: "application/vnd.handheld-entertainment+xml", }; ================================================ FILE: client/src/components/ContentNavigator/types.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { FileStat, Uri } from "vscode"; export interface ContentItem { // Data returned from service contentType?: string; creationTimeStamp: number; id: string; links: Link[]; memberCount?: number; modifiedTimeStamp: number; name: string; parentFolderUri?: string; type?: string; uri: string; // UI properties inferred from service data contextValue?: string; fileStat?: FileStat; flags?: { isInRecycleBin?: boolean; isInMyFavorites?: boolean; favoriteUri?: string; }; isReference?: boolean; permission: Permission; resourceId?: string; typeName?: string; uid?: string; vscUri?: Uri; } export interface Link { method: string; rel: string; href: string; type: string; uri: string; } export interface Permission { write: boolean; delete: boolean; addMember: boolean; } export interface FileManipulationEvent { type: "create" | "recycle" | "rename" | "delete" | "restore"; uri: Uri; newUri?: Uri; } export type RootFolderMap = { [name: string]: ContentItem }; export interface AddChildItemProperties { name?: string; contentType?: string; type?: string; } export interface ContentAdapter { addChildItem: ( childItemUri: string | undefined, parentItemUri: string | undefined, properties: AddChildItemProperties, ) => Promise; addItemToFavorites: (item: ContentItem) => Promise; connect: (baseUrl: string) => Promise; connected: () => boolean; createNewFolder: ( parentItem: ContentItem, folderName: string, ) => Promise; createNewItem: ( parentItem: ContentItem, fileName: string, buffer?: ArrayBufferLike, ) => Promise; deleteItem: (item: ContentItem) => Promise; getChildItems: (parentItem: ContentItem) => Promise; getContentOfItem: (item: ContentItem) => Promise; getContentOfUri: (uri: Uri) => Promise; getFolderPathForItem: (item: ContentItem) => Promise | string; getItemOfUri: (uri: Uri) => Promise; getParentOfItem: (item: ContentItem) => Promise; getPathOfItem?: ( item: ContentItem, folderPathOnly?: boolean, ) => Promise; getRootFolder: (name: string) => ContentItem | undefined; getRootItems: () => Promise; getUriOfItem: (item: ContentItem, readOnly: boolean) => Promise; moveItem: ( item: ContentItem, targetParentFolderUri: string, ) => Promise; recycleItem?: (item: ContentItem) => Promise<{ newUri?: Uri; oldUri?: Uri }>; removeItemFromFavorites: (item: ContentItem) => Promise; renameItem: ( item: ContentItem, newName: string, ) => Promise; restoreItem?: (item: ContentItem) => Promise; updateContentOfItem(uri: Uri, content: string): Promise; } export enum ContentSourceType { SASContent = "sasContent", SASServer = "sasServer", } export interface ContentNavigatorConfig { treeIdentifier: string; mimeType: string; sourceType: ContentSourceType; } ================================================ FILE: client/src/components/ContentNavigator/utils.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { FileType, SnippetString, Tab, TabInputNotebook, TabInputText, window, } from "vscode"; import { basename } from "path"; import { ProfileWithFileRootOptions } from "../profile"; import { DEFAULT_FILE_CONTENT_TYPE, FILE_TYPES, FOLDER_TYPE, FOLDER_TYPES, SERVER_HOME_FOLDER_TYPE, TRASH_FOLDER_TYPE, } from "./const"; import mimeTypes from "./mime-types"; import { ContentItem, Permission } from "./types"; export const isContainer = (item: ContentItem): boolean => item.fileStat.type === FileType.Directory; export const isReference = (item: ContentItem): boolean => !!item && item?.type === "reference"; export const isValidItem = (item: ContentItem): boolean => !!item && !!item.id && !!item.name && !!item.links; export const isItemInRecycleBin = (item: ContentItem): boolean => !!item && item.flags?.isInRecycleBin; export const isContentItem = (item): item is ContentItem => isValidItem(item); // A document uses uppercase letters _if_ are no words // (where word means gte 3 characters) that are lowercase. const documentUsesUppercase = (documentContent: string) => documentContent && !documentContent // Exclude anything in quotes from our calculations .replace(/('|")([^('|")]*)('|")/g, "") .match(/([a-z]{3,})\S/g); export const getFileStatement = ( contentItemName: string, documentContent: string, fileFolderPath: string, ): SnippetString => { const usesUppercase = documentUsesUppercase(documentContent); const cmd = "filename ${1:fileref} filesrvc folderpath='$1' filename='$2';\n"; return new SnippetString( (usesUppercase ? cmd.toUpperCase() : cmd) .replace("$1", fileFolderPath.replace(/'/g, "''")) .replace("$2", contentItemName.replace(/'/g, "''")), ); }; export const getFileContentType = (fileName: string) => mimeTypes[fileName.split(".").pop().toLowerCase()] || DEFAULT_FILE_CONTENT_TYPE; export const createStaticFolder = ( folderId: string, name: string, type: string, membersUri: string, membersRel: string = "members", ) => ({ id: folderId, name, type: type, uri: folderId, links: [ { method: "GET", rel: membersRel, href: membersUri, uri: membersUri, type: "GET", }, { method: "GET", rel: "self", href: folderId, uri: folderId, type: "GET", }, ], }); export const convertStaticFolderToContentItem = ( staticFolder: ReturnType, permission: Permission, ): ContentItem => { const item: ContentItem = { ...staticFolder, uid: staticFolder.id, creationTimeStamp: 0, modifiedTimeStamp: 0, permission, fileStat: { ctime: 0, mtime: 0, size: 0, type: FileType.Directory, }, }; item.typeName = staticFolder.type; return item; }; export const getEditorTabsForItem = (item: ContentItem) => { const fileUri = item.vscUri; const tabs: Tab[] = window.tabGroups.all.map((tg) => tg.tabs).flat(); return tabs.filter( (tab) => (tab.input instanceof TabInputText || tab.input instanceof TabInputNotebook) && tab.input.uri.query.includes(fileUri.query), // compare the file id ); }; export const sortedContentItems = (items: ContentItem[]) => items.sort((a, b) => { const aIsDirectory = a.fileStat?.type === FileType.Directory; const bIsDirectory = b.fileStat?.type === FileType.Directory; if (aIsDirectory && !bIsDirectory) { return -1; } else if (!aIsDirectory && bIsDirectory) { return 1; } else { return a.name.localeCompare(b.name); } }); export const homeDirectoryName = ( fileNavigationRoot: ProfileWithFileRootOptions["fileNavigationRoot"], fileNavigationCustomRootPath: ProfileWithFileRootOptions["fileNavigationCustomRootPath"], ): string => { const defaultName = "Home"; if (fileNavigationRoot !== "CUSTOM" || !fileNavigationCustomRootPath) { return defaultName; } return basename(fileNavigationCustomRootPath) || defaultName; }; export const homeDirectoryNameAndType = ( fileNavigationRoot: ProfileWithFileRootOptions["fileNavigationRoot"], fileNavigationCustomRootPath: ProfileWithFileRootOptions["fileNavigationCustomRootPath"], ): [string, string] => { const directoryName = homeDirectoryName( fileNavigationRoot, fileNavigationCustomRootPath, ); if (directoryName === "Home") { return [directoryName, SERVER_HOME_FOLDER_TYPE]; } return [directoryName, FOLDER_TYPE]; }; export const getTypeName = (item: ContentItem): string => item.contentType || item.type; export const isRootFolder = (item: ContentItem, bStrict?: boolean): boolean => { const typeName = item.typeName; if (!bStrict && isItemInRecycleBin(item) && isReference(item)) { return false; } if (FOLDER_TYPES.indexOf(typeName) >= 0) { return true; } return false; }; export enum ContextMenuAction { CreateChild = "createChild", // Create a new folder _under_ the current one Delete = "delete", // The item can be deleted Update = "update", // The item can be updated/edited/renamed Restore = "restore", // The item can be restored CopyPath = "copyPath", // The item path can be copied Empty = "empty", // Whether or not children can be deleted permanently (for the recycling bin) AddToFavorites = "addToFavorites", // Item can be added to favorites RemoveFromFavorites = "removeFromFavorites", // Item can be removed from favorites ConvertNotebookToFlow = "convertNotebookToFlow", // Allows sasnb files to be converted to flows AllowDownload = "allowDownload", // Allows downloading files / folders } export class ContextMenuProvider { constructor( protected readonly validContextMenuActions: ContextMenuAction[], protected readonly enablementOverrides: Partial< Record boolean> > = {}, ) {} public availableActions(item: ContentItem): string { if (!isValidItem(item)) { return ""; } const { write, delete: canDelete, addMember } = item.permission; const isRecycled = isItemInRecycleBin(item); const type = getTypeName(item); const menuActionEnablement = { [ContextMenuAction.CreateChild]: () => addMember && !isRecycled, [ContextMenuAction.Delete]: () => canDelete && !item.flags?.isInMyFavorites, [ContextMenuAction.Update]: () => write && !isRecycled, [ContextMenuAction.Restore]: () => write && isRecycled, [ContextMenuAction.CopyPath]: () => (addMember || write) && !isRecycled, [ContextMenuAction.Empty]: () => type === TRASH_FOLDER_TYPE && !!item?.memberCount, [ContextMenuAction.AddToFavorites]: () => !item.flags?.isInMyFavorites && item.type !== "reference" && [FOLDER_TYPE, ...FILE_TYPES].includes(type) && !isRecycled, [ContextMenuAction.RemoveFromFavorites]: () => item.flags?.isInMyFavorites, [ContextMenuAction.ConvertNotebookToFlow]: () => item?.name?.endsWith(".sasnb"), [ContextMenuAction.AllowDownload]: () => !isRootFolder(item), ...(this.enablementOverrides || {}), }; const actions = Object.keys(menuActionEnablement) .filter((key: ContextMenuAction) => this.validContextMenuActions.includes(key), ) .filter((key) => menuActionEnablement[key](item)) .map((key) => key); return actions.sort().join("-"); } } ================================================ FILE: client/src/components/ExtensionContext.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ExtensionContext, Uri } from "vscode"; let context: ExtensionContext; export function setContext(c: ExtensionContext) { context = c; } /** * Set an extension context value. */ export async function setContextValue( key: string, value: string, ): Promise { context.workspaceState.update(key, value); } /** * Get an extension context value. */ export async function getContextValue( key: string, ): Promise { return context.workspaceState.get(key); } export function getGlobalStorageUri(): Uri { return context.globalStorageUri; } export function getSecretStorage(namespace: string) { const getNamespaceData = async (): Promise | undefined> => { const storedSessionData = await context.secrets.get(namespace); if (!storedSessionData) { return; } return JSON.parse(storedSessionData); }; const setNamespaceData = async (data: Record) => { await context.secrets.store(namespace, JSON.stringify(data)); }; const get = async (key: string): Promise => { const data = await getNamespaceData(); if (!data) { return; } return data[key]; }; const store = async (key: string, value: T) => { const data = await getNamespaceData(); const newData = { ...(data || {}), [key]: value, }; await context.secrets.store(namespace, JSON.stringify(newData)); }; return { setNamespaceData, getNamespaceData, get, store }; } ================================================ FILE: client/src/components/LibraryNavigator/LibraryAdapterFactory.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import ItcLibraryAdapter from "../../connection/itc/ItcLibraryAdapter"; import RestLibraryAdapter from "../../connection/rest/RestLibraryAdapter"; import { ConnectionType } from "../profile"; import { LibraryAdapter } from "./types"; class LibraryAdapterFactory { public create(connectionType: ConnectionType): LibraryAdapter { switch (connectionType) { case ConnectionType.IOM: case ConnectionType.COM: return new ItcLibraryAdapter(); case ConnectionType.Rest: default: return new RestLibraryAdapter(); } } } export default LibraryAdapterFactory; ================================================ FILE: client/src/components/LibraryNavigator/LibraryDataProvider.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { CancellationToken, DataTransfer, DataTransferItem, Disposable, DocumentDropEdit, DocumentSelector, Event, EventEmitter, Position, ProviderResult, TextDocument, TreeDataProvider, TreeDragAndDropController, TreeItem, TreeItemCollapsibleState, TreeView, Uri, languages, window, } from "vscode"; import { Writable } from "stream"; import { registerAPI } from "../APIProvider"; import { SubscriptionProvider } from "../SubscriptionProvider"; import LibraryModel from "./LibraryModel"; import { Icons, Messages, WorkLibraryId } from "./const"; import { LibraryAdapter, LibraryItem, LibraryType, TableType } from "./types"; export const libraryItemMimeType = "application/vnd.code.tree.librarydataprovider"; const tableTextMimeType = `${libraryItemMimeType}.text`; class LibraryDataProvider implements TreeDataProvider, TreeDragAndDropController, SubscriptionProvider { private _onDidChangeTreeData = new EventEmitter(); private _treeView: TreeView; private _dropEditProvider: Disposable; public dropMimeTypes: string[] = []; public dragMimeTypes: string[] = [libraryItemMimeType, tableTextMimeType]; get onDidChangeTreeData(): Event { return this._onDidChangeTreeData.event; } get treeView(): TreeView { return this._treeView; } constructor( private readonly model: LibraryModel, private readonly extensionUri: Uri, ) { this._treeView = window.createTreeView("librarydataprovider", { treeDataProvider: this, dragAndDropController: this, canSelectMany: true, }); this._dropEditProvider = languages.registerDocumentDropEditProvider( this.selector(), this, ); registerAPI("getColumns", model.fetchColumns.bind(model)); registerAPI("getTables", model.getTables.bind(model)); registerAPI("getLibraries", model.getLibraries.bind(model)); registerAPI("getTableInfo", model.getTableInfo.bind(model)); } public getSubscriptions(): Disposable[] { return [this._treeView, this._dropEditProvider]; } public handleDrag( source: LibraryItem[], dataTransfer: DataTransfer, ): void | Thenable { const dataTransferItem = new DataTransferItem(source); dataTransfer.set(libraryItemMimeType, dataTransferItem); if (source?.[0].library) { dataTransfer.set( tableTextMimeType, new DataTransferItem(source?.[0].uid), ); } } public async provideDocumentDropEdits( _document: TextDocument, position: Position, dataTransfer: DataTransfer, token: CancellationToken, ): Promise { const dataTransferItem = dataTransfer.get(this.dragMimeTypes[1]); if (token.isCancellationRequested || !dataTransferItem) { return undefined; } return { insertText: dataTransferItem.value }; } public selector(): DocumentSelector { return { language: "sas" }; } public getTreeItem(item: LibraryItem): TreeItem | Promise { const iconPath = this.iconPathForItem(item); return { id: item.uid, iconPath: iconPath ? { light: Uri.joinPath(this.extensionUri, iconPath.light), dark: Uri.joinPath(this.extensionUri, iconPath.dark), } : undefined, label: item.name, contextValue: `${item.type}-${item.readOnly ? "readonly" : "actionable"}`, collapsibleState: item.type === LibraryType ? TreeItemCollapsibleState.Collapsed : TreeItemCollapsibleState.None, command: item.type === TableType ? { command: "SAS.viewTable", arguments: [ item, this.model.getTableResultSet(item), () => this.model.fetchColumns(item), ], title: Messages.ViewTableCommandTitle, } : undefined, }; } private iconPathForItem( item: LibraryItem, ): { light: string; dark: string } | undefined { switch (item.type) { case TableType: return Icons.DataSet; case LibraryType: if (item.id === WorkLibraryId) { return Icons.WorkLibrary; } if (item.readOnly) { return Icons.ReadOnlyLibrary; } return Icons.Library; default: return; } } public getChildren(item?: LibraryItem): ProviderResult { return this.model.getChildren(item); } public writeTableContentsToStream(stream: Writable, item: LibraryItem) { return this.model.writeTableContentsToStream(stream, item); } public async deleteTables(items: LibraryItem[]): Promise { await this.model.deleteTables(items); this._onDidChangeTreeData.fire(undefined); } public watch(): Disposable { // ignore, fires for all changes... return new Disposable(() => {}); } public useAdapter(libraryAdapter: LibraryAdapter): void { this.model.useAdapter(libraryAdapter); this._onDidChangeTreeData.fire(undefined); } public async getTableInfo(item: LibraryItem) { return await this.model.getTableInfo(item); } public async fetchColumns(item: LibraryItem) { return await this.model.fetchColumns(item); } } export default LibraryDataProvider; ================================================ FILE: client/src/components/LibraryNavigator/LibraryModel.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ProgressLocation, l10n, window } from "vscode"; import type { SortModelItem } from "ag-grid-community"; import { Writable } from "stream"; import PaginatedResultSet from "./PaginatedResultSet"; import { DefaultRecordLimit, Messages } from "./const"; import { LibraryAdapter, LibraryItem, LibraryItemType, TableData, TableQuery, TableRow, } from "./types"; const sortById = (a: LibraryItem, b: LibraryItem) => a.id.localeCompare(b.id); class LibraryModel { public constructor(protected libraryAdapter: LibraryAdapter | undefined) {} public useAdapter(adapter: LibraryAdapter): void { this.libraryAdapter = adapter; } public getTableResultSet( item: LibraryItem, ): PaginatedResultSet<{ data: TableData; error?: Error }> { return new PaginatedResultSet<{ data: TableData; error?: Error }>( async ( start: number, end: number, sortModel: SortModelItem[], query: TableQuery | undefined, ) => { await this.libraryAdapter.setup(); const limit = end - start + 1; try { return { data: await this.libraryAdapter.getRows( item, start, limit, sortModel, query, ), }; } catch (e) { return { error: e, data: { rows: [], count: 0 } }; } }, ); } public async writeTableContentsToStream( fileStream: Writable, item: LibraryItem, ) { await this.libraryAdapter.setup(); let offset = 0; const { rowCount: totalItemCount, maxNumberOfRowsToRead: limit } = await this.libraryAdapter.getTableRowCount(item); let hasWrittenHeader: boolean = false; const stringArrayToCsvString = (strings: string[]): string => `"${strings .map((item: string | number) => (item ?? "").toString().replace(/"/g, '""'), ) .join('","')}"`; await window.withProgress( { location: ProgressLocation.Notification, title: l10n.t("Saving {itemName}.", { itemName: `${item.library}.${item.name}`, }), cancellable: true, }, async (_progress, cancellationToken) => { cancellationToken.onCancellationRequested(() => { fileStream.destroy(); return; }); do { const data = await this.libraryAdapter.getRowsAsCSV( item, offset, limit, ); const headers = data.rows.shift(); if (!hasWrittenHeader) { fileStream.write(stringArrayToCsvString(headers.columns)); hasWrittenHeader = true; } data.rows.forEach((item: TableRow) => fileStream.write("\n" + stringArrayToCsvString(item.cells)), ); offset += limit; } while (offset < totalItemCount); fileStream.end(); }, ); } public async fetchColumns(item: LibraryItem) { await this.libraryAdapter.setup(); let offset = 0; let items = []; let totalItemCount = Infinity; do { const data = await this.libraryAdapter.getColumns( item, offset, DefaultRecordLimit, ); items = [...items, ...data.items]; totalItemCount = data.count; offset += DefaultRecordLimit; } while (offset < totalItemCount && totalItemCount !== -1); return items; } public async deleteTables(items: LibraryItem[]) { const failures: string[] = []; for (const item of items) { try { await this.libraryAdapter.deleteTable(item); } catch { failures.push(item.uid); } } if (failures.length > 0) { throw new Error( l10n.t(Messages.TableDeletionError, { tableName: failures.join(", ") }), ); } } public async getTableInfo(item: LibraryItem) { if (this.libraryAdapter.getTableInfo) { await this.libraryAdapter.setup(); return await this.libraryAdapter.getTableInfo(item); } throw new Error("Table properties not supported for this connection type"); } public async getChildren(item?: LibraryItem): Promise { if (!this.libraryAdapter) { return []; } if (!item) { return await this.getLibraries(); } return await this.getTables(item); } public async getLibraries(): Promise { await this.libraryAdapter.setup(); let offset = 0; let items = []; let totalItemCount = Infinity; do { const data = await this.libraryAdapter.getLibraries( offset, DefaultRecordLimit, ); items = [...items, ...data.items]; totalItemCount = data.count; offset += DefaultRecordLimit; } while (offset < totalItemCount && totalItemCount !== -1); items.sort(sortById); return this.processItems(items, "library", undefined); } public async getTables(item: LibraryItem): Promise { await this.libraryAdapter.setup(); let offset = 0; let items = []; let totalItemCount = Infinity; do { const data = await this.libraryAdapter.getTables( item, offset, DefaultRecordLimit, ); items = [...items, ...data.items]; totalItemCount = data.count; offset += DefaultRecordLimit; } while (offset < totalItemCount && totalItemCount !== -1); return this.processItems(items, "table", item); } private processItems( items: LibraryItem[], type: LibraryItemType, library: LibraryItem | undefined, ): LibraryItem[] { return items .map( (libraryItem: LibraryItem): LibraryItem => ({ ...libraryItem, uid: `${library?.id || ""}.${libraryItem.id}`, library: library?.id, readOnly: libraryItem.readOnly !== undefined ? libraryItem.readOnly : library?.readOnly || false, type, }), ) .sort(sortById); } } export default LibraryModel; ================================================ FILE: client/src/components/LibraryNavigator/PaginatedResultSet.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { SortModelItem } from "ag-grid-community"; import { TableQuery } from "./types"; class PaginatedResultSet { constructor( protected readonly queryForData: PaginatedResultSet["getData"], ) {} public async getData( start: number, end: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise { return await this.queryForData(start, end, sortModel, query); } } export default PaginatedResultSet; ================================================ FILE: client/src/components/LibraryNavigator/const.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; export const Messages = { TableDeletionError: l10n.t("Unable to delete table {tableName}."), TablesDeletionWarning: l10n.t( "Are you sure you want to delete the selected tables?", ), ViewTableCommandTitle: l10n.t("View SAS Table"), }; export const Icons = { DataSet: { light: "icons/light/sasDataSetLight.svg", dark: "icons/dark/sasDataSetDark.svg", }, ReadOnlyLibrary: { light: "icons/light/readOnlyLibraryLight.svg", dark: "icons/dark/readOnlyLibraryDark.svg", }, Library: { light: "icons/light/libraryLight.svg", dark: "icons/dark/libraryDark.svg", }, WorkLibrary: { light: "icons/light/workLibraryLight.svg", dark: "icons/dark/workLibraryDark.svg", }, }; export const DefaultRecordLimit = 100; export const WorkLibraryId = "WORK"; ================================================ FILE: client/src/components/LibraryNavigator/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ConfigurationChangeEvent, Disposable, ExtensionContext, Uri, commands, env, l10n, window, workspace, } from "vscode"; import { createWriteStream } from "fs"; import * as path from "path"; import { profileConfig } from "../../commands/profile"; import { Column } from "../../connection/rest/api/compute"; import DataViewer from "../../panels/DataViewer"; import TablePropertiesViewer from "../../panels/TablePropertiesViewer"; import { WebViewManager } from "../../panels/WebviewManager"; import { SubscriptionProvider } from "../SubscriptionProvider"; import { treeViewSelections } from "../utils/treeViewSelections"; import LibraryAdapterFactory from "./LibraryAdapterFactory"; import LibraryDataProvider from "./LibraryDataProvider"; import LibraryModel from "./LibraryModel"; import PaginatedResultSet from "./PaginatedResultSet"; import { Messages } from "./const"; import { LibraryAdapter, LibraryItem, TableData } from "./types"; class LibraryNavigator implements SubscriptionProvider { private libraryDataProvider: LibraryDataProvider; private extensionUri: Uri; private webviewManager: WebViewManager; constructor(context: ExtensionContext) { this.extensionUri = context.extensionUri; this.libraryDataProvider = new LibraryDataProvider( new LibraryModel(this.libraryAdapterForConnectionType()), context.extensionUri, ); this.webviewManager = new WebViewManager(); } public getSubscriptions(): Disposable[] { return [ ...this.libraryDataProvider.getSubscriptions(), commands.registerCommand( "SAS.viewTable", async ( item: LibraryItem, paginator: PaginatedResultSet<{ data: TableData; error?: Error }>, fetchColumns: () => Column[], ) => { this.webviewManager.render( new DataViewer( this.extensionUri, item.uid, paginator, fetchColumns, (columnName: string) => { this.displayTableProperties(item, true, columnName); }, ), item.uid, ); }, ), commands.registerCommand("SAS.refreshLibraries", () => this.refresh()), commands.registerCommand("SAS.deleteTable", async (item: LibraryItem) => { const selectedItems = treeViewSelections( this.libraryDataProvider.treeView, item, ); if (selectedItems.length === 0) { return; } const result = await window.showWarningMessage( l10n.t(Messages.TablesDeletionWarning), { modal: true }, "Delete", ); if (result !== "Delete") { return; } try { await this.libraryDataProvider.deleteTables(selectedItems); } catch (error) { window.showErrorMessage(error.message); } }), commands.registerCommand( "SAS.downloadTable", async (item: LibraryItem) => { let dataFilePath: string = ""; if ( env.remoteName !== undefined && workspace.workspaceFolders && workspace.workspaceFolders.length > 0 ) { // start from 'rootPath' workspace folder dataFilePath = workspace.workspaceFolders[0].uri.fsPath; } dataFilePath = path.join( dataFilePath, `${item.library}.${item.name}.csv`.toLocaleLowerCase(), ); // display save file dialog const uri = await window.showSaveDialog({ defaultUri: Uri.file(dataFilePath), }); if (!uri) { return; } const stream = createWriteStream(uri.fsPath); await this.libraryDataProvider.writeTableContentsToStream( stream, item, ); }, ), commands.registerCommand( "SAS.showTableProperties", async (item: LibraryItem) => { await this.displayTableProperties(item); }, ), commands.registerCommand("SAS.collapseAllLibraries", () => { commands.executeCommand( "workbench.actions.treeView.librarydataprovider.collapseAll", ); }), workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => { if (event.affectsConfiguration("SAS.connectionProfiles")) { this.refresh(); } }), ]; } public async refresh(): Promise { this.libraryDataProvider.useAdapter(this.libraryAdapterForConnectionType()); } private async displayTableProperties( item: LibraryItem, showPropertiesTab: boolean = false, focusedColumn?: string, ) { try { const tableInfo = await this.libraryDataProvider.getTableInfo(item); const columns = await this.libraryDataProvider.fetchColumns(item); this.webviewManager.render( new TablePropertiesViewer( this.extensionUri, item.uid, tableInfo, columns, showPropertiesTab, focusedColumn, ), `properties-${item.uid}`, true, ); } catch (error) { window.showErrorMessage( `Failed to load table properties: ${error.message}`, ); } } private libraryAdapterForConnectionType(): LibraryAdapter | undefined { const activeProfile = profileConfig.getProfileByName( profileConfig.getActiveProfile(), ); if (!activeProfile) { return; } return new LibraryAdapterFactory().create(activeProfile.connectionType); } } export default LibraryNavigator; ================================================ FILE: client/src/components/LibraryNavigator/types.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { SortModelItem } from "ag-grid-community"; import { ColumnCollection, TableInfo } from "../../connection/rest/api/compute"; export const LibraryType = "library"; export const TableType = "table"; export type LibraryItemType = "library" | "table"; export interface LibraryItem { uid: string; id: string; name: string; type: LibraryItemType; library?: string; readOnly: boolean; } export interface TableRow { cells?: string[]; columns?: string[]; } export interface TableData { rows: TableRow[]; count: number; } export interface TableQuery { filterValue: string; } export interface LibraryAdapter { connect(): Promise; deleteTable(item: LibraryItem): Promise; getColumns( item: LibraryItem, start: number, limit: number, ): Promise; getLibraries( start: number, limit: number, ): Promise<{ items: LibraryItem[]; count: number; }>; getRows( item: LibraryItem, start: number, limit: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise; getRowsAsCSV( item: LibraryItem, start: number, limit: number, ): Promise; getTableRowCount( item: LibraryItem, ): Promise<{ rowCount: number; maxNumberOfRowsToRead: number }>; getTables( item: LibraryItem, start: number, limit: number, ): Promise<{ items: LibraryItem[]; count: number; }>; getTableInfo?(item: LibraryItem): Promise; setup(): Promise; } ================================================ FILE: client/src/components/ResultPanel/ResultPanel.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Uri, ViewColumn, WebviewPanel, l10n, window } from "vscode"; import { v4 } from "uuid"; import { getContextValue, setContextValue } from "../ExtensionContext"; import { isSideResultEnabled, isSinglePanelEnabled } from "../utils/settings"; const SCRIPT_REGEX = /)<[^<]*)*<\/script>/gi; export const SAS_RESULT_PANEL = "SASResultPanel"; interface ResultPanelState { panelId: string; } interface IdentifiableWebviewPanel { webviewPanel: WebviewPanel; panelId: string; } let resultPanel: IdentifiableWebviewPanel | undefined; export const showResult = (html: string, uri?: Uri, title?: string) => { const sideResult = isSideResultEnabled(); const singlePanel = isSinglePanelEnabled(); let panelId: string; if (!title) { title = l10n.t("Result"); } if (!singlePanel || !resultPanel) { panelId = `${v4()}`; const webviewPanel = window.createWebviewPanel( SAS_RESULT_PANEL, // Identifies the type of the webview. Used internally title, // Title of the panel displayed to the user { preserveFocus: true, viewColumn: sideResult ? ViewColumn.Beside : ViewColumn.Active, }, // Editor column to show the new webview panel in. { enableScripts: true, enableFindWidget: true, }, // Webview options. ); webviewPanel.onDidDispose(() => disposePanel(panelId)); resultPanel = { webviewPanel, panelId }; } else { const editor = uri ? window.visibleTextEditors.find( (editor) => editor.document.uri.toString() === uri.toString(), ) : window.activeTextEditor; if (resultPanel.webviewPanel.title !== title) { resultPanel.webviewPanel.title = title; } panelId = resultPanel.panelId; resultPanel.webviewPanel.reveal( sideResult ? ViewColumn.Beside : editor?.viewColumn, true, ); } const panelHtml = wrapPanelHtml(html, panelId); resultPanel.webviewPanel.webview.html = panelHtml; setContextValue(resultPanel.panelId, panelHtml); }; const wrapPanelHtml = (html: string, panelId: string): string => { return ( html // Inject vscode context into our results html body .replace( "", ` `, ) ); }; export const deserializeWebviewPanel = async ( webviewPanel: WebviewPanel, state: ResultPanelState, ): Promise => { const panelHtml: string = await getContextValue(state.panelId); resultPanel = { panelId: state.panelId, webviewPanel: webviewPanel }; webviewPanel.webview.html = panelHtml; webviewPanel.onDidDispose(() => disposePanel(state.panelId)); }; export const fetchHtmlFor = async (panelId: string) => { let panelHtml: string = ""; panelHtml = await getContextValue(panelId); panelHtml = panelHtml.replace(SCRIPT_REGEX, ""); return panelHtml; }; const disposePanel = (id: string) => { resultPanel = undefined; setContextValue(id, undefined); }; ================================================ FILE: client/src/components/ResultPanel/ResultPanelSubscriptionProvider.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Disposable, Uri, commands, window, workspace } from "vscode"; import { SubscriptionProvider } from "../SubscriptionProvider"; import { fetchHtmlFor } from "./ResultPanel"; interface ResultPanelContext { webview: string; panelId: string; } export class ResultPanelSubscriptionProvider implements SubscriptionProvider { getSubscriptions(): Disposable[] { return [ commands.registerCommand( "SAS.saveHTML", async (context: ResultPanelContext) => { const panelHtml = await fetchHtmlFor(context.panelId); if (panelHtml.length === 0) { return; } const uri = await window.showSaveDialog({ defaultUri: Uri.file(`results.html`), }); if (!uri) { return; } await workspace.fs.writeFile( uri, new TextEncoder().encode(panelHtml), ); }, ), ]; } } ================================================ FILE: client/src/components/ResultPanel/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export * from "./ResultPanel"; export * from "./ResultPanelSubscriptionProvider"; ================================================ FILE: client/src/components/StatusBarItem.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { MarkdownString, StatusBarAlignment, Uri, l10n, window } from "vscode"; import { profileConfig } from "../commands/profile"; const statusBarItem = window.createStatusBarItem(StatusBarAlignment.Left); statusBarItem.command = "SAS.switchProfile"; export const getStatusBarItem = () => statusBarItem; export async function updateStatusBarItem(connected?: boolean) { const activeProfileName = profileConfig.getActiveProfile(); const activeProfile = profileConfig.getProfileByName(activeProfileName); if (!activeProfile) { resetStatusBarItem(); } else { const targetURL = profileConfig.remoteTarget(activeProfileName); const closeSessionUri = Uri.parse("command:SAS.close"); const tooltip = new MarkdownString( `#### ${l10n.t("SAS Profile")}\n\n${activeProfileName}\n\n${targetURL}${ connected ? `\n\n---\n\n[${l10n.t("Close Session")}](${closeSessionUri})` : "" }`, ); tooltip.isTrusted = true; statusBarItem.text = `${ connected ? "$(vm-active)" : "$(account)" } ${activeProfileName}`; statusBarItem.tooltip = tooltip; statusBarItem.show(); } } export function resetStatusBarItem(): void { statusBarItem.text = `$(debug-disconnect) ${l10n.t("No Profile")}`; statusBarItem.tooltip = l10n.t("No SAS Connection Profile"); statusBarItem.show(); } ================================================ FILE: client/src/components/SubscriptionProvider.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Disposable } from "vscode"; export interface SubscriptionProvider { getSubscriptions(): Disposable[]; } ================================================ FILE: client/src/components/logViewer/DiagnosticCodeActionProvider.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { CodeAction, CodeActionContext, CodeActionKind, CodeActionProvider, Command, Diagnostic, DiagnosticSeverity, ProviderResult, Range, Selection, TextDocument, l10n, } from "vscode"; import { diagnosticSource, sasDiagnostic } from "./sasDiagnostics"; export class DiagnosticCodeActionProvider implements CodeActionProvider { public static readonly providedCodeActionKinds = [CodeActionKind.QuickFix]; provideCodeActions( document: TextDocument, _range: Range | Selection, context: CodeActionContext, ): ProviderResult<(CodeAction | Command)[]> { const diagnostics = context.diagnostics.filter( (diagnostic) => diagnostic.source === diagnosticSource, ); if (diagnostics.length === 0) { return []; } return [ this.createCodeAction( document, diagnostics, sasDiagnostic.DiagnosticCommands.IgnoreCommand, ), this.createCodeAction( document, diagnostics, sasDiagnostic.DiagnosticCommands.IgnoreAllWarningCommand, ), this.createCodeAction( document, diagnostics, sasDiagnostic.DiagnosticCommands.IgnoreAllErrorCommand, ), this.createCodeAction( document, diagnostics, sasDiagnostic.DiagnosticCommands.IgnoreAllCommand, ), ]; } private createCodeAction( document: TextDocument, diagnostics: Diagnostic[], command: string, ): CodeAction { const action = new CodeAction("", CodeActionKind.QuickFix); switch (command) { case sasDiagnostic.DiagnosticCommands.IgnoreCommand: action.title = l10n.t("Ignore: current position"); action.command = { command: command, title: l10n.t("Ignore: current position"), arguments: [diagnostics, document.uri], }; break; case sasDiagnostic.DiagnosticCommands.IgnoreAllWarningCommand: action.title = l10n.t("Ignore: warning"); action.command = { command: command, title: l10n.t("Ignore: warning"), arguments: [document.uri, DiagnosticSeverity.Warning], }; break; case sasDiagnostic.DiagnosticCommands.IgnoreAllErrorCommand: action.title = l10n.t("Ignore: error"); action.command = { command: command, title: l10n.t("Ignore: error"), arguments: [document.uri, DiagnosticSeverity.Error], }; break; case sasDiagnostic.DiagnosticCommands.IgnoreAllCommand: action.title = l10n.t("Ignore: all"); action.command = { command: command, title: l10n.t("Ignore: all"), arguments: [document.uri], }; break; } return action; } } ================================================ FILE: client/src/components/logViewer/ProblemProcessor.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { LogLine } from "../../connection"; type ProblemType = "error" | "warning"; /* there are 4 raw problems below: ERROR 22-322: Syntax error, expecting one of the following: (, ;. ERROR 79-322: Expecting a ). ERROR 68-185: The function SYMPUTX is unknown, or cannot be accessed. ERROR 251-185: The subroutine CALL is unknown, or cannot be accessed. Check your spelling. Either it was not found in the path(s) of executable images, or there was incorrect or missing subroutine descriptor information. */ type RawProblem = { type: ProblemType; //"error" | "warning"; lines: string[]; problemNumber?: string; }; /* there are 2 group of location lines below: ------- - 22 79 68 ---- 251 */ type RawLocationGroup = { indicatorLine: string; problemNumberLines: string[]; }; /* all location line groups on one source code, example: 65 call call symputx('mac', quote(strip(emple))); ------- - 22 79 68 ---- 251 */ type RawLocationDesc = { sourceCodeLines: string[]; rawLocationGroups?: RawLocationGroup[]; }; // the start column for code in log may be different with which is in source file, // one case is the \t is converted to multiple spaces, so column offset is needed. // the line number is different with which is in source file as well, so line offset is needed. export type LocationOffset = { columnOffset: number; lineOffset: number; }; export type Problem = { lineNumber: number; startColumn: number; endColumn: number; message: string; type: ProblemType; }; export type ProblemLocation = { startColumn?: number; endColumn?: number; lineNumber?: number; problemNumber?: string; }; // A problem set includes encountering one or more consecutive problems (followed by other source code log behavior endpoints) // and error log lines that may exist prior to these problems for localization purposes export class ProblemProcessor { private currentSourceCodeLines: string[]; private rawLocationDescs: RawLocationDesc[]; private rawProblems: RawProblem[]; private unclaimedLocations: ProblemLocation[]; public constructor( sourceCodeLine?: string[], private legacyLocations?: ProblemLocation[], ) { this.rawLocationDescs = []; this.rawProblems = []; this.currentSourceCodeLines = []; this.unclaimedLocations = []; if (sourceCodeLine && sourceCodeLine.length > 0) { this.currentSourceCodeLines.push(...sourceCodeLine); } } public addProblemLogLine(logLine: LogLine) { this.rawProblems.push(this.createRawProblem(logLine)); } public appendProblemLogLine(logLine: LogLine) { const lastRawProblem = getLastElement(this.rawProblems); if (lastRawProblem) { lastRawProblem.lines.push(logLine.line); } } public addLocationIndicatorLogLine(logLine: LogLine) { const newRawLocationGroup: RawLocationGroup = { indicatorLine: logLine.line, problemNumberLines: [], }; const lastRawLocationDesc = getLastElement(this.rawLocationDescs); if ( lastRawLocationDesc && lastRawLocationDesc.sourceCodeLines.join("-") === this.currentSourceCodeLines.join("-") ) { lastRawLocationDesc.rawLocationGroups.push(newRawLocationGroup); return; } this.rawLocationDescs.push({ sourceCodeLines: [...this.currentSourceCodeLines], rawLocationGroups: [newRawLocationGroup], }); } public addProblemNumberLogLine(logLine: LogLine) { const lastRawLocationDesc = getLastElement(this.rawLocationDescs); if (!lastRawLocationDesc) { return; } const lastRawLocationGroup = getLastElement( lastRawLocationDesc.rawLocationGroups, ); if (!lastRawLocationGroup || lastRawLocationGroup.indicatorLine === "") { return; } lastRawLocationGroup.problemNumberLines.push(logLine.line); } public isReady() { return this.rawProblems.length > 0; } public processProblems(offset?: LocationOffset | undefined): Problem[] { if (!offset) { return []; } const problems: Problem[] = []; const generalRawProblems: RawProblem[] = this.rawProblems.filter( (rawProblem) => rawProblem.problemNumber === undefined, ); const typedRawProblems: RawProblem[] = this.rawProblems.filter( (rawProblem) => rawProblem.problemNumber !== undefined, ); // process general problems problems.push( ...this.processGeneralProblems( this.currentSourceCodeLines, generalRawProblems, offset, ), ); // process typed problems let unprocessedTypedRawProblems: RawProblem[] = []; let result: { problems: Problem[]; unprocessedRawProblems: RawProblem[]; unclaimedLocations: ProblemLocation[]; }; if (this.rawLocationDescs.length > 0 && typedRawProblems.length > 0) { const locations = processRawLocationDescs(this.rawLocationDescs, offset); result = this.processTypedProblems(locations, typedRawProblems); problems.push(...result.problems); unprocessedTypedRawProblems = [...result.unprocessedRawProblems]; this.unclaimedLocations.push(...result.unclaimedLocations); } else if (this.rawLocationDescs.length > 0) { this.unclaimedLocations.push( ...processRawLocationDescs(this.rawLocationDescs, offset), ); } else if (typedRawProblems.length > 0) { unprocessedTypedRawProblems = [...typedRawProblems]; } // ensure that all raw problems are converted to problems if ( unprocessedTypedRawProblems.length > 0 && (this.legacyLocations?.length ?? 0) > 0 ) { result = this.processTypedProblems( this.legacyLocations, unprocessedTypedRawProblems, ); problems.push(...result.problems); unprocessedTypedRawProblems = [...result.unprocessedRawProblems]; } if (unprocessedTypedRawProblems.length > 0) { problems.push( ...this.processGeneralProblems( this.currentSourceCodeLines, unprocessedTypedRawProblems, offset, ), ); } return problems; } // check if the passed line is wrapped line, or a new line start, or same as previous // for wrapped line, it is possible that the passed line is same as previous line, in this case, keep the latter. public setSourceCodeLine(newSourceCodeLine: string) { const lastSourceCodeLine = getLastElement(this.currentSourceCodeLines); if (!lastSourceCodeLine) { this.currentSourceCodeLines = [newSourceCodeLine]; return; } const isSameAsLast = newSourceCodeLine.trim() === lastSourceCodeLine.trim(); if (isSameAsLast) { return; } const isWrappedLine = isSourceCodeLineAfterLineWrapping(newSourceCodeLine); if (!isWrappedLine) { this.currentSourceCodeLines = [newSourceCodeLine]; return; } const lastCodeInfo = decomposeCodeLogLine(lastSourceCodeLine); const newCodeInfo = decomposeCodeLogLine(newSourceCodeLine); const isSameLineNumber = lastCodeInfo.lineNumber === newCodeInfo.lineNumber; const lastLine = lastCodeInfo.code.trim(); const newLine = newCodeInfo.code.trim(); const isSameCode = lastLine.startsWith(newLine) || newLine.startsWith(lastLine); if (!isSameLineNumber) { this.currentSourceCodeLines = [newSourceCodeLine]; return; } if (isSameCode) { const beginIndex = lastSourceCodeLine.indexOf(newLine[0]); this.currentSourceCodeLines.pop(); this.currentSourceCodeLines.push( lastSourceCodeLine.substring(0, beginIndex) + newLine, ); } else { this.currentSourceCodeLines.push(newSourceCodeLine); } } public getSourceCodeLines(): string[] { return this.currentSourceCodeLines; } public getUnclaimedLocations(): ProblemLocation[] { return this.unclaimedLocations; } private processGeneralProblems( sourceCodeLines: string[], rawProblems: RawProblem[], offset: LocationOffset, ): Problem[] { const { lineNumber, startColumn, endColumn } = processGeneralLocation( sourceCodeLines, offset, ); return rawProblems.map((rawProblem) => ({ lineNumber, startColumn, endColumn, message: rawProblem.lines.map((line) => line.trim()).join(" "), type: rawProblem.type, })); } /* Associate the problem message with the location, with the strategy of: Iterate over all the locations, the order of the locations in the list is in row order: First, All the locations in the first row. Then, All the locations in the second row. And so on. For the first location, read the problem messages in the order they appear until the corresponding problem is found (based on the problem number). For the second location, the search will start from the location after the location at which the last found problem message, and start from the beginning when it reaches the end of the column. Each subsequent location is searched from the location after the last location at which the problem message was found. *** If the list is traversed and no corresponding problem message is found, discard the location. *** */ private processTypedProblems( locations: ProblemLocation[], rawProblems: RawProblem[], ): { problems: Problem[]; unprocessedRawProblems: RawProblem[]; unclaimedLocations: ProblemLocation[]; } { const problems: Problem[] = []; const processedRawProblems = new Set(); const lastIndexMap = new Map(); const unclaimedLocations = []; locations.forEach((location) => { const problemNumber = location.problemNumber; const lastFoundIndex = lastIndexMap.get(problemNumber) ?? -1; let currentIndex = (lastFoundIndex + 1) % rawProblems.length; let foundIndex = undefined; let count = 0; while (count <= rawProblems.length) { if ( problemNumber !== undefined && rawProblems[currentIndex].problemNumber === problemNumber ) { foundIndex = currentIndex; break; } count++; currentIndex = (currentIndex + 1) % rawProblems.length; } if (foundIndex !== undefined) { lastIndexMap.set(problemNumber, foundIndex); processedRawProblems.add(foundIndex); const { lines, type } = rawProblems[foundIndex]; const { lineNumber, startColumn, endColumn } = location; problems.push({ lineNumber, startColumn, endColumn, message: lines.map((logLine) => logLine.trim()).join(" "), type, }); } else { unclaimedLocations.push(location); } }); const unprocessedRawProblems = rawProblems.filter( (_raw, index) => !processedRawProblems.has(index), ); return { problems, unprocessedRawProblems, unclaimedLocations }; } private createRawProblem(logLine: LogLine): RawProblem { const problemNumber = getProblemNumberFromProblemLogLine(logLine.line); const { line, type } = logLine; return { lines: [line], type: type === "error" ? "error" : "warning", problemNumber: problemNumber, }; } } // decompose code information in a line of log. The line is expected as // "229 \ttitle 'Output Dataset From PROC UNIVARIATE';" or // "232! quit;ods html5 close;" export function decomposeCodeLogLine(codeLine: string): { lineNumber: number; code: string; } | null { const capturingRegExp = /^(?\d+)\s*!?(?\s*.*)/; const match = codeLine.match(capturingRegExp); return match !== null && match.groups !== undefined ? { lineNumber: parseInt(match.groups.lineNum), code: match.groups.code, } : null; } function getLastElement(arr: T[]): T | null { const lastIndex = arr.length - 1; return lastIndex >= 0 ? arr[lastIndex] : null; } /* there are two kind of beginning log lines indicating new problem 1) problem with this kind of beginning has location indicator in one of previous log line. "22" will be extracted as problem number in below log line. "ERROR 22-322: Syntax error, expecting one of the following: ;, CANCEL, " 2) problem with this kind of beginning has no location indicator and it is located to the previous closest source code. "undefined" will be returned in below log line, which means a general problem location will be used. "WARNING: Variable POP_100 not found in data set WORK.UNIVOUT." */ function getProblemNumberFromProblemLogLine( logLine: string, ): string | undefined { const regExp = /(?<=^(warning|error)\s+)\d+(?=-\d+:\s.*)/gi; const match = logLine.match(regExp); return match?.[0] ?? undefined; } function processLocations( line: string, from: "indicator" | "problemNumber", ): ProblemLocation[] | null { switch (from) { case "indicator": return processLocationsFromIndicatorLine(line); case "problemNumber": return processLocationFromProblemNumberLine(line); } } function processLocationsFromIndicatorLine( indicatorLogLine: string, ): ProblemLocation[] | null { // example: " ---- --- --" const regExp = /[-_]+/g; const locations = Array.from(indicatorLogLine.matchAll(regExp), (match) => ({ startColumn: match.index, endColumn: match.index + match[0].length, })); return locations.length === 0 ? null : locations; } // problem number log line example: // 22 79 function processLocationFromProblemNumberLine( problemNumberLine: string, ): ProblemLocation[] | null { const regExp = /\d+/g; const locations: ProblemLocation[] = Array.from( problemNumberLine.matchAll(regExp), (match): ProblemLocation => ({ startColumn: match.index, problemNumber: match[0], }), ); return locations.length === 0 ? null : locations; } function reviseLocationsFromIndicatorLine( indicatorLogLine: string, baseLocations: ProblemLocation[], ): ProblemLocation[] { const arr = Array.from(indicatorLogLine); baseLocations.forEach((location) => { arr[location.startColumn] = "="; }); const regExp = /=[-_]*/g; const locations = Array.from(arr.join("").matchAll(regExp), (match) => ({ startColumn: match.index, endColumn: match.index + match[0].length, })); return locations.length === 0 ? null : locations; } function processRawLocationDescs( rawLocationDescs: RawLocationDesc[], offset: LocationOffset, ): ProblemLocation[] { const locations: ProblemLocation[] = []; rawLocationDescs.forEach((rawLocationDesc) => locations.push(...processRawLocationDesc(rawLocationDesc, offset)), ); return locations; } function processSourceCodeLines( sourceCodeLines: string[], columnOffset: number, ): { lineNumber?: number; columnCorrection?: number } { if (!sourceCodeLines || sourceCodeLines.length === 0) { return {}; } const lineNumber = decomposeCodeLogLine(sourceCodeLines[0]).lineNumber; // the source code log line may be separated into multiple lines, and the error occurred at the latter line, // in this case, must take account of the previous lines length to make start column correct. const columnCorrection = sourceCodeLines.reduce( (accumulator, line, index, lines) => { // it is possible the beginning and end spaces are trimmed, which makes the column correction wrong. // so in such case, 1 additional column (suppose only one space between two lines) will be considered. const isLastLineEndWithSpace = index === 0 || lines[index - 1].endsWith(" "); const isCurrentLineStartWithSpace = lines[index] .substring(columnOffset) .startsWith(" "); // excludes the length of last line const currentLineLength = lines.length - index === 1 ? 0 : line.length - columnOffset; return ( accumulator + currentLineLength + (!(isLastLineEndWithSpace || isCurrentLineStartWithSpace) ? 1 : 0) ); }, 0, ); return { lineNumber, columnCorrection }; } function processRawLocationDesc( rawLocationDesc: RawLocationDesc, offset: LocationOffset, ): ProblemLocation[] { const { lineNumber, columnCorrection } = processSourceCodeLines( rawLocationDesc.sourceCodeLines, offset.columnOffset, ); if (lineNumber === undefined || columnCorrection === undefined) { return []; } const locations: ProblemLocation[] = []; const groups = rawLocationDesc.rawLocationGroups; groups.forEach((group) => { locations.push(...processRawLocationGroup(group)); }); locations.map((location) => { location.lineNumber = lineNumber; location.startColumn = location.startColumn - offset.columnOffset + columnCorrection; location.endColumn = location.endColumn - offset.columnOffset + columnCorrection; }); return locations; } /* to handle the case below: 87 data CUSTOMERS (label="Customer data for geocoding"); 88 infile datalines dlm=#' dlm=#' dlm=#; _ _ 24 24 24 24 ERROR 24-322: Variable name is not valid. ERROR 24-2: Invalid value for the DLM option. 89 length address $ 24 city $ 24 state $ 2; adjust the item order in list make the items which have same startColumn placed continuously */ function adjustAppearanceOrder( locations: ProblemLocation[], ): ProblemLocation[] { if (locations.length < 3) { return locations; } const findAllMatched = (startColumn: number, problemNumber: string) => { const found = []; locations.map((location, index) => { if ( location && location.startColumn === startColumn && location.problemNumber === problemNumber ) { locations[index] = undefined; found.push(location); } }); return found; }; const orderedLocations: ProblemLocation[] = []; locations.forEach((location, index) => { if (!location) { return; } orderedLocations.push(location); locations[index] = undefined; const found = findAllMatched(location.startColumn, location.problemNumber); orderedLocations.push(...found); }); return orderedLocations; } function processRawLocationGroup( group: RawLocationGroup, ): ProblemLocation[] | null { if ( !group.indicatorLine || !group.problemNumberLines || group.problemNumberLines.length === 0 ) { return null; } let indicatorLocations = processLocations(group.indicatorLine, "indicator"); const problemNumberLocations = processLocations( group.problemNumberLines[0], "problemNumber", ); // to handle this case: // _____ // 1 22 if (problemNumberLocations.length > indicatorLocations.length) { indicatorLocations = reviseLocationsFromIndicatorLine( group.indicatorLine, problemNumberLocations, ); } // TODO if (problemNumberLocations.length < indicatorLocations.length) { // is it possible to have such case: // - - // 221 // is it possible to have such case, below includes two problems: // --- // 221 } const locations: ProblemLocation[] = []; group.problemNumberLines.forEach((line) => { const locationsWithProblemNumber = processLocations(line, "problemNumber"); locationsWithProblemNumber.forEach((location1) => { const found = indicatorLocations.find( (location2) => location2.startColumn === location1.startColumn, ); if (found) { locations.push({ startColumn: found.startColumn, endColumn: found.endColumn, problemNumber: location1.problemNumber, }); } }); }); return adjustAppearanceOrder(locations); } function processGeneralLocation( sourceCodeLines: string[], offset: LocationOffset, ): ProblemLocation | null { if (!sourceCodeLines || sourceCodeLines.length === 0 || !offset) { return null; } const lineNumber = decomposeCodeLogLine(sourceCodeLines[0]).lineNumber; const wholeLine = sourceCodeLines.reduce( (accumulator, line) => accumulator + line.substring(offset.columnOffset), ); const startColumn = getFirstCharacterIndex(wholeLine) - offset.columnOffset; const endColumn = startColumn + wholeLine.substring(startColumn).trim().length - 1; return { lineNumber, startColumn, endColumn }; } function getFirstCharacterIndex(logLine: string): number { if (logLine.trim() === "") { return -1; } /* below are 3 cases that source code may be presented in log lines. 8 ... 8 ! ... 12! ... */ const regExp = /(?<=^\d+\s*!?\s+)[^\s!]/; const match = logLine.match(regExp); return match === null ? -1 : match.index; } /* below are 3 cases that source code may be presented in log lines. 8 ... 8 ! ... 8! ... */ export function isSourceCodeLineAfterLineWrapping(logLine: string): boolean { return /^(?\d+)\s*!\s(?\s*.*)/.test(logLine); } ================================================ FILE: client/src/components/logViewer/index.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { DocumentSemanticTokensProvider, OutputChannel, SemanticTokensBuilder, l10n, window, } from "vscode"; import type { OnLogFn } from "../../connection"; import { useLogStore, useRunStore } from "../../store"; import { logSelectors, runSelectors } from "../../store/selectors"; import { clearLogOnExecutionStart, showLogOnExecutionFinish, showLogOnExecutionStart, } from "../utils/settings"; const { setProducedExecutionLogOutput } = useLogStore.getState(); let outputChannel: OutputChannel; let data: string[] = []; let fileName = ""; export const legend = { tokenTypes: ["error", "warning", "note"], tokenModifiers: [], }; export const LogTokensProvider: DocumentSemanticTokensProvider = { provideDocumentSemanticTokens: (document) => { if (document.getText() === "") { data = []; } const tokensBuilder = new SemanticTokensBuilder(legend); for (let i = 0; i < data.length; i++) { if (legend.tokenTypes.includes(data[i])) { tokensBuilder.push(document.lineAt(i).range, data[i]); } } return tokensBuilder.build(); }, }; /** * Handles log lines generated for the SAS session startup. * @param logs array of log lines to write. */ export const appendSessionLogFn: OnLogFn = (logLines) => { appendLogLines(logLines); }; /** * Handles log lines generated for the SAS session execution. * @param logs array of log lines to write. */ export const appendExecutionLogFn: OnLogFn = (logLines) => { appendLogLines(logLines); if (!useLogStore.getState().producedExecutionOutput) { setProducedExecutionLogOutput(true); } }; export const appendLogToken = (type: string): void => { data.push(type); }; export const setFileName = (name: string) => { fileName = name; }; const appendLogLines: OnLogFn = (logs) => { if (!outputChannel) { const name = clearLogOnExecutionStart() ? l10n.t("SAS Log: {name}", { name: fileName }) : l10n.t("SAS Log"); outputChannel = window.createOutputChannel(name, "sas-log"); } for (const line of logs) { line.line .trimEnd() .split("\n") .forEach((text) => { appendLogToken(line.type); outputChannel.appendLine(text); }); } }; useLogStore.subscribe( logSelectors.selectProducedExecutionOutput, (producedOutput, prevProducedOutput) => { if (producedOutput && !prevProducedOutput) { if (showLogOnExecutionStart()) { outputChannel?.show(true); } } }, ); useRunStore.subscribe( runSelectors.selectIsExecutingCode, (isExecuting, prevIsExecuting) => { if ( !isExecuting && prevIsExecuting && useLogStore.getState().producedExecutionOutput ) { if (showLogOnExecutionFinish()) { outputChannel?.show(true); } } else if (isExecuting && !prevIsExecuting) { setProducedExecutionLogOutput(false); if ( clearLogOnExecutionStart() && outputChannel && useRunStore.getState().isUserExecuting ) { outputChannel.dispose(); outputChannel = undefined; data = []; } } }, ); ================================================ FILE: client/src/components/logViewer/logParser.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { LogLine } from "../../connection"; import { LocationOffset, Problem, ProblemProcessor, decomposeCodeLogLine, isSourceCodeLineAfterLineWrapping, } from "./ProblemProcessor"; export function parseLog( logs: LogLine[], logStartFlag: string, ): [Problem[], string[]] { if (logs.length === 0 || logStartFlag.trim() === "") { return [[], []]; } // logs cleaning const latestLogs = getTheLatestLogs(logs, logStartFlag); const problemRelatedLogs = getProblemRelatedLogs(latestLogs); let problemProcessor: ProblemProcessor = new ProblemProcessor(); let offset: LocationOffset; const problems: Problem[] = []; const codeLines: string[] = []; problemRelatedLogs.forEach((logLine) => { if (isProblemTypeLog(logLine)) { if (isNewProblemLogLine(logLine.line)) { problemProcessor.addProblemLogLine(logLine); return; } if (isLocationIndicatorLogLine(logLine.line)) { problemProcessor.addLocationIndicatorLogLine(logLine); return; } if (isProblemNumberLogLine(logLine.line)) { problemProcessor.addProblemNumberLogLine(logLine); return; } problemProcessor.appendProblemLogLine(logLine); return; } else { codeLines.push(logLine.line); if (!isValidSourceCodeLog(logLine)) { return; } const currentSourceCodeLine = logLine.line; if (!offset) { offset = calculateLocationOffset(currentSourceCodeLine, logStartFlag); } const isWrappedLine = isSourceCodeLineAfterLineWrapping( currentSourceCodeLine, ); const previousSourceCodeLines = problemProcessor.getSourceCodeLines(); const isSameAsPrevious = areSameLines( currentSourceCodeLine, previousSourceCodeLines[previousSourceCodeLines.length - 1], ); if (problemProcessor.isReady() && !isSameAsPrevious) { problems.push(...problemProcessor.processProblems(offset)); const unclaimedLocations = problemProcessor.getUnclaimedLocations(); problemProcessor = isWrappedLine ? new ProblemProcessor(previousSourceCodeLines, unclaimedLocations) : new ProblemProcessor(undefined, unclaimedLocations); } problemProcessor.setSourceCodeLine(currentSourceCodeLine); } }); if (problemProcessor.isReady()) { problems.push(...problemProcessor.processProblems(offset)); } problemProcessor = null; return [problems, cleanCodeLines(codeLines)]; } function getTheLatestLogs(logs: LogLine[], firstCodeLine: string): LogLine[] { let beginningIndex = -1; logs.forEach((logLine, index) => { if (logLine.type !== "source") { return; } const code = decomposeCodeLogLine(logLine.line)?.code ?? null; if (code !== null && firstCodeLine === code.trim()) { beginningIndex = index; } }); return beginningIndex === -1 ? [] : logs.slice(beginningIndex); } function getProblemRelatedLogs(logs: LogLine[]): LogLine[] { return logs.filter((logLine) => { return ["error", "warning", "source"].includes(logLine.type); }); } function calculateLocationOffset( codeLogLine: string, firstCodeLine: string, ): { columnOffset: number; lineOffset: number } { const codeInfo = decomposeCodeLogLine(codeLogLine); // there may be a log kept when finishing running selected code, // the kept log will be sent out in following running code. // that log line number should not be used for calculating line offset. if (codeInfo === null || firstCodeLine !== codeInfo.code.trim()) { return { lineOffset: -1, columnOffset: -1 }; } const lineOffset = codeInfo.lineNumber; const columnOffset = codeLogLine.indexOf(firstCodeLine); return { columnOffset, lineOffset }; } function isProblemTypeLog(logLine: LogLine): boolean { return logLine.type === "error" || logLine.type === "warning"; } function isSourceTypeLog(logLine: LogLine): boolean { return logLine.type === "source"; } function isEmptyCodeLogLine(logLine: string): boolean { return /^\d+\s*$/.test(logLine); } /* there are two kind of beginning log lines indicating new problem 1) problem with this kind of beginning has location indicator in one of previous log line. "ERROR 22-322: Syntax error, expecting one of the following: ;, CANCEL, " 2) problem with this kind of beginning has no location indicator and it is located to the previous closest source code "WARNING: Variable POP_100 not found in data set WORK.UNIVOUT." */ function isNewProblemLogLine(line: string): boolean { return /^(?error|warning)(?\s*\d+-\d+)?:\s(?.*)/i.test( line, ); } /* the continuous hyphens/underscores means a location indicator. in below logs, the 2nd & 5th lines are location indicator log lines. below are part of logs: 18 call call symputx('mac', quote(strip(emple))); ------- - 22 79 68 ---- 251 */ function isLocationIndicatorLogLine(logLine: string): boolean { return /^(?\s+)(?[-_]+\s*)+$/.test(logLine); } /* the number below the continuous hyphens/underscores means a problem number. in below logs, the 3rd & 4th & 6th lines are problem number log lines. below are part of logs: 18 call call symputx('mac', quote(strip(emple))); ------- - 22 79 68 ---- 251 */ function isProblemNumberLogLine(line: string): boolean { return /^(?\s+)(?\d+\s*)+$/.test(line); } function isValidSourceCodeLog(logLine: LogLine): boolean { return isSourceTypeLog(logLine) && !isEmptyCodeLogLine(logLine.line); } function areSameLines(line1: string, line2: string) { return line1 === line2; } // keep each line number only once function cleanCodeLines(codeLines: string[]): string[] { if (codeLines.length === 0) { return codeLines; } let previousLineNumber = -1; const result = []; codeLines.forEach((line) => { const lineNumber = decomposeCodeLogLine(line)?.lineNumber ?? -1; if (lineNumber === previousLineNumber) { return; } else { previousLineNumber = lineNumber; result.push(line); } }); return result; } ================================================ FILE: client/src/components/logViewer/sasDiagnostics.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Diagnostic, DiagnosticCollection, DiagnosticSeverity, Disposable, Range, Uri, commands, languages, window, workspace, } from "vscode"; import { LogLine, OnLogFn } from "../../connection"; import { useRunStore } from "../../store"; import { runSelectors } from "../../store/selectors"; import { SASCodeDocument } from "../utils/SASCodeDocument"; import { isShowProblemsFromSASLogEnabled } from "../utils/settings"; import { DiagnosticCodeActionProvider } from "./DiagnosticCodeActionProvider"; import { Problem } from "./ProblemProcessor"; import { parseLog } from "./logParser"; export const diagnosticSource = "sas log"; let diagnosticCollection: DiagnosticCollection; enum DiagnosticCommands { IgnoreCommand = "SAS.diagnostic.ignore", IgnoreAllWarningCommand = "SAS.diagnostic.ignoreAllWarning", IgnoreAllErrorCommand = "SAS.diagnostic.ignoreAllError", IgnoreAllCommand = "SAS.diagnostic.ignoreAll", } function ignore(diagnosticsToRemove: Diagnostic[], uri: Uri): void { const diagnostics = getSasDiagnosticCollection().get(uri); const newDiagnostics = diagnostics.filter((diagnostic) => { return !diagnosticsToRemove.includes(diagnostic); }); getSasDiagnosticCollection().set(uri, newDiagnostics); } function ignoreAll(uri: Uri, severity?: DiagnosticSeverity): void { if (severity === undefined) { getSasDiagnosticCollection().delete(uri); } else { const diagnostics = getSasDiagnosticCollection().get(uri); const newDiagnostics = diagnostics.filter((diagnostic) => { return diagnostic.severity !== severity; }); getSasDiagnosticCollection().set(uri, newDiagnostics); } } function updateDiagnosticUri(oldUri: Uri, newUri: Uri): void { const diagnosticCollection = getSasDiagnosticCollection(); const diagnostics = diagnosticCollection.get(oldUri); diagnosticCollection.delete(oldUri); diagnosticCollection.set(newUri, diagnostics); } function getSasDiagnosticCollection(): DiagnosticCollection { if (diagnosticCollection === undefined) { diagnosticCollection = languages.createDiagnosticCollection("sas"); } return diagnosticCollection; } async function updateDiagnostics( logs: LogLine[], codeDoc: SASCodeDocument, ): Promise { if (!isShowProblemsFromSASLogEnabled()) { getSasDiagnosticCollection().clear(); return; } const [problems, codeLinesInLog] = parseLog( logs, codeDoc.wrappedCodeLineAt(0), ); await updateProblemLocation(problems, codeDoc, codeLinesInLog); const problemsWithValidLocation = problems.filter((problem) => { const { lineNumber, startColumn, endColumn } = problem; return lineNumber * startColumn * endColumn >= 0; }); const diagnostics = constructDiagnostics(problemsWithValidLocation); getSasDiagnosticCollection().set( Uri.parse(codeDoc.getUri()), diagnostics.length > 0 ? diagnostics : undefined, ); } async function updateProblemLocation( problems: Problem[], codeDoc: SASCodeDocument, codeLinesInLog: string[], ) { for (const problem of problems) { const { lineNumber, startColumn, endColumn } = problem; const { lineNumber: actualLineNumber, startColumn: actualStartColumn, endColumn: actualEndColumn, } = await codeDoc.getLocationInRawCode( { lineNumber, startColumn, endColumn, }, codeLinesInLog, ); problem.lineNumber = actualLineNumber; problem.startColumn = actualStartColumn; problem.endColumn = actualEndColumn; } } function constructDiagnostics(problems: Problem[]): Diagnostic[] { const diagnostics = problems.map((problem) => { const { lineNumber, startColumn, endColumn, message, type } = problem; const range = new Range(lineNumber, startColumn, lineNumber, endColumn); const diagnostic = new Diagnostic( range, message, type === "error" ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, ); diagnostic.source = diagnosticSource; return diagnostic; }); return diagnostics; } function generateLogFn( codeDoc: SASCodeDocument, originLogFn?: OnLogFn, ): OnLogFn { const uri = codeDoc.getUri(); if (uri === undefined || uri.trim() === "") { return originLogFn; } const receivedLogs = []; const additionalLogFn: OnLogFn = (logs) => { receivedLogs.push(...logs); }; const unsubscribe = useRunStore.subscribe( runSelectors.selectIsExecutingCode, (isExecuting) => { if (!isExecuting) { updateDiagnostics(receivedLogs, codeDoc); unsubscribe(); } }, ); return (logs) => { originLogFn?.(logs); additionalLogFn(logs); }; } function getSubscriptions(): Disposable[] { return [ getSasDiagnosticCollection(), commands.registerCommand(DiagnosticCommands.IgnoreCommand, ignore), commands.registerCommand( DiagnosticCommands.IgnoreAllWarningCommand, ignoreAll, ), commands.registerCommand( DiagnosticCommands.IgnoreAllErrorCommand, ignoreAll, ), commands.registerCommand(DiagnosticCommands.IgnoreAllCommand, ignoreAll), languages.registerCodeActionsProvider( "sas", new DiagnosticCodeActionProvider(), ), workspace.onDidRenameFiles((e) => { e.files.forEach((file) => updateDiagnosticUri(file.oldUri, file.newUri)); }), workspace.onDidDeleteFiles((e) => { e.files.forEach((uri) => { ignoreAll(uri); }); }), workspace.onDidSaveTextDocument((e) => { // the new file const uri = window.activeTextEditor.document.uri; const isNewFileSaved = uri.scheme === "untitled" && e.languageId === "sas"; if (isNewFileSaved) { // clear diagnostics on new file ignoreAll(uri); // if the new file is saved, e indicates the file which new file saved to. // no matter if it override a existing file, it is ok to clear its diagnostics. ignoreAll(e.uri); } }), workspace.onDidCloseTextDocument((e) => { const uri = e.uri; // if the new file is saved, the onDidSaveTextDocument is invoked, then this is invoked. // if the new file is not saved, only this is invoked. const isNewFileClosed = uri.scheme === "untitled"; if (isNewFileClosed) { ignoreAll(uri); } }), ]; } export const sasDiagnostic = { DiagnosticCommands, generateLogFn, getSubscriptions, updateDiagnosticUri, ignoreAll, }; ================================================ FILE: client/src/components/notebook/Controller.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import * as vscode from "vscode"; import { getSession } from "../../connection"; import { SASCodeDocument } from "../utils/SASCodeDocument"; import { getCodeDocumentConstructionParameters } from "../utils/SASCodeDocumentHelper"; import { Deferred, deferred } from "../utils/deferred"; export class NotebookController { readonly controllerId = "sas-notebook-controller-id"; readonly notebookType = "sas-notebook"; readonly label = "SAS Notebook"; readonly supportedLanguages = ["sas", "sql", "python", "r"]; private readonly _controller: vscode.NotebookController; private _executionOrder = 0; private _interrupted: Deferred | undefined; constructor() { this._controller = vscode.notebooks.createNotebookController( this.controllerId, this.notebookType, this.label, ); this._controller.supportedLanguages = this.supportedLanguages; this._controller.supportsExecutionOrder = true; this._controller.executeHandler = this._execute.bind(this); this._controller.interruptHandler = this._interrupt.bind(this); } dispose(): void { this._controller.dispose(); } private async _execute(cells: vscode.NotebookCell[]): Promise { this._interrupted = undefined; try { const session = getSession(); await session.setup(); } catch (err) { vscode.window.showErrorMessage( err.response?.data ? JSON.stringify(err.response.data) : err.message, ); return; } for (const cell of cells) { await this._doExecution(cell); } } private async _doExecution(cell: vscode.NotebookCell): Promise { if (this._interrupted) { return; } const execution = this._controller.createNotebookCellExecution(cell); execution.executionOrder = ++this._executionOrder; execution.start(Date.now()); // Keep track of elapsed time to execute cell. execution.clearOutput(); const session = getSession(); session.onExecutionLogFn = (logLines) => { logs = logs.concat(logLines); }; const parameters = getCodeDocumentConstructionParameters(cell.document); const codeDoc = new SASCodeDocument(parameters); let logs = []; try { const result = await session.run(codeDoc.getWrappedCode()); execution.replaceOutput([ new vscode.NotebookCellOutput([ ...(result.html5?.length ? [ vscode.NotebookCellOutputItem.text( result.html5, "application/vnd.sas.ods.html5", ), ] : []), vscode.NotebookCellOutputItem.json( logs, "application/vnd.sas.compute.log.lines", ), ]), ]); execution.end(true, Date.now()); } catch (error) { execution.replaceOutput([ new vscode.NotebookCellOutput([ vscode.NotebookCellOutputItem.error(error), ]), ]); execution.end(false, Date.now()); if (!this._interrupted) { this._interrupted = deferred(); } } if (this._interrupted) { this._interrupted.resolve(); } } private _interrupt() { if (this._interrupted) { return; } this._interrupted = deferred(); vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, title: vscode.l10n.t("Cancelling job..."), }, () => this._interrupted.promise, ); const session = getSession(); session.cancel?.(); } } ================================================ FILE: client/src/components/notebook/Serializer.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import * as vscode from "vscode"; import { TextDecoder, TextEncoder } from "util"; interface RawNotebookCell { language: string; value: string; kind: vscode.NotebookCellKind; outputs?: { items: { data: string; mime: string; }[]; }[]; } export class NotebookSerializer implements vscode.NotebookSerializer { private readonly _decoder = new TextDecoder(); private readonly _encoder = new TextEncoder(); async deserializeNotebook(content: Uint8Array): Promise { const contents = this._decoder.decode(content); let raw: RawNotebookCell[]; try { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions raw = JSON.parse(contents); } catch { raw = []; } const cells = raw.map((item) => { const cell = new vscode.NotebookCellData( item.kind, item.value, item.language, ); if (item.outputs) { cell.outputs = item.outputs.map( (output) => new vscode.NotebookCellOutput( output.items.map((item) => vscode.NotebookCellOutputItem.text(item.data, item.mime), ), ), ); } return cell; }); return new vscode.NotebookData(cells); } async serializeNotebook(data: vscode.NotebookData): Promise { const contents: RawNotebookCell[] = []; for (const cell of data.cells) { const content: RawNotebookCell = { kind: cell.kind, language: cell.languageId, value: cell.value, }; if (cell.outputs) { content.outputs = cell.outputs.map((output) => ({ items: output.items.map((item) => ({ data: this._decoder.decode(item.data), mime: item.mime, })), })); } contents.push(content); } return this._encoder.encode(JSON.stringify(contents)); } } ================================================ FILE: client/src/components/notebook/exporters/index.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Uri, l10n, window, workspace } from "vscode"; import type { LanguageClient } from "vscode-languageclient/node"; import path from "path"; import { exportToHTML } from "./toHTML"; import { exportToSAS } from "./toSAS"; export const exportNotebook = async (client: LanguageClient) => { const notebook = window.activeNotebookEditor?.notebook; if (!notebook) { return; } // Show QuickPick for export format selection const formatChoices = [ { label: l10n.t("HTML"), description: l10n.t("Export as HTML file"), format: "html" as const, extension: "html", }, { label: l10n.t("SAS Code"), description: l10n.t("Export as SAS program file"), format: "sas" as const, extension: "sas", }, ]; const formatChoice = await window.showQuickPick(formatChoices, { placeHolder: l10n.t("Select export format"), ignoreFocusOut: true, }); if (!formatChoice) { return; } // Show save dialog with appropriate file extension const defaultFileName = path.basename(notebook.uri.path, ".sasnb") + `.${formatChoice.extension}`; const filters: { [name: string]: string[] } = {}; filters[formatChoice.extension.toUpperCase()] = [formatChoice.extension]; const uri = await window.showSaveDialog({ filters, defaultUri: Uri.parse(defaultFileName), }); if (!uri) { return; } try { let content: string | Uint8Array; // Generate content based on selected format switch (formatChoice.format) { case "html": content = await exportToHTML(notebook, client); await workspace.fs.writeFile(uri, new TextEncoder().encode(content)); break; case "sas": content = exportToSAS(notebook); await workspace.fs.writeFile(uri, new TextEncoder().encode(content)); break; } window.showInformationMessage( l10n.t("Notebook exported to {0}", uri.fsPath), ); } catch (error) { window.showErrorMessage( l10n.t("Failed to export notebook: {0}", error.message || error), ); } }; export const saveOutput = async () => { const notebook = window.activeNotebookEditor?.notebook; const activeCell = window.activeNotebookEditor?.selection?.start; if (!notebook || activeCell === undefined) { return; } const cell = notebook.cellAt(activeCell); if (!cell) { return; } let odsItem = null; let logItem = null; for (const output of cell.outputs) { if (!odsItem) { odsItem = output.items.find( (item) => item.mime === "application/vnd.sas.ods.html5", ); } if (!logItem) { logItem = output.items.find( (item) => item.mime === "application/vnd.sas.compute.log.lines", ); } if (odsItem && logItem) { break; } } const choices: Array<{ label: string; outputType: "html" | "log"; }> = []; if (odsItem) { choices.push({ label: l10n.t("Save ODS HTML"), outputType: "html", }); } if (logItem) { choices.push({ label: l10n.t("Save Log"), outputType: "log", }); } const exportChoice = await window.showQuickPick(choices, { placeHolder: l10n.t("Choose output type to save"), ignoreFocusOut: true, }); if (!exportChoice) { return; } let content = ""; let fileExtension = ""; let fileName = ""; try { if (exportChoice.outputType === "html" && odsItem) { content = odsItem.data.toString(); fileExtension = "html"; fileName = `${path.basename(notebook.uri.path, ".sasnb")}_${l10n.t("output")}_${ activeCell + 1 }.html`; } else if (exportChoice.outputType === "log" && logItem) { const logs: Array<{ line: string; type: string }> = JSON.parse( logItem.data.toString(), ); content = logs.map((log) => log.line).join("\n"); fileExtension = "log"; fileName = `${path.basename(notebook.uri.path, ".sasnb")}_${l10n.t("output")}_${ activeCell + 1 }.log`; } } catch (error) { window.showErrorMessage( l10n.t("Failed to extract output content." + error), ); return; } const filters: { [name: string]: string[] } = {}; filters[fileExtension.toUpperCase()] = [fileExtension]; const uri = await window.showSaveDialog({ filters, defaultUri: Uri.parse(fileName), }); if (!uri) { return; } await workspace.fs.writeFile(uri, new TextEncoder().encode(content)); window.showInformationMessage(l10n.t("Saved to {0}", uri.fsPath)); }; ================================================ FILE: client/src/components/notebook/exporters/templates/dark.css ================================================ body { background-color: #03233a; color: #cccccc; --border-color: #b0b7bb; --highlight-background-color: #9fb6c633; } .markdown-cell a:link { color: #3794ff; } .hljs { background: #021727; color: #dddfe4; } /* Syntax highlighting */ .hljs-operator, .hljs-punctuation { color: #dddfe4; } .hljs-keyword { color: #4398f9; } .hljs-comment { color: #97c03f; } .hljs-string { color: #f17e70; } .hljs-number { color: #54b6a4; } .hljs-title { color: #92c3fc; font-weight: bold; } .hljs-built_in { color: #faaa6b; } /* SAS Syntax */ .sas-syntax-sep { color: #dddfe4; } .sas-syntax-keyword, .sas-syntax-macro-keyword { color: #4398f9; } .sas-syntax-sec-keyword, .sas-syntax-proc-name { color: #92c3fc; font-weight: bold; } .sas-syntax-comment, .sas-syntax-macro-comment { color: #97c03f; } .sas-syntax-macro-ref, .sas-syntax-macro-sec-keyword { color: #dddfe4; font-weight: bold; } .sas-syntax-macro-keyword-param { color: #97c6fc; } .sas-syntax-cards-data { color: #faaa6b; } .sas-syntax-string { color: #f17e70; } .sas-syntax-date, .sas-syntax-time, .sas-syntax-dt, .sas-syntax-bitmask { color: #54b6a4; font-weight: bold; } .sas-syntax-namelit { color: #f17e70; font-weight: bold; } .sas-syntax-hex, .sas-syntax-numeric { color: #54b6a4; font-weight: bold; } .sas-syntax-format { color: #54b6a4; } .log-line.sas-log-error { color: #ff4d4d; } .log-line.sas-log-warning { color: #ffb829; } .log-line.sas-log-note { color: #2fa8fe; } ================================================ FILE: client/src/components/notebook/exporters/templates/default.html ================================================ ${content} ================================================ FILE: client/src/components/notebook/exporters/templates/light.css ================================================ body { color: #3b3b3b; --border-color: #b0b7bb; --highlight-background-color: #818b981f; } .hljs { background: #fff; } /* Syntax highlighting */ .hljs-operator, .hljs-punctuation { color: #1b1d22; } .hljs-keyword { color: #3578c5; } .hljs-comment { color: #647f29; } .hljs-string { color: #8f4238; } .hljs-number { color: #3c8275; } .hljs-title { color: #224c7c; font-weight: bold; } .hljs-built_in { color: #aa0d91; } /* SAS Syntax */ .sas-syntax-sep { color: #1b1d22; } .sas-syntax-keyword, .sas-syntax-macro-keyword { color: #3578c5; } .sas-syntax-sec-keyword, .sas-syntax-proc-name { color: #224c7c; font-weight: bold; } .sas-syntax-comment, .sas-syntax-macro-comment { color: #647f29; } .sas-syntax-macro-ref, .sas-syntax-macro-sec-keyword { color: #1b1d22; font-weight: bold; } .sas-syntax-macro-keyword-param { color: #054894; } .sas-syntax-cards-data { color: #ad6531; } .sas-syntax-string { color: #8f4238; } .sas-syntax-date, .sas-syntax-time, .sas-syntax-dt, .sas-syntax-bitmask { color: #3c8275; font-weight: bold; } .sas-syntax-namelit { color: #8f4238; font-weight: bold; } .sas-syntax-hex, .sas-syntax-numeric { color: #3c8275; font-weight: bold; } .sas-syntax-format { color: #3c8275; } .log-line.sas-log-error { color: #ff0000; } .log-line.sas-log-warning { color: #8f5f00; } .log-line.sas-log-note { color: #0000ff; } ================================================ FILE: client/src/components/notebook/exporters/toHTML.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ColorThemeKind, NotebookCell, NotebookCellKind, NotebookCellOutput, NotebookDocument, TextDocument, window, } from "vscode"; import { LanguageClient, SemanticTokensRequest, } from "vscode-languageclient/node"; import { readFileSync } from "fs"; import hljs from "highlight.js/lib/core"; import python from "highlight.js/lib/languages/python"; import r from "highlight.js/lib/languages/r"; import sql from "highlight.js/lib/languages/sql"; import { marked } from "marked"; import markedKatex from "marked-katex-extension"; import path from "path"; import type { LogLine } from "../../../connection"; import { includeLogInNotebookExport } from "../../utils/settings"; const templatesDir = path.resolve(__dirname, "../notebook/exporters/templates"); hljs.registerLanguage("python", python); hljs.registerLanguage("r", r); hljs.registerLanguage("sql", sql); // Configure marked options marked.setOptions({ breaks: false, gfm: false, }); // Enable KaTeX extension for marked marked.use(markedKatex()); export const exportToHTML = async ( notebook: NotebookDocument, client: LanguageClient, ) => { const cells = notebook.getCells(); let template = readFileSync(`${templatesDir}/default.html`).toString(); const isDark = window.activeColorTheme.kind === ColorThemeKind.Dark || window.activeColorTheme.kind === ColorThemeKind.HighContrast; const theme = readFileSync( `${templatesDir}/${isDark ? "dark" : "light"}.css`, ).toString(); // Read KaTeX CSS from templates directory (copied from node_modules during build) const katexCss = readFileSync(`${templatesDir}/katex.css`).toString(); template = template.replace("${katex}", katexCss); template = template.replace("${theme}", theme); template = template.replace("${content}", await exportCells(cells, client)); return template; }; const exportCells = async (cells: NotebookCell[], client: LanguageClient) => { let result = ""; for (const cell of cells) { if (cell.kind === NotebookCellKind.Markup) { result += markdownToHTML(cell.document) + "\n"; } else { result += (await codeToHTML(cell.document, client)) + "\n"; if (cell.outputs.length > 0) { for (const output of cell.outputs) { if (includeLogInNotebookExport()) { result += logToHTML(output) + "\n"; } result += odsToHTML(output) + "\n"; } } } } return result; }; const markdownToHTML = (doc: TextDocument) => { let text = doc.getText(); text = normalizeDisplayMathBlocks(text); return `
${marked.parse(text)}
`; }; /** * Normalize display math blocks in markdown text. * * Ensures each $$...$$ display math block is on its own lines with blank * lines before and after, and trims leading/trailing whitespace inside the * delimiters while preserving internal newlines. * * @example * Inline: "This is $$ x^2 $$ in text." -> "This is\n\n$$\n x^2\n$$\n\n" * * @example * Display: "Text$$\\frac{1}{2}$$More" -> "Text\n\n$$\n\\frac{1}{2}\n$$\n\nMore" */ const normalizeDisplayMathBlocks = (input: string) => input.replace(/\$\$([\s\S]*?)\$\$/g, (_match, content) => { const trimmedContent = content.trim(); return `\n\n$$\n${trimmedContent}\n$$\n\n`; }); const codeToHTML = async (doc: TextDocument, client: LanguageClient) => { let result = ""; if (doc.languageId === "sas") { result = await SASToHTML(doc, client); } else { result = hljs.highlight(doc.getText(), { language: doc.languageId, }).value; } return `
${result}
${doc.languageId}
`; }; const SASToHTML = async (doc: TextDocument, client: LanguageClient) => { const result = []; const tokens = ( await client.sendRequest(SemanticTokensRequest.type, { textDocument: { uri: doc.uri.toString(), }, }) ).data; const legend = client.initializeResult.capabilities.semanticTokensProvider.legend .tokenTypes; let tokenIndex = 0; let token = tokenIndex + 4 < tokens.length ? { line: tokens[tokenIndex], startChar: tokens[tokenIndex + 1], length: tokens[tokenIndex + 2], tokenType: tokens[tokenIndex + 3], } : null; for (let line = 0; line < doc.lineCount; line++) { const lineText = doc.lineAt(line).text; const parts = []; let end = 0; while (token && token.line === line) { parts.push(lineText.slice(end, token.startChar)); end = token.startChar + token.length; parts.push( `${lineText.slice( token.startChar, end, )}`, ); tokenIndex += 5; token = tokenIndex + 4 < tokens.length ? { line: tokens[tokenIndex] + token.line, startChar: tokens[tokenIndex + 1] + (tokens[tokenIndex] > 0 ? 0 : token.startChar), length: tokens[tokenIndex + 2], tokenType: tokens[tokenIndex + 3], } : null; } parts.push(lineText.slice(end)); result.push(parts.join("")); } return result.join("\n"); }; const odsToHTML = (output: NotebookCellOutput) => { const ods = output.items.find( (item) => item.mime === "application/vnd.sas.ods.html5", ); if (ods) { const html = ods.data.toString(); const style = html.slice( html.indexOf("") + 8, ); const content = html.slice( html.indexOf(""), ); return `
${style}
`; } return ""; }; const logToHTML = (output: NotebookCellOutput) => { const logItem = output.items.find( (item) => item.mime === "application/vnd.sas.compute.log.lines", ); if (logItem) { const logs: LogLine[] = JSON.parse(logItem.data.toString()); return `
${logs .map( (line) => `
${line.line}
`, ) .join("\n")}
`; } return ""; }; ================================================ FILE: client/src/components/notebook/exporters/toSAS.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { NotebookCell, NotebookDocument } from "vscode"; export const exportToSAS = (notebook: NotebookDocument) => notebook .getCells() .map((cell) => exportCell(cell) + "\n") .join("\n"); const exportCell = (cell: NotebookCell) => { const text = cell.document.getText(); switch (cell.document.languageId) { case "sas": return text; case "python": return wrapPython(text); case "r": return wrapR(text); case "sql": return wrapSQL(text); case "markdown": return `/*\n${text}\n*/`; } }; const wrapSQL = (code: string) => { if (!code.trimEnd().endsWith(";")) { code = `${code};`; } return `proc sql; ${code} quit;`; }; const wrapPython = (code: string) => `proc python; submit; ${code} endsubmit; run;`; const wrapR = (code: string) => `proc r; submit; ${code} endsubmit; run;`; ================================================ FILE: client/src/components/notebook/renderers/HTMLRenderer.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { ActivationFunction } from "vscode-notebook-renderer"; /** * Replace the last occurrence of a substring */ function replaceLast( base: string, searchValue: string, replaceValue: string, ): string { const index = base.lastIndexOf(searchValue); if (index < 0) { return base; } return ( base.slice(0, index) + replaceValue + base.slice(index + searchValue.length) ); } export const activate: ActivationFunction = () => ({ renderOutputItem(data, element) { const html = data.text(); let shadow = element.shadowRoot; if (!shadow) { shadow = element.attachShadow({ mode: "open" }); } shadow.innerHTML = replaceLast( // it's not a whole webview, body not allowed html.replace("", "
", ); }, }); ================================================ FILE: client/src/components/notebook/renderers/LogRenderer.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { ActivationFunction } from "vscode-notebook-renderer"; import type { LogLine } from "../../../connection"; const colorMap = { error: "var(--vscode-editorError-foreground)", warning: "var(--vscode-editorWarning-foreground)", note: "var(--vscode-editorInfo-foreground)", }; export const activate: ActivationFunction = () => ({ renderOutputItem(data, element) { const root = document.createElement("div"); root.style.whiteSpace = "pre"; root.style.fontFamily = "var(--vscode-editor-font-family)"; const logs: LogLine[] = data.json(); for (const line of logs) { const color = colorMap[line.type]; const div = document.createElement("div"); div.innerText = line.line; if (color) { div.style.color = color; } root.append(div); } element.replaceChildren(root); }, }); ================================================ FILE: client/src/components/profile.ts ================================================ // Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ConfigurationTarget, QuickPickOptions, commands, l10n, window, workspace, } from "vscode"; import { readFileSync } from "fs"; export const EXTENSION_CONFIG_KEY = "SAS"; export const EXTENSION_DEFINE_PROFILES_CONFIG_KEY = "connectionProfiles"; export const EXTENSION_PROFILES_CONFIG_KEY = "profiles"; export const EXTENSION_ACTIVE_PROFILE_CONFIG_KEY = "activeProfile"; enum ConnectionOptions { SAS9COM = "SAS 9.4 (local)", SAS9IOM = "SAS 9.4 (remote - IOM)", SAS9SSH = "SAS 9.4 (remote - SSH)", SASViya = "SAS Viya", } const CONNECTION_PICK_OPTS: string[] = [ ConnectionOptions.SASViya, ConnectionOptions.SAS9SSH, ConnectionOptions.SAS9IOM, ConnectionOptions.SAS9COM, ]; /** * The default compute context that will be used to create a SAS session. */ export const DEFAULT_COMPUTE_CONTEXT = "SAS Job Execution compute context"; export const DEFAULT_SSH_PORT = "22"; export const DEFAULT_IOM_PORT = "8591"; /** * Dictionary is a type that maps a generic object with a string key. */ export type Dictionary = { [key: string]: T; }; /** * Enum that represents the authentication type for a profile. */ export enum AuthType { AuthCode = "authorization_code", Error = "error", } /** * Enum that represents the connection type for a profile. */ export enum ConnectionType { COM = "com", IOM = "iom", Rest = "rest", SSH = "ssh", } /** * Profile is an interface that represents a users profile. Currently * supports two different authentication flows, token and password * flow with the clientId and clientSecret. * * Direct connect is also supported where a server is already started with * a static serverId. Setting serverId in the profile indicates that a connection * to that specific server with Id will be created. This overrides the context * value. Normally this option should not be set by the user since it is most likely * being set by an automated process. */ export interface ViyaProfile extends BaseProfile, ProfileWithFileRootOptions { connectionType: ConnectionType.Rest; endpoint: string; clientId?: string; clientSecret?: string; context?: string; serverId?: string; } export interface SSHProfile extends BaseProfile { connectionType: ConnectionType.SSH; host: string; saspath: string; port: number; username: string; privateKeyFilePath?: string; } export interface COMProfile extends BaseProfile, ProfileWithFileRootOptions { connectionType: ConnectionType.COM; host: string; } export interface IOMProfile extends BaseProfile, ProfileWithFileRootOptions { connectionType: ConnectionType.IOM; host: string; username: string; port: number; } export type Profile = ViyaProfile | SSHProfile | COMProfile | IOMProfile; export enum AutoExecType { File = "file", Line = "line", } export type AutoExec = AutoExecLine | AutoExecFile; export interface AutoExecLine { type: AutoExecType.Line; line: string; } export interface AutoExecFile { type: AutoExecType.File; filePath: string; } export interface BaseProfile { sasOptions?: string[]; autoExec?: AutoExec[]; } export interface ProfileWithFileRootOptions { fileNavigationCustomRootPath?: string; fileNavigationRoot?: "CUSTOM" | "SYSTEM" | "USER"; } export const toAutoExecLines = (autoExec: AutoExec[]): string[] => { const lines: string[] = []; for (const item of autoExec) { switch (item.type) { case AutoExecType.Line: lines.push(item.line); break; case AutoExecType.File: lines.push(...toAutoExecLinesFromPaths(item.filePath)); break; default: break; } } return lines; }; /** * Reads content from the given string paths. * Content is read sequentially from each path starting at the zeroth path, * appending each content line into the output array. * * If there is an error reading a file in the paths array, then * the file is skipped and content is not added. * @param paths string array of paths to read content from. * @returns string array of lines */ const toAutoExecLinesFromPaths = (filePath: string): string[] => { const lines: string[] = []; try { const content = readFileSync(filePath, "utf8").split(/\n|\r\n/); lines.push(...content); } catch (e) { const err: Error = e; console.warn( `Error reading file: ${filePath}, error: ${err.message}, skipping...`, ); } return lines; }; /** * Profile detail is an interface that encapsulates the name of the profile * with the {@link Profile}. */ export interface ProfileDetail { name: string; profile: Profile; } /** * Profile validation is an interface that represents the validation * information from a profile needed when making a SAS connection. */ export interface ProfileValidation { type: AuthType; error: string; data?: string; profile: Profile; } /** * ProfileConfig manages a list of {@link Profile}s that are located in vscode settings. * Connection Profiles are designed to keep track of multiple * configurations of SAS Connections. */ export class ProfileConfig { /** * Helper function to migrate legacy profiles without a connection type. */ async migrateLegacyProfiles() { const profiles = this.getAllProfiles(); if (profiles) { for (const key in profiles) { const profile = profiles[key]; if (profile.connectionType === undefined) { profile.connectionType = ConnectionType.Rest; await this.upsertProfile(key, profile); } if ( profile.connectionType === ConnectionType.Rest && /\/$/.test(profile.endpoint) ) { profile.endpoint = profile.endpoint.replace(/\/$/, ""); await this.upsertProfile(key, profile); } } } } /** * Validates settings.json to confirm that SAS.connectionProfiles exists * as a key, and updates it, if the setting does not exists * * @returns Boolean for pass or fail */ validateSettings(): boolean { const profileList: Dictionary = workspace .getConfiguration(EXTENSION_CONFIG_KEY) .get(EXTENSION_DEFINE_PROFILES_CONFIG_KEY)[EXTENSION_PROFILES_CONFIG_KEY]; if (!profileList) { workspace.getConfiguration(EXTENSION_CONFIG_KEY).update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, { activeProfile: "", profiles: {}, }, ConfigurationTarget.Global, ); return false; } return true; } /** * Get the active profile from the vscode settings. * * @returns String name to the active profile */ getActiveProfile(): string { if (!this.validateSettings()) { return ""; } const activeProfile: string = workspace .getConfiguration(EXTENSION_CONFIG_KEY) .get(EXTENSION_DEFINE_PROFILES_CONFIG_KEY)[ EXTENSION_ACTIVE_PROFILE_CONFIG_KEY ]; return activeProfile; } /** * Gets all profiles from the vscode settings. * * @returns Dictionary of profiles */ getAllProfiles(): Dictionary { if (!this.validateSettings()) { return {}; } const profileList: Dictionary = workspace .getConfiguration(EXTENSION_CONFIG_KEY) .get(EXTENSION_DEFINE_PROFILES_CONFIG_KEY)[EXTENSION_PROFILES_CONFIG_KEY]; return profileList; } /** * Update VSCode settings with profile dictionary * * @param profileDict {@link Dictionary} the value for the key */ async updateProfileSetting(profileDict: Dictionary): Promise { const currentActiveProfile = this.getActiveProfile(); const profiles = { activeProfile: currentActiveProfile, profiles: profileDict, }; await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, profiles, ConfigurationTarget.Global, ); } /** * Update VSCode settings with active profile * * @param activeProfileParam {@link String} the value for the key */ async updateActiveProfileSetting(activeProfileParam: string): Promise { const profileList = this.getAllProfiles(); const profiles = { activeProfile: activeProfileParam, profiles: profileList, }; if (activeProfileParam in profileList) { commands.executeCommand("SAS.close", true); } else { profiles.activeProfile = ""; } await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, profiles, ConfigurationTarget.Global, ); } /** * Determines the number of profiles found in settings * * @returns number of profiles found in vscode settings */ length(): number { return Object.keys(this.getAllProfiles()).length; } /** * Retreives the list of profile names. * * @returns List of profile names */ listProfile(): string[] { return Object.keys(this.getAllProfiles()); } /** * Retrieves the {@link Profile} by name from the profile configuration. If the profile * is not found by name, a default {@link Profile} will be generated and returned. * * @param name {@link String} of the profile name * @returns Profile object */ getProfileByName(name: string): T { const profileList = this.getAllProfiles(); if (name in profileList) { /* eslint-disable @typescript-eslint/consistent-type-assertions*/ return profileList[name] as T; } return undefined; } /** * Retrieves the {@link ProfileDetail} of the active profile set in the profile * configurations. * * @returns Optional ProfileDetail */ getActiveProfileDetail(): ProfileDetail | undefined { const activeProfileName = this.getActiveProfile(); const profileList = this.getAllProfiles(); if (activeProfileName in profileList) { const profile = { ...profileList[activeProfileName] }; if ( profile.connectionType === ConnectionType.Rest && /\/$/.test(profile.endpoint) ) { profile.endpoint = profile.endpoint.replace(/\/$/, ""); } const detail: ProfileDetail = { name: activeProfileName, profile, }; return detail; } else { return undefined; } } /** * Upsert allows for add or update the new {@link Profile} into vscode settings. * * @param name {@link String} of the name of the profile * @param profile {@link Profile} object */ async upsertProfile(name: string, profile: Profile): Promise { const profileList = this.getAllProfiles(); // Cannot mutate VSCode Config Object, create a clone and add that to settings.json const newProfileList = JSON.parse(JSON.stringify(profileList)); newProfileList[name] = profile; await this.updateProfileSetting(newProfileList); } /** * Deletes a profile from the vscode settings. * * @param name {@link String} of the name of the profile */ async deleteProfile(name: string): Promise { const profileList = this.getAllProfiles(); if (name in profileList) { // Cannot mutate VSCode Config Object, create a clone and add that to settings.json const newProfileList = JSON.parse(JSON.stringify(profileList)); delete newProfileList[name]; await this.updateProfileSetting(newProfileList); if (name === this.getActiveProfile()) { await this.updateActiveProfileSetting(""); } } } /** * Validates if the {@link ProfileDetail} meets the requirements needed for authentication * and returns back the authentication type. * * The validation process calculates the authentication flow by what is detailed in the * {@link ProfileDetail}. If the conditions to calculate the authentication flow are not * meet, then an error is provided in the {@link ProfileValidation}. * * @param profileDetail * @returns ProfileValidation object */ validateProfile(profileDetail?: ProfileDetail): ProfileValidation { const pv: ProfileValidation = { type: AuthType.Error, error: "", profile: undefined, }; //Validate active profile, return early if not valid if (!profileDetail?.profile) { pv.error = l10n.t("No Active Profile"); return pv; } const profile: Profile = profileDetail.profile; if (profile.connectionType === undefined) { pv.error = l10n.t("Missing connectionType in active profile."); return pv; } if (profile.connectionType === ConnectionType.Rest) { if (!profile.endpoint) { pv.error = l10n.t("Missing endpoint in active profile."); return pv; } } else if (profile.connectionType === ConnectionType.SSH) { if (!profile.host) { pv.error = l10n.t("Missing host in active profile."); return pv; } if (!profile.port) { pv.error = l10n.t("Missing port in active profile."); return pv; } if (!profile.saspath) { pv.error = l10n.t("Missing sas path in active profile."); return pv; } if (!profile.username) { pv.error = l10n.t("Missing username in active profile."); return pv; } } pv.profile = profileDetail.profile; pv.type = AuthType.AuthCode; return pv; } /** * Requests users input on updating or adding a new profile. * * @param name the {@link String} representation of the name of the profile */ async prompt(name: string): Promise { const profile: Profile = this.getProfileByName(name); // Cannot mutate VSCode Config Object, create a clone and upsert let profileClone = { ...profile }; if (!profile) { profileClone = { connectionType: ConnectionType.Rest, endpoint: undefined, }; } const inputConnectionType: string = await createInputQuickPick( CONNECTION_PICK_OPTS, ProfilePromptType.ConnectionType, ); if (inputConnectionType === undefined) { return; } profileClone.connectionType = mapQuickPickToEnum(inputConnectionType); if (profileClone.connectionType === ConnectionType.Rest) { profileClone.endpoint = await createInputTextBox( ProfilePromptType.Endpoint, profileClone.endpoint, ); if (!profileClone.endpoint) { return; } profileClone.endpoint = profileClone.endpoint.replace(/\/$/, ""); profileClone.context = await createInputTextBox( ProfilePromptType.ComputeContext, profileClone.context || DEFAULT_COMPUTE_CONTEXT, ); if (profileClone.context === undefined) { return; } if ( profileClone.context === "" || profileClone.context === DEFAULT_COMPUTE_CONTEXT ) { delete profileClone.context; } profileClone.clientId = await createInputTextBox( ProfilePromptType.ClientId, profileClone.clientId, ); if (profileClone.clientId === undefined) { return; } if (profileClone.clientId === "") { delete profileClone.clientId; } if (profileClone.clientId) { profileClone.clientSecret = await createInputTextBox( ProfilePromptType.ClientSecret, profileClone.clientSecret, ); if (profileClone.clientSecret === undefined) { return; } } await this.upsertProfile(name, profileClone); } else if (profileClone.connectionType === ConnectionType.SSH) { profileClone.host = await createInputTextBox( ProfilePromptType.Host, profileClone.host, ); if (!profileClone.host) { return; } profileClone.saspath = await createInputTextBox( ProfilePromptType.SASPath, profileClone.saspath, ); if (profileClone.saspath === undefined) { return; } profileClone.username = await createInputTextBox( ProfilePromptType.Username, profileClone.username, ); if (profileClone.username === undefined) { return; } profileClone.port = parseInt( await createInputTextBox(ProfilePromptType.Port, DEFAULT_SSH_PORT), ); if (isNaN(profileClone.port)) { return; } const keyPath = await createInputTextBox( ProfilePromptType.PrivateKeyFilePath, profileClone.privateKeyFilePath, ); if (keyPath) { profileClone.privateKeyFilePath = keyPath; } await this.upsertProfile(name, profileClone); } else if (profileClone.connectionType === ConnectionType.COM) { profileClone.sasOptions = []; profileClone.host = "localhost"; //once remote support rolls out this should be set via prompting await this.upsertProfile(name, profileClone); } else if (profileClone.connectionType === ConnectionType.IOM) { profileClone.sasOptions = []; profileClone.host = await createInputTextBox( ProfilePromptType.Host, profileClone.host, ); if (!profileClone.host) { return; } profileClone.port = parseInt( await createInputTextBox(ProfilePromptType.Port, DEFAULT_IOM_PORT), ); if (isNaN(profileClone.port)) { return; } profileClone.username = await createInputTextBox( ProfilePromptType.Username, profileClone.username, ); if (profileClone.username === undefined) { return; } await this.upsertProfile(name, profileClone); } } /** * Retrieves the remote target associated with the active profile. For SSH profiles, the host * value is used. For Viya, the endpoint value is used. * @param profileName - a profile name to retrieve. * @returns */ remoteTarget(profileName: string): string { const activeProfile = this.getProfileByName(profileName); switch (activeProfile.connectionType) { case ConnectionType.SSH: case ConnectionType.COM: case ConnectionType.IOM: return activeProfile.host; case ConnectionType.Rest: return activeProfile.endpoint; } } } /** * Define an object to represent the values needed for prompting a window.showInputBox */ export interface ProfilePrompt { title: string; placeholder: string; description: string; } /** * An enum representing the types of prompts that can be returned for window.showInputBox */ export enum ProfilePromptType { Profile = 0, NewProfile, ClientId, Endpoint, ComputeContext, ClientSecret, ConnectionType, Host, SASPath, Port, Username, PrivateKeyFilePath, } /** * An interface that will map an enum of {@link ProfilePromptType} to an interface of {@link ProfilePrompt}. */ export type ProfilePromptInput = { [key in ProfilePromptType]: ProfilePrompt; }; /** * Retrieves the {@link ProfilePrompt} by the enum {@link ProfilePromptType} * * @param type {@link ProfilePromptType} * @returns ProfilePrompt object */ export function getProfilePrompt(type: ProfilePromptType): ProfilePrompt { return input[type]; } /** * Helper method to generate a window.ShowInputBox with using a defined set of {@link ProfilePrompt}s. * * @param profilePromptType {@link ProfilePromptType} * @param defaultValue the {@link String} of the default value that will be represented in the input box. Defaults to null * @param maskValue the {@link boolean} if the input value will be masked * @param username the {@link String} of the SAS User ID * @returns Thenable<{@link String}> of the users input */ export async function createInputTextBox( profilePromptType: ProfilePromptType, defaultValue: string | undefined = null, maskValue = false, ): Promise { const profilePrompt = getProfilePrompt(profilePromptType); const entered = await window.showInputBox({ title: profilePrompt.title, placeHolder: profilePrompt.placeholder, prompt: profilePrompt.description, password: maskValue, value: defaultValue, ignoreFocusOut: true, }); return entered; } /** * Helper method to generate a window.ShowInputQuickPick using a defined set of {@link ProfilePrompt}s. * @param items list of selectable options to bind to the quickpick. * @param profilePromptType {@link ProfilePromptType} * @returns Thenable<{@link String}> of the users input */ export async function createInputQuickPick( items: readonly string[] | Thenable = [], profilePromptType: ProfilePromptType, ): Promise { const profilePrompt = getProfilePrompt(profilePromptType); const options: QuickPickOptions = { title: profilePrompt.title, placeHolder: profilePrompt.placeholder, ignoreFocusOut: true, canPickMany: false, }; const entered = await window.showQuickPick(items, options); return entered; } /** * Mapped {@link ProfilePrompt} to an enum of {@link ProfilePromptType}. */ const input: ProfilePromptInput = { [ProfilePromptType.Profile]: { title: l10n.t("Switch Current SAS Profile"), placeholder: l10n.t("Select a SAS connection profile"), description: "", }, [ProfilePromptType.NewProfile]: { title: l10n.t("New SAS Connection Profile Name"), placeholder: l10n.t("Enter connection name"), description: l10n.t( "You can also specify connection profile using the settings.json file.", ), }, [ProfilePromptType.Endpoint]: { title: l10n.t("SAS Viya Server"), placeholder: l10n.t("Enter the URL"), description: l10n.t( "Enter the URL for the SAS Viya server. An example is https://example.sas.com.", ), }, [ProfilePromptType.ComputeContext]: { title: l10n.t("SAS Compute Context"), placeholder: l10n.t("Enter the SAS compute context"), description: l10n.t("Enter the SAS compute context."), }, [ProfilePromptType.ClientId]: { title: l10n.t("Client ID"), placeholder: l10n.t("Enter a client ID"), description: l10n.t( "Enter the registered client ID. An example is myapp.client.", ), }, [ProfilePromptType.ClientSecret]: { title: l10n.t("Client Secret"), placeholder: l10n.t("Enter a client secret"), description: l10n.t( "Enter secret for client ID. An example is myapp.secret.", ), }, [ProfilePromptType.ConnectionType]: { title: l10n.t("Connection Type"), placeholder: l10n.t("Select a Connection Type"), description: l10n.t("Select a Connection Type."), }, [ProfilePromptType.Host]: { title: l10n.t("SAS 9 Server"), placeholder: l10n.t("Enter the server name"), description: l10n.t("Enter the name of the SAS 9 server."), }, [ProfilePromptType.SASPath]: { title: l10n.t("Server Path"), placeholder: l10n.t("Enter the server path"), description: l10n.t("Enter the server path of the SAS Executable."), }, [ProfilePromptType.Port]: { title: l10n.t("Port Number"), placeholder: l10n.t("Enter a port number"), description: l10n.t("Enter a port number."), }, [ProfilePromptType.Username]: { title: l10n.t("SAS Server Username"), placeholder: l10n.t("Enter your username"), description: l10n.t("Enter your SAS server username."), }, [ProfilePromptType.PrivateKeyFilePath]: { title: l10n.t("Private Key File Path (optional)"), placeholder: l10n.t("Enter the local private key file path"), description: l10n.t("To use the SSH Agent or a password, leave blank."), }, }; /** * Helper function to map the quick pick item selection to a well known {@link ConnectionType}. * @param connectionTypePickInput - string value of one of the quick pick option inputs * @returns {@link ConnectionType} */ function mapQuickPickToEnum(connectionTypePickInput: string): ConnectionType { /* Having a translation layer here allows the profile types to potentially evolve separately from the underlying technology used to implement the connection. Down the road its quite possible to have more than one selectable quick pick input that uses the same underlying connection methods.. */ switch (connectionTypePickInput) { case ConnectionOptions.SASViya: return ConnectionType.Rest; case ConnectionOptions.SAS9SSH: return ConnectionType.SSH; case ConnectionOptions.SAS9COM: return ConnectionType.COM; case ConnectionOptions.SAS9IOM: return ConnectionType.IOM; default: return undefined; } } ================================================ FILE: client/src/components/tasks/SasTaskProvider.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { CustomExecution, EventEmitter, ProviderResult, Pseudoterminal, Task, TaskProvider, TaskScope, l10n, } from "vscode"; import { hasRunningTask } from "../../commands/run"; import { Execute, SAS_TASK_TYPE, SasTaskDefinition, SasTaskNames, TaskInfo, runSasFileTask, } from "./SasTasks"; export class SasTaskProvider implements TaskProvider { provideTasks(): ProviderResult { return [generateTask(SasTaskNames.RunSasFile, runSasFileTask)]; } resolveTask(task: Task): ProviderResult { if (task.definition.task === SasTaskNames.RunSasFile) { return generateTask(task, runSasFileTask); } } } export class SasPseudoterminal implements Pseudoterminal { private messageEmitter = new EventEmitter(); private closeEmitter = new EventEmitter(); constructor( private execute: Execute, private taskInfo: TaskInfo, ) {} public onDidWrite = this.messageEmitter.event; public onDidClose? = this.closeEmitter.event; public open(): void { if (hasRunningTask()) { this.messageEmitter.fire( "There is running task, please try again after that is complete.\n", ); this.closeEmitter.fire(1); } else { this.executeTask(); } } public close(): void { this.closeEmitter.fire(0); } public handleInput?(data): void { // press ctrl + c to cancel executing task. if (data === "") { this.messageEmitter.fire("Task is cancelled."); this.closeEmitter.fire(1); } } private async executeTask(): Promise { return new Promise(() => { this.execute(this.messageEmitter, this.taskInfo, this.closeEmitter) .then(() => { this.messageEmitter.fire(l10n.t("Task is complete.") + "\r\n\r\n"); this.closeEmitter.fire(0); }) .catch((reason) => { this.messageEmitter.fire(reason.message + "\r\n\r\n"); this.messageEmitter.fire(l10n.t("Task is cancelled.") + "\r\n\r\n"); this.closeEmitter.fire(1); }); }); } } function generateTask(task: string | Task, execute: Execute) { const definition = typeof task === "object" ? task.definition : { type: SAS_TASK_TYPE, task: task, }; return new Task( definition, TaskScope.Workspace, definition.task, SAS_TASK_TYPE, new CustomExecution(async (taskDefinition: SasTaskDefinition) => { return new SasPseudoterminal(execute, { definition: taskDefinition, label: typeof task === "object" ? task.name : task, }); }), ); } ================================================ FILE: client/src/components/tasks/SasTasks.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { EventEmitter, TaskDefinition, l10n, window, workspace } from "vscode"; import { isAbsolute } from "path"; import { runTask } from "../../commands/run"; import { SASCodeDocument } from "../utils/SASCodeDocument"; import { getCodeDocumentConstructionParameters } from "../utils/SASCodeDocumentHelper"; export const SAS_TASK_TYPE = "sas"; export enum SasTaskNames { // Run the sas file indicated in the "file" property. if preamble or postamble provided, wrapping the sas code in the file with them. // If this task is called as predefined task or custom task without file or blank file name provided, // the code to run will be the selected code in active editor or be the active file code if there is no code selected. RunSasFile = "Run sas file", } export interface SasTaskDefinition extends TaskDefinition { task: string; file?: string; preamble?: string; postamble?: string; } export interface TaskInfo { definition: SasTaskDefinition; label: string; } export type Execute = ( messageEmitter: EventEmitter, taskInfo: TaskInfo, closeEmitter: EventEmitter, ) => Promise; export async function runSasFileTask( messageEmitter: EventEmitter, taskInfo: TaskInfo, closeEmitter: EventEmitter, ) { const { definition: { file, preamble, postamble }, label, } = taskInfo; const textDocument = await getTextDocumentFromFile(file); const parameters = getCodeDocumentConstructionParameters(textDocument, { selections: file === undefined || file.trim() === "" ? window.activeTextEditor?.selections : undefined, preamble, postamble, }); const codeDoc = new SASCodeDocument(parameters); return runTask(codeDoc, messageEmitter, closeEmitter, label); } async function getTextDocumentFromFile(file: string | undefined) { if (file === undefined || file.trim() === "") { return window.activeTextEditor.document; } else if (isAbsolute(file)) { return await workspace.openTextDocument(file); } else { const uri = (await workspace.findFiles(file))[0]; if (uri === undefined) { throw new Error(l10n.t("Cannot find file: {file}", { file })); } else { return await workspace.openTextDocument(uri); } } } ================================================ FILE: client/src/components/utils/SASCodeDocument.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ProblemLocation, decomposeCodeLogLine, } from "../logViewer/ProblemProcessor"; export interface SASCodeDocumentParameters { languageId: string; code: string; selectedCode: string; uri?: string; fileName?: string; selections?: ReadonlyArray<{ start: { line: number; character: number }; end: { line: number; character: number }; }>; preamble?: string; postamble?: string; outputHtml?: boolean; htmlStyle?: string; uuid?: string; checkKeyword: (LineNumber: number, ...keywords: string[]) => Promise; } type LineNumber = number; type Offset = { lineOffset: number; columnOffset: number }; export class SASCodeDocument { // there may be many selected raw code and they can be not continuous in editor. // this field provides a offset map for selected raw code in wrapped code and in whole raw code. private offsetMap: Map; public constructor(private parameters: SASCodeDocumentParameters) {} public getWrappedCode(): string { const code = this.getRawCode(); return this.codeIsEmpty(code) ? "" : this.wrapCode(code); } public getUri(): string { return this.parameters.uri; } public getFileName(): string { return this.parameters.fileName; } public wrappedCodeLineAt(lineNumber: number) { return this.getWrappedCode().split("\n")[lineNumber]; } public async getLocationInRawCode( locationFromLog: ProblemLocation, codeLinesInLog: string[], ): Promise { if (this.offsetMap === undefined) { await this.constructOffsetMap(codeLinesInLog); } const { lineNumber: lineNumberInLog, startColumn: startColumnInLog, endColumn: endColumnInLog, } = locationFromLog; const offset = this.offsetMap.get(lineNumberInLog); if (offset) { const { lineOffset: lineNumberInRaw, columnOffset } = offset; return { lineNumber: lineNumberInRaw, startColumn: startColumnInLog + columnOffset, endColumn: endColumnInLog + columnOffset, }; } const firstLineNumber = this.offsetMap.keys().next().value; const lastLineNumber = Array.from(this.offsetMap.keys()).pop() ?? 0; // if the problem occurs before the first raw code line, // then re-locate it at the first character in the first raw code line. if (lineNumberInLog < firstLineNumber) { return { lineNumber: 0, startColumn: 0, endColumn: 1, }; } // if the problem occurs after the last raw code line, // then re-located it at the last character in the last raw code line. if (lineNumberInLog > lastLineNumber) { const codeLinesInRaw = this.getRawCode().split("\n"); const count = codeLinesInRaw[codeLinesInRaw.length - 1].length; let lastCharacterIndex = count === 0 ? 0 : count - 1; if (this.offsetMap.size === 1) { lastCharacterIndex = this.parameters.selections[0].end.character - 1; } const lineNumberInRaw = this.offsetMap.get(lastLineNumber)?.lineOffset ?? 0; return { lineNumber: lineNumberInRaw, startColumn: lastCharacterIndex, endColumn: lastCharacterIndex + 1, }; } // the problem occurs in imported source code, // re-locate it at the nearest previous raw code line. const nearestPreviousLineNumberInLog = Array.from(this.offsetMap.keys()) .reverse() .find((lineNumber) => lineNumberInLog > lineNumber); const nearestOffset = this.offsetMap.get(nearestPreviousLineNumberInLog); return { lineNumber: nearestOffset.lineOffset, startColumn: 0, endColumn: 1, }; } private codeIsEmpty(code: string): boolean { return code.trim() === ""; } private wrapCodeWithSASProgramFileName(code: string): string { let fileName = this.parameters.fileName; if (fileName === undefined) { return code; } else { fileName = fileName.replace(/[('")]/g, "%$&"); const wrapped = "%let _SASPROGRAMFILE = %nrquote(%nrstr(" + fileName + "));\n" + code; return wrapped; } } private wrapCodeWithPreambleAndPostamble(code: string): string { return ( (this.parameters?.preamble ? this.parameters?.preamble + "\n" : "") + code + (this.parameters?.postamble ? "\n" + this.parameters?.postamble : "") ); } private wrapCodeWithOutputHtml(code: string): string { if (this.parameters.outputHtml) { const htmlStyle = this.parameters.htmlStyle.trim(); const htmlStyleOption = htmlStyle !== "" ? ` style=${htmlStyle}` : ""; const outputDestination = this.parameters?.uuid ? ` body="${this.parameters.uuid}.htm"` : ""; return `title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode)${htmlStyleOption} options(bitmap_mode='inline' svg_mode='inline')${outputDestination}; ${code} ;*';*";*/;run;quit;ods html5(id=vscode) close; `; } else { return code; } } private wrapSQL(code: string) { return `proc sql; ${code} ;quit;`; } private wrapPython(code: string) { return `proc python; submit; ${code} endsubmit; run;`; } private wrapR(code: string) { return `proc r; submit; ${code} endsubmit; run;`; } private insertLogStartIndicator(code: string): string { // add a comment line at the top of code, // this comment line will be used as indicator to the beginning of log related with this code return `/** LOG_START_INDICATOR **/ ${code}`; } private wrapCode(code: string): string { let wrapped = code; if (this.parameters.languageId === "sql") { wrapped = this.wrapSQL(wrapped); } if (this.parameters.languageId === "python") { wrapped = this.wrapPython(wrapped); } if (this.parameters.languageId === "r") { wrapped = this.wrapR(wrapped); } wrapped = this.wrapCodeWithSASProgramFileName(wrapped); wrapped = this.wrapCodeWithPreambleAndPostamble(wrapped); wrapped = this.wrapCodeWithOutputHtml(wrapped); wrapped = this.insertLogStartIndicator(wrapped); return wrapped; } // getWrappedCode() returns more code than raw code in editor, and addition code may be added at the beginning or end of raw code. // this method return the position at which the raw code begins in wrapped code. private getRawCodeBeginLineNumberInWrappedCode(): number { const FRONT_LOCATOR = "LOCATOR-TO-MARK-THE-BEGIN-OF-USER-CODE"; const codeWithLocator = FRONT_LOCATOR + this.getRawCode(); const wrapped = this.wrapCode(codeWithLocator); return wrapped .split("\n") .findIndex((line) => line.includes(FRONT_LOCATOR)); } // return selected code line array, which is in {lineNumber, column, code} format. private constructCodeLinesInRaw(): { lineNumber: LineNumber; column: number; code: string; }[] { const codeLines = this.getRawCode().split("\n"); let index = -1; const codeLinesInRaw = []; this.parameters.selections.forEach((selection) => { const { start, end } = selection; for (let lineNumber = start.line; lineNumber <= end.line; lineNumber++) { index++; codeLinesInRaw[index] = { lineNumber, column: lineNumber === start.line ? start.character : 0, code: codeLines[index], }; } }); return codeLinesInRaw; } private getNextValidCodeLineInLog( codeLines: string[], start: number, ): { code: string; lineNumber: number; index: number } { let index = start; let { code, lineNumber } = decomposeCodeLogLine(codeLines[index]); while ( index < codeLines.length && // code not included in the source file starts with "+" in the log. code.trim().startsWith("+") ) { ({ code, lineNumber } = decomposeCodeLogLine(codeLines[++index])); } return { code, lineNumber, index }; } private async constructOffsetMap(codeLinesInLog: string[]): Promise { const codeLinesInRaw = this.constructCodeLinesInRaw(); let indexInRaw = 0; let codeLineInRaw: string; let lineNumberInRaw: number; let columnInRaw: number; let indexInLog = this.getRawCodeBeginLineNumberInWrappedCode(); let codeLineInLog: string; let lineNumberInLog: number; let lastValidLineNumberInLog: number; let inInteractiveBlock = false; this.offsetMap = new Map(); while ( indexInRaw < codeLinesInRaw.length && indexInLog < codeLinesInLog.length ) { ({ code: codeLineInRaw, lineNumber: lineNumberInRaw, column: columnInRaw, } = codeLinesInRaw[indexInRaw]); if (inInteractiveBlock) { let index = indexInRaw; let lineInfo = codeLinesInRaw[++index]; while ( !(await this.parameters.checkKeyword( // this.parameters.uri, // lineInfo.code, lineInfo.lineNumber, "endinteractive", )) && index < codeLinesInRaw.length ) { lineInfo = codeLinesInRaw[++index]; } if (index < codeLinesInRaw.length) { ({ code: codeLineInRaw, lineNumber: lineNumberInRaw, column: columnInRaw, } = codeLinesInRaw[++index]); indexInRaw = index; inInteractiveBlock = false; } } ({ code: codeLineInLog, lineNumber: lineNumberInLog, index: indexInLog, } = this.getNextValidCodeLineInLog(codeLinesInLog, indexInLog)); // The line numbers in the source code within the log should be continuous. // but if encountering datasets following a datalines statement or %INC statement, // the line numbers will not be continuous. // for datalines-like statements, it will skip the number of dataset lines. // for %INC-like statements, it will continue without skip const delta = lastValidLineNumberInLog === undefined ? 1 : lineNumberInLog - lastValidLineNumberInLog; if ( delta > 1 && // if the code line in log can be found in raw, // think of the discontinuous line number is caused by %INC-like statements, // otherwise it is from datalines-like statements and need to skip lines in raw. !isSameOrStartsWith(codeLineInRaw.trim(), codeLineInLog.trim()) ) { indexInRaw += delta - 1; ({ code: codeLineInRaw, lineNumber: lineNumberInRaw, column: columnInRaw, } = codeLinesInRaw[indexInRaw]); } if (!isSameOrStartsWith(codeLineInRaw.trim(), codeLineInLog.trim())) { const match = this.getMatchedCodeLineInLog( codeLineInRaw, codeLinesInLog, indexInLog, ); lineNumberInLog = match.lineNumber; indexInLog = match.index; } const offset = { lineOffset: lineNumberInRaw, columnOffset: columnInRaw }; this.offsetMap.set(lineNumberInLog, offset); lastValidLineNumberInLog = lineNumberInLog; inInteractiveBlock = await this.parameters.checkKeyword( // this.parameters.uri, // codeLineInRaw, lineNumberInRaw, "interactive", "i", ); indexInRaw++; indexInLog++; } } private getMatchedCodeLineInLog( codeLineInRaw: string, codeLinesInLog: string[], start: number, ): { code: string; lineNumber: number; index: number } | null { let validCodeLine = { code: "", lineNumber: -1, index: start }; let indexInLog = start; do { validCodeLine = this.getNextValidCodeLineInLog( codeLinesInLog, indexInLog++, ); } while ( !isSameOrStartsWith(codeLineInRaw.trim(), validCodeLine.code.trim()) && indexInLog < codeLinesInLog.length ); return validCodeLine.index >= codeLinesInLog.length ? null : validCodeLine; } // priority return selected code, otherwise, return whole code. private getRawCode(): string { return this.parameters.selectedCode.trim() === "" ? this.parameters.code : this.parameters.selectedCode; } } function isSameOrStartsWith(base: string, target: string): boolean { return target === "" ? base === target : base.startsWith(target); } ================================================ FILE: client/src/components/utils/SASCodeDocumentHelper.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ColorThemeKind, Hover, Position, Selection, TextDocument, commands, window, workspace, } from "vscode"; import { v4 } from "uuid"; import { profileConfig } from "../../commands/profile"; import { ConnectionType } from "../profile"; import { SASCodeDocumentParameters } from "./SASCodeDocument"; import { getHtmlStyle, isOutputHtmlEnabled } from "./settings"; export function getCodeDocumentConstructionParameters( textDocument: TextDocument, addition?: { selections?: ReadonlyArray; preamble?: string; postamble?: string; }, ): SASCodeDocumentParameters { // TODO #810 This is a temporary solution to prevent creating an excessive // number of result files for viya connections. // This todo will be cleaned up with remaining work in #810. const uuid = connectionTypeIsNotRest() ? v4() : undefined; return { languageId: textDocument.languageId, code: textDocument.getText(), selectedCode: getSelectedCode(textDocument, addition?.selections), uri: textDocument.uri.toString(), fileName: getFileName(textDocument), selections: getCodeSelections(addition?.selections, textDocument), preamble: addition?.preamble, postamble: addition?.postamble, htmlStyle: getHtmlStyleValue(), outputHtml: isOutputHtmlEnabled(), uuid, checkKeyword: async (lineNumber: number, ...keywords: string[]) => { const codeLines = textDocument.getText().split("\n"); const codeLine = codeLines[lineNumber]; const regExp = new RegExp(`\\b(${keywords.join("|")})\\b`, "gi"); const matches = Array.from(codeLine.matchAll(regExp)); if (matches.length === 0) { return false; } for (const match of matches) { const [actualHover]: Hover[] = await commands.executeCommand( "vscode.executeHoverProvider", textDocument.uri, new Position(lineNumber, match.index), ); if (actualHover !== undefined) { return true; } } return false; }, }; } function getSelectedCode( textDocument: TextDocument, selections?: ReadonlyArray, ): string { if (selectionsAreNotEmpty(selections)) { return selections .map((selection) => { return textDocument.getText(selection); }) .join("\n"); } else { return ""; } } function connectionTypeIsNotRest(): boolean { const activeProfile = profileConfig.getActiveProfileDetail(); return ( activeProfile && activeProfile.profile.connectionType !== ConnectionType.Rest ); } function selectionsAreNotEmpty( selections: ReadonlyArray | undefined, ): boolean { return ( selections?.length > 1 || // the single cursor (if it is not in a selection) is always treated as a selection in Monaco Editor (selections?.length === 1 && !selections[0].isEmpty) ); } function getHtmlStyleValue(): string { const htmlStyleSetting = getHtmlStyle(); if (htmlStyleSetting === "(auto)") { // get the results.html.custom.style object from user settings const customStyle = workspace.getConfiguration("SAS").get<{ light?: string; dark?: string; highContrast?: string; highContrastLight?: string; }>("results.html.custom.style") || {}; switch (window.activeColorTheme.kind) { case ColorThemeKind.Light: return customStyle.light || "Illuminate"; case ColorThemeKind.Dark: return customStyle.dark || "Ignite"; case ColorThemeKind.HighContrast: return customStyle.highContrast || "HighContrast"; case ColorThemeKind.HighContrastLight: return customStyle.highContrastLight || "Illuminate"; default: return ""; } } else if (htmlStyleSetting === "(server default)") { return ""; } else { return htmlStyleSetting; } } // if no valid selection, return whole text as only selection function getCodeSelections( selections: ReadonlyArray, textDocument: TextDocument, ): ReadonlyArray | undefined { if (selectionsAreNotEmpty(selections)) { const codeSelections: Selection[] = selections.filter( (selection) => !selection.isEmpty, ); return codeSelections; } else { const lastLine = textDocument.lineCount - 1; const lastCharacter = textDocument.lineAt(lastLine).text.length; return [ new Selection(new Position(0, 0), new Position(lastLine, lastCharacter)), ]; } } function getFileName(textDocument: TextDocument): string { // Extract the query parameters const params = new URL(decodeURIComponent(textDocument.uri.toString())) .searchParams; let pathName: string; // Massage file path value const scheme = textDocument.uri?.scheme; if (scheme === "sasServer" && params.has("id")) { const id = params.get("id"); // Viya - server file // id = /compute/sessions//files/~fs~studiodev~fs~myprogram.sas // result = /studiodev/myprogram.sas if (/^\/compute\/sessions\/\w+(-\w+)+\/files\/~fs~[^/]+$/.test(id)) { pathName = `${id}`.split("/").pop().replace(/~fs~/g, "/"); } if (!pathName) { // IOM - server file // id = C:\\Users\\sasdemo\\Documents\\My SAS Files\\9.4\\myfolder\\myprogram.sas pathName = id; } } // Local files will default to utilizing the fileName. // fileName = c:\\Development\\VSCODE\\files\\myprogram.sas // We could consider utilizing the "sasContent" scheme id value but this // is the internal uri in the form of /files/files/ which would need to // potentially get translated to a readable path name. Also it doesn't work well // with the _SASPROGRAMDIR variable as it assumes folder structure. return pathName ?? textDocument.fileName ?? textDocument.uri?.fsPath; } ================================================ FILE: client/src/components/utils/deferred.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export interface Deferred { promise: Promise; resolve: (value: T | PromiseLike) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any reject: (reason?: any) => void; } export function deferred() { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const deferred = {} as Deferred; deferred.promise = new Promise((resolve, reject) => { deferred.resolve = resolve; deferred.reject = reject; }); return deferred; } ================================================ FILE: client/src/components/utils/settings.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { workspace } from "vscode"; export function isOutputHtmlEnabled(): boolean { return !!workspace.getConfiguration("SAS").get("results.html.enabled"); } export function getHtmlStyle(): string { return workspace.getConfiguration("SAS").get("results.html.style"); } export function isSideResultEnabled(): string { return workspace.getConfiguration("SAS").get("results.sideBySide"); } export function isSinglePanelEnabled(): string { return workspace.getConfiguration("SAS").get("results.singlePanel"); } export function showLogOnExecutionStart(): boolean { return workspace.getConfiguration("SAS").get("log.showOnExecutionStart"); } export function showLogOnExecutionFinish(): boolean { return workspace.getConfiguration("SAS").get("log.showOnExecutionFinish"); } export function clearLogOnExecutionStart(): boolean { return workspace.getConfiguration("SAS").get("log.clearOnExecutionStart"); } export function isShowProblemsFromSASLogEnabled(): boolean { return workspace.getConfiguration("SAS").get("problems.log.enabled"); } export function includeLogInNotebookExport(): boolean { return workspace.getConfiguration("SAS").get("notebook.export.includeLog"); } ================================================ FILE: client/src/components/utils/throttle.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Run tasks with limited concurrency * @param tasks array of tasks to run * @param limit limit of tasks that can run in parallel * @returns a promise like `Promise.all` */ export function throttle(tasks: Array<() => Promise>, limit: number) { const total = tasks.length; const results: T[] = Array(total); let count = 0; return new Promise((resolve, reject) => { function run() { const index = total - tasks.length; if (index === total) { if (count === total) { resolve(results); } return; } const task = tasks.shift(); task().then((result) => { results[index] = result; ++count; run(); }, reject); } Array(limit).fill(0).forEach(run); }); } ================================================ FILE: client/src/components/utils/treeViewSelections.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { TreeItem, TreeView } from "vscode"; /** * Gets the selected items from a tree view based on the current selection state. * * If an item is present and is not part of selections, return the item. Otherwise, * return the selections. * * @param treeView - The VS Code TreeView instance * @param item - The item that was clicked/activated * @returns An array of selected items */ export function treeViewSelections( treeView: TreeView, item: T | undefined, ): T[] { if (item) { const itemIsInSelection = treeView.selection.some( ({ id }) => id === item.id, ); if (itemIsInSelection) { return [...treeView.selection]; } return [item]; } return [...treeView.selection]; } ================================================ FILE: client/src/connection/index.ts ================================================ // Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import { AuthType, ConnectionType, ProfileConfig, ViyaProfile, toAutoExecLines, } from "../components/profile"; import { getSession as getITCSession } from "./itc"; import { ITCProtocol } from "./itc/types"; import { Config as RestConfig, getSession as getRestSession } from "./rest"; import { Error2 as ComputeError, LogLine as ComputeLogLine, LogLineTypeEnum as ComputeLogLineTypeEnum, } from "./rest/api/compute"; import { Session } from "./session"; import { getSession as getSSHSession } from "./ssh"; let profileConfig: ProfileConfig; export type ErrorRepresentation = ComputeError; export type LogLine = ComputeLogLine; export type LogLineTypeEnum = ComputeLogLineTypeEnum; export type OnLogFn = (logs: LogLine[]) => void; export interface RunResult { html5?: string; title?: string; } export interface BaseConfig { sasOptions?: string[]; autoExecLines?: string[]; } export function getSession(): Session { if (!profileConfig) { profileConfig = new ProfileConfig(); } // retrieve active & valid profile const activeProfile = profileConfig.getActiveProfileDetail(); const validProfile = profileConfig.validateProfile(activeProfile); if (validProfile.type === AuthType.Error) { throw new Error(validProfile.error); } switch (validProfile.profile?.connectionType) { case ConnectionType.Rest: return getRestSession(toRestConfig(validProfile.profile)); case ConnectionType.SSH: return getSSHSession(validProfile.profile); case ConnectionType.COM: return getITCSession(validProfile.profile, ITCProtocol.COM); case ConnectionType.IOM: return getITCSession(validProfile.profile, ITCProtocol.IOMBridge); default: throw new Error( l10n.t("Invalid connectionType. Check Profile settings."), ); } } /** * Translates a {@link ViyaProfile} interface to a {@link RestConfig} interface. * @param profile an input {@link ViyaProfile} to translate. * @returns RestConfig instance derived from the input profile. */ function toRestConfig(profile: ViyaProfile): RestConfig { const mapped: RestConfig = profile; if (profile.autoExec) { mapped.autoExecLines = toAutoExecLines(profile.autoExec); } return mapped; } ================================================ FILE: client/src/connection/itc/CodeRunner.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { commands } from "vscode"; import { v4 } from "uuid"; import { ITCSession } from "."; import { LogLine, getSession } from ".."; import { useRunStore } from "../../store"; import { Session } from "../session"; import { extractTextBetweenTags } from "../util"; let wait: Promise | undefined; export async function executeRawCode(code: string): Promise { const randomId = v4(); const startTag = `<${randomId}>`; const endTag = ``; const task = () => _runCode( async (session) => { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions await (session as ITCSession).execute( `Write-Host "${startTag}"\n${code}\nWrite-Host "${endTag}"\n`, ); }, startTag, endTag, ); wait = wait ? wait.then(task) : task(); return wait; } export async function runCode( code: string, startTag: string = "", endTag: string = "", ): Promise { const task = () => _runCode( // eslint-disable-next-line @typescript-eslint/consistent-type-assertions async (session) => await (session as ITCSession).run(code, true), startTag, endTag, ); wait = wait ? wait.then(task) : task(); return wait; } async function _runCode( runCallback: (session: Session) => void, startTag: string = "", endTag: string = "", ): Promise { // If we're already executing code, lets wait for it // to finish up. let unsubscribe; if (useRunStore.getState().isExecutingCode) { await new Promise((resolve) => { unsubscribe = useRunStore.subscribe( (state) => state.isExecutingCode, (isExecutingCode) => !isExecutingCode && resolve(true), ); }); } const { setIsExecutingCode } = useRunStore.getState(); setIsExecutingCode(true, false); commands.executeCommand("setContext", "SAS.running", true); const session = getSession(); let logText = ""; const onExecutionLogFn = session.onExecutionLogFn; const outputLines = []; const addLine = (logLines: LogLine[]) => { outputLines.push(...logLines.map(({ line }) => line)); }; try { await session.setup(true); // Lets capture output to use it on session.onExecutionLogFn = addLine; await runCallback(session); const logOutput = outputLines.filter((line) => line.trim()).join(""); logText = extractTextBetweenTags(logOutput, startTag, endTag); } finally { unsubscribe && unsubscribe(); // Lets update our session to write to the log session.onExecutionLogFn = onExecutionLogFn; setIsExecutingCode(false); commands.executeCommand("setContext", "SAS.running", false); } return logText; } ================================================ FILE: client/src/connection/itc/ItcLibraryAdapter.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import type { SortModelItem } from "ag-grid-community"; import { ChildProcessWithoutNullStreams } from "child_process"; import { onRunError } from "../../commands/run"; import { LibraryAdapter, LibraryItem, TableData, TableQuery, TableRow, } from "../../components/LibraryNavigator/types"; import { ColumnCollection, TableInfo } from "../rest/api/compute"; import { getColumnIconType } from "../util"; import { executeRawCode, runCode } from "./CodeRunner"; import { Config } from "./types"; class ItcLibraryAdapter implements LibraryAdapter { protected hasEstablishedConnection: boolean = false; protected shellProcess: ChildProcessWithoutNullStreams; protected pollingForLogResults: boolean = false; protected log: string[] = []; protected endTag: string = ""; protected outputFinished: boolean = false; protected config: Config; public async connect(): Promise { this.hasEstablishedConnection = true; } public async setup(): Promise { if (this.hasEstablishedConnection) { return; } await this.connect(); } public async deleteTable(item: LibraryItem): Promise { const code = ` proc datasets library=${item.library} nolist nodetails; delete ${item.name}; run; `; await this.runCode(code); } public async getColumns(item: LibraryItem): Promise { const code = ` $runner.GetColumns("${item.library}", "${item.name}") `; const output = await executeRawCode(code); const rawColumns = JSON.parse(output); const columns = rawColumns.map((column) => ({ ...column, type: getColumnIconType(column), })); return { items: columns, count: -1, }; } public async getLibraries(): Promise<{ items: LibraryItem[]; count: number; }> { const code = ` $runner.GetLibraries() `; const output = await executeRawCode(code); const rawLibraries = JSON.parse(output).libraries; const libraries = rawLibraries.map((row: string[]) => { const [libName, readOnlyValue] = row; return { type: "library", uid: libName, id: libName, name: libName, readOnly: readOnlyValue === "yes", }; }); return { items: libraries, count: -1, }; } public async getRows( item: LibraryItem, start: number, limit: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise { const { rows: rawRowValues, count } = await this.getDatasetInformation( item, start, limit, sortModel, query, ); const rows = rawRowValues.map((line, idx: number): TableRow => { const rowData = [`${start + idx + 1}`].concat(line); return { cells: rowData }; }); return { rows, count, }; } public async getRowsAsCSV( item: LibraryItem, start: number, limit: number, ): Promise { // We only need the columns for the first page of results const columns = start === 0 ? { columns: ["INDEX"].concat( (await this.getColumns(item)).items.map((column) => column.name), ), } : {}; const { rows } = await this.getRows(item, start, limit, [], undefined); rows.unshift(columns); // Fetching csv doesn't rely on count. Instead, we get the count // upfront via getTableRowCount return { rows, count: -1 }; } public async getTableRowCount( item: LibraryItem, ): Promise<{ rowCount: number; maxNumberOfRowsToRead: number }> { const code = ` proc sql; SELECT COUNT(1) into: COUNT FROM ${item.library}.${item.name}; quit; %put &COUNT; `; const output = await this.runCode(code, "", ""); const rowCount = parseInt(output.replace(/[^0-9]/g, ""), 10); return { rowCount, maxNumberOfRowsToRead: 100 }; } public async getTables(item: LibraryItem): Promise<{ items: LibraryItem[]; count: number; }> { const code = ` $runner.GetTables("${item.name}") `; const output = await executeRawCode(code); const rawTables = JSON.parse(output).tables; const tables = rawTables.map((table: string): LibraryItem => { return { type: "table", uid: `${item.name!}.${table}`, id: table, name: table, library: item.name, readOnly: item.readOnly, }; }); return { items: tables, count: -1 }; } protected async getDatasetInformation( item: LibraryItem, start: number, limit: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise<{ rows: Array; count: number }> { const sortString = sortModel .map((col) => `${col.colId} ${col.sort}`) .join(","); const code = ` $runner.GetDatasetRecords("${item.library}","${item.name}", ${start}, ${limit}, "${sortString}", '${query ? JSON.stringify(query) : ""}') `; const output = await executeRawCode(code); try { return JSON.parse(output); } catch (e) { console.warn("Failed to load table data with error", e); console.warn("Raw output", output); throw new Error( l10n.t( "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.", ), ); } } public async getTableInfo(item: LibraryItem): Promise { const basicInfo: TableInfo = { bookmarkLength: 0, // Not available in vtable columnCount: 0, compressionRoutine: "", creationTimeStamp: "", encoding: "", engine: "", extendedType: "", label: "", libref: item.library, logicalRecordCount: 0, modifiedTimeStamp: "", name: item.name, physicalRecordCount: 0, recordLength: 0, rowCount: 0, type: "DATA", }; try { // Use the PowerShell GetTableInfo function which queries sashelp.vtable const code = ` $runner.GetTableInfo("${item.library}", "${item.name}") `; const output = await executeRawCode(code); const tableInfo = JSON.parse(output); return { ...basicInfo, columnCount: tableInfo.columnCount || basicInfo.columnCount, compressionRoutine: tableInfo.compressionRoutine || basicInfo.compressionRoutine, creationTimeStamp: tableInfo.creationTimeStamp || basicInfo.creationTimeStamp, encoding: tableInfo.encoding || basicInfo.encoding, engine: tableInfo.engine || basicInfo.engine, extendedType: tableInfo.extendedType || basicInfo.extendedType, label: tableInfo.label || basicInfo.label, libref: tableInfo.libref || basicInfo.libref, logicalRecordCount: tableInfo.rowCount || basicInfo.logicalRecordCount, modifiedTimeStamp: tableInfo.modifiedTimeStamp || basicInfo.modifiedTimeStamp, name: tableInfo.name || basicInfo.name, physicalRecordCount: tableInfo.rowCount || basicInfo.physicalRecordCount, recordLength: tableInfo.recordLength || basicInfo.recordLength, rowCount: tableInfo.rowCount || basicInfo.rowCount, type: tableInfo.type || basicInfo.type, }; } catch (error) { console.warn("Failed to get table info:", error); // If anything fails, return basic info return basicInfo; } } protected async executionHandler( callback: () => Promise, ): Promise { try { return await callback(); } catch (e) { onRunError(e); return ""; } } protected async runCode( code: string, startTag: string = "", endTag: string = "", ): Promise { return this.executionHandler(() => runCode(code, startTag, endTag)); } protected async executeRawCode(code: string): Promise { return this.executionHandler(() => executeRawCode(code)); } } export default ItcLibraryAdapter; ================================================ FILE: client/src/connection/itc/ItcServerAdapter.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { FileType, Uri, workspace } from "vscode"; import { v4 } from "uuid"; import { onRunError } from "../../commands/run"; import { Messages, SAS_SERVER_ROOT_FOLDER, SAS_SERVER_ROOT_FOLDERS, SERVER_FOLDER_ID, } from "../../components/ContentNavigator/const"; import { ContentAdapter, ContentItem, RootFolderMap, } from "../../components/ContentNavigator/types"; import { ContextMenuAction, ContextMenuProvider, convertStaticFolderToContentItem, createStaticFolder, homeDirectoryNameAndType, sortedContentItems, } from "../../components/ContentNavigator/utils"; import { getGlobalStorageUri } from "../../components/ExtensionContext"; import { ProfileWithFileRootOptions } from "../../components/profile"; import { getLink, getResourceId, getSasServerUri } from "../rest/util"; import { executeRawCode } from "./CodeRunner"; import { PowershellResponse, ScriptActions } from "./types"; import { getDirectorySeparator } from "./util"; class ItcServerAdapter implements ContentAdapter { protected sessionId: string; private rootFolders: RootFolderMap; private contextMenuProvider: ContextMenuProvider; public constructor( protected readonly fileNavigationCustomRootPath: ProfileWithFileRootOptions["fileNavigationCustomRootPath"], protected readonly fileNavigationRoot: ProfileWithFileRootOptions["fileNavigationRoot"], ) { this.rootFolders = {}; this.contextMenuProvider = new ContextMenuProvider( [ ContextMenuAction.CreateChild, ContextMenuAction.Delete, ContextMenuAction.Update, ContextMenuAction.CopyPath, ContextMenuAction.AllowDownload, ], { [ContextMenuAction.CopyPath]: (item) => item.id !== SERVER_FOLDER_ID, }, ); } /* The following methods are needed for favorites, which are not applicable to sas server */ public async addChildItem(): Promise { throw new Error("Method not implemented"); } public async addItemToFavorites(): Promise { throw new Error("Method not implemented"); } public removeItemFromFavorites(): Promise { throw new Error("Method not implemented"); } public getRootFolder(): ContentItem | undefined { return undefined; } /* The following is needed for creating a flow, which isn't supported on sas server */ public async getParentOfItem( item: ContentItem, ): Promise { const parent = await this.getItemAtPath(item.parentFolderUri); if (!parent) { return undefined; } return parent; } public async getFolderPathForItem(): Promise { return ""; } public async connect(): Promise { return; } public connected(): boolean { return true; } public async createNewFolder( parentItem: ContentItem, folderName: string, ): Promise { try { const { success, data } = await this.execute( ScriptActions.CreateDirectory, { folderPath: parentItem.uri, folderName, }, ); if (!success) { return; } return this.convertPowershellResponseToContentItem(data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async createNewItem( parentItem: ContentItem, fileName: string, buffer?: ArrayBufferLike, ): Promise { try { const { success, data } = await this.execute(ScriptActions.CreateFile, { folderPath: parentItem.uri, fileName, content: buffer ? Buffer.from(buffer).toString("base64") : "", }); if (!success) { return; } return this.convertPowershellResponseToContentItem(data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async deleteItem(item: ContentItem): Promise { try { const { success } = await this.execute(ScriptActions.DeleteFile, { filePath: item.uri, }); return success; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } } private fileNavigationRootSettings() { return { fileNavigationCustomRootPath: this.fileNavigationCustomRootPath, fileNavigationRoot: this.fileNavigationRoot || "USER", }; } public async getChildItems(parentItem: ContentItem): Promise { // If the user is fetching child items of the root folder, give them the // "home" directory if (parentItem.id === SERVER_FOLDER_ID) { const { success, data: items } = await this.execute( ScriptActions.GetChildItems, { path: "/", ...this.fileNavigationRootSettings(), }, ); if (!success) { if (this.fileNavigationRoot === "CUSTOM") { throw new Error(Messages.FileNavigationRootUserError); } return []; } const uri = items[0].parentFolderUri; const homeFolder = convertStaticFolderToContentItem( createStaticFolder( uri, ...homeDirectoryNameAndType( this.fileNavigationRoot, this.fileNavigationCustomRootPath, ), "/", "getDirectoryMembers", ), { write: false, delete: false, addMember: true, }, ); homeFolder.contextValue = this.contextMenuProvider.availableActions(homeFolder); return [homeFolder]; } const { success, data: items } = await this.execute( ScriptActions.GetChildItems, { path: getLink(parentItem.links, "GET", "getDirectoryMembers").uri, ...this.fileNavigationRootSettings(), }, ); if (!success) { return []; } const childItems = items.map( this.convertPowershellResponseToContentItem.bind(this), ); return sortedContentItems(childItems); } public async getPathOfItem(item: ContentItem): Promise { return item.uri; } private async getTempFile() { const tempFile = v4(); const globalStorageUri = getGlobalStorageUri(); try { await workspace.fs.readDirectory(globalStorageUri); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { await workspace.fs.createDirectory(globalStorageUri); } const outputFile = Uri.joinPath(globalStorageUri, tempFile); return outputFile; } public async getContentOfItem(item: ContentItem): Promise { const filePath = item.uri; const outputFile = await this.getTempFile(); try { const { success } = await this.execute(ScriptActions.FetchFileContent, { filePath, outputFile: outputFile.fsPath, }); if (!success) { return ""; } // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return ""; } const file = await workspace.fs.readFile(outputFile); await workspace.fs.delete(outputFile); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return file as unknown as string; } public async getContentOfUri(uri: Uri): Promise { const item = await this.getItemAtPath(getResourceId(uri)); return ((await this.getContentOfItem(item)) || "").toString(); } public async getItemOfUri(uri: Uri): Promise { return this.getItemAtPath(getResourceId(uri)); } public async getRootItems(): Promise { for (let index = 0; index < SAS_SERVER_ROOT_FOLDERS.length; ++index) { const delegateFolderName = SAS_SERVER_ROOT_FOLDERS[index]; this.rootFolders[delegateFolderName] = { uid: `${index}`, ...convertStaticFolderToContentItem(SAS_SERVER_ROOT_FOLDER, { write: false, delete: false, addMember: false, }), }; } return this.rootFolders; } public async getUriOfItem(item: ContentItem): Promise { return item.vscUri; } public async moveItem( item: ContentItem, targetParentFolderUri: string, ): Promise { try { const { success, data } = await this.execute(ScriptActions.RenameFile, { oldPath: item.uri, newPath: targetParentFolderUri, newName: item.name, }); if (!success) { return undefined; } return this.convertPowershellResponseToContentItem(data).vscUri; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return undefined; } } public async renameItem( item: ContentItem, newName: string, ): Promise { try { const { success, data } = await this.execute(ScriptActions.RenameFile, { oldPath: item.uri, newPath: item.parentFolderUri, newName, }); if (!success) { return undefined; } return this.convertPowershellResponseToContentItem(data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return undefined; } } public async updateContentOfItem(uri: Uri, content: string): Promise { try { const item = await this.getItemAtPath(getResourceId(uri)); await this.execute(ScriptActions.UpdateFile, { filePath: item.uri, content, }); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } protected async getItemAtPathWithName( path: string, name: string, ): Promise { const { data: items } = await this.execute(ScriptActions.GetChildItems, { path, ...this.fileNavigationRootSettings(), }); const foundItem = items.find((item) => item.name === name); return this.convertPowershellResponseToContentItem(foundItem); } protected async getItemAtPath(path: string): Promise { const separator = getDirectorySeparator(path); const pathPieces = path.split(separator); const name = pathPieces.pop(); return await this.getItemAtPathWithName(pathPieces.join(separator), name); } private convertPowershellResponseToContentItem( response: PowershellResponse, ): ContentItem { // response.category can be 0, 1, or 2. 0 is directory, 1 is "sas" type, 2 is other file types const type = response.category === 0 ? FileType.Directory : FileType.File; const uri = response.uri; const links = [ type === FileType.Directory && { method: "GET", rel: "getDirectoryMembers", href: uri, uri: uri, type: "GET", }, { method: "GET", rel: "self", href: uri, uri: uri, type: "GET" }, ].filter((link) => link); const modifiedTimeStamp = new Date( response.modifiedTimeStamp.replace(/[^0-9]/g, ""), ).getTime(); const item: ContentItem = { id: uri, uri, name: response.name, creationTimeStamp: new Date(response.creationTimeStamp).getTime() ?? 0, modifiedTimeStamp, links, permission: { write: true, delete: true, addMember: type === FileType.Directory, }, type: "", parentFolderUri: response.parentFolderUri, fileStat: { ctime: 0, mtime: modifiedTimeStamp, size: response.size, type, }, }; return { ...item, contextValue: this.contextMenuProvider.availableActions(item), vscUri: getSasServerUri(item, false), }; } private async execute(incomingCode: string, params: Record) { let code = incomingCode; Object.keys(params).forEach((key: string) => { // This is a little confusing. Basically, we can pass in any kind of string. Some of those // strings break powershell (ex. NewFile+!@$%^&*.txt). Thus, we create one level of indirection // where we wrap these unprocessed strings in the powershell "heredoc" syntax before passing things // along const codeToPrefix = `$processed_${key}=\n@'\n${params[key]}\n'@\n`; code = codeToPrefix + code.replace(`$${key}`, `$processed_${key}`); }); try { const output = await executeRawCode(code); const decodedOutput = output ? JSON.parse(output) : ""; // If we do have an error message with more information, lets dump it to console if (decodedOutput && !decodedOutput.success && decodedOutput.message) { console.dir(decodedOutput.message); } return decodedOutput; } catch (e) { onRunError(e); return ""; } } } export default ItcServerAdapter; ================================================ FILE: client/src/connection/itc/LineParser.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export class LineParser { protected processedLines: string[] = []; protected capturingLine: boolean = false; public constructor( protected startTag: string, protected endTag: string, protected returnNonProcessedLines: boolean, ) {} public processLine(line: string): string | undefined { if (line.includes(this.startTag) || this.capturingLine) { this.processedLines.push(line); this.capturingLine = true; if (line.includes(this.endTag)) { return this.processedLine(); } return; } return this.returnNonProcessedLines ? line : undefined; } protected processedLine(): string { this.capturingLine = false; const fullError = this.processedLines .join("") .replace(this.startTag, "") .replace(this.endTag, ""); this.processedLines = []; return fullError; } public isCapturingLine(): boolean { return this.capturingLine; } public reset() { this.capturingLine = false; this.processedLines = []; } } ================================================ FILE: client/src/connection/itc/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { CancellationTokenSource, Uri, env, l10n, window, workspace, } from "vscode"; import { ChildProcessWithoutNullStreams, spawn } from "child_process"; import { resolve } from "path"; import { LogLineTypeEnum, RunResult } from ".."; import { getGlobalStorageUri, getSecretStorage, } from "../../components/ExtensionContext"; import { updateStatusBarItem } from "../../components/StatusBarItem"; import { Session } from "../session"; import { extractOutputHtmlFileName } from "../util"; import { LineParser } from "./LineParser"; import { getScript } from "./script"; import { LineCodes, Tags } from "./script/env.json"; import { Config, ITCProtocol } from "./types"; import { decodeEntities, escapePowershellString, getDirectorySeparator, } from "./util"; const LogLineTypes: LogLineTypeEnum[] = [ "normal", "hilighted", "source", "title", "byline", "footnote", "error", "warning", "note", "message", ]; const SECRET_STORAGE_NAMESPACE = "ITC_SECRET_STORAGE"; let sessionInstance: ITCSession; export class ITCSession extends Session { private _config: Config; private _shellProcess: ChildProcessWithoutNullStreams; private _html5FileName: string; private _runResolve: ((value?) => void) | undefined; private _runReject: ((reason?) => void) | undefined; private _workDirectory: string; private _password: string; private _secretStorage; private _passwordKey: string; private _pollingForLogResults: boolean; private _logLineType = 0; private _passwordInputCancellationTokenSource: | CancellationTokenSource | undefined; private _errorParser: LineParser; private _workDirectoryParser: LineParser; constructor() { super(); this._password = ""; this._secretStorage = getSecretStorage(SECRET_STORAGE_NAMESPACE); this._pollingForLogResults = false; this._errorParser = new LineParser( Tags.ErrorStartTag, Tags.ErrorEndTag, true, ); this._workDirectoryParser = new LineParser( Tags.WorkDirStartTag, Tags.WorkDirEndTag, false, ); } public set config(value: Config) { this._config = value; this._passwordKey = `${value.host}${value.protocol}${value.username}`; } /** * Initialization logic that should be performed prior to execution. * @returns void promise. */ protected establishConnection = async (): Promise => { const { host, port, protocol, username, interopLibraryFolderPath } = this._config; const setupPromise = new Promise((resolve, reject) => { this._runResolve = resolve; this._runReject = reject; }); if (this._shellProcess && !this._shellProcess.killed) { this._runResolve(); return; // manually terminate to avoid executing the code below } this._shellProcess = spawn( "chcp 65001 >NUL & powershell.exe -NonInteractive -NoProfile -Command -", { shell: true, env: process.env, }, ); this._shellProcess.stdout.on("data", this.onShellStdOut); this._shellProcess.stderr.on("data", this.onShellStdErr); this._shellProcess.stdin.write( getScript({ interopLibraryFolderPath: escapePowershellString( interopLibraryFolderPath || "", ), }) + "\n", this.onWriteComplete, ); this._shellProcess.stdin.write( `$runner = New-Object -TypeName SASRunner\n`, this.onWriteComplete, ); /* * There are cases where the higher level run command will invoke setup multiple times. * Avoid re-initializing the session when this happens. In a first run scenario a work dir * will not exist. The work dir should only be deleted when close is invoked. */ if (!this._workDirectory) { this._shellProcess.stdin.write(`$profileHost = "${host}"\n`); this._shellProcess.stdin.write(`$port = ${port}\n`); this._shellProcess.stdin.write(`$protocol = ${protocol}\n`); this._shellProcess.stdin.write( `$username = "${escapePowershellString(username)}"\n`, ); const password = await this.fetchPassword(); this._shellProcess.stdin.write( `$password = "${escapePowershellString(password)}"\n`, ); this._shellProcess.stdin.write( `$serverName = "${ protocol === ITCProtocol.COM ? "ITC Local" : "ITC IOM Bridge" }"\n`, ); this._shellProcess.stdin.write(`$displayLang = "${env.language}"\n`); this._shellProcess.stdin.write( `$runner.Setup($profileHost,$username,$password,$port,$protocol,$serverName,$displayLang)\n`, this.onWriteComplete, ); this._workDirectoryParser.reset(); this._shellProcess.stdin.write( "$runner.ResolveSystemVars()\n", this.onWriteComplete, ); if (this._config.sasOptions?.length > 0) { const sasOptsInput = `$sasOpts=${this.formatSASOptions( this._config.sasOptions, )}\n`; this._shellProcess.stdin.write(sasOptsInput, this.onWriteComplete); this._shellProcess.stdin.write( `$runner.SetOptions($sasOpts)\n`, this.onWriteComplete, ); } } // free objects in the scripting env process.on("exit", async () => { close(); }); return setupPromise; }; private storePassword = async () => await this._secretStorage.store(this._passwordKey, this._password); private clearPassword = async () => { await this._secretStorage.store(this._passwordKey, ""); this._password = ""; }; private fetchPassword = async (): Promise => { if (this._config.protocol === ITCProtocol.COM) { return ""; } const storedPassword = await this._secretStorage.get(this._passwordKey); if (storedPassword) { this._password = storedPassword; return storedPassword; } const source = new CancellationTokenSource(); this._passwordInputCancellationTokenSource = source; this._password = (await window.showInputBox( { ignoreFocusOut: true, password: true, prompt: l10n.t("Enter your password for this connection."), title: l10n.t("Enter your password"), }, this._passwordInputCancellationTokenSource.token, )) || ""; return this._password; }; /** * Executes the given input code. * @param code A string of SAS code to execute. * @param onLog A callback handler responsible for marshalling log lines back to the higher level extension API. * @returns A promise that eventually resolves to contain the given {@link RunResult} for the input code execution. */ protected _run = async ( code: string, skipPageHeaders?: boolean, ): Promise => { const runPromise = new Promise((resolve, reject) => { this._runResolve = resolve; this._runReject = reject; }); //write ODS output to work so that the session cleans up after itself const codeWithODSPath = code.replace( /\bods html5\(id=vscode\)([^;]*;)/i, `ods html5(id=vscode) path="${this._workDirectory}" $1`, ); //write an end mnemonic so that the handler knows when execution has finished const codeWithEnd = `${codeWithODSPath}\n%put ${LineCodes.RunEndCode};`; const codeWithEscapeNewLine = codeWithEnd.replace( /\n/g, "\n'@+[environment]::NewLine+@'\n", ); const codeToRun = `$code=\n@'\n${codeWithEscapeNewLine}\n'@\n`; this._html5FileName = ""; this._shellProcess.stdin.write(codeToRun); this._pollingForLogResults = true; this._shellProcess.stdin.write(`$runner.Run($code)\n`, async (error) => { if (error) { this._runReject(error); } await this.fetchLog(skipPageHeaders); }); return runPromise; }; public execute = async (code: string): Promise => { const runPromise = new Promise((resolve, reject) => { this._runResolve = resolve; this._runReject = reject; }); this._html5FileName = ""; this._pollingForLogResults = true; const codeToExecute = `${code}\nWrite-Host "${LineCodes.RunEndCode}"\n`; this._shellProcess.stdin.write(codeToExecute, async (error) => { if (error) { this._runReject(error); } }); return runPromise; }; /** * Cleans up resources for the given SAS session. * @returns void promise. */ protected _close = async (): Promise => { return new Promise((resolve) => { if (this._shellProcess) { this._shellProcess.stdin.write( "$runner.Close()\n", this.onWriteComplete, ); this._shellProcess.kill(); this._shellProcess = undefined; this._workDirectory = undefined; this._runReject = undefined; this._runResolve = undefined; } this.clearPassword(); resolve(); updateStatusBarItem(false); }); }; /** * Cancels a running SAS program */ public cancel = async () => { this._pollingForLogResults = false; this._shellProcess.stdin.write("$runner.Cancel()\n", async (error) => { if (error) { this._runReject(error); } await this.fetchLog(); }); }; /** * Formats the SAS Options provided in the profile into a format * that the shell process can understand. * @param sasOptions SAS Options array from the connection profile. * @returns a string denoting powershell syntax for an array literal. */ private formatSASOptions = (sasOptions: string[]): string => { const optionsVariable = `@("${sasOptions.join(`","`)}")`; return optionsVariable; }; /** * Flushes the SAS log in chunks of [chunkSize] length, * writing each chunk to stdout. */ private fetchLog = async (skipPageHeaders?: boolean): Promise => { const pollingInterval = setInterval(() => { if (!this._pollingForLogResults) { clearInterval(pollingInterval); } const skipPageHeadersValue = skipPageHeaders ? "$true" : "$false"; this._shellProcess.stdin.write( ` do { $chunkSize = 32768 $count = $runner.FlushLogLines($chunkSize, ${skipPageHeadersValue}) } while ($count -gt 0)\n `, this.onWriteComplete, ); }, 2 * 1000); }; /** * Handles stderr output from the powershell child process. * @param chunk a buffer of stderr output from the child process. */ private onShellStdErr = (chunk: Buffer): void => { const msg = chunk.toString(); const errorMessage = this._errorParser.processLine(msg); if (!errorMessage) { return; } this._runReject( new Error(this.fetchHumanReadableErrorMessage(errorMessage)), ); // If we encountered an error in setup, we need to go through everything again const fatalErrors = [ /Setup error/, /powershell\.exe/, /LoadingInterop error/, ]; if (fatalErrors.find((regex) => regex.test(errorMessage))) { // If we can't even run the shell script (i.e. powershell.exe not found), // we'll also need to dismiss the password prompt this._passwordInputCancellationTokenSource && this._passwordInputCancellationTokenSource.cancel(); this.clearPassword(); this._shellProcess.kill(); this._workDirectory = undefined; } }; private fetchWorkDirectory = (line: string): string | undefined => { const foundWorkDirectory = this._workDirectoryParser.processLine(line); // We don't want to output any of the captured lines if (this._workDirectoryParser.isCapturingLine()) { return; } return foundWorkDirectory || ""; }; private fetchHumanReadableErrorMessage = (msg: string): string => { const atLineIndex = msg.indexOf("At line"); const errorMessage = atLineIndex ? msg.slice(0, atLineIndex) : msg; // Dump error to console console.warn("shellProcess stderr: " + errorMessage); if (/powershell\.exe/.test(msg)) { return l10n.t("This platform does not support this connection type."); } if (/LoadingInterop error/.test(msg)) { return l10n.t("Unable to load required libraries."); } // Do we have SAS messages? const sasMessages = errorMessage .replace(/\n|\t/gm, "") .match(/([^<]*)<\/SASMessage>/g); if (sasMessages && sasMessages.length) { return decodeEntities( sasMessages .map((sasMessage) => sasMessage .replace(//, "") .replace(/<\/SASMessage>/, ""), ) .join(" "), ); } // Do we have a description? const descriptions = errorMessage .replace(/\n|\t/gm, "") .match(/([^<]*)<\/description>/g); if (descriptions && descriptions.length) { return decodeEntities( descriptions .map((sasMessage) => sasMessage .replace(//, "") .replace(/<\/description>/, ""), ) .join(" "), ); } // If we have neither of those, lets just point the user to the console return l10n.t( "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.", ); }; /** * Handles stdout output from the powershell child process. * @param data a buffer of stdout output from the child process. */ private onShellStdOut = (data: Buffer): void => { const output = data.toString(); const outputLines = output.split(/\n|\r\n/); outputLines.forEach((line: string) => { if (!line) { return; } if (!this.processLineCodes(line)) { if (!this._workDirectory) { const foundWorkDirectory = this.fetchWorkDirectory(line); if (foundWorkDirectory === undefined) { return; } if (foundWorkDirectory) { this._workDirectory = foundWorkDirectory.trim(); this._runResolve(); updateStatusBarItem(true); return; } } this._html5FileName = extractOutputHtmlFileName( line, this._html5FileName, ); if (this._workDirectory) { this._onExecutionLogFn?.([{ type: this.getLogLineType(), line }]); } else { this._onSessionLogFn?.([{ type: this.getLogLineType(), line }]); } } }); }; private processLineCodes(line: string): boolean { if (line.endsWith(LineCodes.RunEndCode)) { // run completed this.fetchResults(); return true; } if (line.includes(LineCodes.SessionCreatedCode)) { this.storePassword(); return true; } if (line.includes(LineCodes.ResultsFetchedCode)) { this.displayResults(); return true; } if (line.includes(LineCodes.RunCancelledCode)) { this._runResolve({}); return true; } if (line.includes(LineCodes.LogLineType)) { const start = line.indexOf(LineCodes.LogLineType) + LineCodes.LogLineType.length + 1; this._logLineType = parseInt(line.slice(start, start + 1)); return true; } return false; } private getLogLineType(): LogLineTypeEnum { const result = LogLineTypes[this._logLineType]; this._logLineType = 0; return result; } /** * Generic call for use on stdin write completion. * @param err The error encountered on the write attempt. Undefined if no error occurred. */ private onWriteComplete = (err: Error): void => { if (err) { this._runReject?.(err); } }; /** * Not implemented. */ public sessionId = (): string => { throw new Error("Not Implemented"); }; /** * Fetches the ODS output results for the latest html results file. */ private fetchResults = async () => { if (!this._html5FileName) { this._pollingForLogResults = false; return this._runResolve({}); } const globalStorageUri = getGlobalStorageUri(); try { await workspace.fs.readDirectory(globalStorageUri); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { await workspace.fs.createDirectory(globalStorageUri); } this._pollingForLogResults = false; const outputFileUri = Uri.joinPath( globalStorageUri, `${this._html5FileName}.htm`, ); const directorySeparator = getDirectorySeparator(this._workDirectory); const filePath = this._config.protocol === ITCProtocol.COM ? resolve(this._workDirectory, this._html5FileName + ".htm") : `${this._workDirectory}${directorySeparator}${this._html5FileName}.htm`; this._shellProcess.stdin.write( `$filePath = "${filePath}" $outputFile = "${outputFileUri.fsPath}" $runner.FetchResultsFile($filePath, $outputFile)\n`, this.onWriteComplete, ); }; private displayResults = async () => { const globalStorageUri = getGlobalStorageUri(); const outputFileUri = Uri.joinPath( globalStorageUri, `${this._html5FileName}.htm`, ); const file = await workspace.fs.readFile(outputFileUri); const htmlResults = (file || "").toString(); if (file) { workspace.fs.delete(outputFileUri); } const runResult: RunResult = {}; if (htmlResults.search('<*id="IDX*.+">') !== -1) { runResult.html5 = htmlResults; runResult.title = "Result"; } this._runResolve(runResult); }; } /** * Creates a new SAS 9 Session. * @param c Instance denoting configuration parameters for this connection profile. * @returns created COM session. */ export const getSession = ( c: Partial, protocol: ITCProtocol, ): Session => { const defaults = { host: "localhost", port: 0, username: "", protocol, }; if (!sessionInstance) { sessionInstance = new ITCSession(); } sessionInstance.config = { ...defaults, ...c }; return sessionInstance; }; ================================================ FILE: client/src/connection/itc/script/env.json ================================================ { "LineCodes": { "LogLineType": "--vscode-sas-extension-log-line-type--", "ResultsFetchedCode": "--vscode-sas-extension-results-fetched--", "RunCancelledCode": "--vscode-sas-extension-run-cancelled--", "RunEndCode": "--vscode-sas-extension-submit-end--", "SessionCreatedCode": "--vscode-sas-extension-session-created--" }, "Tags": { "ErrorEndTag": "", "ErrorStartTag": "", "WorkDirEndTag": "", "WorkDirStartTag": "" } } ================================================ FILE: client/src/connection/itc/script/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import fs from "fs"; import path from "path"; type ScriptProperties = { interopLibraryFolderPath?: string; }; export const getScript = ({ interopLibraryFolderPath = "", }: ScriptProperties) => ` Set-Location -Path "${__dirname}" $global:interopLibraryFolderPath="${interopLibraryFolderPath}" ${fs.readFileSync(path.join(__dirname, "itc.ps1")).toString()} `; ================================================ FILE: client/src/connection/itc/script/itc.ps1 ================================================ using namespace System.Collections.Generic $global:env = (Get-Content -Path "$PWD\\env.json" -Raw) | ConvertFrom-Json #region Table Helpers function GetFilteredView { param( [string]$Library, [string]$Table, [string]$SortCriteria = "", [string]$JSONQueryData = "" ) $epoch = [datetime]::FromFileTimeUtc(0) $currentUtcTime = (Get-Date).ToUniversalTime() $ts = [int64]($currentUtcTime - $epoch).TotalSeconds $tableName = "WORK.temp_$ts" $query = "CREATE VIEW $tableName AS SELECT * FROM $library.$table" if ($JSONQueryData -ne "") { $queryParams = $JSONQueryData | ConvertFrom-Json if ($queryParams.filterValue) { $query = "$query WHERE $($queryParams.filterValue)" } } if ($SortCriteria -ne "") { $query = "$query ORDER BY $sortCriteria" } return @{ Query = $query Name = $tableName } } #endregion Table Helpers #region Setup Helpers function GetInteropDirectory { # try to load from user specified path first if ("$($global:interopLibraryFolderPath)") { if (Test-Path -Path "$($global:interopLibraryFolderPath)\\SASInterop.dll") { return "$($global:interopLibraryFolderPath)" } } # try to load path from registry try { $pathFromRegistry = (Get-ItemProperty -ErrorAction Stop -Path "HKLM:\\SOFTWARE\\WOW6432Node\\SAS Institute Inc.\\Common Data\\Shared Files\\Integration Technologies").Path if (Test-Path -Path "$pathFromRegistry\\SASInterop.dll") { return $pathFromRegistry } } catch { } # try to load path from integration technologies $itcPath = "C:\\Program Files\\SASHome\\x86\\Integration Technologies" if (Test-Path -Path "$itcPath\\SASInterop.dll") { return $itcPath } return "" } #endregion Setup Helpers try { $interopDir = GetInteropDirectory Add-Type -Path "$interopDir\\SASInterop.dll" Add-Type -Path "$interopDir\\SASOManInterop.dll" } catch { Write-Error "$($global:env.Tags.ErrorStartTag)LoadingInterop error: $_$($global:env.Tags.ErrorEndTag)" } class SASRunner { [System.__ComObject] $objSAS [System.__ComObject] $objKeeper [System.__ComObject] $dataConnection [void]ResolveSystemVars() { try { Write-Host "$($global:env.Tags.WorkDirStartTag)" Write-Host $this.GetWorkDir() Write-Host "$($global:env.Tags.WorkDirEndTag)" } catch { Write-Error "$($global:env.Tags.ErrorStartTag)Setup error: $_$($global:env.Tags.ErrorEndTag)" } } [void]Setup([string]$profileHost, [string]$username, [string]$password, [int]$port, [int]$protocol, [string]$serverName, [string]$displayLang) { try { # Set Encoding for input and output $OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding # create the Integration Technologies objects $objFactory = New-Object -TypeName SASObjectManager.ObjectFactoryMulti2Class $objFactory.ApplicationName = "SAS Extension for Visual Studio Code" $objServerDef = New-Object -TypeName SASObjectManager.ServerDefClass $objServerDef.MachineDNSName = $profileHost # SAS Workspace node $objServerDef.Port = $port # workspace server port $objServerDef.Protocol = $protocol # 0 = COM protocol $sasLocale = $displayLang -replace '-', '_' $objServerDef.ExtraNameValuePairs = "LOCALE=$sasLocale" # set the correct locale # Class Identifier for SAS Workspace $objServerDef.ClassIdentifier = "440196d4-90f0-11d0-9f41-00a024bb830c" # create and connect to the SAS session $this.objSAS = $objFactory.CreateObjectByServer( $serverName, # server name $true, $objServerDef, # built server definition $username, $password ) $this.objKeeper = New-Object -ComObject SASObjectManager.ObjectKeeper $this.objKeeper.AddObject(1, "WorkspaceObject", $this.objSAS) $this.dataConnection = New-Object -comobject ADODB.Connection $this.dataConnection.Provider = "sas.IOMProvider" $this.dataConnection.Properties("Data Source") = ( "iom-id://" + $this.objSAS.UniqueIdentifier ) $this.dataConnection.Open() Write-Host "$($global:env.LineCodes.SessionCreatedCode)" } catch { Write-Error "$($global:env.Tags.ErrorStartTag)Setup error: $_$($global:env.Tags.ErrorEndTag)" } } [void]SetOptions([array] $sasOptions) { $names = [string[]]@() $values = [string[]]@() foreach ($item in $sasOptions) { $parts = $item -split '=| ' $names += $parts[0] -replace '^-' if ($parts.Length -gt 1) { $values += $parts[1] } else { $values += "" } } [ref]$errorIndices = [int[]]::new($names.Length) [ref]$errors = [string[]]::new($names.Length) [ref]$errorCodes = [int[]]::new($names.Length) try { $this.objSAS.Utilities.OptionService.SetOptions([string[]]$names, [string[]]$values, $errorIndices, $errorCodes, $errors) $errVals = $errors.Value if ($errVals.Length -gt 0) { throw $errVals } } catch { Write-Error "$($global:env.Tags.ErrorStartTag)$Error[0].Exception.Message$($global:env.Tags.ErrorEndTag)" } } [string]GetWorkDir() { $fieldInclusionMask = ($false, $false, $false, $true, $false) [ref]$engineName = [string[]]@() [ref]$engineAttrs = New-Object 'int[,]' 0, 0 [ref]$libraryAttrs = [int[]]@() [ref]$physicalName = [string[]]::new(1) [ref]$infoPropertyNames = New-Object 'string[,]' 0, 0 [ref]$infoPropertyValues = New-Object 'string[,]' 0, 0 $lib = $this.objSAS.DataService.UseLibref("work") $lib.LevelInfo([bool[]]$fieldInclusionMask, $engineName, $engineAttrs, $libraryAttrs, $physicalName, $infoPropertyNames, $infoPropertyValues) return $physicalName.Value[0] } [void]Run([string]$code) { try { $this.objSAS.LanguageService.Reset() $this.objSAS.LanguageService.Async = $true $this.objSAS.LanguageService.Submit($code) } catch { Write-Error "$($global:env.Tags.ErrorStartTag)Run error: $_$($global:env.Tags.ErrorEndTag)" } } [void]Close() { try { $this.dataConnection.Close() $this.objKeeper.RemoveObject($this.objSAS) $this.objSAS.Close() } catch { Write-Error "$($global:env.Tags.ErrorStartTag)Close error: $_$($global:env.Tags.ErrorEndTag)" } } [void]Cancel() { try { $this.objSAS.LanguageService.Cancel() Write-Host "$($global:env.LineCodes.RunCancelledCode)" } catch { Write-Error "$($global:env.Tags.ErrorStartTag)Cancel error: $_$($global:env.Tags.ErrorEndTag)" } } [String]FlushLog([int]$chunkSize) { try { return $this.objSAS.LanguageService.FlushLog($chunkSize) } catch { Write-Error "$($global:env.Tags.ErrorStartTag)FlushLog error: $_$($global:env.Tags.ErrorEndTag)" } return "" } [int]FlushLogLines([int]$chunkSize, [bool]$skipPageHeader) { [ref]$carriageControls = [int[]]::new($chunkSize) [ref]$lineTypes = [int[]]::new($chunkSize) [ref]$logLines = [string[]]::new($chunkSize) try { $this.objSAS.LanguageService.FlushLogLines($chunkSize, $carriageControls, $lineTypes, $logLines) } catch { Write-Error "$($global:env.Tags.ErrorStartTag)FlushLog error: $_$($global:env.Tags.ErrorEndTag)" } for ($i = 0; $i -lt $logLines.Value.Length; $i++) { if (($carriageControls.Value[$i] -eq 1) -and $skipPageHeader) { continue } Write-Host "$($global:env.LineCodes.LogLineType)" $lineTypes.Value[$i] Write-Host $logLines.Value[$i] } return $logLines.Value.Length } [void]FlushCompleteLog() { do { $chunkSize = 32768 $log = $this.FlushLog($chunkSize) Write-Host $log } while ($log.Length -gt 0) } [void]FetchResultsFile([string]$filePath, [string]$outputFile) { $fileRef = "" $objFile = $this.objSAS.FileService.AssignFileref("", "DISK", $filePath, "", [ref] $fileRef) $objStream = $objFile.OpenBinaryStream(1); [Byte[]] $bytes = 0x0 $endOfFile = $false $byteCount = 0 $outStream = New-Object System.IO.FileStream($outputFile, [System.IO.FileMode]::OpenOrCreate, [System.IO.FileAccess]::Write) try { do { $objStream.Read(8192, [ref] $bytes) $outStream.Write($bytes, 0, $bytes.length) $endOfFile = $bytes.Length -lt 8192 $byteCount = $byteCount + $bytes.Length } while (-not $endOfFile) } finally { $objStream.Close() $outStream.Close() $this.objSAS.FileService.DeassignFileref($objFile.FilerefName) } Write-Host "$($global:env.LineCodes.ResultsFetchedCode)" } [void]GetDatasetRecords([string]$library, [string]$table, [int]$start = 0, [int]$limit = 100, [string]$sortCriteria = "", [string]$jsonQueryData = "") { $objRecordSet = New-Object -comobject ADODB.Recordset $objRecordSet.ActiveConnection = $this.dataConnection # This is needed to set the properties for sas formats. $objRecordSet.Properties.Item("SAS Formats").Value = "_ALL_" $queryParams = $jsonQueryData | ConvertFrom-Json $tableName = $library + "." + $table if ($sortCriteria -ne "" -or $jsonQueryData -ne "") { $view = GetFilteredView -Library $library -Table $table -SortCriteria $sortCriteria -JSONQueryData $jsonQueryData $tableName = $view.Name $this.dataConnection.Execute($view.Query) } $objRecordSet.Open( $tableName, [System.Reflection.Missing]::Value, # Use the active connection 2, # adOpenDynamic 1, # adLockReadOnly 512 # adCmdTableDirect ) $records = [List[List[object]]]::new() $fields = $objRecordSet.Fields.Count if ($objRecordSet.EOF) { Write-Host '{"rows": [], "count": 0}' return } $objRecordSet.AbsolutePosition = $start + 1 for ($j = 0; $j -lt $limit -and $objRecordSet.EOF -eq $False; $j++) { $cell = [List[object]]::new() for ($i = 0; $i -lt $fields; $i++) { $cell.Add($objRecordSet.Fields.Item($i).Value) } $records.Add($cell) $objRecordSet.MoveNext() } $objRecordSet.Close() $objRecordSet.Open( "SELECT COUNT(1) FROM $tableName", $this.dataConnection, 3, 1, 1 ) # adOpenStatic, adLockReadOnly, adCmdText $count = $objRecordSet.Fields.Item(0).Value $objRecordSet.Close() $result = New-Object psobject $result | Add-Member -MemberType NoteProperty -Name "rows" -Value $records $result | Add-Member -MemberType NoteProperty -Name "count" -Value $count if ($sortCriteria -ne "") { $this.dataConnection.Execute("DROP VIEW $tableName") } Write-Host $(ConvertTo-Json -Depth 10 -InputObject $result -Compress) } [void]GetColumns([string]$libname, [string]$memname) { $objRecordSet = New-Object -comobject ADODB.Recordset $objRecordSet.ActiveConnection = $this.dataConnection $query = @" select name, type, format, informat, label, length, varnum from sashelp.vcolumn where libname='$libname' and memname='$memname' order by varnum; "@ $objRecordSet.Open( $query, [System.Reflection.Missing]::Value, # Use the active connection 2, # adOpenDynamic 1, # adLockReadOnly 1 # adCmdText ) $rows = $objRecordSet.GetRows() $objRecordSet.Close() $parsedRows = @() for ($i = 0; $i -lt $rows.GetLength(1); $i++) { $parsedRow = [PSCustomObject]@{ index = $i + 1 name = $rows[0, $i] type = $rows[1, $i] format = $rows[2, $i] informat = $rows[3, $i] label = $rows[4, $i] length = $rows[5, $i] varnum = $rows[6, $i] } $parsedRows += $parsedRow } Write-Host $(ConvertTo-Json -Depth 10 -InputObject $parsedRows -Compress) } [void]DeleteItemAtPath([string]$filePath, [bool]$recursive) { if ($recursive) { $items = $this.GetItemsAtPath($filePath, [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath); for ($i = 0; $i -lt $items.Count; $i++) { if ($items[$i].category -eq 0) { $this.DeleteItemAtPath($items[$i].uri, $true); } else { $this.DeleteItemAtPath($items[$i].uri, $false); } } $this.objSAS.FileService.DeleteFile($filePath) } else { $this.objSAS.FileService.DeleteFile($filePath) } } [void]DeleteFile([string]$filePath) { $recursive = $true try { # If we error out, that means we're trying to get items at a file path, # which isn't valid (thus, this isn't recursive) $items = $this.GetItemsAtPath($filePath, [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath); } catch { $recursive = $false } try { $this.DeleteItemAtPath($filePath, $recursive) Write-Host (@{success = $true } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [void]CreateDirectory([string]$folderPath, [string]$folderName) { try { $currentFolder = $this.GetItemAtPathWithName($folderPath, $folderName) if ($currentFolder -ne $null) { Write-Host (@{success = $false } | ConvertTo-Json) return; } $uri = $this.objSAS.FileService.MakeDirectory($folderPath, $folderName) $newFolder = $this.GetItemAtPathWithName($folderPath, $folderName) Write-Host (@{success = $true; data = $newFolder } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [void]CreateFile([string]$folderPath, [string]$fileName, [string]$content) { try { $currentItem = $this.GetItemAtPathWithName($folderPath, $fileName) if ($currentItem -ne $null) { Write-Host (@{success = $false } | ConvertTo-Json) return; } $fileRefName = "" $objFile = $this.objSAS.FileService.AssignFileref("", "DISK", $folderPath, "", [ref] $fileRefName) $assignedName = "" $outFile = $objFile.AssignMember("", $fileName, "DISK", "", [ref] $assignedName) $objStream = $outFile.OpenBinaryStream([SAS.StreamOpenMode]::StreamOpenModeForWriting) $objStream.Write([System.Convert]::FromBase64String($content)); $objStream.Close() $this.objSAS.FileService.DeassignFileref($outFile.FilerefName) $this.objSAS.FileService.DeassignFileref($objFile.FilerefName) $newFile = $this.GetItemAtPathWithName($folderPath, $fileName) Write-Host (@{success = $true; data = $newFile } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [void]UpdateFile([string]$filePath, [string]$content) { try { $fileRefName = "" $objFile = $this.objSAS.FileService.AssignFileref("", "DISK", $filePath, "", [ref] $fileRefName) $objStream = $objFile.OpenBinaryStream([SAS.StreamOpenMode]::StreamOpenModeForWriting); $encoding = [System.Text.Encoding]::UTF8 $objStream.Write($encoding.GetBytes($content)); $objStream.Close() $this.objSAS.FileService.DeassignFileref($objFile.FilerefName) Write-Host (@{success = $true } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [string]GetDirectorySeparator([string]$path) { if ($path -Match "/") { return "/" } return "\" } [void]RenameFile([string]$oldPath, [string]$newPath, [string]$newName) { try { $currentItem = $this.GetItemAtPathWithName($newPath, $newName) if ($currentItem -ne $null) { Write-Host (@{success = $false } | ConvertTo-Json) return; } $this.objSAS.FileService.RenameFile($oldPath, $newPath + $this.GetDirectorySeparator($newPath) + $newName); $item = $this.GetItemAtPathWithName($newPath, $newName); Write-Host (@{success = $true; data = $item } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [void]FetchFileContent([string]$filePath, [string]$outputFile) { try { $fileRef = "" $objFile = $this.objSAS.FileService.AssignFileref("", "DISK", $filePath, "", [ref] $fileRef) $objStream = $objFile.OpenBinaryStream(1); [Byte[]] $bytes = 0x0 $endOfFile = $false $byteCount = 0 $outStream = New-Object System.IO.FileStream($outputFile, [System.IO.FileMode]::OpenOrCreate, [System.IO.FileAccess]::Write) try { do { $objStream.Read(8192, [ref] $bytes) $outStream.Write($bytes, 0, $bytes.length) $endOfFile = $bytes.Length -lt 8192 $byteCount = $byteCount + $bytes.Length } while (-not $endOfFile) } finally { $objStream.Close() $outStream.Close() $this.objSAS.FileService.DeassignFileref($objFile.FilerefName) } Write-Host (@{success = $true } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [object] GetItemAtPathWithName([string]$folderPath, [string]$name) { $items = $this.GetItemsAtPath($folderPath, [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath) for ($i = 0; $i -lt $items.Count; $i++) { if ($items[$i].name -eq $name) { return $items[$i] } } return $null; } [object[]] GetItemsAtPath([string]$folderPath, [SAS.FileServiceListFilesMode] $mode) { $fieldInclusionMask = [boolean[]]@() # Out data $listedPath = "" $names = [string[]]@() $typeNames = [string[]]@() $typeCategories = [SAS.FileRefTypeCategory[]]@() $sizes = [int[]]@() $modTimes = [DateTime[]]@() $engines = [string[]]@() $this.objSAS.FileService.ListFiles( $folderPath, $mode, $fieldInclusionMask, [ref]$listedPath, [ref]$names, [ref]$typeNames, [ref]$typeCategories, [ref]$sizes, [ref]$modTimes, [ref]$engines ) $output = [object[]]::new($names.Length) for ($i = 0; $i -lt $names.Count; $i++) { $uri = $listedPath.Trim("\\") + $this.GetDirectorySeparator($listedPath) + $names[$i]; if ($listedPath -eq "") { $uri = $names[$i] } $output[$i] = @{ uri = $uri; name = $names[$i]; type = $typeNames[$i]; category = $typeCategories[$i]; size = $sizes[$i]; modifiedTimeStamp = $modTimes[$i]; engine = $engines[$i]; parentFolderUri = $listedPath } } return $output } [void]GetChildItems([string]$folderPath, [string]$fileNavigationCustomRootPath, [string]$fileNavigationRoot) { try { $mode = [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath if ($folderPath -eq "/") { if ($fileNavigationRoot -eq "USER") { $mode = [SAS.FileServiceListFilesMode]::FileServiceListFilesModeUser } if ($fileNavigationRoot -eq "SYSTEM") { $mode = [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath } if ($fileNavigationRoot -eq "CUSTOM") { $folderPath = $fileNavigationCustomRootPath $mode = [SAS.FileServiceListFilesMode]::FileServiceListFilesModePath } } $output = $this.GetItemsAtPath($folderPath, $mode) Write-Host (@{success = $true; data = $output } | ConvertTo-Json) } catch { Write-Host (@{success = $false; message = $Error[0].Exception.Message } | ConvertTo-Json) } } [void]GetLibraries() { $objRecordSet = New-Object -comobject ADODB.Recordset $objRecordSet.ActiveConnection = $this.dataConnection $query = @" select distinct libname, readonly from sashelp.vlibnam order by libname asc; "@ $objRecordSet.Open( $query, [System.Reflection.Missing]::Value, # Use the active connection 2, # adOpenDynamic 1, # adLockReadOnly 1 # adCmdText ) $records = [System.Collections.Generic.List[object[]]]::new() while (-not $objRecordSet.EOF) { $row = @() for ($i = 0; $i -lt $objRecordSet.Fields.Count; $i++) { $row += $objRecordSet.Fields.Item($i).Value } $records.Add($row) $objRecordSet.MoveNext() } $objRecordSet.Close() $result = New-Object psobject $result | Add-Member -MemberType NoteProperty -Name "libraries" -Value $records $result | Add-Member -MemberType NoteProperty -Name "count" -Value $records.Count Write-Host $(ConvertTo-Json -Depth 10 -InputObject $result -Compress) } [void]GetTableInfo([string]$libname, [string]$memname) { $objRecordSet = New-Object -comobject ADODB.Recordset $objRecordSet.ActiveConnection = $this.dataConnection $query = @" select v.memname, v.memtype, v.crdate, v.modate, v.nobs, v.obslen, v.nvar, v.compress, v.memlabel, v.typemem, v.filesize, v.delobs, v.encoding, m.engine from sashelp.vtable v left join sashelp.vmember m on v.libname = m.libname and v.memname = m.memname where v.libname='$libname' and v.memname='$memname'; "@ $objRecordSet.Open( $query, [System.Reflection.Missing]::Value, # Use the active connection 2, # adOpenDynamic 1, # adLockReadOnly 1 # adCmdText ) $result = New-Object psobject if (-not $objRecordSet.EOF) { $result | Add-Member -MemberType NoteProperty -Name "name" -Value $objRecordSet.Fields.Item(0).Value $result | Add-Member -MemberType NoteProperty -Name "type" -Value $objRecordSet.Fields.Item(1).Value $result | Add-Member -MemberType NoteProperty -Name "creationTimeStamp" -Value $objRecordSet.Fields.Item(2).Value $result | Add-Member -MemberType NoteProperty -Name "modifiedTimeStamp" -Value $objRecordSet.Fields.Item(3).Value $result | Add-Member -MemberType NoteProperty -Name "rowCount" -Value $objRecordSet.Fields.Item(4).Value $result | Add-Member -MemberType NoteProperty -Name "recordLength" -Value $objRecordSet.Fields.Item(5).Value $result | Add-Member -MemberType NoteProperty -Name "columnCount" -Value $objRecordSet.Fields.Item(6).Value $result | Add-Member -MemberType NoteProperty -Name "compressionRoutine" -Value $objRecordSet.Fields.Item(7).Value $result | Add-Member -MemberType NoteProperty -Name "label" -Value $objRecordSet.Fields.Item(8).Value $result | Add-Member -MemberType NoteProperty -Name "extendedType" -Value $objRecordSet.Fields.Item(9).Value $result | Add-Member -MemberType NoteProperty -Name "fileSize" -Value $objRecordSet.Fields.Item(10).Value $result | Add-Member -MemberType NoteProperty -Name "deletedObs" -Value $objRecordSet.Fields.Item(11).Value $result | Add-Member -MemberType NoteProperty -Name "encoding" -Value $objRecordSet.Fields.Item(12).Value $result | Add-Member -MemberType NoteProperty -Name "engine" -Value $objRecordSet.Fields.Item(13).Value $result | Add-Member -MemberType NoteProperty -Name "libref" -Value $libname } $objRecordSet.Close() Write-Host $(ConvertTo-Json -Depth 10 -InputObject $result -Compress) } [void]GetTables([string]$libname) { $objRecordSet = New-Object -comobject ADODB.Recordset $objRecordSet.ActiveConnection = $this.dataConnection $query = @" select memname from sashelp.vtable where libname='$libname' order by memname asc; "@ $objRecordSet.Open( $query, [System.Reflection.Missing]::Value, # Use the active connection 2, # adOpenDynamic 1, # adLockReadOnly 1 # adCmdText ) $records = @() while (-not $objRecordSet.EOF) { $records += $objRecordSet.Fields.Item(0).Value $objRecordSet.MoveNext() } $objRecordSet.Close() $result = New-Object psobject $result | Add-Member -MemberType NoteProperty -Name "tables" -Value $records $result | Add-Member -MemberType NoteProperty -Name "count" -Value $records.Count Write-Host $(ConvertTo-Json -Depth 10 -InputObject $result -Compress) } } ================================================ FILE: client/src/connection/itc/types.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { BaseConfig } from ".."; export enum ScriptActions { CreateDirectory = `$runner.CreateDirectory($folderPath, $folderName)`, CreateFile = `$runner.CreateFile($folderPath, $fileName, $content)`, DeleteFile = `$runner.DeleteFile($filePath)`, FetchFileContent = `$runner.FetchFileContent($filePath, $outputFile)`, GetChildItems = `$runner.GetChildItems($path, $fileNavigationCustomRootPath, $fileNavigationRoot)`, RenameFile = `$runner.RenameFile($oldPath,$newPath,$newName)`, UpdateFile = `$runner.UpdateFile($filePath, $content)`, } export enum ITCProtocol { COM = 0, IOMBridge = 2, } /** * Configuration parameters for this connection provider */ export interface Config extends BaseConfig { host: string; port: number; username: string; protocol: ITCProtocol; interopLibraryFolderPath?: string; } export type PowershellResponse = { category: number; creationTimeStamp?: string; modifiedTimeStamp: string; name: string; parentFolderUri: string; size: number; uri: string; }; ================================================ FILE: client/src/connection/itc/util.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export const decodeEntities = (msg: string): string => { // Some of our messages from the server contain html encoded // characters. This converts them back. const specialCharacters = { "'": "'", }; Object.entries(specialCharacters).map(([encodedHtml, text]) => { msg = msg.replace(encodedHtml, text); }); return msg; }; export const escapePowershellString = (unescapedString: string): string => unescapedString.replace(/(`|"|'|\$|\(|\)|%|{|}|\[|\])/g, "`$1"); export const getDirectorySeparator = (path: string): string => path.lastIndexOf("/") !== -1 ? "/" : "\\"; ================================================ FILE: client/src/connection/rest/RestContentAdapter.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { FileType, Uri, authentication } from "vscode"; import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, } from "axios"; import { SASAuthProvider } from "../../components/AuthProvider"; import { DEFAULT_FILE_CONTENT_TYPE, FILE_TYPES, FOLDER_TYPES, ROOT_FOLDER, SAS_CONTENT_ROOT_FOLDERS, TRASH_FOLDER_TYPE, } from "../../components/ContentNavigator/const"; import { AddChildItemProperties, ContentAdapter, ContentItem, Link, RootFolderMap, } from "../../components/ContentNavigator/types"; import { ContextMenuAction, ContextMenuProvider, getFileContentType, getTypeName, isContainer, isItemInRecycleBin, isReference, } from "../../components/ContentNavigator/utils"; import { getItemContentType, getLink, getPermission, getResourceId, getResourceIdFromItem, getSasContentUri, } from "./util"; class RestContentAdapter implements ContentAdapter { private connection: AxiosInstance; private authorized: boolean; private viyaCadence: string; private rootFolders: RootFolderMap; private fileMetadataMap: { [id: string]: { etag: string; lastModified: string; contentType: string }; }; private contextMenuProvider: ContextMenuProvider; public constructor() { this.rootFolders = {}; this.fileMetadataMap = {}; this.contextMenuProvider = new ContextMenuProvider([ ContextMenuAction.CreateChild, ContextMenuAction.Delete, ContextMenuAction.Update, ContextMenuAction.Restore, ContextMenuAction.CopyPath, ContextMenuAction.Empty, ContextMenuAction.AddToFavorites, ContextMenuAction.RemoveFromFavorites, ContextMenuAction.ConvertNotebookToFlow, ContextMenuAction.AllowDownload, ]); } public connected(): boolean { return this.authorized; } public async connect(baseURL: string): Promise { this.connection = axios.create({ baseURL }); this.connection.interceptors.response.use( (response: AxiosResponse) => response, async (error: AxiosError) => { const originalRequest: AxiosRequestConfig & { _retry?: boolean } = error.config; if (error.response?.status === 401 && !originalRequest._retry) { originalRequest._retry = true; await this.updateAccessToken(); return this.connection(originalRequest); } return Promise.reject(error); }, ); await this.updateAccessToken(); this.authorized = true; this.viyaCadence = await this.getViyaCadence(); } public getConnection() { return this.connection; } public getRootFolder(name: string): ContentItem | undefined { return this.rootFolders[name]; } public get myFavoritesFolder(): ContentItem | undefined { return this.getRootFolder("@myFavorites"); } public async getParentOfItem( item: ContentItem, ): Promise { const ancestorsLink = getLink(item.links, "GET", "ancestors"); if (!ancestorsLink) { return; } const { data } = await this.connection.get(ancestorsLink.uri); if (data && data.length > 0) { return this.enrichWithDataProviderProperties(data[0]); } } public async getChildItems(parentItem: ContentItem): Promise { const { data: result } = await this.connection.get( await this.generatedMembersUrlForParentItem(parentItem), ); if (!result.items) { return Promise.reject(); } const myFavoritesFolder = this.myFavoritesFolder; const isInRecycleBin = TRASH_FOLDER_TYPE === getTypeName(parentItem) || parentItem.flags?.isInRecycleBin; const parentIdIsFavoritesFolder = getResourceIdFromItem(parentItem) === getResourceIdFromItem(myFavoritesFolder); const allFavorites = parentIdIsFavoritesFolder ? [] : await this.getChildItems(myFavoritesFolder); const items = result.items.map( (childItem: ContentItem, index): ContentItem => { const favoriteUri = fetchFavoriteUri(childItem); return { ...childItem, uid: `${parentItem.uid}/${index}`, ...this.enrichWithDataProviderProperties(childItem, { isInRecycleBin, isInMyFavorites: parentIdIsFavoritesFolder || !!favoriteUri, favoriteUri, }), }; }, ); return items; function fetchFavoriteUri(childItem: ContentItem) { if (parentIdIsFavoritesFolder) { return getLink(childItem.links, "DELETE", "delete")?.uri; } const favoriteId = allFavorites.find( (favorite) => getResourceIdFromItem(favorite) === getResourceIdFromItem(childItem), )?.id; if (!favoriteId) { return undefined; } return `${getResourceIdFromItem(myFavoritesFolder)}/members/${favoriteId}`; } } public async getFolderPathForItem(item: ContentItem): Promise { return await this.getPathOfItem(item, true); } public async getPathOfItem( item: ContentItem, folderPathOnly?: boolean, ): Promise { if (!item) { return ""; } const filePathParts = []; let currentContentItem: Pick = item; if (!folderPathOnly) { filePathParts.push(currentContentItem.name); } do { try { const { data: parentData } = await this.connection.get( currentContentItem.parentFolderUri, ); currentContentItem = parentData; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return ""; } if (currentContentItem.name) { filePathParts.push(currentContentItem.name); } } while (currentContentItem.parentFolderUri); return "/" + filePathParts.reverse().join("/"); } public async moveItem( item: ContentItem, parentFolderUri: string, ): Promise { const newItemData = { ...item, parentFolderUri }; const updateLink = getLink(item.links, "PUT", "update"); try { const response = await this.connection.put(updateLink.uri, newItemData); return this.enrichWithDataProviderProperties(response.data).vscUri; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } private async generatedMembersUrlForParentItem( parentItem: ContentItem, ): Promise { const parentIsContent = parentItem.uri === ROOT_FOLDER.uri; const typeQuery = generateTypeQuery(parentIsContent); const membersLink = getLink(parentItem.links, "GET", "members"); let membersUrl = membersLink ? membersLink.uri : null; if (!membersUrl && parentItem.uri) { membersUrl = `${parentItem.uri}/members`; } if (!membersUrl) { const selfLink = getLink(parentItem.links, "GET", "self"); if (!selfLink) { console.error( "Invalid state: FolderService object has no self link : " + parentItem.name, ); return Promise.reject({ status: 404 }); } membersUrl = selfLink.uri + "/members"; } membersUrl = membersUrl + "?limit=1000000"; const filters = []; if (parentIsContent) { filters.push("isNull(parent)"); } if (typeQuery) { filters.push(typeQuery); } if (filters.length === 1) { membersUrl = membersUrl + "&filter=" + filters[0]; } else if (filters.length > 1) { membersUrl = membersUrl + "&filter=and(" + filters.join(",") + ")"; } membersUrl = membersUrl + `&sortBy=${ parentIsContent || this.viyaCadence === "2023.03" // 2023.03 fails query with this sortBy param ? "" : "eq(contentType,'folder'):descending," }name:primary:ascending,type:ascending`; return membersUrl; function generateTypeQuery(parentIsContent: boolean): string { // Generate type query segment if applicable let typeQuery = ""; // Determine the set of types on which to filter const includedTypes = FILE_TYPES.concat(FOLDER_TYPES); // Generate type query string typeQuery = "in(" + (parentIsContent ? "type" : "contentType") + ","; for (let i = 0; i < includedTypes.length; i++) { typeQuery += "'" + includedTypes[i] + "'"; if (i !== includedTypes.length - 1) { typeQuery += ","; } } typeQuery += ")"; return typeQuery; } } public async getRootItems(): Promise { for (let index = 0; index < SAS_CONTENT_ROOT_FOLDERS.length; ++index) { const delegateFolderName = SAS_CONTENT_ROOT_FOLDERS[index]; const result = delegateFolderName === "@sasRoot" ? { data: ROOT_FOLDER } : await this.connection.get(`/folders/folders/${delegateFolderName}`); this.rootFolders[delegateFolderName] = { ...result.data, uid: `${index}`, ...this.enrichWithDataProviderProperties(result.data), }; } return this.rootFolders; } public async getItemOfId(id: string): Promise { const response = await this.connection.get(id); this.updateFileMetadata(id, response); return this.enrichWithDataProviderProperties(response.data); } public async getItemOfUri(uri: Uri): Promise { const resourceId = getResourceId(uri); return await this.getItemOfId(resourceId); } public async getContentOfUri(uri: Uri): Promise { const resourceId = getResourceId(uri); const { data } = await this.connection.get(resourceId + "/content", { responseType: "arraybuffer", }); return data; } public async getContentOfItem(item: ContentItem): Promise { return await this.getContentOfUri(item.vscUri); } public async createNewFolder( parentItem: ContentItem, folderName: string, ): Promise { const parentFolderUri = parentItem.uri || getLink(parentItem.links || [], "GET", "self")?.uri || null; if (!parentFolderUri) { return; } try { const createFolderResponse = await this.connection.post( `/folders/folders?parentFolderUri=${parentFolderUri}`, { name: folderName }, ); return this.enrichWithDataProviderProperties(createFolderResponse.data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } private enrichWithDataProviderProperties( item: ContentItem, flags?: ContentItem["flags"], ): ContentItem { item.flags = flags; item.permission = getPermission(item); return { ...item, contextValue: this.contextMenuProvider.availableActions(item), fileStat: { ctime: item.creationTimeStamp, mtime: item.modifiedTimeStamp, size: 0, type: getIsContainer(item) ? FileType.Directory : FileType.File, }, isReference: isReference(item), resourceId: getResourceIdFromItem(item), vscUri: getSasContentUri(item, flags?.isInRecycleBin || false), typeName: getTypeName(item), }; function getIsContainer(item: ContentItem): boolean { const typeName = getTypeName(item); if (isItemInRecycleBin(item) && isReference(item)) { return false; } if (FOLDER_TYPES.indexOf(typeName) >= 0) { return true; } return false; } } public async renameItem( item: ContentItem, newName: string, ): Promise { const itemIsReference = item.type === "reference"; const uri = itemIsReference ? getLink(item.links, "GET", "self").uri : item.uri; try { const validationUri = getLink(item.links, "PUT", "validateRename")?.uri; if (validationUri) { await this.connection.put( validationUri .replace("{newname}", encodeURI(newName)) .replace("{newtype}", getTypeName(item)), ); } // not sure why but the response of moveTo request does not return the latest etag so request it every time const fileData = await this.getItemOfId(uri); const contentType = getFileContentType(newName); const fileMetadata = this.fileMetadataMap[uri]; const patchResponse = await this.connection.put( uri, { ...fileData, name: newName }, { headers: { "If-Unmodified-Since": fileMetadata.lastModified, "If-Match": fileMetadata.etag, "Content-Type": getItemContentType(item), }, }, ); this.updateFileMetadata(uri, patchResponse, contentType); // The links in My Favorites are of type reference. Instead of passing // back the reference objects, we want to pass back the underlying source // objects. if (itemIsReference) { return await this.getItemOfId(item.uri); } return this.enrichWithDataProviderProperties(patchResponse.data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async createNewItem( parentItem: ContentItem, fileName: string, buffer?: ArrayBufferLike, ): Promise { const typeDef = await this.getTypeDefinition(fileName); let createdResource: ContentItem; try { const fileCreationResponse = await this.connection.post( `/files/files#rawUpload?typeDefName=${typeDef}`, buffer || Buffer.from("", "binary"), { headers: { "Content-Type": getFileContentType(fileName), "Content-Disposition": `filename*=UTF-8''${encodeURI(fileName)}`, Accept: "application/vnd.sas.file+json", }, }, ); createdResource = fileCreationResponse.data; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } const fileLink: Link | null = getLink(createdResource.links, "GET", "self"); const memberAdded = await this.addChildItem( fileLink?.uri, getLink(parentItem.links, "POST", "addMember")?.uri, { name: fileName, contentType: typeDef, }, ); if (!memberAdded) { return; } return this.enrichWithDataProviderProperties(createdResource); } public async addChildItem( childItemUri: string | undefined, parentItemUri: string | undefined, properties: AddChildItemProperties, ): Promise { if (!childItemUri || !parentItemUri) { return false; } try { await this.connection.post(parentItemUri, { uri: childItemUri, type: "CHILD", ...properties, }); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } return true; } public async updateContentOfItem(uri: Uri, content: string): Promise { const resourceId = getResourceId(uri); const { etag, lastModified, contentType } = this.getFileInfo(resourceId); const headers = { "Content-Type": contentType, "If-Unmodified-Since": lastModified, }; if (etag !== "") { headers["If-Match"] = etag; } try { const res = await this.connection.put(resourceId + "/content", content, { headers, }); this.updateFileMetadata(resourceId, res, contentType); } catch (error) { console.log(error); } } public async getUriOfItem(item: ContentItem): Promise { if (item.type !== "reference") { return item.vscUri; } // If we're attempting to open a favorite, open the underlying file instead. try { return (await this.getItemOfId(item.uri)).vscUri; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return item.vscUri; } } public async deleteItem(item: ContentItem): Promise { // folder service will return 409 error if the deleting folder has non-folder item even if add recursive parameter // delete the resource or move item to recycle bin will automatically delete the favorites as well. return await (isContainer(item) ? this.deleteFolder(item) : this.deleteResource(item)); } public async addItemToFavorites(item: ContentItem): Promise { return await this.addChildItem( getResourceIdFromItem(item), getLink(this.myFavoritesFolder.links, "POST", "addMember").uri, { type: "reference", name: item.name, contentType: item.contentType, }, ); } public async removeItemFromFavorites(item: ContentItem): Promise { const deleteFavoriteUri = item.flags.favoriteUri; if (!deleteFavoriteUri) { return false; } try { await this.connection.delete(deleteFavoriteUri); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } return true; } public async recycleItem( item: ContentItem, ): Promise<{ newUri?: Uri; oldUri?: Uri }> { const recycleBin = this.getRootFolder("@myRecycleBin"); if (!recycleBin) { // fallback to delete return recycleItemResponse(await this.deleteItem(item)); } const recycleBinUri = getLink(recycleBin.links, "GET", "self")?.uri; if (!recycleBinUri) { return {}; } const success = await this.moveItem(item, recycleBinUri); return recycleItemResponse(!!success); function recycleItemResponse(success: boolean) { if (!success) { return {}; } return { newUri: getSasContentUri(item, true), oldUri: getSasContentUri(item), }; } } public async restoreItem(item: ContentItem): Promise { const previousParentUri = getLink(item.links, "GET", "previousParent")?.uri; if (!previousParentUri) { return false; } return !!(await this.moveItem(item, previousParentUri)); } private async updateAccessToken(): Promise { const session = await authentication.getSession(SASAuthProvider.id, [], { createIfNone: true, }); this.connection.defaults.headers.common.Authorization = `Bearer ${session.accessToken}`; } private updateFileMetadata( id: string, { headers, data }: AxiosResponse, contentType?: string, ) { this.fileMetadataMap[id] = { etag: headers.etag, lastModified: headers["last-modified"], contentType: contentType || data.contentType, }; } private getFileInfo(resourceId: string): { etag: string; lastModified: string; contentType: string; } { if (resourceId in this.fileMetadataMap) { return this.fileMetadataMap[resourceId]; } const now = new Date(); const timestamp = now.toUTCString(); return { etag: "", lastModified: timestamp, contentType: DEFAULT_FILE_CONTENT_TYPE, }; } private async deleteFolder(item: ContentItem): Promise { try { const children = await this.getChildItems(item); await Promise.all(children.map((child) => this.deleteItem(child))); const deleteRecursivelyLink = getLink( item.links, "DELETE", "deleteRecursively", )?.uri; const deleteResourceLink = getLink( item.links, "DELETE", "deleteResource", )?.uri; if (!deleteRecursivelyLink && !deleteResourceLink) { return false; } const deleteLink = deleteRecursivelyLink ?? `${deleteResourceLink}?recursive=true`; await this.connection.delete(deleteLink); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } return true; } private async deleteResource(item: ContentItem): Promise { const deleteResourceLink = getLink( item.links, "DELETE", "deleteResource", )?.uri; if (!deleteResourceLink) { return false; } try { await this.connection.delete(deleteResourceLink); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } // Due to delay in folders service's automatic deletion of associated member we need // to attempt manual deletion of member to ensure subsequent data refreshes don't occur before // member is deleted. Per Gary Williams, we must do these steps sequentially not concurrently. // If member already deleted, server treats this call as NO-OP. try { const deleteLink = getLink(item.links, "DELETE", "delete")?.uri; if (deleteLink) { await this.connection.delete(deleteLink); } } catch (error) { return error.response.status === 404 || error.response.status === 403; } return true; } private async getViyaCadence(): Promise { try { const { data } = await this.connection.get( "/deploymentData/cadenceVersion", ); return data.cadenceVersion; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { console.error("fail to retrieve the viya cadence"); } return "unknown"; } private async getTypeDefinition(fileName: string): Promise { const defaultContentType = "file"; const ext = fileName.split(".").pop().toLowerCase(); if (ext === "sas") { return "programFile"; } try { const typeResponse = await this.connection.get( `/types/types?filter=contains('extensions', '${ext}')`, ); if (typeResponse.data.items && typeResponse.data.items.length !== 0) { return typeResponse.data.items[0].name; } } catch { return defaultContentType; } return defaultContentType; } private async deleteMemberUriForFavorite(item: ContentItem): Promise { if (item.flags?.isInMyFavorites) { return getLink(item.links, "DELETE", "delete")?.uri; } const myFavoritesFolder = this.getRootFolder("@myFavorites"); const allFavorites = await this.getChildItems(myFavoritesFolder); const favoriteId = allFavorites.find( (favorite) => getResourceIdFromItem(favorite) === getResourceIdFromItem(item), )?.id; if (!favoriteId) { return undefined; } return `${getResourceIdFromItem(myFavoritesFolder)}/members/${favoriteId}`; } } export default RestContentAdapter; ================================================ FILE: client/src/connection/rest/RestLibraryAdapter.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { SortModelItem } from "ag-grid-community"; import { AxiosResponse } from "axios"; import { getSession } from ".."; import { LibraryAdapter, LibraryItem, TableData, TableQuery, } from "../../components/LibraryNavigator/types"; import { appendSessionLogFn } from "../../components/logViewer"; import { ColumnCollection, DataAccessApi, RowCollection, TableInfo, } from "./api/compute"; import { getApiConfig } from "./common"; const requestOptions = { headers: { Accept: "application/vnd.sas.collection+json" }, }; class RestLibraryAdapter implements LibraryAdapter { protected dataAccessApi: ReturnType; protected sessionId: string; public constructor() {} public async connect(): Promise { const session = getSession(); session.onSessionLogFn = appendSessionLogFn; await session.setup(); this.sessionId = session?.sessionId(); this.dataAccessApi = DataAccessApi(getApiConfig()); } public async setup(): Promise { if (this.sessionId && this.dataAccessApi) { return; } await this.connect(); } public async getRows( item: Pick, start: number, limit: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise { if (sortModel.length > 0) { return await this.getSortedRows(item, start, limit, sortModel, query); } const { data } = await this.retryOnFail( async () => await this.dataAccessApi.getRows( { sessionId: this.sessionId, libref: item.library || "", tableName: item.name, includeIndex: true, start, limit, formatMissingValues: true, where: query && query.filterValue ? query.filterValue : undefined, }, requestOptions, ), ); return { rows: data.items, count: data.count, }; } private async getSortedRows( item: Pick, start: number, limit: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise { const { data: viewData } = await this.retryOnFail( async () => await this.dataAccessApi.createView( { sessionId: this.sessionId, libref: item.library || "", tableName: item.name, viewRequest: { sortBy: sortModel.map((sortModelItem) => ({ key: sortModelItem.colId, direction: sortModelItem.sort === "asc" ? "ascending" : "descending", })), }, }, requestOptions, ), ); const results = await this.getRows( { library: viewData.libref, name: viewData.name, }, start, limit, [], query, ); await this.deleteTable({ library: viewData.libref, name: viewData.name }); return results; } public async getRowsAsCSV( item: LibraryItem, start: number, limit: number, ): Promise { const response = await this.retryOnFail( async () => await this.dataAccessApi.getRowsAsCSV( { includeColumnNames: true, includeIndex: true, libref: item.library || "", // Since we're including column names, we need to grab one more row limit: limit + 1, sessionId: this.sessionId, start, tableName: item.name, }, requestOptions, ), ); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const data = response.data as unknown as RowCollection; return { rows: data.items, count: data.count, }; } public async getColumns( item: LibraryItem, start: number, limit: number, ): Promise { const { data } = await this.retryOnFail( async () => await this.dataAccessApi.getColumns( { sessionId: this.sessionId, limit, start, libref: item.library || "", tableName: item.name, }, { headers: { Accept: "application/json" } }, ), ); return data; } public async getTableRowCount( item: LibraryItem, ): Promise<{ rowCount: number; maxNumberOfRowsToRead: number }> { await this.setup(); const response = await this.retryOnFail( async () => await this.dataAccessApi.getTable( { sessionId: this.sessionId, libref: item.library || "", tableName: item.name, }, { headers: { Accept: "application/json" } }, ), ); return { rowCount: response.data.rowCount, maxNumberOfRowsToRead: 1000 }; } public async getTableInfo(item: LibraryItem): Promise { await this.setup(); const response = await this.retryOnFail( async () => await this.dataAccessApi.getTable( { sessionId: this.sessionId, libref: item.library || "", tableName: item.name, }, { headers: { Accept: "application/json" } }, ), ); return response.data; } private async retryOnFail( callbackFn: () => Promise>, ): Promise> { try { return await callbackFn(); } catch (error) { // If it's not a 404, we can't retry it if (error.response?.status !== 404) { throw error; } await this.connect(); // If it fails a second time, we give up return await callbackFn(); } } public async deleteTable({ library, name, }: Pick): Promise { await this.setup(); try { await this.retryOnFail( async () => await this.dataAccessApi.deleteTable({ sessionId: this.sessionId, libref: library, tableName: name, }), ); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { throw new Error("Cannot delete table"); } } public async getLibraries( start: number, limit: number, ): Promise<{ items: LibraryItem[]; count: number }> { const { data } = await this.retryOnFail( async () => await this.dataAccessApi.getLibraries( { sessionId: this.sessionId, limit, start, }, requestOptions, ), ); const libraryItems: LibraryItem[] = await Promise.all( data.items.map(async (item: LibraryItem): Promise => { const { data: responseData } = await this.retryOnFail( async () => await this.dataAccessApi.getLibrarySummary( { sessionId: this.sessionId, libref: item.id, }, { headers: { Accept: "application/json", }, }, ), ); return { ...item, // eslint-disable-next-line @typescript-eslint/consistent-type-assertions readOnly: (responseData as { readOnly: boolean }).readOnly, }; }), ); return { items: libraryItems, count: data.count }; } public async getTables( item: LibraryItem, start: number, limit: number, ): Promise<{ items: LibraryItem[]; count: number }> { const { data } = await this.retryOnFail( async () => await this.dataAccessApi.getTables( { sessionId: this.sessionId, libref: item.id, limit, start, }, requestOptions, ), ); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return { items: data.items as LibraryItem[], count: data.count }; } } export default RestLibraryAdapter; ================================================ FILE: client/src/connection/rest/RestServerAdapter.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { FileType, Uri } from "vscode"; import { AxiosResponse } from "axios"; import { getSession } from ".."; import { FOLDER_TYPES, Messages, SAS_SERVER_ROOT_FOLDER, SAS_SERVER_ROOT_FOLDERS, SERVER_FOLDER_ID, } from "../../components/ContentNavigator/const"; import { AddChildItemProperties, ContentAdapter, ContentItem, RootFolderMap, } from "../../components/ContentNavigator/types"; import { ContextMenuAction, ContextMenuProvider, createStaticFolder, getTypeName, homeDirectoryNameAndType, isReference, sortedContentItems, } from "../../components/ContentNavigator/utils"; import { appendSessionLogFn } from "../../components/logViewer"; import { ProfileWithFileRootOptions } from "../../components/profile"; import { FileProperties, FileSystemApi } from "./api/compute"; import { getApiConfig } from "./common"; import { getLink, getResourceId, getResourceIdFromItem, getSasServerUri, } from "./util"; export const SAS_SERVER_HOME_DIRECTORY = "SAS_SERVER_HOME_DIRECTORY"; const SAS_FILE_SEPARATOR = "~fs~"; class RestServerAdapter implements ContentAdapter { protected baseUrl: string; protected fileSystemApi: ReturnType; protected sessionId: string; private rootFolders: RootFolderMap; private fileMetadataMap: { [id: string]: { etag: string; lastModified?: string; contentType?: string }; }; private fileNavigationSetByAdmin: boolean; private contextMenuProvider: ContextMenuProvider; public constructor( protected fileNavigationCustomRootPath: ProfileWithFileRootOptions["fileNavigationCustomRootPath"], protected fileNavigationRoot: ProfileWithFileRootOptions["fileNavigationRoot"], ) { this.rootFolders = {}; this.fileMetadataMap = {}; this.fileNavigationSetByAdmin = false; this.contextMenuProvider = new ContextMenuProvider( [ ContextMenuAction.CreateChild, ContextMenuAction.Delete, ContextMenuAction.Update, ContextMenuAction.CopyPath, ContextMenuAction.AllowDownload, ], { [ContextMenuAction.CopyPath]: (item) => item.id !== SERVER_FOLDER_ID, }, ); } addChildItem: ( childItemUri: string | undefined, parentItemUri: string | undefined, properties: AddChildItemProperties, ) => Promise; recycleItem?: (item: ContentItem) => Promise<{ newUri?: Uri; oldUri?: Uri }>; restoreItem?: (item: ContentItem) => Promise; private async establishConnection() { const session = getSession(); session.onSessionLogFn = appendSessionLogFn; await session.setup(true); this.sessionId = session?.sessionId(); // Overwrite file nav settings with data coming from the compute context if (session.contextAttributes) { const attributes = await session.contextAttributes(); if ( attributes && (attributes.fileNavigationCustomRootPath || attributes.fileNavigationRoot) ) { this.fileNavigationSetByAdmin = true; this.fileNavigationCustomRootPath = attributes.fileNavigationCustomRootPath ?? ""; this.fileNavigationRoot = attributes.fileNavigationRoot ?? "USER"; } } return this.sessionId; } public async connect(): Promise { await this.establishConnection(); // This proxies all calls to the fileSystem api to reconnect // if we ever get a 401 (unauthorized) const reconnect = async () => { return await this.establishConnection(); }; this.fileSystemApi = new Proxy(FileSystemApi(getApiConfig()), { get: function (target, property) { if (typeof target[property] === "function") { return new Proxy(target[property], { apply: async function (target, _this, argList) { try { return await target(...argList); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { // If we get any error, lets reconnect and try again. If we fail a second time, // then we can assume it's a "real" error const sessionId = await reconnect(); // If we reconnected, lets make sure we update our session id if (argList.length && argList[0].sessionId) { argList[0].sessionId = sessionId; } return await target(...argList); } }, }); } return target[property]; }, }); } public connected(): boolean { return true; } public async setup(): Promise { if (this.sessionId && this.fileSystemApi) { return; } await this.connect(); } // TODO #417 Implement favorites public async addItemToFavorites(): Promise { throw new Error("Method not implemented."); } // TODO #417 Implement favorites public async removeItemFromFavorites(): Promise { throw new Error("Method not implemented."); } public async createNewFolder( parentItem: ContentItem, folderName: string, ): Promise { try { const response = await this.fileSystemApi.createFileOrDirectory({ sessionId: this.sessionId, fileOrDirectoryPath: this.getCreationPath(parentItem.uri), fileProperties: { name: folderName, isDirectory: true }, }); return this.filePropertiesToContentItem(response.data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async createNewItem( parentItem: ContentItem, fileName: string, buffer?: ArrayBufferLike, ): Promise { try { const response = await this.fileSystemApi.createFileOrDirectory({ sessionId: this.sessionId, fileOrDirectoryPath: this.getCreationPath(parentItem.uri), fileProperties: { name: fileName, isDirectory: false }, }); const contentItem = this.filePropertiesToContentItem(response.data); this.updateFileMetadata( this.trimComputePrefix(contentItem.uri), response, ); if (buffer) { await this.updateContentOfItemAtPath( this.trimComputePrefix(contentItem.uri), new TextDecoder().decode(buffer), ); } return contentItem; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } private getCreationPath(uri: string) { if ( uri === SAS_SERVER_HOME_DIRECTORY && this.fileNavigationRoot === "CUSTOM" ) { return ( this.fileNavigationCustomRootPath.replace(/\//g, SAS_FILE_SEPARATOR) || SAS_FILE_SEPARATOR ); } return this.trimComputePrefix(uri); } public async deleteItem(item: ContentItem): Promise { const filePath = this.trimComputePrefix(item.uri); try { await this.fileSystemApi.deleteFileOrDirectoryFromSystem({ sessionId: this.sessionId, fileOrDirectoryPath: filePath, ifMatch: "", }); delete this.fileMetadataMap[filePath]; return true; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return false; } } private getNavigationRoot(): string { if (this.fileNavigationRoot === "CUSTOM") { const navPath = this.fileNavigationCustomRootPath.split("/").join("~fs~"); return `/compute/sessions/${this.sessionId}/files/${navPath}/members`; } return `/compute/sessions/${this.sessionId}/files/~fs~/members`; } public async getChildItems(parentItem: ContentItem): Promise { // If the user is fetching child items of the root folder, give them the // "home" directory if (parentItem.id === SERVER_FOLDER_ID) { return [ this.filePropertiesToContentItem( createStaticFolder( SAS_SERVER_HOME_DIRECTORY, ...homeDirectoryNameAndType( this.fileNavigationRoot, this.fileNavigationCustomRootPath, ), this.getNavigationRoot(), "getDirectoryMembers", ), ), ]; } const allItems = []; const limit = 100; let start = 0; let totalItemCount = 0; do { let response; try { response = await this.fileSystemApi.getDirectoryMembers({ sessionId: this.sessionId, directoryPath: this.trimComputePrefix( getLink(parentItem.links, "GET", "getDirectoryMembers").uri, ).replace("/members", ""), limit, start, }); } catch (error) { // If this error is specifically related to file nav root settings, provide // better feedback to the user if ( error.status === 404 && parentItem.uri === SAS_SERVER_HOME_DIRECTORY && this.fileNavigationRoot === "CUSTOM" ) { if (this.fileNavigationSetByAdmin) { throw new Error(Messages.FileNavigationRootAdminError); } else { throw new Error(Messages.FileNavigationRootUserError); } } throw error; } totalItemCount = response.data.count; allItems.push( ...response.data.items.map((childItem: FileProperties, index) => ({ ...this.filePropertiesToContentItem(childItem), uid: `${parentItem.uid}/${index + start}`, })), ); start += limit; } while (start < totalItemCount); return sortedContentItems(allItems); } public async getContentOfItem(item: ContentItem): Promise { const path = this.trimComputePrefix(item.uri); return await this.getContentOfItemAtPath(path); } public async getContentOfUri(uri: Uri): Promise { const path = this.trimComputePrefix(getResourceId(uri)); return await this.getContentOfItemAtPath(path); } private async getContentOfItemAtPath(path: string) { const response = await this.fileSystemApi.getFileContentFromSystem( { sessionId: this.sessionId, filePath: path, }, { responseType: "arraybuffer", }, ); this.updateFileMetadata(path, response); // Disabling typescript checks on this line as this function is typed // to return AxiosResponse. However, it appears to return // AxiosResponse. // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return response.data as unknown as string; } public async getFolderPathForItem(): Promise { // This is for creating a filename statement which won't work as expected for // file system files. return ""; } public async getPathOfItem(item: ContentItem): Promise { const uri = item.uri === SAS_SERVER_HOME_DIRECTORY ? this.getNavigationRoot().replace("/members", "") : item.uri; const path = this.trimComputePrefix(uri); return path.split(SAS_FILE_SEPARATOR).join("/").replace(/~sc~/g, ";"); } public async getItemOfUri(uri: Uri): Promise { const fileOrDirectoryPath = this.trimComputePrefix(getResourceId(uri)); const response = await this.fileSystemApi.getFileorDirectoryProperties({ sessionId: this.sessionId, fileOrDirectoryPath, }); this.updateFileMetadata(fileOrDirectoryPath, response); return this.filePropertiesToContentItem(response.data); } public async getParentOfItem( item: ContentItem, ): Promise { const fileOrDirectoryPath = this.getParentPathOfUri( this.trimComputePrefix(item.uri), ); const response = await this.fileSystemApi.getFileorDirectoryProperties({ sessionId: this.sessionId, fileOrDirectoryPath, }); return this.filePropertiesToContentItem(response.data); } // TODO #417 Implement as part of favorites public getRootFolder(): ContentItem | undefined { return undefined; } public async getRootItems(): Promise { await this.setup(); for (let index = 0; index < SAS_SERVER_ROOT_FOLDERS.length; ++index) { const delegateFolderName = SAS_SERVER_ROOT_FOLDERS[index]; const result = delegateFolderName === "@sasServerRoot" ? { data: SAS_SERVER_ROOT_FOLDER } : { data: {} }; this.rootFolders[delegateFolderName] = { ...result.data, uid: `${index}`, ...this.filePropertiesToContentItem(result.data), }; } return this.rootFolders; } public async getUriOfItem(item: ContentItem): Promise { if (item.type !== "reference") { return item.vscUri; } return item.vscUri; // TODO #417 Implement favorites // // If we're attempting to open a favorite, open the underlying file instead. // try { // return (await this.getItemOfId(item.uri)).vscUri; // } catch (error) { // return item.vscUri; // } } public async moveItem( item: ContentItem, targetParentFolderUri: string, ): Promise { const currentFilePath = this.trimComputePrefix(item.uri); const newFilePath = this.trimComputePrefix(targetParentFolderUri); const { etag } = await this.getFileInfo(currentFilePath, true); const params = { sessionId: this.sessionId, fileOrDirectoryPath: currentFilePath, ifMatch: etag, fileProperties: { name: item.name, path: newFilePath .split(SAS_FILE_SEPARATOR) .join("/") .replace(/~sc~/g, ";"), }, }; try { const response = await this.fileSystemApi.updateFileOrDirectoryOnSystem(params); delete this.fileMetadataMap[currentFilePath]; this.updateFileMetadata(newFilePath, response); return this.filePropertiesToContentItem(response.data).vscUri; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async renameItem( item: ContentItem, newName: string, ): Promise { const filePath = this.trimComputePrefix(item.uri); const parsedFilePath = filePath.split(SAS_FILE_SEPARATOR); parsedFilePath.pop(); const path = parsedFilePath.join("/"); try { const response = await this.fileSystemApi.updateFileOrDirectoryOnSystem({ sessionId: this.sessionId, fileOrDirectoryPath: filePath, ifMatch: "", fileProperties: { name: newName, path }, }); this.updateFileMetadata(filePath, response); return this.filePropertiesToContentItem(response.data); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return; } } public async updateContentOfItem(uri: Uri, content: string): Promise { const filePath = this.trimComputePrefix(getResourceId(uri)); return await this.updateContentOfItemAtPath(filePath, content); } private async updateContentOfItemAtPath( filePath: string, content: string, ): Promise { const { etag } = await this.getFileInfo(filePath); const data = { sessionId: this.sessionId, filePath, // updateFileContentOnSystem requires body to be a File type. However, the // underlying code is expecting a string. This forces compute to accept // a string. // eslint-disable-next-line @typescript-eslint/consistent-type-assertions body: content as unknown as File, ifMatch: etag, }; const response = await this.fileSystemApi.updateFileContentOnSystem(data); this.updateFileMetadata(filePath, response); } private getParentPathOfUri(uri: string) { const uriPieces = uri.split(SAS_FILE_SEPARATOR); uriPieces.pop(); return uriPieces.join(SAS_FILE_SEPARATOR); } private filePropertiesToContentItem( fileProperties: FileProperties & { type?: string }, flags?: ContentItem["flags"], ): ContentItem { const links = fileProperties.links.map((link) => ({ method: link.method, rel: link.rel, href: link.href, type: link.type, uri: link.uri, })); const id = getLink(links, "GET", "self").uri; const isRootFolder = [SERVER_FOLDER_ID, SAS_SERVER_HOME_DIRECTORY].includes( id, ); const item = { id, uri: id, name: fileProperties.name, creationTimeStamp: 0, modifiedTimeStamp: new Date(fileProperties.modifiedTimeStamp).getTime(), links, permission: { write: !isRootFolder && !fileProperties.readOnly, delete: !isRootFolder && !fileProperties.readOnly, addMember: !!getLink(links, "POST", "makeDirectory") || !!getLink(links, "POST", "createFile") || id === SAS_SERVER_HOME_DIRECTORY, }, flags, type: fileProperties.type || "", parentFolderUri: this.getParentPathOfUri(id), }; const typeName = getTypeName(item); return { ...item, contextValue: this.contextMenuProvider.availableActions(item), fileStat: { ctime: item.creationTimeStamp, mtime: item.modifiedTimeStamp, size: 0, type: fileProperties.isDirectory || FOLDER_TYPES.indexOf(typeName) >= 0 || isRootFolder ? FileType.Directory : FileType.File, }, isReference: isReference(item), resourceId: getResourceIdFromItem(item), vscUri: getSasServerUri(item, flags?.isInRecycleBin || false), typeName: getTypeName(item), }; } private trimComputePrefix(uri: string): string { const uriWithoutPrefix = uri.replace( /\/compute\/sessions\/[a-zA-Z0-9-]*\/files\//, "", ); try { return decodeURIComponent(uriWithoutPrefix); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { return uriWithoutPrefix; } } private updateFileMetadata(id: string, { headers }: AxiosResponse) { this.fileMetadataMap[id] = { etag: headers.etag, }; return this.fileMetadataMap[id]; } private async getFileInfo(path: string, forceRefresh?: boolean) { if (!forceRefresh && path in this.fileMetadataMap) { return this.fileMetadataMap[path]; } // If we don't have file metadata stored, lets attempt to fetch it try { const response = await this.fileSystemApi.getFileorDirectoryProperties({ sessionId: this.sessionId, fileOrDirectoryPath: path, }); return this.updateFileMetadata(path, response); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { // Intentionally blank } return { etag: "", }; } } export default RestServerAdapter; ================================================ FILE: client/src/connection/rest/api/common.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Compute * The Compute API defines the replacement for the application servers that were used for SAS 9. The Compute API enables clients to perform the following tasks:
  • Submit and execute SAS code.
  • Obtain the SAS log or listing information from executed SAS code.
  • View output that is generated by a SAS code submission.
  • Access SAS data sets that are created by a SAS code submission.
  • Access SAS filerefs that are created by a SAS code submission.
  • Access SAS variables that are defined and used in a SAS code submission.
  • Retrieve information about engines that are available in a session.
* * The version of the OpenAPI document: 11 * Contact: devex@sas.com * * NOTE: This class is auto generated by OpenAPI * Do not edit the class manually. */ /* tslint:disable */ /* eslint-disable */ import globalAxios, { AxiosRequestConfig, AxiosResponse } from "axios"; import { URL, URLSearchParams } from "url"; import { Configuration } from "./configuration"; /** * * @export */ export const DUMMY_BASE_URL = "https://example.com"; /** * * @export * @interface RequestArgs */ export interface RequestArgs { url: string; options: AxiosRequestConfig; } /** * * @export * @class RequiredError * @extends {Error} */ export class RequiredError extends Error { name: "RequiredError" = "RequiredError"; constructor( public field: string, msg?: string, ) { super(msg); } } /** * * @throws {RequiredError} * @export */ export const assertParamExists = function ( functionName: string, paramName: string, paramValue: unknown, ) { if (paramValue === null || paramValue === undefined) { throw new RequiredError( paramName, `Required parameter ${paramName} was null or undefined when calling ${functionName}.`, ); } }; function setFlattenedQueryParams( urlSearchParams: URLSearchParams, parameter: any, key: string = "", ): void { if (typeof parameter === "object") { if (Array.isArray(parameter)) { (parameter as any[]).forEach((item) => setFlattenedQueryParams(urlSearchParams, item, key), ); } else { Object.keys(parameter).forEach((currentKey) => setFlattenedQueryParams( urlSearchParams, parameter[currentKey], `${key}${key !== "" ? "." : ""}${currentKey}`, ), ); } } else { if (urlSearchParams.has(key)) { urlSearchParams.append(key, parameter); } else { urlSearchParams.set(key, parameter); } } } /** * * @export */ export const setSearchParams = function (url: URL, ...objects: any[]) { const searchParams = new URLSearchParams(url.search); setFlattenedQueryParams(searchParams, objects); url.search = searchParams.toString(); }; /** * * @export */ export const serializeDataIfNeeded = function ( value: any, requestOptions: any, configuration?: Configuration, ) { const nonString = typeof value !== "string"; const needsSerialization = nonString && configuration && configuration.isJsonMime ? configuration.isJsonMime(requestOptions.headers["Content-Type"]) : nonString; return needsSerialization ? JSON.stringify(value !== undefined ? value : {}) : value || ""; }; /** * * @export */ export const toPathString = function (url: URL) { return url.pathname + url.search + url.hash; }; /** * * @export */ export const createRequestFunction = function ( axiosArgs: RequestArgs, configuration?: Configuration, ) { const axiosRequestArgs = { ...axiosArgs.options, url: (configuration?.basePath || "") + axiosArgs.url, }; if (axiosRequestArgs.headers && configuration?.accessToken) axiosRequestArgs.headers["Authorization"] = "Bearer " + configuration?.accessToken; return globalAxios.request>(axiosRequestArgs); }; ================================================ FILE: client/src/connection/rest/api/compute.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Compute * The Compute API defines the replacement for the application servers that were used for SAS 9. The Compute API enables clients to perform the following tasks:
  • Submit and execute SAS code.
  • Obtain the SAS log or listing information from executed SAS code.
  • View output that is generated by a SAS code submission.
  • Access SAS data sets that are created by a SAS code submission.
  • Access SAS filerefs that are created by a SAS code submission.
  • Access SAS variables that are defined and used in a SAS code submission.
  • Retrieve information about engines that are available in a session.
* * The version of the OpenAPI document: 11 * Contact: devex@sas.com * * NOTE: This class is auto generated by OpenAPI * Do not edit the class manually. */ /* tslint:disable */ /* eslint-disable */ import { AxiosRequestConfig, AxiosResponse } from "axios"; // URLSearchParams not necessarily used // @ts-ignore import { URL } from "url"; // Some imports not used depending on template conditions // @ts-ignore import { DUMMY_BASE_URL, RequestArgs, assertParamExists, createRequestFunction, serializeDataIfNeeded, setSearchParams, toPathString, } from "./common"; import { Configuration } from "./configuration"; /** * The list of links to top-level resources and operations available from the root of the API. * @export * @interface Api */ export interface Api { /** * The version number of the API representation. This is version 1. * @type {number} * @memberof Api */ version: number; /** * The API\'s top-level links. * @type {Array} * @memberof Api */ links: Array; } /** * This is a base schema used to define paginated collections of resources. This base schema is extended by other schemas in APIs by adding an \'items\' array property. These extensions define the application/vnd.sas.collection media type (version 2) * @export * @interface BaseCollection2 */ export interface BaseCollection2 { /** * The name of the collection. * @type {string} * @memberof BaseCollection2 */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof BaseCollection2 */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof BaseCollection2 */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof BaseCollection2 */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof BaseCollection2 */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof BaseCollection2 */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof BaseCollection2 */ version?: number; } /** * Describes a column from a table. * @export * @interface Column */ export interface Column { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof Column */ version?: number; /** * Specifies the identifier for this column. * @type {string} * @memberof Column */ id?: string; /** * Specifies the name for this column. * @type {string} * @memberof Column */ name?: string; /** * Specifies the numerical index for this column. This is a zero-based index. * @type {number} * @memberof Column */ index?: number; /** * Specifies the label for this column. The label is optional. * @type {string} * @memberof Column */ label?: string; /** * Specifies the length of the data in this column. * @type {number} * @memberof Column */ length?: number; /** * Specifies the data type of the column. * @type {string} * @memberof Column */ type?: string; /** * * @type {ColumnSimpleFormat} * @memberof Column */ format?: ColumnSimpleFormat; /** * * @type {ColumnSimpleFormat} * @memberof Column */ informat?: ColumnSimpleFormat; } /** * Provides a paginated collection of table columns. * @export * @interface ColumnCollection */ export interface ColumnCollection { /** * The name of the collection. * @type {string} * @memberof ColumnCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof ColumnCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof ColumnCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof ColumnCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof ColumnCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof ColumnCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof ColumnCollection */ version?: number; /** * Specifies an array that contains column resources. * @type {Array} * @memberof ColumnCollection */ items: Array; } /** * * @export * @interface ColumnCollectionAllOf */ export interface ColumnCollectionAllOf { /** * Specifies an array that contains column resources. * @type {Array} * @memberof ColumnCollectionAllOf */ items: Array; } /** * Specifies the format to apply to a column when retrieving data from a cell. * @export * @interface ColumnFormatting */ export interface ColumnFormatting { /** * Specifies the name of a column. * @type {string} * @memberof ColumnFormatting */ name?: string; /** * Specifies the format to use when retrieving data from a column. * @type {string} * @memberof ColumnFormatting */ format?: string; } /** * Specifies the format to use for values in a column. * @export * @interface ColumnSimpleFormat */ export interface ColumnSimpleFormat { /** * Specifies the number of digits to the right of the decimal point. * @type {number} * @memberof ColumnSimpleFormat */ decimals?: number; /** * Specifies the length of a formatted value. * @type {number} * @memberof ColumnSimpleFormat */ length?: number; /** * Specifies the qualified name of the format or informat in the form of: <$>name. * @type {string} * @memberof ColumnSimpleFormat */ name?: string; } /** * Provides a request to generate a column collection. * @export * @interface ColumnsRequest */ export interface ColumnsRequest { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof ColumnsRequest */ version?: number; /** * Specifies the identifier for a column. * @type {string} * @memberof ColumnsRequest */ id?: string; /** * Specifies an array of strings that indicate the columns to include in a row set. If you do not specify a value, then all columns are returned. The order of the column names in the list indicates the order of the cells of the row set. * @type {Array} * @memberof ColumnsRequest */ includeColumns?: Array; /** * * @type {FileProtection} * @memberof ColumnsRequest */ fileProtection?: FileProtection; /** * Specifies the encoding for the password values in the fileProtection structure. If the value is \"base64\", then the password values in the fileProtection structure should be encoded by converting the text to UTF-8 and base64-encoding the result. If no value is provided, then the password values of the fileProtection structure are expected to be clear text. * @type {string} * @memberof ColumnsRequest */ fileProtectionEncoding?: string; } /** * Provides a concatenation of libraries. * @export * @interface Concatenation */ export interface Concatenation { /** * Specifies the name of the engine that is used for this member of the concatenation. * @type {string} * @memberof Concatenation */ engineName?: string; /** * Specifies the name of the file format that is used for this member of the concatenation. * @type {string} * @memberof Concatenation */ fileFormat?: string; /** * Specifies the physical name that is used for this member of the concatenation. * @type {string} * @memberof Concatenation */ physicalName?: string; } /** * Provides information about the context that is stored for a service. * @export * @interface Context */ export interface Context { /** * Specifies the version number of this representation schema. This is version 4. * @type {number} * @memberof Context */ version?: number; /** * Specifies the Compute context definition ID. * @type {string} * @memberof Context */ id: string; /** * Specifies the localized context name. * @type {string} * @memberof Context */ name: string; /** * Specifies the localized description. * @type {string} * @memberof Context */ description?: string; /** * * @type {ContextLaunchContext} * @memberof Context */ launchContext: ContextLaunchContext; /** * Specifies the type of launcher to use when launching SAS Compute Servers. The only value currently supported is service, which refers to the Launcher service. * @type {string} * @memberof Context */ launchType: string; /** * Specifies the service-defined attributes that were set when this context was created. * @type {object} * @memberof Context */ attributes?: object; /** * * @type {Environment} * @memberof Context */ environment?: Environment; /** * Specifies optional information that overrides mappings of file extensions to media types in the sessions that was launched for this context. The session attempts to use file extensions to determine the media type of the files that are returned. Standard IANA type mappings are used. To override the default behavior of the server, specify a mapping from a file extension to a media type name. That media type is then used for that file extension. * @type {{ [key: string]: string; }} * @memberof Context */ mediaTypeMap?: { [key: string]: string }; /** * Specifies the user-ID that created the context definition. * @type {string} * @memberof Context */ createdBy?: string; /** * Specifies the user ID that last updated the context definition. * @type {string} * @memberof Context */ modifiedBy?: string; /** * Specifies the timestamp when the context was created. * @type {string} * @memberof Context */ creationTimeStamp?: string; /** * Specifies the timestamp when the context was last updated. * @type {string} * @memberof Context */ modifiedTimeStamp?: string; /** * Specifies links that apply to the context. * @type {Array} * @memberof Context */ links?: Array; /** * Specifies the resources that have been configured for this context. * @type {Array} * @memberof Context */ resources?: Array; /** * Specifies the name of the workload queue where Compute servers configured from this context should run. If workload queues are not supported, this specification will be ignored. The value of the queue name is limited to 250 characters. * @type {string} * @memberof Context */ queueName?: string; } /** * Provides information about the Launch context that is used by the Compute service. * @export * @interface ContextLaunchContext */ export interface ContextLaunchContext { /** * Specifies the command that launches the server for this context. If this value is not set, the service uses the default command that is determined at runtime. * @type {string} * @memberof ContextLaunchContext */ command?: string; /** * Specifies the context name from the launcher context. If the launchType is service, then contextId or contextName is required. * @type {string} * @memberof ContextLaunchContext */ contextName?: string; /** * Specifies the context ID from the launcher context. If the launchType is service, then contextId or contextName is required. * @type {string} * @memberof ContextLaunchContext */ contextId?: string; } /** * Enables the creation of a new Compute context. * @export * @interface ContextRequest */ export interface ContextRequest { /** * Specifies the version number of this representation schema. This is version 3. * @type {number} * @memberof ContextRequest */ version?: number; /** * Specifies the context name. The value of the name is limited to 100 characters. The value must be unique. * @type {string} * @memberof ContextRequest */ name: string; /** * Specifies a localized description. The value of description is limited to 1000 characters. * @type {string} * @memberof ContextRequest */ description?: string; /** * * @type {ContextLaunchContext} * @memberof ContextRequest */ launchContext: ContextLaunchContext; /** * Specifies the type of launcher to use when launching SAS Compute Servers. The only value currently supported is service, which refers to the Launcher service. * @type {string} * @memberof ContextRequest */ launchType: string; /** * Specifies the attributes that control the behavior of sessions, based on this context. See the example for details. * @type {object} * @memberof ContextRequest */ attributes?: object; /** * * @type {Environment} * @memberof ContextRequest */ environment?: Environment; /** * Specifies the list of users who are allowed to request sessions using the specified context. * @type {Array} * @memberof ContextRequest */ authorizedUsers?: Array; /** * Specifies the list of groups whose memes are allowed to request sessions using the specified context. * @type {Array} * @memberof ContextRequest */ authorizedGroups?: Array; /** * Specifies whether all authenticated users are allowed to request sessions using the specified context. If true, then authorizedUsers and authorizedGroups are ignored. * @type {boolean} * @memberof ContextRequest */ authorizeAllAuthenticatedUsers?: boolean; /** * Specifies whether the guest user is allowed to request sessions using the specified context. * @type {boolean} * @memberof ContextRequest */ facilitateGuest?: boolean; /** * Specifies optional information that overrides mappings of file extensions to media types in sessions that are launched for this context. The session attempts to use file extensions to determine the media type of files that are returned. Standard IANA type mappings are used. To override the default behavior of the server, specify a mapping from a file extension to a media type name. That media type is then used for that file extension. * @type {{ [key: string]: string; }} * @memberof ContextRequest */ mediaTypeMap?: { [key: string]: string }; /** * Specifies the resources that have been requested to be added to this context. * @type {Array} * @memberof ContextRequest */ resources?: Array; /** * Specifies the name of the workload queue where Compute servers configured from this context should run. If workload queues are not supported, this specification will be ignored. The value of the queue name is limited to 250 characters. * @type {string} * @memberof ContextRequest */ queueName?: string; } /** * Provides summary information about the context that is stored for a service. * @export * @interface ContextSummary */ export interface ContextSummary { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof ContextSummary */ version?: number; /** * Specifies the definition ID of the Compute context summary. * @type {string} * @memberof ContextSummary */ id?: string; /** * Specifies the localized context name. * @type {string} * @memberof ContextSummary */ name?: string; /** * Specifies the user-ID that created the context definition. * @type {string} * @memberof ContextSummary */ createdBy?: string; /** * Specifies the links that apply to the context. * @type {Array} * @memberof ContextSummary */ links?: Array; } /** * Provides a paginated collection of context summaries. * @export * @interface ContextSummaryCollection */ export interface ContextSummaryCollection { /** * The name of the collection. * @type {string} * @memberof ContextSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof ContextSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof ContextSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof ContextSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof ContextSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof ContextSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof ContextSummaryCollection */ version?: number; /** * Specifies the array that contains context summaries. * @type {Array} * @memberof ContextSummaryCollection */ items: Array; } /** * * @export * @interface ContextSummaryCollectionAllOf */ export interface ContextSummaryCollectionAllOf { /** * Specifies the array that contains context summaries. * @type {Array} * @memberof ContextSummaryCollectionAllOf */ items: Array; } /** * Describes a member of a directory-based fileref object. * @export * @interface DirMember */ export interface DirMember { /** * Specifies a Compute context definition id. * @type {string} * @memberof DirMember */ id?: string; /** * Links that apply to this directory member * @type {Array} * @memberof DirMember */ links?: Array; } /** * Provides a collection that contains the members of a directory-based fileref object. * @export * @interface DirectoryCollection */ export interface DirectoryCollection { /** * The name of the collection. * @type {string} * @memberof DirectoryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof DirectoryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof DirectoryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof DirectoryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof DirectoryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof DirectoryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof DirectoryCollection */ version?: number; /** * Specifies an array that contains a listing of members of a directory fileref. * @type {Array} * @memberof DirectoryCollection */ items: Array; } /** * * @export * @interface DirectoryCollectionAllOf */ export interface DirectoryCollectionAllOf { /** * Specifies an array that contains a listing of members of a directory fileref. * @type {Array} * @memberof DirectoryCollectionAllOf */ items: Array; } /** * Provides a description of a SAS LIBNAME engine. * @export * @interface Engine */ export interface Engine { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof Engine */ version?: number; /** * Specifies the unique name of this engine. * @type {string} * @memberof Engine */ name?: string; /** * Specifies the label for this engine. This value maps to the nickname for the engine in the Compute session. * @type {string} * @memberof Engine */ label?: string; /** * Specifies the engine description. In the Compute session, this is the short legal name of the engine. * @type {string} * @memberof Engine */ description?: string; /** * Specifies the providerId for this service. In a Compute session, this value is compute. * @type {string} * @memberof Engine */ providerId?: string; /** * Specifies the identifier of the data source that provides the engine. In a Compute session, this is the context id. * @type {string} * @memberof Engine */ dataSourceId?: string; /** * Specifies whether the engine is licensed. * @type {boolean} * @memberof Engine */ licensed?: boolean; /** * Specifies links that apply to this engine. * @type {Array} * @memberof Engine */ links?: Array; } /** * Provides a paginated collection of SAS engine objects. * @export * @interface EngineCollection */ export interface EngineCollection { /** * The name of the collection. * @type {string} * @memberof EngineCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof EngineCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof EngineCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof EngineCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof EngineCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof EngineCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof EngineCollection */ version?: number; /** * Specifies an array that contains engine resources. * @type {Array} * @memberof EngineCollection */ items: Array; } /** * * @export * @interface EngineCollectionAllOf */ export interface EngineCollectionAllOf { /** * Specifies an array that contains engine resources. * @type {Array} * @memberof EngineCollectionAllOf */ items: Array; } /** * Provides the SAS options and initialization code that is used by the Compute service and its sessions. * @export * @interface Environment */ export interface Environment { /** * Specifies the SAS options to apply to a context. * @type {Array} * @memberof Environment */ options?: Array; /** * Specifies the SAS code to execute during session initialization. * @type {Array} * @memberof Environment */ autoExecLines?: Array; } /** * The representation of an error. * @export * @interface Error2 */ export interface Error2 { /** * The message for the error. * @type {string} * @memberof Error2 */ message?: string; /** * The string ID for the error. * @type {string} * @memberof Error2 */ id?: string; /** * The numeric ID for the error. * @type {number} * @memberof Error2 */ errorCode?: number; /** * The HTTP status code for the error. * @type {number} * @memberof Error2 */ httpStatusCode: number; /** * Messages that provide additional details about the cause of the error. * @type {Array} * @memberof Error2 */ details?: Array; /** * A message that describes how to resolve the error. * @type {string} * @memberof Error2 */ remediation?: string; /** * Any additional errors that occurred. * @type {Array} * @memberof Error2 */ errors?: Array; /** * The links that apply to the error. * @type {Array} * @memberof Error2 */ links?: Array; /** * The version number of the error representation. This representation is version 2. * @type {number} * @memberof Error2 */ version: number; } /** * Provides properties of a file or directory object. * @export * @interface FileProperties */ export interface FileProperties { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof FileProperties */ version?: number; /** * Specifies whether the object references a directory on the system. * @type {boolean} * @memberof FileProperties */ isDirectory?: boolean; /** * Specifies whether the file or directory is Read Only. * @type {boolean} * @memberof FileProperties */ readOnly?: boolean; /** * Specifies links that apply to this file or directory object. * @type {Array} * @memberof FileProperties */ links?: Array; /** * Specifies the name of the file or directory. * @type {string} * @memberof FileProperties */ name?: string; /** * Specifies the path of the file or directory. * @type {string} * @memberof FileProperties */ path?: string; /** * Specifies the size of the file or directory. * @type {number} * @memberof FileProperties */ size?: number; /** * Specifies the modification timestamp for this file or directory. * @type {string} * @memberof FileProperties */ modifiedTimeStamp?: string; /** * Specifies the creation timestamp for this file or directory. This information is returned only if the file or directory is available. * @type {string} * @memberof FileProperties */ creationTimeStamp?: string; } /** * Provides a collection that contains the members of a directory. * @export * @interface FilePropertiesCollection */ export interface FilePropertiesCollection { /** * The name of the collection. * @type {string} * @memberof FilePropertiesCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FilePropertiesCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FilePropertiesCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FilePropertiesCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FilePropertiesCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof FilePropertiesCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FilePropertiesCollection */ version?: number; /** * Specifies an array that contains a listing of members of a directory. * @type {Array} * @memberof FilePropertiesCollection */ items: Array; } /** * * @export * @interface FilePropertiesCollectionAllOf */ export interface FilePropertiesCollectionAllOf { /** * Specifies an array that contains a listing of members of a directory. * @type {Array} * @memberof FilePropertiesCollectionAllOf */ items: Array; } /** * Specifies information that you use to access data sets or tables that are protected. Provide password values in the format password-type=password. Possible values for password-type are \"ALTER\", \"PW\", \"READ\", or \"WRITE\". A password value must be a valid eight-character SAS name. * @export * @interface FileProtection */ export interface FileProtection { /** * Specifies the password that grants Read access to the file that represents the data set. * @type {string} * @memberof FileProtection */ read?: string; /** * Specifies the password that grants Alter access to the file that represents the data set. * @type {string} * @memberof FileProtection */ alter?: string; /** * Specifies the password that grants Write access to the file that represents the data set. * @type {string} * @memberof FileProtection */ write?: string; } /** * Provides properties of a file or directory object. * @export * @interface FileRequest */ export interface FileRequest { /** * Specifies the name of the file or directory. * @type {string} * @memberof FileRequest */ name?: string; /** * Specifies the path of the file or directory. * @type {string} * @memberof FileRequest */ path?: string; } /** * An object representing a file * @export * @interface FileResource */ export interface FileResource { /** * The username of whoever created the resource. * @type {string} * @memberof FileResource */ createdBy?: string; /** * The username of whoever last modified the resource. * @type {string} * @memberof FileResource */ modifiedBy?: string; /** * The timestamp for when the resource was created. * @type {string} * @memberof FileResource */ creationTimeStamp?: string; /** * The timestamp for when the resource was last modified. * @type {string} * @memberof FileResource */ modifiedTimeStamp?: string; /** * URI of the object which is either associated or linked with file resource * @type {string} * @memberof FileResource */ parentUri?: string; /** * Properties specific to this file. Each property uses a \"key\" : \"value\" format and a comma is used as the separator between properties. * @type {{ [key: string]: string; }} * @memberof FileResource */ properties?: { [key: string]: string }; /** * Value for Content Disposition header which will be set in response while downloading the file * @type {string} * @memberof FileResource */ contentDisposition?: string; /** * Type of the content * @type {string} * @memberof FileResource */ contentType?: string; /** * Description of the document * @type {string} * @memberof FileResource */ description?: string; /** * Type of the document * @type {string} * @memberof FileResource */ documentType?: string; /** * Encoding of the document * @type {string} * @memberof FileResource */ encoding?: string; /** * Id of the file resource * @type {string} * @memberof FileResource */ id?: string; /** * Links that apply to this object. Includes \"self\", \"content\", \"patch\", \"update\" and \"delete\" * @type {Array} * @memberof FileResource */ links?: Array; /** * Name of the document * @type {string} * @memberof FileResource */ name?: string; /** * Byte size of the document content * @type {number} * @memberof FileResource */ size?: number; } /** * * @export * @interface FileResourceAllOf */ export interface FileResourceAllOf { /** * URI of the object which is either associated or linked with file resource * @type {string} * @memberof FileResourceAllOf */ parentUri?: string; /** * Properties specific to this file. Each property uses a \"key\" : \"value\" format and a comma is used as the separator between properties. * @type {{ [key: string]: string; }} * @memberof FileResourceAllOf */ properties?: { [key: string]: string }; /** * Value for Content Disposition header which will be set in response while downloading the file * @type {string} * @memberof FileResourceAllOf */ contentDisposition?: string; /** * Type of the content * @type {string} * @memberof FileResourceAllOf */ contentType?: string; /** * Description of the document * @type {string} * @memberof FileResourceAllOf */ description?: string; /** * Type of the document * @type {string} * @memberof FileResourceAllOf */ documentType?: string; /** * Encoding of the document * @type {string} * @memberof FileResourceAllOf */ encoding?: string; /** * Id of the file resource * @type {string} * @memberof FileResourceAllOf */ id?: string; /** * Links that apply to this object. Includes \"self\", \"content\", \"patch\", \"update\" and \"delete\" * @type {Array} * @memberof FileResourceAllOf */ links?: Array; /** * Name of the document * @type {string} * @memberof FileResourceAllOf */ name?: string; /** * Byte size of the document content * @type {number} * @memberof FileResourceAllOf */ size?: number; } /** * Provides a description of a SAS fileref object. * @export * @interface Fileref */ export interface Fileref { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof Fileref */ version?: number; /** * Specifies the access method that is used for this fileref. Common values are \"DISK\" and \"TEMP\", but other values be supported. * @type {string} * @memberof Fileref */ accessMethod?: string; /** * Specifies whether the fileref references a directory on the system. * @type {boolean} * @memberof Fileref */ isDirectory?: boolean; /** * Specifies links that apply to this fileref. * @type {Array} * @memberof Fileref */ links?: Array; /** * Specifies the name of fileref resource. * @type {string} * @memberof Fileref */ name?: string; /** * Specifies the modification timestamp for this fileref. * @type {string} * @memberof Fileref */ modifiedTimeStamp?: string; /** * Specifies the name of the file. * @type {string} * @memberof Fileref */ fileName?: string; /** * Specifies the size of the file. * @type {number} * @memberof Fileref */ fileSize?: number; /** * Specifies the identifier for this fileref. * @type {string} * @memberof Fileref */ id?: string; /** * Specifies the resolved path of the file. Support for this value was added in version 2. * @type {string} * @memberof Fileref */ filePath?: string; } /** * Enables you to create a new SAS fileref object. * @export * @interface FilerefRequest */ export interface FilerefRequest { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof FilerefRequest */ version?: number; /** * Specifies the name of this fileref. * @type {string} * @memberof FilerefRequest */ name: string; /** * Specifies the path to the file or directory that is referenced by this fileref. * @type {string} * @memberof FilerefRequest */ path: string; /** * Specifies the access method that is used for this fileref. Common values are \"DISK\" and \"TEMP\", but other values can be supported. * @type {string} * @memberof FilerefRequest */ accessMethod?: string; /** * Specifies an options string for the creation of the fileref. * @type {string} * @memberof FilerefRequest */ options?: string; } /** * Provides summary information about a SAS fileref. * @export * @interface FilerefSummary */ export interface FilerefSummary { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof FilerefSummary */ version?: number; /** * Specifies the identifier for this fileref. * @type {string} * @memberof FilerefSummary */ id?: string; /** * Specifies the name of fileref resource. * @type {string} * @memberof FilerefSummary */ name?: string; /** * Specifies links that apply to this fileref. * @type {Array} * @memberof FilerefSummary */ links?: Array; } /** * Provides a collection of fileref summaries. * @export * @interface FilerefSummaryCollection */ export interface FilerefSummaryCollection { /** * The name of the collection. * @type {string} * @memberof FilerefSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FilerefSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FilerefSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FilerefSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FilerefSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof FilerefSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FilerefSummaryCollection */ version?: number; /** * Array containing list of fileref summary resources. * @type {Array} * @memberof FilerefSummaryCollection */ items: Array; } /** * * @export * @interface FilerefSummaryCollectionAllOf */ export interface FilerefSummaryCollectionAllOf { /** * Array containing list of fileref summary resources. * @type {Array} * @memberof FilerefSummaryCollectionAllOf */ items: Array; } /** * Provides a description of a SAS format or informat. * @export * @interface Format */ export interface Format { /** * Specifies the category that this format falls into (for example, CHAR, DATE, BINARY, and so on). * @type {string} * @memberof Format */ category?: string; /** * Specifies the decimal precision that a format defaults to. * @type {number} * @memberof Format */ defaultDecimals?: number; /** * Specifies the default modifier that is applied to a format. * @type {number} * @memberof Format */ defaultModifier?: number; /** * Specifies the default width of this format. * @type {number} * @memberof Format */ defaultWidth?: number; /** * Specifies the format type, which is either \'format\' or \'informat\'. * @type {string} * @memberof Format */ formatType?: string; /** * Specifies whether a format is left-justified or right-justified. * @type {string} * @memberof Format */ justification?: string; /** * Specifies the maximum decimal precision that you can set for a format. * @type {number} * @memberof Format */ maximumDecimals?: number; /** * Specifies the maximum width that you can set for a format. * @type {number} * @memberof Format */ maximumWidth?: number; /** * Specifies the minimum decimal precision that you can set for a format. * @type {number} * @memberof Format */ minimumDecimals?: number; /** * Specifies the minimum width that you can set for a format. * @type {number} * @memberof Format */ minimumWidth?: number; /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof Format */ version?: number; /** * Specifies the identifier of a format. * @type {string} * @memberof Format */ id?: string; /** * Specifies the name of a format. * @type {string} * @memberof Format */ name?: string; /** * Specifies the links that apply to a format. * @type {Array} * @memberof Format */ links?: Array; } /** * Provides a summary of a SAS format or informat. * @export * @interface FormatSummary */ export interface FormatSummary { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof FormatSummary */ version?: number; /** * Specifies the identifier of this format. * @type {string} * @memberof FormatSummary */ id?: string; /** * Specifies the name of this format. * @type {string} * @memberof FormatSummary */ name?: string; /** * Specifies the links that apply to this format. * @type {Array} * @memberof FormatSummary */ links?: Array; } /** * Provides a collection of format summaries. * @export * @interface FormatSummaryCollection */ export interface FormatSummaryCollection { /** * The name of the collection. * @type {string} * @memberof FormatSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FormatSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FormatSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FormatSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FormatSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof FormatSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FormatSummaryCollection */ version?: number; /** * Specifies an array that contains a list of format summary resources. * @type {Array} * @memberof FormatSummaryCollection */ items: Array; } /** * * @export * @interface FormatSummaryCollectionAllOf */ export interface FormatSummaryCollectionAllOf { /** * Specifies an array that contains a list of format summary resources. * @type {Array} * @memberof FormatSummaryCollectionAllOf */ items: Array; } /** * Provides a description of a job that has been submitted to a Compute session. * @export * @interface Job */ export interface Job { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof Job */ version?: number; /** * Specifies the identifier that describes this job. * @type {string} * @memberof Job */ id?: string; /** * Specifies an optional name that is associated with this job. * @type {string} * @memberof Job */ name?: string; /** * Specifies an optional description for this job. * @type {string} * @memberof Job */ description?: string; /** * Specifies the timestamp when the job was created. * @type {string} * @memberof Job */ creationTimeStamp?: string; /** * Specifies the timestamp when the job completed. * @type {string} * @memberof Job */ completedTimeStamp?: string; /** * Specifies the session that this job was submitted in. * @type {string} * @memberof Job */ sessionId?: string; /** * Specifies the current state of this job. Here are the possible values: pending, running, canceled, warning, error, or completed. * @type {string} * @memberof Job */ state?: string; /** * Specifies the condition code for this job. This value is set when the job completes, and the value is set to the value of the SYSCC macro variable. * @type {number} * @memberof Job */ jobConditionCode?: number; /** * * @type {LogStatistics} * @memberof Job */ logStatistics?: LogStatistics; /** * * @type {ListingStatistics} * @memberof Job */ listingStatistics?: ListingStatistics; /** * * @type {JobStatistics} * @memberof Job */ statistics?: JobStatistics; /** * Specifies the links that apply to this job. * @type {Array} * @memberof Job */ links?: Array; } /** * Provides a paginated collection of jobs. * @export * @interface JobCollection */ export interface JobCollection { /** * The name of the collection. * @type {string} * @memberof JobCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof JobCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof JobCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof JobCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof JobCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof JobCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof JobCollection */ version?: number; /** * Specifies an array that contains job resources. * @type {Array} * @memberof JobCollection */ items: Array; } /** * * @export * @interface JobCollectionAllOf */ export interface JobCollectionAllOf { /** * Specifies an array that contains job resources. * @type {Array} * @memberof JobCollectionAllOf */ items: Array; } /** * Provides a collection of line objects that comprise the output for a job. * @export * @interface JobListingCollection */ export interface JobListingCollection { /** * The name of the collection. * @type {string} * @memberof JobListingCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof JobListingCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof JobListingCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof JobListingCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof JobListingCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof JobListingCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof JobListingCollection */ version?: number; /** * Specifies an array that contains listing lines from a job. * @type {Array} * @memberof JobListingCollection */ items: Array; } /** * * @export * @interface JobListingCollectionAllOf */ export interface JobListingCollectionAllOf { /** * Specifies an array that contains listing lines from a job. * @type {Array} * @memberof JobListingCollectionAllOf */ items: Array; } /** * Provides a collection of line objects that comprise the log for a job. * @export * @interface JobLogCollection */ export interface JobLogCollection { /** * The name of the collection. * @type {string} * @memberof JobLogCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof JobLogCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof JobLogCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof JobLogCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof JobLogCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof JobLogCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof JobLogCollection */ version?: number; /** * Specifies an array that contains log lines from a job. * @type {Array} * @memberof JobLogCollection */ items: Array; } /** * * @export * @interface JobLogCollectionAllOf */ export interface JobLogCollectionAllOf { /** * Specifies an array that contains log lines from a job. * @type {Array} * @memberof JobLogCollectionAllOf */ items: Array; } /** * Provides an object that you use to request a new job in a Compute session. * @export * @interface JobRequest */ export interface JobRequest { /** * Specifies the version number of this representation schema. This is version 3. * @type {number} * @memberof JobRequest */ version?: number; /** * Specifies an optional name that is associated with this job. * @type {string} * @memberof JobRequest */ name?: string; /** * Specifies an optional description for this job. * @type {string} * @memberof JobRequest */ description?: string; /** * * @type {Environment} * @memberof JobRequest */ environment?: Environment; /** * Specifies input variables for this request. * @type {{ [key: string]: string; }} * @memberof JobRequest */ variables?: { [key: string]: string }; /** * * @type {Array} * @memberof JobRequest */ code?: Array; /** * Specifies a URI path to a resource reference from the Files service. You must specify code or codeUri. * @type {string} * @memberof JobRequest */ codeUri?: string; /** * Specifies the resources that are requested for this job. * @type {Array} * @memberof JobRequest */ resources?: Array; /** * Specifies the attributes that modify the behavior of this job request. See example for details. Support for these attributes was added in version 2. * @type {object} * @memberof JobRequest */ attributes?: object; } /** * Provides performance data for a job. * @export * @interface JobStatistics */ export interface JobStatistics { /** * Specifies the elapsed CPU time that is related to the system. * @type {number} * @memberof JobStatistics */ systemCpuTime?: number; /** * Specifies the elapsed CPU time that is related to user tasks. * @type {number} * @memberof JobStatistics */ userCpuTime?: number; } /** * Describes a SAS libref. * @export * @interface Library */ export interface Library { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof Library */ version?: number; /** * Specifies the identifier for this library. This value is the same as the specified libref at assignment. * @type {string} * @memberof Library */ id?: string; /** * Specifies the number of concatenated libraries, if any are concatenated. * @type {number} * @memberof Library */ concatenationCount?: number; /** * Specifies the information about the concatenated members, if any are concatenated. * @type {Array} * @memberof Library */ concatenations?: Array; /** * Specifies the name of the engine that is used with this library. * @type {string} * @memberof Library */ engineName?: string; /** * Specifies the identifier of the format for this library. * @type {string} * @memberof Library */ fileFormat?: string; /** * Specifies the flags that were used when the library was created. * @type {number} * @memberof Library */ flags?: number; /** * Specifies the name of the referenced library. * @type {string} * @memberof Library */ libref?: string; /** * Specifies the name of the library resource. * @type {string} * @memberof Library */ name?: string; /** * Specifies the options that were used to create this library. * @type {string} * @memberof Library */ options?: string; /** * Specifies the resolved location of this library. * @type {string} * @memberof Library */ physicalName?: string; /** * Specifies whether the library is read only. * @type {boolean} * @memberof Library */ readOnly?: boolean; /** * Specifies links that apply to this library. * @type {Array} * @memberof Library */ links?: Array; } /** * Assigns a new library or libref. * @export * @interface LibraryRequest */ export interface LibraryRequest { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof LibraryRequest */ version?: number; /** * Specifies the name of the library to assign. * @type {string} * @memberof LibraryRequest */ name: string; /** * Specifies the engine to use with this library. * @type {string} * @memberof LibraryRequest */ engine: string; /** * Specifies the engine-specific path information for this library. * @type {string} * @memberof LibraryRequest */ path: string; /** * Specifies options that the engine uses. * @type {Array} * @memberof LibraryRequest */ options?: Array; } /** * Summarizes a SAS libref. * @export * @interface LibrarySummary */ export interface LibrarySummary { /** * The version number of this representation schema. This is version 2. * @type {number} * @memberof LibrarySummary */ version?: number; /** * Specifies the identifier for this library summary object. This is currently the same as the libref given at assignment time. * @type {string} * @memberof LibrarySummary */ id?: string; /** * Specifies the name of this library summary. * @type {string} * @memberof LibrarySummary */ name?: string; /** * Specifies links that apply to this library summary. * @type {Array} * @memberof LibrarySummary */ links?: Array; } /** * Provides a collection of library summaries. * @export * @interface LibrarySummaryCollection */ export interface LibrarySummaryCollection { /** * The name of the collection. * @type {string} * @memberof LibrarySummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof LibrarySummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof LibrarySummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof LibrarySummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof LibrarySummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof LibrarySummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof LibrarySummaryCollection */ version?: number; /** * Specifies an array that contains library summary resources. * @type {Array} * @memberof LibrarySummaryCollection */ items: Array; } /** * * @export * @interface LibrarySummaryCollectionAllOf */ export interface LibrarySummaryCollectionAllOf { /** * Specifies an array that contains library summary resources. * @type {Array} * @memberof LibrarySummaryCollectionAllOf */ items: Array; } /** * A link to a related operation or resource. * @export * @interface Link */ export interface Link { /** * The HTTP method for the link. * @type {string} * @memberof Link */ method?: string; /** * The relationship of the link to the resource. * @type {string} * @memberof Link */ rel: string; /** * The relative URI for the link. * @type {string} * @memberof Link */ uri?: string; /** * The URL for the link. * @type {string} * @memberof Link */ href?: string; /** * The title for the link. * @type {string} * @memberof Link */ title?: string; /** * The media type or link type for the link. * @type {string} * @memberof Link */ type?: string; /** * If this is a link to a container, `itemType` is the media type or link type for the items in the container. * @type {string} * @memberof Link */ itemType?: string; /** * The media type or link type of the response body for a `PUT`, `POST`, or `PATCH` operation. * @type {string} * @memberof Link */ responseType?: string; /** * The media type or link type of the items in the response body for a `PUT`, `POST`, or `PATCH` operation. * @type {string} * @memberof Link */ responseItemType?: string; } /** * Provides information about the output for a session or job. * @export * @interface ListingStatistics */ export interface ListingStatistics { /** * Specifies the number of lines in the specified listing. * @type {number} * @memberof ListingStatistics */ lineCount?: number; /** * Specifies the timestamp when the listing information was last updated. * @type {string} * @memberof ListingStatistics */ modifiedTimeStamp?: string; } /** * Provides an individual line from a log or listing resource. * @export * @interface LogLine */ export interface LogLine { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof LogLine */ version?: number; /** * Specifies the line entry classification. * @type {string} * @memberof LogLine */ type: LogLineTypeEnum; /** * Specifies the line of text without the type (classification) prefix marker. * @type {string} * @memberof LogLine */ line: string; } export const LogLineTypeEnum = { Normal: "normal", Hilighted: "hilighted", Source: "source", Title: "title", Byline: "byline", Footnote: "footnote", Error: "error", Warning: "warning", Note: "note", Message: "message", } as const; export type LogLineTypeEnum = (typeof LogLineTypeEnum)[keyof typeof LogLineTypeEnum]; /** * Provides information about the log for a session or a job. * @export * @interface LogStatistics */ export interface LogStatistics { /** * Specifies the number of lines in the specified log. * @type {number} * @memberof LogStatistics */ lineCount?: number; /** * Specifies the timestamp when the log information was last updated. * @type {string} * @memberof LogStatistics */ modifiedTimeStamp?: string; } /** * Requests that session or job log or listing output be uploaded to the Files service. * @export * @interface OutputStreamFileRequest */ export interface OutputStreamFileRequest { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof OutputStreamFileRequest */ version?: number; /** * Specifies the attributes that modify the behavior of this stream request. See example for details. * @type {object} * @memberof OutputStreamFileRequest */ attributes?: object; } /** * Provides data from a table for use in building prompts * @export * @interface PromptContent */ export interface PromptContent { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof PromptContent */ version?: number; /** * Specifies the level of column information that is returned. Values are names (default), detail, or summary. * @type {string} * @memberof PromptContent */ columnDetail?: string; /** * Specifies column information for the prompt content. * @type {Array} * @memberof PromptContent */ columns?: Array; /** * Specifies the formatted and raw data for the cells in this row. * @type {Array} * @memberof PromptContent */ rows?: Array; /** * Specifies the start index of the returned rows. * @type {number} * @memberof PromptContent */ start?: number; /** * Specifies links that apply to this prompt content. * @type {Array} * @memberof PromptContent */ links?: Array; } /** * Provides a request that you can use to build prompt content based on a given dataset. * @export * @interface PromptContentRequest */ export interface PromptContentRequest { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof PromptContentRequest */ version?: number; /** * Specifies that a standard SAS WHERE clause was used to build the content for this request. * @type {string} * @memberof PromptContentRequest */ where?: string; /** * * @type {FileProtection} * @memberof PromptContentRequest */ fileProtection?: FileProtection; /** * Specifies the encoding for the password values in the fileProtection structure. If the value is \"base64\", then the password values in the fileProtection structure should be encoded by converting the text to UTF-8 and base64-encoding the result. If no value is provided, then the password values of the fileProtection structure are expected to be clear text. * @type {string} * @memberof PromptContentRequest */ fileProtectionEncoding?: string; /** * Specifies the level of column information to return. * @type {string} * @memberof PromptContentRequest */ columnDetail?: PromptContentRequestColumnDetailEnum; /** * Specifies an array of strings that indicate the columns to include in the returned content. If you do not specify a value, then all columns are returned. The order of the column names in the list indicates the order for the cells of the prompt content. * @type {Array} * @memberof PromptContentRequest */ includeColumns?: Array; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the prompt content are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof PromptContentRequest */ columnNaturalOrder?: boolean; /** * Specifies an array of objects that describe the sort definitions to use in the prompt content. * @type {Array} * @memberof PromptContentRequest */ sortBy?: Array; /** * * @type {Array} * @memberof PromptContentRequest */ columnFormatting?: Array; } export const PromptContentRequestColumnDetailEnum = { Names: "names", Detail: "detail", Summary: "summary", } as const; export type PromptContentRequestColumnDetailEnum = (typeof PromptContentRequestColumnDetailEnum)[keyof typeof PromptContentRequestColumnDetailEnum]; /** * Contains the formatted and raw row data for prompt content * @export * @interface PromptContentRowData */ export interface PromptContentRowData { /** * Formatted cells of the given row * @type {Array} * @memberof PromptContentRowData */ formatted?: Array; /** * Raw, unformatted cells of the given row * @type {Array} * @memberof PromptContentRowData */ raw?: Array; } /** * Provides information about a resource from a different service that can be referenced by the Compute service. * @export * @interface Resource */ export interface Resource { /** * Specifies the name for the resource. This name can be used to reference this resource on the server. The value of the name is limited to 40 characters. The value must be unique within a context. * @type {string} * @memberof Resource */ name: string; /** * Specifies the URI path to the resource. The URI path contains information about how to access the resource under the services base URL. The value of the URI is limited to 500 characters. * @type {string} * @memberof Resource */ uri: string; /** * Specifies the type of resource that is referenced in this item. The value of the type is limited to 100 characters. * @type {string} * @memberof Resource */ type: string; /** * Specifies whether the resource can be referenced in the output or results of a session or job. * @type {boolean} * @memberof Resource */ output?: boolean; /** * Specifies the scope of the resource. If a resource is specified for a job and the resource has JOB scope, then the resource is deleted or deassigned at the end of the job. * @type {string} * @memberof Resource */ scope?: ResourceScopeEnum; /** * Specifies the options to add to the resource for the creation or assignment of an internal SAS component that is created based on type. * @type {object} * @memberof Resource */ options?: object; /** * Specifies whether a resource is required. If a required resource cannot be instantiated by the session or job, then that session or job is considered to have failed. * @type {boolean} * @memberof Resource */ required?: boolean; /** * Specifies the attributes for the resource. Support for resource attributes was added in version 3 for contexts, context requests, and job requests, and in version 2 for session requests. * @type {object} * @memberof Resource */ attributes?: object; } export const ResourceScopeEnum = { Session: "SESSION", Job: "JOB", } as const; export type ResourceScopeEnum = (typeof ResourceScopeEnum)[keyof typeof ResourceScopeEnum]; /** * Provides a result that was created by a job and that is available for use by a consumer of a service. * @export * @interface Result */ export interface Result { /** * Specifies the identifier for this result item. * @type {string} * @memberof Result */ id?: string; /** * Specifies the human readable name of the result item. * @type {string} * @memberof Result */ name?: string; /** * Specifies the type of output that is generated for this result. * @type {string} * @memberof Result */ type?: ResultTypeEnum; /** * Specifies links that apply to this result. * @type {Array} * @memberof Result */ links?: Array; } export const ResultTypeEnum = { Library: "LIBRARY", Table: "TABLE", File: "FILE", Ods: "ODS", } as const; export type ResultTypeEnum = (typeof ResultTypeEnum)[keyof typeof ResultTypeEnum]; /** * Provides a paginated collection of result objects. * @export * @interface ResultCollection */ export interface ResultCollection { /** * The name of the collection. * @type {string} * @memberof ResultCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof ResultCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof ResultCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof ResultCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof ResultCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof ResultCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof ResultCollection */ version?: number; /** * Specifies an array that contains results. * @type {Array} * @memberof ResultCollection */ items: Array; } /** * * @export * @interface ResultCollectionAllOf */ export interface ResultCollectionAllOf { /** * Specifies an array that contains results. * @type {Array} * @memberof ResultCollectionAllOf */ items: Array; } /** * Provides data from a row of a table. * @export * @interface Row */ export interface Row { /** * Specifies values for the data cells in this row. * @type {Array} * @memberof Row */ cells?: Array; } /** * Provides a paginated collection of table rows. * @export * @interface RowCollection */ export interface RowCollection { /** * The name of the collection. * @type {string} * @memberof RowCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof RowCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof RowCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof RowCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof RowCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof RowCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof RowCollection */ version?: number; /** * Specifies an array that contains row resources. * @type {Array} * @memberof RowCollection */ items: Array; } /** * * @export * @interface RowCollectionAllOf */ export interface RowCollectionAllOf { /** * Specifies an array that contains row resources. * @type {Array} * @memberof RowCollectionAllOf */ items: Array; } /** * Provides data from a table in row set formation. * @export * @interface RowSet */ export interface RowSet { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof RowSet */ version?: number; /** * Specifies the level of column information that is returned. Values are names (default), detail, or summary. * @type {string} * @memberof RowSet */ columnDetail?: string; /** * Specifies column information for the row set. * @type {Array} * @memberof RowSet */ columns?: Array; /** * Specifies the values for the data cells in this row. * @type {Array>} * @memberof RowSet */ rows?: Array>; /** * Specifies the start index of the returned rows. * @type {number} * @memberof RowSet */ start?: number; /** * Specifies links that apply to this row set. * @type {Array} * @memberof RowSet */ links?: Array; } /** * Provides a request that you can use to generate a row set. * @export * @interface RowSetRequest */ export interface RowSetRequest { /** * Specifies the version number of this representation schema. This is version 3. * @type {number} * @memberof RowSetRequest */ version?: number; /** * Specifies that a standard SAS WHERE clause was used to build the row set for this request. * @type {string} * @memberof RowSetRequest */ where?: string; /** * * @type {FileProtection} * @memberof RowSetRequest */ fileProtection?: FileProtection; /** * Specifies the encoding for the password values in the fileProtection structure. If the value is \"base64\", then the password values in the fileProtection structure should be encoded by converting the text to UTF-8 and base64-encoding the result. If no value is provided, then the password values of the fileProtection structure are expected to be clear text. * @type {string} * @memberof RowSetRequest */ fileProtectionEncoding?: string; /** * Specifies the level of column information to return. * @type {string} * @memberof RowSetRequest */ columnDetail?: RowSetRequestColumnDetailEnum; /** * Specifies an array of strings that indicate the columns to include in a row set. If you do not specify a value, then all columns are returned. The order of the column names in the list indicates the order for the cells of the row set. * @type {Array} * @memberof RowSetRequest */ includeColumns?: Array; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof RowSetRequest */ columnNaturalOrder?: boolean; /** * Specifies an array of objects that describe the sort definitions to use in this row set. * @type {Array} * @memberof RowSetRequest */ sortBy?: Array; /** * * @type {Array} * @memberof RowSetRequest */ columnFormatting?: Array; } export const RowSetRequestColumnDetailEnum = { Names: "names", Detail: "detail", Summary: "summary", } as const; export type RowSetRequestColumnDetailEnum = (typeof RowSetRequestColumnDetailEnum)[keyof typeof RowSetRequestColumnDetailEnum]; /** * Provides a request that you can use to obtain rows from a table or data set. * @export * @interface RowsRequest */ export interface RowsRequest { /** * Specifies the version number of this representation schema. This is version 3. * @type {number} * @memberof RowsRequest */ version?: number; /** * Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @type {string} * @memberof RowsRequest */ where?: string; /** * * @type {FileProtection} * @memberof RowsRequest */ fileProtection?: FileProtection; /** * Specifies the encoding for the password values in the fileProtection structure. If the value is \"base64\", then the password values in the fileProtection structure should be encoded by converting the text to UTF-8 and base64-encoding the result. If no value is provided, then the password values of the fileProtection structure are expected to be clear text. * @type {string} * @memberof RowsRequest */ fileProtectionEncoding?: string; /** * Specifies the formatting to be used for specified columns. * @type {Array} * @memberof RowsRequest */ columnFormatting?: Array; } /** * Provides a running SAS Compute Server process. * @export * @interface Server */ export interface Server { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof Server */ version?: number; /** * Specifies an optional name that is associated with this server. * @type {string} * @memberof Server */ name?: string; /** * Specifies an optional description for this server. * @type {string} * @memberof Server */ description?: string; /** * Specifies the timestamp when the server was created. * @type {string} * @memberof Server */ creationTimeStamp?: string; /** * Specifies the user ID that created the server. * @type {string} * @memberof Server */ createdBy?: string; /** * Specifies the identifier for this server. * @type {string} * @memberof Server */ id?: string; /** * Specifies the current state of this server. The current value is running. * @type {string} * @memberof Server */ state?: string; /** * Specifies the links that apply to this server. * @type {Array} * @memberof Server */ links?: Array; } /** * Provides a summary of a SAS Compute Server process that is currently running. * @export * @interface ServerSummary */ export interface ServerSummary { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof ServerSummary */ version?: number; /** * Specifies the identifier of this server. * @type {string} * @memberof ServerSummary */ id?: string; /** * Specifies the links that apply to this server. * @type {Array} * @memberof ServerSummary */ links?: Array; } /** * Provides a paginated collection of server summary objects. * @export * @interface ServerSummaryCollection */ export interface ServerSummaryCollection { /** * The name of the collection. * @type {string} * @memberof ServerSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof ServerSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof ServerSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof ServerSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof ServerSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof ServerSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof ServerSummaryCollection */ version?: number; /** * Specifies the array that contains resource information about the server summary. * @type {Array} * @memberof ServerSummaryCollection */ items: Array; } /** * * @export * @interface ServerSummaryCollectionAllOf */ export interface ServerSummaryCollectionAllOf { /** * Specifies the array that contains resource information about the server summary. * @type {Array} * @memberof ServerSummaryCollectionAllOf */ items: Array; } /** * Provides a Compute session object. * @export * @interface Session */ export interface Session { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof Session */ version?: number; /** * Specifies an optional name that is associated with this session. * @type {string} * @memberof Session */ name?: string; /** * Specifies an optional description for this session. * @type {string} * @memberof Session */ description?: string; /** * Specifies attributes that were defined when the session was requested. * @type {object} * @memberof Session */ attributes?: object; /** * Specifies the timestamp when the session was created. * @type {string} * @memberof Session */ creationTimeStamp?: string; /** * Specifies the user Id of the owner of this session. * @type {string} * @memberof Session */ owner?: string; /** * Specifies the identifier for this session, as determined by the server. * @type {string} * @memberof Session */ id?: string; /** * Specifies the identifier of the server that this session belongs to. * @type {string} * @memberof Session */ serverId?: string; /** * Specifies the current state of this session. Here are the possible values: completed, failed, running, idle, pending, or stopped. * @type {string} * @memberof Session */ state?: string; /** * Specifies the condition code for this session. This is set to the highest value of any jobConditionCode for jobs that executed in the session. * @type {number} * @memberof Session */ sessionConditionCode?: number; /** * * @type {LogStatistics} * @memberof Session */ logStatistics?: LogStatistics; /** * * @type {ListingStatistics} * @memberof Session */ listingStatistics?: ListingStatistics; /** * * @type {SessionStatistics} * @memberof Session */ sessionStatistics?: SessionStatistics; /** * Specifies the name of the application that requested this session. * @type {string} * @memberof Session */ applicationName?: string; /** * The version of the service API that this session supports. * @type {number} * @memberof Session */ serviceAPIVersion?: number; /** * Specifies links that apply to this session. * @type {Array} * @memberof Session */ links?: Array; } /** * Provides a collection of line objects that comprise the output for a session. * @export * @interface SessionListingCollection */ export interface SessionListingCollection { /** * The name of the collection. * @type {string} * @memberof SessionListingCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof SessionListingCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof SessionListingCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof SessionListingCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof SessionListingCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof SessionListingCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof SessionListingCollection */ version?: number; /** * Specifies an array that contains listing lines from a session. * @type {Array} * @memberof SessionListingCollection */ items: Array; } /** * * @export * @interface SessionListingCollectionAllOf */ export interface SessionListingCollectionAllOf { /** * Specifies an array that contains listing lines from a session. * @type {Array} * @memberof SessionListingCollectionAllOf */ items: Array; } /** * Provides a collection of line objects that comprise the log for a session. * @export * @interface SessionLogCollection */ export interface SessionLogCollection { /** * The name of the collection. * @type {string} * @memberof SessionLogCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof SessionLogCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof SessionLogCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof SessionLogCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof SessionLogCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof SessionLogCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof SessionLogCollection */ version?: number; /** * Specifies an array that contains log lines from the session. * @type {Array} * @memberof SessionLogCollection */ items: Array; } /** * * @export * @interface SessionLogCollectionAllOf */ export interface SessionLogCollectionAllOf { /** * Specifies an array that contains log lines from the session. * @type {Array} * @memberof SessionLogCollectionAllOf */ items: Array; } /** * Specifies information about a SAS option that is used in the current session. * @export * @interface SessionOption */ export interface SessionOption { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof SessionOption */ version?: number; /** * Specifies the name of the option. * @type {string} * @memberof SessionOption */ name?: string; /** * Specifies the description of the option as defined in the system. * @type {string} * @memberof SessionOption */ description?: string; /** * Specifies the current value of the option, if it is available. * @type {string} * @memberof SessionOption */ value?: string; } /** * Provides an object that you use to request a new Compute session. * @export * @interface SessionRequest */ export interface SessionRequest { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof SessionRequest */ version?: number; /** * Specifies an optional name that is associated with this session. The value of name is limited to 100 characters. The name is used for informational purposes only. * @type {string} * @memberof SessionRequest */ name?: string; /** * Specifies an optional description for this session. The value of description is limited to 1000 characters. * @type {string} * @memberof SessionRequest */ description?: string; /** * Specifies service-specific attributes that control the behavior of this session. See the example for details. * @type {object} * @memberof SessionRequest */ attributes?: object; /** * * @type {Environment} * @memberof SessionRequest */ environment?: Environment; /** * Specifies the resources that are requested for this session. * @type {Array} * @memberof SessionRequest */ resources?: Array; } /** * Provides performance data for a session. * @export * @interface SessionStatistics */ export interface SessionStatistics { /** * Specifies the elapsed CPU time that is related to the system for a session. * @type {number} * @memberof SessionStatistics */ systemCpuTime?: number; /** * Specifies the elapsed CPU time that is related to the user tasks for a session. * @type {number} * @memberof SessionStatistics */ userCpuTime?: number; /** * Specifies the highest level of memory usage by the session. * @type {number} * @memberof SessionStatistics */ memorySize?: number; } /** * Provides a Compute session summary object. * @export * @interface SessionSummary */ export interface SessionSummary { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof SessionSummary */ version?: number; /** * Specifies an optional name that is associated with this session. * @type {string} * @memberof SessionSummary */ name?: string; /** * Specifies an identifier for this session, as determined by the server. * @type {string} * @memberof SessionSummary */ id?: string; /** * Specifies the user ID of the owner of this session. * @type {string} * @memberof SessionSummary */ owner?: string; /** * Specifies links that apply to this session. * @type {Array} * @memberof SessionSummary */ links?: Array; } /** * Provides a paginated collection of Compute session summaries. * @export * @interface SessionSummaryCollection */ export interface SessionSummaryCollection { /** * The name of the collection. * @type {string} * @memberof SessionSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof SessionSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof SessionSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof SessionSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof SessionSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof SessionSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof SessionSummaryCollection */ version?: number; /** * Specifies an array that contains session summary resources. * @type {Array} * @memberof SessionSummaryCollection */ items: Array; } /** * * @export * @interface SessionSummaryCollectionAllOf */ export interface SessionSummaryCollectionAllOf { /** * Specifies an array that contains session summary resources. * @type {Array} * @memberof SessionSummaryCollectionAllOf */ items: Array; } /** * Provides a paginated collection of SAS macro variables. * @export * @interface SessionVariableCollection */ export interface SessionVariableCollection { /** * The name of the collection. * @type {string} * @memberof SessionVariableCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof SessionVariableCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof SessionVariableCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof SessionVariableCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof SessionVariableCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof SessionVariableCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof SessionVariableCollection */ version?: number; /** * Specifies an array that contains a listing of current session variables. * @type {Array} * @memberof SessionVariableCollection */ items: Array; } /** * * @export * @interface SessionVariableCollectionAllOf */ export interface SessionVariableCollectionAllOf { /** * Specifies an array that contains a listing of current session variables. * @type {Array} * @memberof SessionVariableCollectionAllOf */ items: Array; } /** * Provides sorting options to use with a table or data set. * @export * @interface SortByRequest */ export interface SortByRequest { /** * Specifies the key to use in this sortBy request. * @type {string} * @memberof SortByRequest */ key?: string; /** * Specifies the sort order for this sortBy request. * @type {string} * @memberof SortByRequest */ direction?: SortByRequestDirectionEnum; } export const SortByRequestDirectionEnum = { Ascending: "ascending", Descending: "descending", } as const; export type SortByRequestDirectionEnum = (typeof SortByRequestDirectionEnum)[keyof typeof SortByRequestDirectionEnum]; /** * Provides information about a SAS table or data set. * @export * @interface TableInfo */ export interface TableInfo { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof TableInfo */ version?: number; /** * Specifies the identifier for this data set. * @type {string} * @memberof TableInfo */ id?: string; /** * Specifies the name of this data set. * @type {string} * @memberof TableInfo */ name?: string; /** * Specifies the table type as DATA or VIEW. * @type {string} * @memberof TableInfo */ type?: string; /** * Specifies that this is a special type of table. Most tables do not have an extended type, but the ones that do typically have special columns, rows, or both that are used by some SAS/STAT procedures. * @type {string} * @memberof TableInfo */ extendedType?: string; /** * Specifies the length of the bookmark in this data set. * @type {number} * @memberof TableInfo */ bookmarkLength?: number; /** * Specifies the compression routine for this data set. * @type {string} * @memberof TableInfo */ compressionRoutine?: string; /** * Specifies the creation timestamp for this data set. * @type {string} * @memberof TableInfo */ creationTimeStamp?: string; /** * Specifies the modification timestamp for this data set. * @type {string} * @memberof TableInfo */ modifiedTimeStamp?: string; /** * Specifies the name of the engine that handles this data set. * @type {string} * @memberof TableInfo */ engine?: string; /** * Specifies the label for this data set. This label describes the data set. * @type {string} * @memberof TableInfo */ label?: string; /** * Specifies the name of the library that owns this data set. * @type {string} * @memberof TableInfo */ libref?: string; /** * Specifies the logical record count for this data set. * @type {number} * @memberof TableInfo */ logicalRecordCount?: number; /** * Specifies the number of columns that are defined in this data set. * @type {number} * @memberof TableInfo */ columnCount?: number; /** * Specifies the number of rows that are defined in this data set. * @type {number} * @memberof TableInfo */ rowCount?: number; /** * Specifies the physical record count for this data set. * @type {number} * @memberof TableInfo */ physicalRecordCount?: number; /** * Specifies the length of a record in this data set. * @type {number} * @memberof TableInfo */ recordLength?: number; /** * Specifies the character encoding that is used to store the table. * @type {string} * @memberof TableInfo */ encoding?: string; /** * Specifies links that apply to this data set. * @type {Array} * @memberof TableInfo */ links?: Array; } /** * Summarizes a SAS table or data set. * @export * @interface TableSummary */ export interface TableSummary { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof TableSummary */ version?: number; /** * Specifies the identifier for this table object. * @type {string} * @memberof TableSummary */ id?: string; /** * Specifies the name of the table. * @type {string} * @memberof TableSummary */ name?: string; /** * Specifies links that apply to this table summary. * @type {Array} * @memberof TableSummary */ links?: Array; } /** * Provides a paginated collection of SAS table or data set summaries. * @export * @interface TableSummaryCollection */ export interface TableSummaryCollection { /** * The name of the collection. * @type {string} * @memberof TableSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof TableSummaryCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof TableSummaryCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof TableSummaryCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof TableSummaryCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof TableSummaryCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof TableSummaryCollection */ version?: number; /** * Specifies an array that contains table summary resources. * @type {Array} * @memberof TableSummaryCollection */ items: Array; } /** * * @export * @interface TableSummaryCollectionAllOf */ export interface TableSummaryCollectionAllOf { /** * Specifies an array that contains table summary resources. * @type {Array} * @memberof TableSummaryCollectionAllOf */ items: Array; } /** * This class is used to provide common attributes and behaviors around tracking who and when objects were created and modified to representation objects. * @export * @interface TrackedResource */ export interface TrackedResource { /** * The username of whoever created the resource. * @type {string} * @memberof TrackedResource */ createdBy?: string; /** * The username of whoever last modified the resource. * @type {string} * @memberof TrackedResource */ modifiedBy?: string; /** * The timestamp for when the resource was created. * @type {string} * @memberof TrackedResource */ creationTimeStamp?: string; /** * The timestamp for when the resource was last modified. * @type {string} * @memberof TrackedResource */ modifiedTimeStamp?: string; } /** * Describes a SAS macro variable that is available from the current session. * @export * @interface Variable */ export interface Variable { /** * Specifies the version number of this representation schema. This is version 1. * @type {number} * @memberof Variable */ version?: number; /** * Specifies the scope of the variable as determined by SAS. * @type {string} * @memberof Variable */ scope?: string; /** * Specifies the name of the variable. * @type {string} * @memberof Variable */ name?: string; /** * Specifies the value of the variable. * @type {string} * @memberof Variable */ value?: string; } /** * Provides a request that you can use to create a view on a table or data set. * @export * @interface ViewRequest */ export interface ViewRequest { /** * Specifies the version number of this representation schema. This is version 2. * @type {number} * @memberof ViewRequest */ version?: number; /** * Specifies that a standard SAS WHERE clause was used to select the data for this view. * @type {string} * @memberof ViewRequest */ where?: string; /** * * @type {FileProtection} * @memberof ViewRequest */ fileProtection?: FileProtection; /** * Specifies the encoding for the password values in the fileProtection structure. If the value is \"base64\", then the password values in the fileProtection structure should be encoded by converting the text to UTF-8 and base64-encoding the result. If no value is provided, then the password values of the fileProtection structure are expected to be clear text. * @type {string} * @memberof ViewRequest */ fileProtectionEncoding?: string; /** * Specifies an array of strings that indicate the columns to include in the row set. If no value is specified, then all columns are returned. * @type {Array} * @memberof ViewRequest */ includeColumns?: Array; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof ViewRequest */ columnNaturalOrder?: boolean; /** * Specifies an array of objects that describe the sort definitions to use for this row set. * @type {Array} * @memberof ViewRequest */ sortBy?: Array; /** * Specifies whether to select only distinct values for the view. * @type {boolean} * @memberof ViewRequest */ distinct?: boolean; } /** * ContextsApi - axios parameter creator * @export */ export const ContextsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Creates a context definition. The new context is assigned a unique ID. The contextName namespace is managed by you, and the contextName must be unique. You can update contexts by performing a PUT on the corresponding URL. * @summary Create a context definition * @param {ContextRequest} contextRequest Specifies a context request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createContext: async ( contextRequest: ContextRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextRequest' is not null or undefined assertParamExists("createContext", "contextRequest", contextRequest); const localVarPath = `/contexts`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.context.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( contextRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Creates a new session that is based on the Compute context definition that corresponds to the contextId path variable. If a reusable SAS Compute Server is available to handle this session, a new session is created on that SAS Compute Server. Otherwise, a new SAS Compute Server is created and the new session is created on that SAS Compute Server. The new session is associated with the identity of the requester. URLs that define how to access the session are returned. The contextId matches the ID member of a known context entry. The Location header contains the URI of the created session resource. * @summary Request new session * @param {string} contextId Specifies the context definition ID. * @param {SessionRequest} [sessionRequest] * @param {*} [options] Override http request option. * @throws {RequiredError} */ createSession: async ( contextId: string, sessionRequest?: SessionRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextId' is not null or undefined assertParamExists("createSession", "contextId", contextId); const localVarPath = `/contexts/{contextId}/sessions`.replace( `{${"contextId"}}`, encodeURIComponent(String(contextId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.session.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( sessionRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes the context definition that has the specified contextId. * @summary Delete a context definition * @param {string} contextId Deletes the context definition with the specified ID. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteContext: async ( contextId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextId' is not null or undefined assertParamExists("deleteContext", "contextId", contextId); const localVarPath = `/contexts/{contextId}`.replace( `{${"contextId"}}`, encodeURIComponent(String(contextId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the context definition that has the specified contextId. * @summary Get a context definition * @param {string} contextId Returns the context definition with the specified ID. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getContext: async ( contextId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextId' is not null or undefined assertParamExists("getContext", "contextId", contextId); const localVarPath = `/contexts/{contextId}`.replace( `{${"contextId"}}`, encodeURIComponent(String(contextId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of Compute context definitions. Standard paging, filtering, and sorting options are provided. By default, this endpoint returns a summary of the available information about the contexts. Specify an Accept-Item header with the value application/vnd.sas.compute.context+json to get all available information for each context. * @summary Get context definitions * @param {'application/vnd.sas.compute.context+json' | 'application/vnd.sas.compute.context.summary+json'} [acceptItem] Specifies the desired context representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.context+json <li>application/vnd.sas.compute.context.summary+json <li>blank </ul> If the application/vnd.sas.compute.context.summary+json type is specified or no Accept-Item header is specified, then the contexts are returned as summary representation context objects. * @param {number} [start] Specifies the offset of the first context definition to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of context definitions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned context definitions. * @param {string} [sortBy] Sorts returned context definitions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getContexts: async ( acceptItem?: | "application/vnd.sas.compute.context+json" | "application/vnd.sas.compute.context.summary+json", start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/contexts`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified context exists. * @summary Verify that a context exists * @param {string} contextId Specifies the context to check. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForContext: async ( contextId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextId' is not null or undefined assertParamExists("headersForContext", "contextId", contextId); const localVarPath = `/contexts/{contextId}`.replace( `{${"contextId"}}`, encodeURIComponent(String(contextId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether an endpoint is currently available. * @summary Check endpoint availability * @param {number} [start] Returns the offset of first context definition to return. The default value is \"0\". * @param {number} [limit] Returns the maximum number of context definitions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned context definitions. * @param {string} [sortBy] Sorts returned context definitions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForContexts: async ( start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/contexts`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates a context definition. Changing a context does not affect any sessions that are currently running on the server that is instantiated by that context. Servers that are created after updating the context use the current definition. If the contextId matches the ID of an existing context, that context is updated. Otherwise, an error is returned. The request must include the current ETag of the context as the value of the If-Match request header to prevent concurrent updates. The current ETag of the context is provided in the value of the ETag response header of any endpoint that produces application/vnd.sas.compute.context. * @summary Update a context definition * @param {string} contextId Specifies the ID of the context definition. * @param {string} ifMatch Specifies the current ETag of the context that you are updating. * @param {Context} context context definition * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateContext: async ( contextId: string, ifMatch: string, context: Context, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'contextId' is not null or undefined assertParamExists("updateContext", "contextId", contextId); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateContext", "ifMatch", ifMatch); // verify required parameter 'context' is not null or undefined assertParamExists("updateContext", "context", context); const localVarPath = `/contexts/{contextId}`.replace( `{${"contextId"}}`, encodeURIComponent(String(contextId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.context+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( context, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * ContextsApi - functional programming interface * @export */ export const ContextsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = ContextsApiAxiosParamCreator(configuration); return { /** * Creates a context definition. The new context is assigned a unique ID. The contextName namespace is managed by you, and the contextName must be unique. You can update contexts by performing a PUT on the corresponding URL. * @summary Create a context definition * @param {ContextsApiCreateContextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createContext( requestParameters: ContextsApiCreateContextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createContext( requestParameters.contextRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Creates a new session that is based on the Compute context definition that corresponds to the contextId path variable. If a reusable SAS Compute Server is available to handle this session, a new session is created on that SAS Compute Server. Otherwise, a new SAS Compute Server is created and the new session is created on that SAS Compute Server. The new session is associated with the identity of the requester. URLs that define how to access the session are returned. The contextId matches the ID member of a known context entry. The Location header contains the URI of the created session resource. * @summary Request new session * @param {ContextsApiCreateSessionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createSession( requestParameters: ContextsApiCreateSessionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createSession( requestParameters.contextId, requestParameters.sessionRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes the context definition that has the specified contextId. * @summary Delete a context definition * @param {ContextsApiDeleteContextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteContext( requestParameters: ContextsApiDeleteContextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteContext( requestParameters.contextId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the context definition that has the specified contextId. * @summary Get a context definition * @param {ContextsApiGetContextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getContext( requestParameters: ContextsApiGetContextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getContext( requestParameters.contextId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of Compute context definitions. Standard paging, filtering, and sorting options are provided. By default, this endpoint returns a summary of the available information about the contexts. Specify an Accept-Item header with the value application/vnd.sas.compute.context+json to get all available information for each context. * @summary Get context definitions * @param {ContextsApiGetContextsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getContexts( requestParameters: ContextsApiGetContextsRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getContexts( requestParameters.acceptItem, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified context exists. * @summary Verify that a context exists * @param {ContextsApiHeadersForContextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForContext( requestParameters: ContextsApiHeadersForContextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForContext( requestParameters.contextId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether an endpoint is currently available. * @summary Check endpoint availability * @param {ContextsApiHeadersForContextsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForContexts( requestParameters: ContextsApiHeadersForContextsRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForContexts( requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates a context definition. Changing a context does not affect any sessions that are currently running on the server that is instantiated by that context. Servers that are created after updating the context use the current definition. If the contextId matches the ID of an existing context, that context is updated. Otherwise, an error is returned. The request must include the current ETag of the context as the value of the If-Match request header to prevent concurrent updates. The current ETag of the context is provided in the value of the ETag response header of any endpoint that produces application/vnd.sas.compute.context. * @summary Update a context definition * @param {ContextsApiUpdateContextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateContext( requestParameters: ContextsApiUpdateContextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateContext( requestParameters.contextId, requestParameters.ifMatch, requestParameters.context, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createContext operation in ContextsApi. * @export * @interface ContextsApiCreateContextRequest */ export interface ContextsApiCreateContextRequest { /** * Specifies a context request. * @type {ContextRequest} * @memberof ContextsApiCreateContext */ readonly contextRequest: ContextRequest; } /** * Request parameters for createSession operation in ContextsApi. * @export * @interface ContextsApiCreateSessionRequest */ export interface ContextsApiCreateSessionRequest { /** * Specifies the context definition ID. * @type {string} * @memberof ContextsApiCreateSession */ readonly contextId: string; /** * * @type {SessionRequest} * @memberof ContextsApiCreateSession */ readonly sessionRequest?: SessionRequest; } /** * Request parameters for deleteContext operation in ContextsApi. * @export * @interface ContextsApiDeleteContextRequest */ export interface ContextsApiDeleteContextRequest { /** * Deletes the context definition with the specified ID. * @type {string} * @memberof ContextsApiDeleteContext */ readonly contextId: string; } /** * Request parameters for getContext operation in ContextsApi. * @export * @interface ContextsApiGetContextRequest */ export interface ContextsApiGetContextRequest { /** * Returns the context definition with the specified ID. * @type {string} * @memberof ContextsApiGetContext */ readonly contextId: string; } /** * Request parameters for getContexts operation in ContextsApi. * @export * @interface ContextsApiGetContextsRequest */ export interface ContextsApiGetContextsRequest { /** * Specifies the desired context representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.context+json <li>application/vnd.sas.compute.context.summary+json <li>blank </ul> If the application/vnd.sas.compute.context.summary+json type is specified or no Accept-Item header is specified, then the contexts are returned as summary representation context objects. * @type {'application/vnd.sas.compute.context+json' | 'application/vnd.sas.compute.context.summary+json'} * @memberof ContextsApiGetContexts */ readonly acceptItem?: | "application/vnd.sas.compute.context+json" | "application/vnd.sas.compute.context.summary+json"; /** * Specifies the offset of the first context definition to return. The default value is \"0\". * @type {number} * @memberof ContextsApiGetContexts */ readonly start?: number; /** * Specifies the maximum number of context definitions to return. The default value is \"10\". * @type {number} * @memberof ContextsApiGetContexts */ readonly limit?: number; /** * Specifies the filter criteria for returned context definitions. * @type {string} * @memberof ContextsApiGetContexts */ readonly filter?: string; /** * Sorts returned context definitions. * @type {string} * @memberof ContextsApiGetContexts */ readonly sortBy?: string; } /** * Request parameters for headersForContext operation in ContextsApi. * @export * @interface ContextsApiHeadersForContextRequest */ export interface ContextsApiHeadersForContextRequest { /** * Specifies the context to check. * @type {string} * @memberof ContextsApiHeadersForContext */ readonly contextId: string; } /** * Request parameters for headersForContexts operation in ContextsApi. * @export * @interface ContextsApiHeadersForContextsRequest */ export interface ContextsApiHeadersForContextsRequest { /** * Returns the offset of first context definition to return. The default value is \"0\". * @type {number} * @memberof ContextsApiHeadersForContexts */ readonly start?: number; /** * Returns the maximum number of context definitions to return. The default value is \"10\". * @type {number} * @memberof ContextsApiHeadersForContexts */ readonly limit?: number; /** * Specifies the filter criteria for returned context definitions. * @type {string} * @memberof ContextsApiHeadersForContexts */ readonly filter?: string; /** * Sorts returned context definitions. * @type {string} * @memberof ContextsApiHeadersForContexts */ readonly sortBy?: string; } /** * Request parameters for updateContext operation in ContextsApi. * @export * @interface ContextsApiUpdateContextRequest */ export interface ContextsApiUpdateContextRequest { /** * Specifies the ID of the context definition. * @type {string} * @memberof ContextsApiUpdateContext */ readonly contextId: string; /** * Specifies the current ETag of the context that you are updating. * @type {string} * @memberof ContextsApiUpdateContext */ readonly ifMatch: string; /** * context definition * @type {Context} * @memberof ContextsApiUpdateContext */ readonly context: Context; } /** * DataAccessApi - axios parameter creator * @export */ export const DataAccessApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Assigns a libref that is based on the request body for a session. The Location header contains the URI of the libref resource. * @summary Assign a libref * @param {string} sessionId Specifies the ID of the session. * @param {LibraryRequest} libraryRequest Specifies a libref assignment request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createLibrary: async ( sessionId: string, libraryRequest: LibraryRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("createLibrary", "sessionId", sessionId); // verify required parameter 'libraryRequest' is not null or undefined assertParamExists("createLibrary", "libraryRequest", libraryRequest); const localVarPath = `/sessions/{sessionId}/data`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.library.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( libraryRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a view of the specified data set. The request body that you provide controls the view that is created. You can then access the returned view as a table. * @summary Create a data set view * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {ViewRequest} viewRequest Specifies a view creation request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createView: async ( sessionId: string, libref: string, tableName: string, viewRequest: ViewRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("createView", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("createView", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("createView", "tableName", tableName); // verify required parameter 'viewRequest' is not null or undefined assertParamExists("createView", "viewRequest", viewRequest); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/views` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.view.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( viewRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Removes the libref from the session. * @summary Deassign libref * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref to deassign. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteLibrary: async ( sessionId: string, libref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteLibrary", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("deleteLibrary", "libref", libref); const localVarPath = `/sessions/{sessionId}/data/{libref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes a table or view. If you request to delete a table and you have proper permissions, then the data set is deleted. If you request to delete a view, then the view is destroyed. * @summary Delete a table or view * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to update. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteTable: async ( sessionId: string, libref: string, tableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteTable", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("deleteTable", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("deleteTable", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets a specific column from a data set. * @summary Get a column * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} columnName Specifies the name of the column to retrieve. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getColumn: async ( sessionId: string, libref: string, tableName: string, columnName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getColumn", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getColumn", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getColumn", "tableName", tableName); // verify required parameter 'columnName' is not null or undefined assertParamExists("getColumn", "columnName", columnName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns/{columnName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))) .replace(`{${"columnName"}}`, encodeURIComponent(String(columnName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the column information for a specified data set. By default, a collection is returned, and standard paging options are available. * @summary Get column information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first column entry to return. * @param {number} [limit] Specifies the maximum number of columns to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getColumns: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getColumns", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getColumns", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getColumns", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the column information for a specified data set based on the submitted request body. By default, a collection is returned, and standard paging options are available. * @summary Retrieve column information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first column entry to return. * @param {number} [limit] Specifies the maximum number of columns to return. * @param {ColumnsRequest} [columnsRequest] Optional body that is used to refine a request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getColumnsWithRequest: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, columnsRequest?: ColumnsRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getColumnsWithRequest", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getColumnsWithRequest", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getColumnsWithRequest", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.columns.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( columnsRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Provides a listing that contains summaries of the libraries that are defined in the current session. * @summary Return libraries in a session * @param {string} sessionId Specifies the ID of the session. * @param {'application/vnd.sas.compute.library+json' | 'application/vnd.sas.compute.library.summary+json'} [acceptItem] Specifies the desired library representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.library+json <li>application/vnd.sas.compute.library.summary+json <li>blank </ul> If the application/vnd.sas.compute.library.summary+json type is specified or no Accept-Item header is specified, then the libraries are returned as summary representation library objects. * @param {number} [start] Specifies the offset of the first library to return. * @param {number} [limit] Specifies the maximum number of libraries to return. * @param {boolean} [noCache] Specifies whether to force the library collection to be refreshed before it is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getLibraries: async ( sessionId: string, acceptItem?: | "application/vnd.sas.compute.library+json" | "application/vnd.sas.compute.library.summary+json", start?: number, limit?: number, noCache?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getLibraries", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/data`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (noCache !== undefined) { localVarQueryParameter["noCache"] = noCache; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves information about a specified libref, including links to tables. * @summary Get libref information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getLibrary: async ( sessionId: string, libref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getLibrary", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getLibrary", "libref", libref); const localVarPath = `/sessions/{sessionId}/data/{libref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns summary information about a specified libref. * @summary Get libref summary * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getLibrarySummary: async ( sessionId: string, libref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getLibrarySummary", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getLibrarySummary", "libref", libref); const localVarPath = `/sessions/{sessionId}/data/{libref}#summary` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns content useful for populating prompts more effectively. * @summary Get prompt content from a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to build the content for this request. * @param {'names' | 'detail' | 'summary'} [columnDetail] Specifies the level of column information to return. * @param {string} [includeColumns] Specifies a comma-separated list of columns to include in the returned content . If you do not specify a list, all columns are returned. The order of the column names in the list determines the order of cells of the return prompt content. * @param {boolean} [columnNaturalOrder] When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the content are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {string} [sortBy] Sets the sort order for the returned row set. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getPromptContent: async ( sessionId: string, libref: string, tableName: string, where?: string, columnDetail?: "names" | "detail" | "summary", includeColumns?: string, columnNaturalOrder?: boolean, start?: number, limit?: number, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getPromptContent", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getPromptContent", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getPromptContent", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/promptContent` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (where !== undefined) { localVarQueryParameter["where"] = where; } if (columnDetail !== undefined) { localVarQueryParameter["columnDetail"] = columnDetail; } if (includeColumns !== undefined) { localVarQueryParameter["includeColumns"] = includeColumns; } if (columnNaturalOrder !== undefined) { localVarQueryParameter["columnNaturalOrder"] = columnNaturalOrder; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns content useful for populating prompts more effectively. * @summary Get prompt content from a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {PromptContentRequest} promptContentRequest Specifies a prompt content creation request. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getPromptContentWithRequest: async ( sessionId: string, libref: string, tableName: string, promptContentRequest: PromptContentRequest, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getPromptContentWithRequest", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getPromptContentWithRequest", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getPromptContentWithRequest", "tableName", tableName); // verify required parameter 'promptContentRequest' is not null or undefined assertParamExists( "getPromptContentWithRequest", "promptContentRequest", promptContentRequest, ); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/promptContent` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.prompt.content.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( promptContentRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a row set that is based on the specified table and an optional WHERE clause. * @summary Get a row set from a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to build the row set for this request. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {'names' | 'detail' | 'summary'} [columnDetail] Specifies the level of column information to return. * @param {string} [includeColumns] Specifies a comma-separated list of columns to include in a row set. If you do not specify a list, all columns are returned. The order of the column names in the list determines the order of cells of the row set. * @param {boolean} [columnNaturalOrder] When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {string} [sortBy] Sets the sort order for the returned row set. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRowSet: async ( sessionId: string, libref: string, tableName: string, where?: string, format?: boolean, columnDetail?: "names" | "detail" | "summary", includeColumns?: string, columnNaturalOrder?: boolean, start?: number, limit?: number, sortBy?: string, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getRowSet", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getRowSet", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getRowSet", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rowSet` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (where !== undefined) { localVarQueryParameter["where"] = where; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (columnDetail !== undefined) { localVarQueryParameter["columnDetail"] = columnDetail; } if (includeColumns !== undefined) { localVarQueryParameter["includeColumns"] = includeColumns; } if (columnNaturalOrder !== undefined) { localVarQueryParameter["columnNaturalOrder"] = columnNaturalOrder; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a row set that is based on the specified request body. * @summary Get a row set from a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {RowSetRequest} rowSetRequest Specifies a row set creation request. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRowSetWithRequest: async ( sessionId: string, libref: string, tableName: string, rowSetRequest: RowSetRequest, format?: boolean, start?: number, limit?: number, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getRowSetWithRequest", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getRowSetWithRequest", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getRowSetWithRequest", "tableName", tableName); // verify required parameter 'rowSetRequest' is not null or undefined assertParamExists("getRowSetWithRequest", "rowSetRequest", rowSetRequest); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rowSet` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (format !== undefined) { localVarQueryParameter["format"] = format; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.row.set.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( rowSetRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the rows for a specified data set. By default, a collection is returned, and standard paging options are available. * @summary Get row information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {boolean} [includeIndex] Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @param {boolean} [includeColumnNames] Specifies whether the first row that is returned consists of column names. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRows: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, format?: boolean, includeIndex?: boolean, where?: string, includeColumnNames?: boolean, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getRows", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getRows", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getRows", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rows` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (includeIndex !== undefined) { localVarQueryParameter["includeIndex"] = includeIndex; } if (where !== undefined) { localVarQueryParameter["where"] = where; } if (includeColumnNames !== undefined) { localVarQueryParameter["includeColumnNames"] = includeColumnNames; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns rows in CSV format for a specified data set. * @summary Get row information as comma-separated values * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] (Optional) Specifies the maximum number of rows to return. If not set, all rows are returned. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {boolean} [includeIndex] Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @param {string} [where] Specifies that a standard SAS WHERE clause has been used to return the rows for this request. * @param {boolean} [includeColumnNames] Specifies whether the first row that is returned consists of column names. * @param {string} [columnSeparator] Specifies the character to use as the column separator. If no character is specified, a comma is used as the separator. * @param {string} [rowSeparator] Specifies the characters to use as the row separator. If no characters are specified, a line feed character (\\n) is used. * @param {boolean} [enableQuoting] Specifies whether values that contain special characters are quoted. * @param {boolean} [enableEscaping] Specifies whether special characters in values are escaped if the value is not quoted. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRowsAsCSV: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, format?: boolean, includeIndex?: boolean, where?: string, includeColumnNames?: boolean, columnSeparator?: string, rowSeparator?: string, enableQuoting?: boolean, enableEscaping?: boolean, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getRowsAsCSV", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getRowsAsCSV", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getRowsAsCSV", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rows#CSV` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (includeIndex !== undefined) { localVarQueryParameter["includeIndex"] = includeIndex; } if (where !== undefined) { localVarQueryParameter["where"] = where; } if (includeColumnNames !== undefined) { localVarQueryParameter["includeColumnNames"] = includeColumnNames; } if (columnSeparator !== undefined) { localVarQueryParameter["columnSeparator"] = columnSeparator; } if (rowSeparator !== undefined) { localVarQueryParameter["rowSeparator"] = rowSeparator; } if (enableQuoting !== undefined) { localVarQueryParameter["enableQuoting"] = enableQuoting; } if (enableEscaping !== undefined) { localVarQueryParameter["enableEscaping"] = enableEscaping; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the rows for a specified data set based on the submitted request body. By default, a collection is returned, and standard paging options are available. * @summary Obtain rows from a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {RowsRequest} rowsRequest Specifies a row-generation request. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {boolean} [includeIndex] Specifies whether the first value in the cell is the index of a specific row. Support for this parameter was added in version 2. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRowsWithRequest: async ( sessionId: string, libref: string, tableName: string, rowsRequest: RowsRequest, start?: number, limit?: number, format?: boolean, includeIndex?: boolean, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getRowsWithRequest", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getRowsWithRequest", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getRowsWithRequest", "tableName", tableName); // verify required parameter 'rowsRequest' is not null or undefined assertParamExists("getRowsWithRequest", "rowsRequest", rowsRequest); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rows` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (includeIndex !== undefined) { localVarQueryParameter["includeIndex"] = includeIndex; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.rows.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( rowsRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns information about a data set. * @summary Get a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getTable: async ( sessionId: string, libref: string, tableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getTable", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getTable", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getTable", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns summary information about a data set. * @summary Get a summary of a data set * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getTableSummary: async ( sessionId: string, libref: string, tableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getTableSummary", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getTableSummary", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("getTableSummary", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}#summary` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a collection of data sets that are associated with a specified libref. Set the Accept header on this method to application/vnd.sas.collection+json. The collection contains application/vnd.sas.compute.data.table.summary items. Standard paging options are provided. * @summary Get data sets in a libref * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref to query. * @param {'application/vnd.sas.compute.data.table+json'} [acceptItem] Specifies the desired data table representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.data.table+json <li>application/vnd.sas.compute.data.table.summary+json <li>blank </ul> If the application/vnd.sas.compute.data.table.summary+json type is specified or no Accept-Item header is specified, then the data tables are returned as summary representation data table objects. * @param {number} [start] Specifies the offset of the first table summary to return. * @param {number} [limit] Specifies the maximum number of table summaries to return. * @param {boolean} [noCache] Specifies whether to force the table collection to be refreshed before it is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getTables: async ( sessionId: string, libref: string, acceptItem?: "application/vnd.sas.compute.data.table+json", start?: number, limit?: number, noCache?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getTables", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("getTables", "libref", libref); const localVarPath = `/sessions/{sessionId}/data/{libref}#tables` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (noCache !== undefined) { localVarQueryParameter["noCache"] = noCache; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a specified data set has access to a column. * @summary Check for a column in a table * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} columnName Specifies the column name to check. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForColumn: async ( sessionId: string, libref: string, tableName: string, columnName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForColumn", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForColumn", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForColumn", "tableName", tableName); // verify required parameter 'columnName' is not null or undefined assertParamExists("headersForColumn", "columnName", columnName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns/{columnName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))) .replace(`{${"columnName"}}`, encodeURIComponent(String(columnName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified data set has access to columns. * @summary Check for available columns in a table * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first column entry to return. * @param {number} [limit] Specifies the maximum number of columns to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForColumns: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForColumns", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForColumns", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForColumns", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified libref exists in a session. * @summary Verify that a libref exists * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForLibrary: async ( sessionId: string, libref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForLibrary", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForLibrary", "libref", libref); const localVarPath = `/sessions/{sessionId}/data/{libref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines headers for prompt content for a given data set. * @summary Check prompt content availability * @param {string} sessionId Specifies the ID of the session * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to build the content for this request. * @param {'names' | 'detail' | 'summary'} [columnDetail] Specifies the level of column information to return. * @param {string} [includeColumns] Specifies a comma separated list of columns to include in the returned content. If you do not specify a list, all columns are returned. The order of the column names in the list is the order in which the cells of the content are in as well. * @param {boolean} [columnNaturalOrder] When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the returned content are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @param {number} [start] Specifies the offset of the first row to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of rows to return. The default value is \"10\". * @param {string} [sortBy] Sets the sort order for the returned prompt content. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForPromptContent: async ( sessionId: string, libref: string, tableName: string, where?: string, columnDetail?: "names" | "detail" | "summary", includeColumns?: string, columnNaturalOrder?: boolean, start?: number, limit?: number, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForPromptContent", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForPromptContent", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForPromptContent", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/promptContent` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (where !== undefined) { localVarQueryParameter["where"] = where; } if (columnDetail !== undefined) { localVarQueryParameter["columnDetail"] = columnDetail; } if (includeColumns !== undefined) { localVarQueryParameter["includeColumns"] = includeColumns; } if (columnNaturalOrder !== undefined) { localVarQueryParameter["columnNaturalOrder"] = columnNaturalOrder; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a data set has access to a specific row. * @summary Check row availability * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] Specifies the maximum number of rows to return. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {boolean} [includeIndex] Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @param {boolean} [includeColumnNames] Specifies whether the first row that is returned consists of column names. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForRow: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, format?: boolean, includeIndex?: boolean, where?: string, includeColumnNames?: boolean, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForRow", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForRow", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForRow", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rows` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (includeIndex !== undefined) { localVarQueryParameter["includeIndex"] = includeIndex; } if (where !== undefined) { localVarQueryParameter["where"] = where; } if (includeColumnNames !== undefined) { localVarQueryParameter["includeColumnNames"] = includeColumnNames; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a row set is available on for a data set. * @summary Check row set availability * @param {string} sessionId Specifies the ID of the session * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to build the row set for this request. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {'names' | 'detail' | 'summary'} [columnDetail] Specifies the level of column information to return. * @param {string} [includeColumns] Specifies a comma separated list of columns to include in the row set. If you do not specify a list, all columns are returned. The order of the column names in the list is the order in which the cells of the row set are in as well. * @param {boolean} [columnNaturalOrder] When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @param {number} [start] Specifies the offset of the first row to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of rows to return. The default value is \"10\". * @param {string} [sortBy] Sets the sort order for the returned row set. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForRowSet: async ( sessionId: string, libref: string, tableName: string, where?: string, format?: boolean, columnDetail?: "names" | "detail" | "summary", includeColumns?: string, columnNaturalOrder?: boolean, start?: number, limit?: number, sortBy?: string, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForRowSet", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForRowSet", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForRowSet", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rowSet` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (where !== undefined) { localVarQueryParameter["where"] = where; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (columnDetail !== undefined) { localVarQueryParameter["columnDetail"] = columnDetail; } if (includeColumns !== undefined) { localVarQueryParameter["includeColumns"] = includeColumns; } if (columnNaturalOrder !== undefined) { localVarQueryParameter["columnNaturalOrder"] = columnNaturalOrder; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the headers for rows in CSV format for a specified data set. * @summary Get headers for rows represented as comma-separated values * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {number} [start] Specifies the offset of the first row to return. * @param {number} [limit] (Optional) Specifies the maximum number of rows to return. If not set, all rows are returned. * @param {boolean} [format] Specifies whether to format the data in the cells. * @param {boolean} [includeIndex] Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @param {string} [where] Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @param {boolean} [includeColumnNames] Specifies whether the first row that is returned consists of column names. * @param {string} [columnSeparator] Specifies the character to use as the column separator. If no character is specified, a comma is used as the separator. * @param {string} [rowSeparator] Specifies the characters to use as the row separator. If no characters are specified, a line feed character (\\n) is used. * @param {boolean} [enableQuoting] Specifies whether values that contain special characters are quoted. * @param {boolean} [enableEscaping] Specifies whether special characters in values are escaped if the values are not quoted. * @param {boolean} [formatMissingValues] If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForRowsAsCSV: async ( sessionId: string, libref: string, tableName: string, start?: number, limit?: number, format?: boolean, includeIndex?: boolean, where?: string, includeColumnNames?: boolean, columnSeparator?: string, rowSeparator?: string, enableQuoting?: boolean, enableEscaping?: boolean, formatMissingValues?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForRowsAsCSV", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForRowsAsCSV", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForRowsAsCSV", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/rows#CSV` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (format !== undefined) { localVarQueryParameter["format"] = format; } if (includeIndex !== undefined) { localVarQueryParameter["includeIndex"] = includeIndex; } if (where !== undefined) { localVarQueryParameter["where"] = where; } if (includeColumnNames !== undefined) { localVarQueryParameter["includeColumnNames"] = includeColumnNames; } if (columnSeparator !== undefined) { localVarQueryParameter["columnSeparator"] = columnSeparator; } if (rowSeparator !== undefined) { localVarQueryParameter["rowSeparator"] = rowSeparator; } if (enableQuoting !== undefined) { localVarQueryParameter["enableQuoting"] = enableQuoting; } if (enableEscaping !== undefined) { localVarQueryParameter["enableEscaping"] = enableEscaping; } if (formatMissingValues !== undefined) { localVarQueryParameter["formatMissingValues"] = formatMissingValues; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a session has a data endpoint available. * @summary Check access to data for a session * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first library to return. * @param {number} [limit] Specifies the maximum number of libraries to return. * @param {boolean} [noCache] Specifies whether to force the library collection to be refreshed before it is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionLibraries: async ( sessionId: string, start?: number, limit?: number, noCache?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionLibraries", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/data`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (noCache !== undefined) { localVarQueryParameter["noCache"] = noCache; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified data set exists in a libref. * @summary Check for a data set in a libref * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForTable: async ( sessionId: string, libref: string, tableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForTable", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("headersForTable", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("headersForTable", "tableName", tableName); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the name, label, format, or informat information for a specified column. * @summary Update column information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table that contains the column to update. * @param {string} columnName Specifies the column name to update. * @param {string} ifMatch Specifies the ETag of the column that you are updating. * @param {Column} column Specifies the information to update for the column. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateColumn: async ( sessionId: string, libref: string, tableName: string, columnName: string, ifMatch: string, column: Column, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateColumn", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("updateColumn", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("updateColumn", "tableName", tableName); // verify required parameter 'columnName' is not null or undefined assertParamExists("updateColumn", "columnName", columnName); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateColumn", "ifMatch", ifMatch); // verify required parameter 'column' is not null or undefined assertParamExists("updateColumn", "column", column); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}/columns/{columnName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))) .replace(`{${"columnName"}}`, encodeURIComponent(String(columnName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table.column+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( column, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the name or label of the specified table. * @summary Update table information * @param {string} sessionId Specifies the ID of the session. * @param {string} libref Specifies the libref for the request. * @param {string} tableName Specifies the table or data set to update. * @param {string} ifMatch Specifies the ETag of the table that you are updating. * @param {TableInfo} tableInfo Specifies the information to update for the table. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateTable: async ( sessionId: string, libref: string, tableName: string, ifMatch: string, tableInfo: TableInfo, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateTable", "sessionId", sessionId); // verify required parameter 'libref' is not null or undefined assertParamExists("updateTable", "libref", libref); // verify required parameter 'tableName' is not null or undefined assertParamExists("updateTable", "tableName", tableName); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateTable", "ifMatch", ifMatch); // verify required parameter 'tableInfo' is not null or undefined assertParamExists("updateTable", "tableInfo", tableInfo); const localVarPath = `/sessions/{sessionId}/data/{libref}/{tableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"libref"}}`, encodeURIComponent(String(libref))) .replace(`{${"tableName"}}`, encodeURIComponent(String(tableName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.data.table+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( tableInfo, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * DataAccessApi - functional programming interface * @export */ export const DataAccessApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = DataAccessApiAxiosParamCreator(configuration); return { /** * Assigns a libref that is based on the request body for a session. The Location header contains the URI of the libref resource. * @summary Assign a libref * @param {DataAccessApiCreateLibraryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createLibrary( requestParameters: DataAccessApiCreateLibraryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createLibrary( requestParameters.sessionId, requestParameters.libraryRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a view of the specified data set. The request body that you provide controls the view that is created. You can then access the returned view as a table. * @summary Create a data set view * @param {DataAccessApiCreateViewRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createView( requestParameters: DataAccessApiCreateViewRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createView( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.viewRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Removes the libref from the session. * @summary Deassign libref * @param {DataAccessApiDeleteLibraryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteLibrary( requestParameters: DataAccessApiDeleteLibraryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteLibrary( requestParameters.sessionId, requestParameters.libref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes a table or view. If you request to delete a table and you have proper permissions, then the data set is deleted. If you request to delete a view, then the view is destroyed. * @summary Delete a table or view * @param {DataAccessApiDeleteTableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteTable( requestParameters: DataAccessApiDeleteTableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteTable( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets a specific column from a data set. * @summary Get a column * @param {DataAccessApiGetColumnRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getColumn( requestParameters: DataAccessApiGetColumnRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getColumn( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.columnName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the column information for a specified data set. By default, a collection is returned, and standard paging options are available. * @summary Get column information * @param {DataAccessApiGetColumnsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getColumns( requestParameters: DataAccessApiGetColumnsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getColumns( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the column information for a specified data set based on the submitted request body. By default, a collection is returned, and standard paging options are available. * @summary Retrieve column information * @param {DataAccessApiGetColumnsWithRequestRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getColumnsWithRequest( requestParameters: DataAccessApiGetColumnsWithRequestRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getColumnsWithRequest( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, requestParameters.columnsRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Provides a listing that contains summaries of the libraries that are defined in the current session. * @summary Return libraries in a session * @param {DataAccessApiGetLibrariesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getLibraries( requestParameters: DataAccessApiGetLibrariesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getLibraries( requestParameters.sessionId, requestParameters.acceptItem, requestParameters.start, requestParameters.limit, requestParameters.noCache, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves information about a specified libref, including links to tables. * @summary Get libref information * @param {DataAccessApiGetLibraryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getLibrary( requestParameters: DataAccessApiGetLibraryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getLibrary( requestParameters.sessionId, requestParameters.libref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns summary information about a specified libref. * @summary Get libref summary * @param {DataAccessApiGetLibrarySummaryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getLibrarySummary( requestParameters: DataAccessApiGetLibrarySummaryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getLibrarySummary( requestParameters.sessionId, requestParameters.libref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns content useful for populating prompts more effectively. * @summary Get prompt content from a data set * @param {DataAccessApiGetPromptContentRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getPromptContent( requestParameters: DataAccessApiGetPromptContentRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getPromptContent( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.where, requestParameters.columnDetail, requestParameters.includeColumns, requestParameters.columnNaturalOrder, requestParameters.start, requestParameters.limit, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns content useful for populating prompts more effectively. * @summary Get prompt content from a data set * @param {DataAccessApiGetPromptContentWithRequestRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getPromptContentWithRequest( requestParameters: DataAccessApiGetPromptContentWithRequestRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getPromptContentWithRequest( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.promptContentRequest, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a row set that is based on the specified table and an optional WHERE clause. * @summary Get a row set from a data set * @param {DataAccessApiGetRowSetRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRowSet( requestParameters: DataAccessApiGetRowSetRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRowSet( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.where, requestParameters.format, requestParameters.columnDetail, requestParameters.includeColumns, requestParameters.columnNaturalOrder, requestParameters.start, requestParameters.limit, requestParameters.sortBy, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a row set that is based on the specified request body. * @summary Get a row set from a data set * @param {DataAccessApiGetRowSetWithRequestRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRowSetWithRequest( requestParameters: DataAccessApiGetRowSetWithRequestRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRowSetWithRequest( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.rowSetRequest, requestParameters.format, requestParameters.start, requestParameters.limit, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the rows for a specified data set. By default, a collection is returned, and standard paging options are available. * @summary Get row information * @param {DataAccessApiGetRowsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRows( requestParameters: DataAccessApiGetRowsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRows( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, requestParameters.format, requestParameters.includeIndex, requestParameters.where, requestParameters.includeColumnNames, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns rows in CSV format for a specified data set. * @summary Get row information as comma-separated values * @param {DataAccessApiGetRowsAsCSVRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRowsAsCSV( requestParameters: DataAccessApiGetRowsAsCSVRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRowsAsCSV( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, requestParameters.format, requestParameters.includeIndex, requestParameters.where, requestParameters.includeColumnNames, requestParameters.columnSeparator, requestParameters.rowSeparator, requestParameters.enableQuoting, requestParameters.enableEscaping, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the rows for a specified data set based on the submitted request body. By default, a collection is returned, and standard paging options are available. * @summary Obtain rows from a data set * @param {DataAccessApiGetRowsWithRequestRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRowsWithRequest( requestParameters: DataAccessApiGetRowsWithRequestRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRowsWithRequest( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.rowsRequest, requestParameters.start, requestParameters.limit, requestParameters.format, requestParameters.includeIndex, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns information about a data set. * @summary Get a data set * @param {DataAccessApiGetTableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getTable( requestParameters: DataAccessApiGetTableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getTable( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns summary information about a data set. * @summary Get a summary of a data set * @param {DataAccessApiGetTableSummaryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getTableSummary( requestParameters: DataAccessApiGetTableSummaryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getTableSummary( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a collection of data sets that are associated with a specified libref. Set the Accept header on this method to application/vnd.sas.collection+json. The collection contains application/vnd.sas.compute.data.table.summary items. Standard paging options are provided. * @summary Get data sets in a libref * @param {DataAccessApiGetTablesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getTables( requestParameters: DataAccessApiGetTablesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getTables( requestParameters.sessionId, requestParameters.libref, requestParameters.acceptItem, requestParameters.start, requestParameters.limit, requestParameters.noCache, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a specified data set has access to a column. * @summary Check for a column in a table * @param {DataAccessApiHeadersForColumnRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForColumn( requestParameters: DataAccessApiHeadersForColumnRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForColumn( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.columnName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified data set has access to columns. * @summary Check for available columns in a table * @param {DataAccessApiHeadersForColumnsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForColumns( requestParameters: DataAccessApiHeadersForColumnsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForColumns( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified libref exists in a session. * @summary Verify that a libref exists * @param {DataAccessApiHeadersForLibraryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForLibrary( requestParameters: DataAccessApiHeadersForLibraryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForLibrary( requestParameters.sessionId, requestParameters.libref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines headers for prompt content for a given data set. * @summary Check prompt content availability * @param {DataAccessApiHeadersForPromptContentRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForPromptContent( requestParameters: DataAccessApiHeadersForPromptContentRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForPromptContent( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.where, requestParameters.columnDetail, requestParameters.includeColumns, requestParameters.columnNaturalOrder, requestParameters.start, requestParameters.limit, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a data set has access to a specific row. * @summary Check row availability * @param {DataAccessApiHeadersForRowRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForRow( requestParameters: DataAccessApiHeadersForRowRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForRow( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, requestParameters.format, requestParameters.includeIndex, requestParameters.where, requestParameters.includeColumnNames, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a row set is available on for a data set. * @summary Check row set availability * @param {DataAccessApiHeadersForRowSetRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForRowSet( requestParameters: DataAccessApiHeadersForRowSetRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForRowSet( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.where, requestParameters.format, requestParameters.columnDetail, requestParameters.includeColumns, requestParameters.columnNaturalOrder, requestParameters.start, requestParameters.limit, requestParameters.sortBy, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the headers for rows in CSV format for a specified data set. * @summary Get headers for rows represented as comma-separated values * @param {DataAccessApiHeadersForRowsAsCSVRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForRowsAsCSV( requestParameters: DataAccessApiHeadersForRowsAsCSVRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForRowsAsCSV( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.start, requestParameters.limit, requestParameters.format, requestParameters.includeIndex, requestParameters.where, requestParameters.includeColumnNames, requestParameters.columnSeparator, requestParameters.rowSeparator, requestParameters.enableQuoting, requestParameters.enableEscaping, requestParameters.formatMissingValues, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a session has a data endpoint available. * @summary Check access to data for a session * @param {DataAccessApiHeadersForSessionLibrariesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionLibraries( requestParameters: DataAccessApiHeadersForSessionLibrariesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionLibraries( requestParameters.sessionId, requestParameters.start, requestParameters.limit, requestParameters.noCache, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified data set exists in a libref. * @summary Check for a data set in a libref * @param {DataAccessApiHeadersForTableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForTable( requestParameters: DataAccessApiHeadersForTableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForTable( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the name, label, format, or informat information for a specified column. * @summary Update column information * @param {DataAccessApiUpdateColumnRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateColumn( requestParameters: DataAccessApiUpdateColumnRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateColumn( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.columnName, requestParameters.ifMatch, requestParameters.column, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the name or label of the specified table. * @summary Update table information * @param {DataAccessApiUpdateTableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateTable( requestParameters: DataAccessApiUpdateTableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateTable( requestParameters.sessionId, requestParameters.libref, requestParameters.tableName, requestParameters.ifMatch, requestParameters.tableInfo, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createLibrary operation in DataAccessApi. * @export * @interface DataAccessApiCreateLibraryRequest */ export interface DataAccessApiCreateLibraryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiCreateLibrary */ readonly sessionId: string; /** * Specifies a libref assignment request. * @type {LibraryRequest} * @memberof DataAccessApiCreateLibrary */ readonly libraryRequest: LibraryRequest; } /** * Request parameters for createView operation in DataAccessApi. * @export * @interface DataAccessApiCreateViewRequest */ export interface DataAccessApiCreateViewRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiCreateView */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiCreateView */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiCreateView */ readonly tableName: string; /** * Specifies a view creation request. * @type {ViewRequest} * @memberof DataAccessApiCreateView */ readonly viewRequest: ViewRequest; } /** * Request parameters for deleteLibrary operation in DataAccessApi. * @export * @interface DataAccessApiDeleteLibraryRequest */ export interface DataAccessApiDeleteLibraryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiDeleteLibrary */ readonly sessionId: string; /** * Specifies the libref to deassign. * @type {string} * @memberof DataAccessApiDeleteLibrary */ readonly libref: string; } /** * Request parameters for deleteTable operation in DataAccessApi. * @export * @interface DataAccessApiDeleteTableRequest */ export interface DataAccessApiDeleteTableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiDeleteTable */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiDeleteTable */ readonly libref: string; /** * Specifies the table or data set to update. * @type {string} * @memberof DataAccessApiDeleteTable */ readonly tableName: string; } /** * Request parameters for getColumn operation in DataAccessApi. * @export * @interface DataAccessApiGetColumnRequest */ export interface DataAccessApiGetColumnRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetColumn */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetColumn */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetColumn */ readonly tableName: string; /** * Specifies the name of the column to retrieve. * @type {string} * @memberof DataAccessApiGetColumn */ readonly columnName: string; } /** * Request parameters for getColumns operation in DataAccessApi. * @export * @interface DataAccessApiGetColumnsRequest */ export interface DataAccessApiGetColumnsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetColumns */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetColumns */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetColumns */ readonly tableName: string; /** * Specifies the offset of the first column entry to return. * @type {number} * @memberof DataAccessApiGetColumns */ readonly start?: number; /** * Specifies the maximum number of columns to return. * @type {number} * @memberof DataAccessApiGetColumns */ readonly limit?: number; } /** * Request parameters for getColumnsWithRequest operation in DataAccessApi. * @export * @interface DataAccessApiGetColumnsWithRequestRequest */ export interface DataAccessApiGetColumnsWithRequestRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetColumnsWithRequest */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetColumnsWithRequest */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetColumnsWithRequest */ readonly tableName: string; /** * Specifies the offset of the first column entry to return. * @type {number} * @memberof DataAccessApiGetColumnsWithRequest */ readonly start?: number; /** * Specifies the maximum number of columns to return. * @type {number} * @memberof DataAccessApiGetColumnsWithRequest */ readonly limit?: number; /** * Optional body that is used to refine a request. * @type {ColumnsRequest} * @memberof DataAccessApiGetColumnsWithRequest */ readonly columnsRequest?: ColumnsRequest; } /** * Request parameters for getLibraries operation in DataAccessApi. * @export * @interface DataAccessApiGetLibrariesRequest */ export interface DataAccessApiGetLibrariesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetLibraries */ readonly sessionId: string; /** * Specifies the desired library representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.library+json <li>application/vnd.sas.compute.library.summary+json <li>blank </ul> If the application/vnd.sas.compute.library.summary+json type is specified or no Accept-Item header is specified, then the libraries are returned as summary representation library objects. * @type {'application/vnd.sas.compute.library+json' | 'application/vnd.sas.compute.library.summary+json'} * @memberof DataAccessApiGetLibraries */ readonly acceptItem?: | "application/vnd.sas.compute.library+json" | "application/vnd.sas.compute.library.summary+json"; /** * Specifies the offset of the first library to return. * @type {number} * @memberof DataAccessApiGetLibraries */ readonly start?: number; /** * Specifies the maximum number of libraries to return. * @type {number} * @memberof DataAccessApiGetLibraries */ readonly limit?: number; /** * Specifies whether to force the library collection to be refreshed before it is returned. * @type {boolean} * @memberof DataAccessApiGetLibraries */ readonly noCache?: boolean; } /** * Request parameters for getLibrary operation in DataAccessApi. * @export * @interface DataAccessApiGetLibraryRequest */ export interface DataAccessApiGetLibraryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetLibrary */ readonly sessionId: string; /** * Specifies the libref to query. * @type {string} * @memberof DataAccessApiGetLibrary */ readonly libref: string; } /** * Request parameters for getLibrarySummary operation in DataAccessApi. * @export * @interface DataAccessApiGetLibrarySummaryRequest */ export interface DataAccessApiGetLibrarySummaryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetLibrarySummary */ readonly sessionId: string; /** * Specifies the libref to query. * @type {string} * @memberof DataAccessApiGetLibrarySummary */ readonly libref: string; } /** * Request parameters for getPromptContent operation in DataAccessApi. * @export * @interface DataAccessApiGetPromptContentRequest */ export interface DataAccessApiGetPromptContentRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly tableName: string; /** * Specifies that a standard SAS WHERE clause was used to build the content for this request. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly where?: string; /** * Specifies the level of column information to return. * @type {'names' | 'detail' | 'summary'} * @memberof DataAccessApiGetPromptContent */ readonly columnDetail?: "names" | "detail" | "summary"; /** * Specifies a comma-separated list of columns to include in the returned content . If you do not specify a list, all columns are returned. The order of the column names in the list determines the order of cells of the return prompt content. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly includeColumns?: string; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the content are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof DataAccessApiGetPromptContent */ readonly columnNaturalOrder?: boolean; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetPromptContent */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetPromptContent */ readonly limit?: number; /** * Sets the sort order for the returned row set. * @type {string} * @memberof DataAccessApiGetPromptContent */ readonly sortBy?: string; } /** * Request parameters for getPromptContentWithRequest operation in DataAccessApi. * @export * @interface DataAccessApiGetPromptContentWithRequestRequest */ export interface DataAccessApiGetPromptContentWithRequestRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly tableName: string; /** * Specifies a prompt content creation request. * @type {PromptContentRequest} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly promptContentRequest: PromptContentRequest; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetPromptContentWithRequest */ readonly limit?: number; } /** * Request parameters for getRowSet operation in DataAccessApi. * @export * @interface DataAccessApiGetRowSetRequest */ export interface DataAccessApiGetRowSetRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly tableName: string; /** * Specifies that a standard SAS WHERE clause was used to build the row set for this request. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly where?: string; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiGetRowSet */ readonly format?: boolean; /** * Specifies the level of column information to return. * @type {'names' | 'detail' | 'summary'} * @memberof DataAccessApiGetRowSet */ readonly columnDetail?: "names" | "detail" | "summary"; /** * Specifies a comma-separated list of columns to include in a row set. If you do not specify a list, all columns are returned. The order of the column names in the list determines the order of cells of the row set. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly includeColumns?: string; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof DataAccessApiGetRowSet */ readonly columnNaturalOrder?: boolean; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetRowSet */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetRowSet */ readonly limit?: number; /** * Sets the sort order for the returned row set. * @type {string} * @memberof DataAccessApiGetRowSet */ readonly sortBy?: string; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiGetRowSet */ readonly formatMissingValues?: boolean; } /** * Request parameters for getRowSetWithRequest operation in DataAccessApi. * @export * @interface DataAccessApiGetRowSetWithRequestRequest */ export interface DataAccessApiGetRowSetWithRequestRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetRowSetWithRequest */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetRowSetWithRequest */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetRowSetWithRequest */ readonly tableName: string; /** * Specifies a row set creation request. * @type {RowSetRequest} * @memberof DataAccessApiGetRowSetWithRequest */ readonly rowSetRequest: RowSetRequest; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiGetRowSetWithRequest */ readonly format?: boolean; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetRowSetWithRequest */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetRowSetWithRequest */ readonly limit?: number; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiGetRowSetWithRequest */ readonly formatMissingValues?: boolean; } /** * Request parameters for getRows operation in DataAccessApi. * @export * @interface DataAccessApiGetRowsRequest */ export interface DataAccessApiGetRowsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetRows */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetRows */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetRows */ readonly tableName: string; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetRows */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetRows */ readonly limit?: number; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiGetRows */ readonly format?: boolean; /** * Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @type {boolean} * @memberof DataAccessApiGetRows */ readonly includeIndex?: boolean; /** * Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @type {string} * @memberof DataAccessApiGetRows */ readonly where?: string; /** * Specifies whether the first row that is returned consists of column names. * @type {boolean} * @memberof DataAccessApiGetRows */ readonly includeColumnNames?: boolean; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiGetRows */ readonly formatMissingValues?: boolean; } /** * Request parameters for getRowsAsCSV operation in DataAccessApi. * @export * @interface DataAccessApiGetRowsAsCSVRequest */ export interface DataAccessApiGetRowsAsCSVRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly tableName: string; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetRowsAsCSV */ readonly start?: number; /** * (Optional) Specifies the maximum number of rows to return. If not set, all rows are returned. * @type {number} * @memberof DataAccessApiGetRowsAsCSV */ readonly limit?: number; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly format?: boolean; /** * Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly includeIndex?: boolean; /** * Specifies that a standard SAS WHERE clause has been used to return the rows for this request. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly where?: string; /** * Specifies whether the first row that is returned consists of column names. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly includeColumnNames?: boolean; /** * Specifies the character to use as the column separator. If no character is specified, a comma is used as the separator. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly columnSeparator?: string; /** * Specifies the characters to use as the row separator. If no characters are specified, a line feed character (\\n) is used. * @type {string} * @memberof DataAccessApiGetRowsAsCSV */ readonly rowSeparator?: string; /** * Specifies whether values that contain special characters are quoted. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly enableQuoting?: boolean; /** * Specifies whether special characters in values are escaped if the value is not quoted. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly enableEscaping?: boolean; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiGetRowsAsCSV */ readonly formatMissingValues?: boolean; } /** * Request parameters for getRowsWithRequest operation in DataAccessApi. * @export * @interface DataAccessApiGetRowsWithRequestRequest */ export interface DataAccessApiGetRowsWithRequestRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetRowsWithRequest */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetRowsWithRequest */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetRowsWithRequest */ readonly tableName: string; /** * Specifies a row-generation request. * @type {RowsRequest} * @memberof DataAccessApiGetRowsWithRequest */ readonly rowsRequest: RowsRequest; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiGetRowsWithRequest */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiGetRowsWithRequest */ readonly limit?: number; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiGetRowsWithRequest */ readonly format?: boolean; /** * Specifies whether the first value in the cell is the index of a specific row. Support for this parameter was added in version 2. * @type {boolean} * @memberof DataAccessApiGetRowsWithRequest */ readonly includeIndex?: boolean; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiGetRowsWithRequest */ readonly formatMissingValues?: boolean; } /** * Request parameters for getTable operation in DataAccessApi. * @export * @interface DataAccessApiGetTableRequest */ export interface DataAccessApiGetTableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetTable */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetTable */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetTable */ readonly tableName: string; } /** * Request parameters for getTableSummary operation in DataAccessApi. * @export * @interface DataAccessApiGetTableSummaryRequest */ export interface DataAccessApiGetTableSummaryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetTableSummary */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiGetTableSummary */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiGetTableSummary */ readonly tableName: string; } /** * Request parameters for getTables operation in DataAccessApi. * @export * @interface DataAccessApiGetTablesRequest */ export interface DataAccessApiGetTablesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiGetTables */ readonly sessionId: string; /** * Specifies the libref to query. * @type {string} * @memberof DataAccessApiGetTables */ readonly libref: string; /** * Specifies the desired data table representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.data.table+json <li>application/vnd.sas.compute.data.table.summary+json <li>blank </ul> If the application/vnd.sas.compute.data.table.summary+json type is specified or no Accept-Item header is specified, then the data tables are returned as summary representation data table objects. * @type {'application/vnd.sas.compute.data.table+json'} * @memberof DataAccessApiGetTables */ readonly acceptItem?: "application/vnd.sas.compute.data.table+json"; /** * Specifies the offset of the first table summary to return. * @type {number} * @memberof DataAccessApiGetTables */ readonly start?: number; /** * Specifies the maximum number of table summaries to return. * @type {number} * @memberof DataAccessApiGetTables */ readonly limit?: number; /** * Specifies whether to force the table collection to be refreshed before it is returned. * @type {boolean} * @memberof DataAccessApiGetTables */ readonly noCache?: boolean; } /** * Request parameters for headersForColumn operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForColumnRequest */ export interface DataAccessApiHeadersForColumnRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForColumn */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForColumn */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForColumn */ readonly tableName: string; /** * Specifies the column name to check. * @type {string} * @memberof DataAccessApiHeadersForColumn */ readonly columnName: string; } /** * Request parameters for headersForColumns operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForColumnsRequest */ export interface DataAccessApiHeadersForColumnsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForColumns */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForColumns */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForColumns */ readonly tableName: string; /** * Specifies the offset of the first column entry to return. * @type {number} * @memberof DataAccessApiHeadersForColumns */ readonly start?: number; /** * Specifies the maximum number of columns to return. * @type {number} * @memberof DataAccessApiHeadersForColumns */ readonly limit?: number; } /** * Request parameters for headersForLibrary operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForLibraryRequest */ export interface DataAccessApiHeadersForLibraryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForLibrary */ readonly sessionId: string; /** * Specifies the libref to query. * @type {string} * @memberof DataAccessApiHeadersForLibrary */ readonly libref: string; } /** * Request parameters for headersForPromptContent operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForPromptContentRequest */ export interface DataAccessApiHeadersForPromptContentRequest { /** * Specifies the ID of the session * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly tableName: string; /** * Specifies that a standard SAS WHERE clause was used to build the content for this request. * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly where?: string; /** * Specifies the level of column information to return. * @type {'names' | 'detail' | 'summary'} * @memberof DataAccessApiHeadersForPromptContent */ readonly columnDetail?: "names" | "detail" | "summary"; /** * Specifies a comma separated list of columns to include in the returned content. If you do not specify a list, all columns are returned. The order of the column names in the list is the order in which the cells of the content are in as well. * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly includeColumns?: string; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the returned content are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof DataAccessApiHeadersForPromptContent */ readonly columnNaturalOrder?: boolean; /** * Specifies the offset of the first row to return. The default value is \"0\". * @type {number} * @memberof DataAccessApiHeadersForPromptContent */ readonly start?: number; /** * Specifies the maximum number of rows to return. The default value is \"10\". * @type {number} * @memberof DataAccessApiHeadersForPromptContent */ readonly limit?: number; /** * Sets the sort order for the returned prompt content. * @type {string} * @memberof DataAccessApiHeadersForPromptContent */ readonly sortBy?: string; } /** * Request parameters for headersForRow operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForRowRequest */ export interface DataAccessApiHeadersForRowRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForRow */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForRow */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForRow */ readonly tableName: string; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiHeadersForRow */ readonly start?: number; /** * Specifies the maximum number of rows to return. * @type {number} * @memberof DataAccessApiHeadersForRow */ readonly limit?: number; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiHeadersForRow */ readonly format?: boolean; /** * Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @type {boolean} * @memberof DataAccessApiHeadersForRow */ readonly includeIndex?: boolean; /** * Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @type {string} * @memberof DataAccessApiHeadersForRow */ readonly where?: string; /** * Specifies whether the first row that is returned consists of column names. * @type {boolean} * @memberof DataAccessApiHeadersForRow */ readonly includeColumnNames?: boolean; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiHeadersForRow */ readonly formatMissingValues?: boolean; } /** * Request parameters for headersForRowSet operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForRowSetRequest */ export interface DataAccessApiHeadersForRowSetRequest { /** * Specifies the ID of the session * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly tableName: string; /** * Specifies that a standard SAS WHERE clause was used to build the row set for this request. * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly where?: string; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiHeadersForRowSet */ readonly format?: boolean; /** * Specifies the level of column information to return. * @type {'names' | 'detail' | 'summary'} * @memberof DataAccessApiHeadersForRowSet */ readonly columnDetail?: "names" | "detail" | "summary"; /** * Specifies a comma separated list of columns to include in the row set. If you do not specify a list, all columns are returned. The order of the column names in the list is the order in which the cells of the row set are in as well. * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly includeColumns?: string; /** * When includeColumns is specified, a value of true for columnNatrualOrder specifies that the cells of the row set are returned in the order in which they occur in the data set instead of in the order that is specified by includeColumns. * @type {boolean} * @memberof DataAccessApiHeadersForRowSet */ readonly columnNaturalOrder?: boolean; /** * Specifies the offset of the first row to return. The default value is \"0\". * @type {number} * @memberof DataAccessApiHeadersForRowSet */ readonly start?: number; /** * Specifies the maximum number of rows to return. The default value is \"10\". * @type {number} * @memberof DataAccessApiHeadersForRowSet */ readonly limit?: number; /** * Sets the sort order for the returned row set. * @type {string} * @memberof DataAccessApiHeadersForRowSet */ readonly sortBy?: string; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiHeadersForRowSet */ readonly formatMissingValues?: boolean; } /** * Request parameters for headersForRowsAsCSV operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForRowsAsCSVRequest */ export interface DataAccessApiHeadersForRowsAsCSVRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly tableName: string; /** * Specifies the offset of the first row to return. * @type {number} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly start?: number; /** * (Optional) Specifies the maximum number of rows to return. If not set, all rows are returned. * @type {number} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly limit?: number; /** * Specifies whether to format the data in the cells. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly format?: boolean; /** * Specifies whether the first value in the cell is the index of the requested row. Support for this parameter was added in version 2. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly includeIndex?: boolean; /** * Specifies that a standard SAS WHERE clause was used to return the rows for this request. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly where?: string; /** * Specifies whether the first row that is returned consists of column names. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly includeColumnNames?: boolean; /** * Specifies the character to use as the column separator. If no character is specified, a comma is used as the separator. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly columnSeparator?: string; /** * Specifies the characters to use as the row separator. If no characters are specified, a line feed character (\\n) is used. * @type {string} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly rowSeparator?: string; /** * Specifies whether values that contain special characters are quoted. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly enableQuoting?: boolean; /** * Specifies whether special characters in values are escaped if the values are not quoted. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly enableEscaping?: boolean; /** * If set to true, SAS missing values found in the data will be formatted based on the setting of the SAS Option MISSING. Otherwise, a NULL value will be returned. * @type {boolean} * @memberof DataAccessApiHeadersForRowsAsCSV */ readonly formatMissingValues?: boolean; } /** * Request parameters for headersForSessionLibraries operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForSessionLibrariesRequest */ export interface DataAccessApiHeadersForSessionLibrariesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForSessionLibraries */ readonly sessionId: string; /** * Specifies the offset of the first library to return. * @type {number} * @memberof DataAccessApiHeadersForSessionLibraries */ readonly start?: number; /** * Specifies the maximum number of libraries to return. * @type {number} * @memberof DataAccessApiHeadersForSessionLibraries */ readonly limit?: number; /** * Specifies whether to force the library collection to be refreshed before it is returned. * @type {boolean} * @memberof DataAccessApiHeadersForSessionLibraries */ readonly noCache?: boolean; } /** * Request parameters for headersForTable operation in DataAccessApi. * @export * @interface DataAccessApiHeadersForTableRequest */ export interface DataAccessApiHeadersForTableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiHeadersForTable */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiHeadersForTable */ readonly libref: string; /** * Specifies the table or data set to query. * @type {string} * @memberof DataAccessApiHeadersForTable */ readonly tableName: string; } /** * Request parameters for updateColumn operation in DataAccessApi. * @export * @interface DataAccessApiUpdateColumnRequest */ export interface DataAccessApiUpdateColumnRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiUpdateColumn */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiUpdateColumn */ readonly libref: string; /** * Specifies the table that contains the column to update. * @type {string} * @memberof DataAccessApiUpdateColumn */ readonly tableName: string; /** * Specifies the column name to update. * @type {string} * @memberof DataAccessApiUpdateColumn */ readonly columnName: string; /** * Specifies the ETag of the column that you are updating. * @type {string} * @memberof DataAccessApiUpdateColumn */ readonly ifMatch: string; /** * Specifies the information to update for the column. * @type {Column} * @memberof DataAccessApiUpdateColumn */ readonly column: Column; } /** * Request parameters for updateTable operation in DataAccessApi. * @export * @interface DataAccessApiUpdateTableRequest */ export interface DataAccessApiUpdateTableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof DataAccessApiUpdateTable */ readonly sessionId: string; /** * Specifies the libref for the request. * @type {string} * @memberof DataAccessApiUpdateTable */ readonly libref: string; /** * Specifies the table or data set to update. * @type {string} * @memberof DataAccessApiUpdateTable */ readonly tableName: string; /** * Specifies the ETag of the table that you are updating. * @type {string} * @memberof DataAccessApiUpdateTable */ readonly ifMatch: string; /** * Specifies the information to update for the table. * @type {TableInfo} * @memberof DataAccessApiUpdateTable */ readonly tableInfo: TableInfo; } /** * EnginesApi - axios parameter creator * @export */ export const EnginesApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Returns information about a specific engine. * @summary Get engine information for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} engineName Specifies the name or nickname of the specified engine. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getEngine: async ( sessionId: string, engineName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getEngine", "sessionId", sessionId); // verify required parameter 'engineName' is not null or undefined assertParamExists("getEngine", "engineName", engineName); const localVarPath = `/sessions/{sessionId}/engines/{engineName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"engineName"}}`, encodeURIComponent(String(engineName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the options schema for a specific engine. * @summary Get options schema for an engine * @param {string} sessionId Specifies the ID of the session. * @param {string} engineName Specifies the name or nickname of the requested engine. * @param {number} [start] Specifies the offset of the first resource to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of resources to return. The default value is \"50\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ getEngineDefinition: async ( sessionId: string, engineName: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getEngineDefinition", "sessionId", sessionId); // verify required parameter 'engineName' is not null or undefined assertParamExists("getEngineDefinition", "engineName", engineName); const localVarPath = `/sessions/{sessionId}/engines/{engineName}/definition` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"engineName"}}`, encodeURIComponent(String(engineName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns engine information for a session. An engine enables you to access data from different storage locations. Each engine might have different requirements for usage. This endpoint returns a collection of engine information that enables you to determine what engines can be used in a session. A collection of application/vnd.sas.data.engine items is returned. Standard pagination rules apply, and simple filtering is allowed. * @summary Get an engine list for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies filter criteria for returned context definitions. * @param {number} [start] Specifies the offset of the first engine to return. The default value is 0. * @param {number} [limit] Specifies the maximum number of engines to return on a page. The default value is 10. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getEngines: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getEngines", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/engines`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether information for a specific engine is available. * @summary Get engine information * @param {string} sessionId Specifies the ID of the session. * @param {string} engineName Specifies the name or nickname of the engine. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForEngine: async ( sessionId: string, engineName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForEngine", "sessionId", sessionId); // verify required parameter 'engineName' is not null or undefined assertParamExists("headersForEngine", "engineName", engineName); const localVarPath = `/sessions/{sessionId}/engines/{engineName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"engineName"}}`, encodeURIComponent(String(engineName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether information for the specified engine is available. * @summary Get engine information for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} engineName Specifies the name or nickname of the requested engine. * @param {number} [start] Specifies the offset of the first resource to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of resources to return. The default value is \"50\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForEngineDefinition: async ( sessionId: string, engineName: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForEngineDefinition", "sessionId", sessionId); // verify required parameter 'engineName' is not null or undefined assertParamExists("headersForEngineDefinition", "engineName", engineName); const localVarPath = `/sessions/{sessionId}/engines/{engineName}/definition` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"engineName"}}`, encodeURIComponent(String(engineName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether it is possible to get engine information for a session. * @summary Check engine list availability for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies filter criteria for returned context definitions. * @param {number} [start] Specifies the offset of the first engine to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of engines to return in a page. The default value is \"10\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForEngines: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForEngines", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/engines`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * EnginesApi - functional programming interface * @export */ export const EnginesApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = EnginesApiAxiosParamCreator(configuration); return { /** * Returns information about a specific engine. * @summary Get engine information for a session * @param {EnginesApiGetEngineRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getEngine( requestParameters: EnginesApiGetEngineRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getEngine( requestParameters.sessionId, requestParameters.engineName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the options schema for a specific engine. * @summary Get options schema for an engine * @param {EnginesApiGetEngineDefinitionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getEngineDefinition( requestParameters: EnginesApiGetEngineDefinitionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getEngineDefinition( requestParameters.sessionId, requestParameters.engineName, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns engine information for a session. An engine enables you to access data from different storage locations. Each engine might have different requirements for usage. This endpoint returns a collection of engine information that enables you to determine what engines can be used in a session. A collection of application/vnd.sas.data.engine items is returned. Standard pagination rules apply, and simple filtering is allowed. * @summary Get an engine list for a session * @param {EnginesApiGetEnginesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getEngines( requestParameters: EnginesApiGetEnginesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getEngines( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether information for a specific engine is available. * @summary Get engine information * @param {EnginesApiHeadersForEngineRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForEngine( requestParameters: EnginesApiHeadersForEngineRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForEngine( requestParameters.sessionId, requestParameters.engineName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether information for the specified engine is available. * @summary Get engine information for a session * @param {EnginesApiHeadersForEngineDefinitionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForEngineDefinition( requestParameters: EnginesApiHeadersForEngineDefinitionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForEngineDefinition( requestParameters.sessionId, requestParameters.engineName, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether it is possible to get engine information for a session. * @summary Check engine list availability for a session * @param {EnginesApiHeadersForEnginesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForEngines( requestParameters: EnginesApiHeadersForEnginesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForEngines( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getEngine operation in EnginesApi. * @export * @interface EnginesApiGetEngineRequest */ export interface EnginesApiGetEngineRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiGetEngine */ readonly sessionId: string; /** * Specifies the name or nickname of the specified engine. * @type {string} * @memberof EnginesApiGetEngine */ readonly engineName: string; } /** * Request parameters for getEngineDefinition operation in EnginesApi. * @export * @interface EnginesApiGetEngineDefinitionRequest */ export interface EnginesApiGetEngineDefinitionRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiGetEngineDefinition */ readonly sessionId: string; /** * Specifies the name or nickname of the requested engine. * @type {string} * @memberof EnginesApiGetEngineDefinition */ readonly engineName: string; /** * Specifies the offset of the first resource to return. The default value is \"0\". * @type {number} * @memberof EnginesApiGetEngineDefinition */ readonly start?: number; /** * Specifies the maximum number of resources to return. The default value is \"50\". * @type {number} * @memberof EnginesApiGetEngineDefinition */ readonly limit?: number; } /** * Request parameters for getEngines operation in EnginesApi. * @export * @interface EnginesApiGetEnginesRequest */ export interface EnginesApiGetEnginesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiGetEngines */ readonly sessionId: string; /** * Specifies filter criteria for returned context definitions. * @type {string} * @memberof EnginesApiGetEngines */ readonly filter?: string; /** * Specifies the offset of the first engine to return. The default value is 0. * @type {number} * @memberof EnginesApiGetEngines */ readonly start?: number; /** * Specifies the maximum number of engines to return on a page. The default value is 10. * @type {number} * @memberof EnginesApiGetEngines */ readonly limit?: number; } /** * Request parameters for headersForEngine operation in EnginesApi. * @export * @interface EnginesApiHeadersForEngineRequest */ export interface EnginesApiHeadersForEngineRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiHeadersForEngine */ readonly sessionId: string; /** * Specifies the name or nickname of the engine. * @type {string} * @memberof EnginesApiHeadersForEngine */ readonly engineName: string; } /** * Request parameters for headersForEngineDefinition operation in EnginesApi. * @export * @interface EnginesApiHeadersForEngineDefinitionRequest */ export interface EnginesApiHeadersForEngineDefinitionRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiHeadersForEngineDefinition */ readonly sessionId: string; /** * Specifies the name or nickname of the requested engine. * @type {string} * @memberof EnginesApiHeadersForEngineDefinition */ readonly engineName: string; /** * Specifies the offset of the first resource to return. The default value is \"0\". * @type {number} * @memberof EnginesApiHeadersForEngineDefinition */ readonly start?: number; /** * Specifies the maximum number of resources to return. The default value is \"50\". * @type {number} * @memberof EnginesApiHeadersForEngineDefinition */ readonly limit?: number; } /** * Request parameters for headersForEngines operation in EnginesApi. * @export * @interface EnginesApiHeadersForEnginesRequest */ export interface EnginesApiHeadersForEnginesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof EnginesApiHeadersForEngines */ readonly sessionId: string; /** * Specifies filter criteria for returned context definitions. * @type {string} * @memberof EnginesApiHeadersForEngines */ readonly filter?: string; /** * Specifies the offset of the first engine to return. The default value is \"0\". * @type {number} * @memberof EnginesApiHeadersForEngines */ readonly start?: number; /** * Specifies the maximum number of engines to return in a page. The default value is \"10\". * @type {number} * @memberof EnginesApiHeadersForEngines */ readonly limit?: number; } /** * FileSystemApi - axios parameter creator * @export */ export const FileSystemApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Copies a file or directory. Provide the path of the destination file or directory in the URI. Provide the path of the source file or directory in the request body. If you do not provide a path in the request body, then the current working directory is assumed. * @summary Copy a file or directory * @param {string} sessionId Specifies the ID of the session. * @param {string} destinationFileOrDirectoryPath Specifies the destination file or directory path. In the path value, replace each forward slash with ~fs~. * @param {FileRequest} fileRequest Specifies the source file or directory `name` and `path` elements. The `name` element is required, and the `path` element is optional. * @param {boolean} [overwrite] Specifies whether to force an overwrite of an existing file or directory if one of the same name exists at the destination path. If you specify true, the request replaces the existing file or directory. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {*} [options] Override http request option. * @throws {RequiredError} */ copyFileOrDirectory: async ( sessionId: string, destinationFileOrDirectoryPath: string, fileRequest: FileRequest, overwrite?: boolean, expandPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("copyFileOrDirectory", "sessionId", sessionId); // verify required parameter 'destinationFileOrDirectoryPath' is not null or undefined assertParamExists( "copyFileOrDirectory", "destinationFileOrDirectoryPath", destinationFileOrDirectoryPath, ); // verify required parameter 'fileRequest' is not null or undefined assertParamExists("copyFileOrDirectory", "fileRequest", fileRequest); const localVarPath = `/sessions/{sessionId}/files/{destinationFileOrDirectoryPath}#copyFileOrDirectory` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"destinationFileOrDirectoryPath"}}`, encodeURIComponent(String(destinationFileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (overwrite !== undefined) { localVarQueryParameter["overwrite"] = overwrite; } if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.file.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( fileRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Creates an empty file or directory. In the request body, set the `isDirectory` attribute to \'false\' for files and to \'true\' for a directory. The `name` attribute specifies the name of the new file or directory. Provide the path of the new file or directory either in the URI or in the `path` attribute in the request body. If you do not provide a path, then the new file or directory is created under the current working directory. * @summary Create an empty file or directory * @param {string} sessionId Specifies the ID of the session. * @param {string} fileOrDirectoryPath Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @param {FileProperties} fileProperties Specifies the file or directory `name` and `path` elements. The `name` element is required and the `path` element is optional. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createFileOrDirectory: async ( sessionId: string, fileOrDirectoryPath: string, fileProperties: FileProperties, expandPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("createFileOrDirectory", "sessionId", sessionId); // verify required parameter 'fileOrDirectoryPath' is not null or undefined assertParamExists( "createFileOrDirectory", "fileOrDirectoryPath", fileOrDirectoryPath, ); // verify required parameter 'fileProperties' is not null or undefined assertParamExists( "createFileOrDirectory", "fileProperties", fileProperties, ); const localVarPath = `/sessions/{sessionId}/files/{fileOrDirectoryPath}#touchFileOrDirectory` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"fileOrDirectoryPath"}}`, encodeURIComponent(String(fileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.file.properties+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( fileProperties, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes a file or directory. * @summary Delete a file or directory * @param {string} sessionId Specifies the ID of the session. * @param {string} fileOrDirectoryPath Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @param {string} ifMatch Specifies the current ETag of the file or directory resource that you are deleting. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFileOrDirectoryFromSystem: async ( sessionId: string, fileOrDirectoryPath: string, ifMatch: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists( "deleteFileOrDirectoryFromSystem", "sessionId", sessionId, ); // verify required parameter 'fileOrDirectoryPath' is not null or undefined assertParamExists( "deleteFileOrDirectoryFromSystem", "fileOrDirectoryPath", fileOrDirectoryPath, ); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("deleteFileOrDirectoryFromSystem", "ifMatch", ifMatch); const localVarPath = `/sessions/{sessionId}/files/{fileOrDirectoryPath}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"fileOrDirectoryPath"}}`, encodeURIComponent(String(fileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a collection of directory members from a specified directory path. * @summary Get directory members * @param {string} sessionId Specifies the ID of the session. * @param {string} directoryPath Specifies the directory path. In the directory path, replace each forward slash with ~fs~. * @param {boolean} [showAll] Specifies whether to return hidden members in the directory. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {number} [start] Specifies the offset of the first directory member to return. The default value is 0. * @param {number} [limit] Specifies the maximum number of members to return. The default value is 10. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getDirectoryMembers: async ( sessionId: string, directoryPath: string, showAll?: boolean, expandPath?: boolean, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getDirectoryMembers", "sessionId", sessionId); // verify required parameter 'directoryPath' is not null or undefined assertParamExists("getDirectoryMembers", "directoryPath", directoryPath); const localVarPath = `/sessions/{sessionId}/files/{directoryPath}/members` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"directoryPath"}}`, encodeURIComponent(String(directoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (showAll !== undefined) { localVarQueryParameter["showAll"] = showAll; } if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets contents of a file that is specified by the file path. If the server can determine the type of file that is returned, then the `Content-type` header returns the appropriate media type information. Otherwise, application/octet-stream data is returned for the `Content-type` header. * @summary Download file contents * @param {string} sessionId Specifies the ID of the session. * @param {string} filePath Specifies the file path. In the file path, replace each forward slash with ~fs~. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileContentFromSystem: async ( sessionId: string, filePath: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFileContentFromSystem", "sessionId", sessionId); // verify required parameter 'filePath' is not null or undefined assertParamExists("getFileContentFromSystem", "filePath", filePath); const localVarPath = `/sessions/{sessionId}/files/{filePath}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"filePath"}}`, encodeURIComponent(String(filePath))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets file or directory properties at a specified path. * @summary Get file or directory properties * @param {string} sessionId Specifies the ID of the session. * @param {string} fileOrDirectoryPath Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileorDirectoryProperties: async ( sessionId: string, fileOrDirectoryPath: string, expandPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFileorDirectoryProperties", "sessionId", sessionId); // verify required parameter 'fileOrDirectoryPath' is not null or undefined assertParamExists( "getFileorDirectoryProperties", "fileOrDirectoryPath", fileOrDirectoryPath, ); const localVarPath = `/sessions/{sessionId}/files/{fileOrDirectoryPath}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"fileOrDirectoryPath"}}`, encodeURIComponent(String(fileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified file or directory exists. * @summary Check for file or directory properties * @param {string} sessionId Specifies the ID of the session. * @param {string} fileOrDirectoryPath Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFileorDirectoryProperties: async ( sessionId: string, fileOrDirectoryPath: string, expandPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists( "headersForFileorDirectoryProperties", "sessionId", sessionId, ); // verify required parameter 'fileOrDirectoryPath' is not null or undefined assertParamExists( "headersForFileorDirectoryProperties", "fileOrDirectoryPath", fileOrDirectoryPath, ); const localVarPath = `/sessions/{sessionId}/files/{fileOrDirectoryPath}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"fileOrDirectoryPath"}}`, encodeURIComponent(String(fileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Creates a file or replaces an existing file. An ETag is required when you replace an existing file. * @summary Upload file content * @param {string} sessionId Specifies the ID of the session. * @param {string} filePath Specifies the file path. In the file path, replace each forward slash with ~fs~. * @param {File} body Specifies the content to upload to the file. * @param {string} [ifMatch] Specifies the current ETag of the file resource that you are deleting. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFileContentOnSystem: async ( sessionId: string, filePath: string, body: File, ifMatch?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateFileContentOnSystem", "sessionId", sessionId); // verify required parameter 'filePath' is not null or undefined assertParamExists("updateFileContentOnSystem", "filePath", filePath); // verify required parameter 'body' is not null or undefined assertParamExists("updateFileContentOnSystem", "body", body); const localVarPath = `/sessions/{sessionId}/files/{filePath}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"filePath"}}`, encodeURIComponent(String(filePath))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/octet-stream"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( body, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Renames a file or directory at the specified location. Can also be used to move a file or directory to a location that you specify in the `path` element of the application/vnd.sas.compute.file.properties body. If no `path` is provided, the file is moved to the current working directory. The `move` action causes the path for the new file or directory to change. * @summary Rename a file or directory * @param {string} sessionId Specifies the ID of the session. * @param {string} fileOrDirectoryPath Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @param {string} ifMatch Specifies the current ETag of the file or directory resource that you are renaming. * @param {FileProperties} fileProperties Specifies the file or directory `name` and `path` elements. The `name` element is required and the `path` element is optional. If specified, the \'path\' value can contain an absolute path or a path that is relative to the current working directory. Do not replace forward slash characters with ~fs~ for the `path` element. * @param {boolean} [overwrite] Specifies whether to force an overwrite of an existing file or directory if one of the same name exists at the destination path. If you specify true, the request replaces the existing file or directory. * @param {boolean} [expandPath] Specifies whether to return fully qualified paths in response links. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFileOrDirectoryOnSystem: async ( sessionId: string, fileOrDirectoryPath: string, ifMatch: string, fileProperties: FileProperties, overwrite?: boolean, expandPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists( "updateFileOrDirectoryOnSystem", "sessionId", sessionId, ); // verify required parameter 'fileOrDirectoryPath' is not null or undefined assertParamExists( "updateFileOrDirectoryOnSystem", "fileOrDirectoryPath", fileOrDirectoryPath, ); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateFileOrDirectoryOnSystem", "ifMatch", ifMatch); // verify required parameter 'fileProperties' is not null or undefined assertParamExists( "updateFileOrDirectoryOnSystem", "fileProperties", fileProperties, ); const localVarPath = `/sessions/{sessionId}/files/{fileOrDirectoryPath}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"fileOrDirectoryPath"}}`, encodeURIComponent(String(fileOrDirectoryPath)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (overwrite !== undefined) { localVarQueryParameter["overwrite"] = overwrite; } if (expandPath !== undefined) { localVarQueryParameter["expandPath"] = expandPath; } if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.file.properties+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( fileProperties, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * FileSystemApi - functional programming interface * @export */ export const FileSystemApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = FileSystemApiAxiosParamCreator(configuration); return { /** * Copies a file or directory. Provide the path of the destination file or directory in the URI. Provide the path of the source file or directory in the request body. If you do not provide a path in the request body, then the current working directory is assumed. * @summary Copy a file or directory * @param {FileSystemApiCopyFileOrDirectoryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async copyFileOrDirectory( requestParameters: FileSystemApiCopyFileOrDirectoryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.copyFileOrDirectory( requestParameters.sessionId, requestParameters.destinationFileOrDirectoryPath, requestParameters.fileRequest, requestParameters.overwrite, requestParameters.expandPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Creates an empty file or directory. In the request body, set the `isDirectory` attribute to \'false\' for files and to \'true\' for a directory. The `name` attribute specifies the name of the new file or directory. Provide the path of the new file or directory either in the URI or in the `path` attribute in the request body. If you do not provide a path, then the new file or directory is created under the current working directory. * @summary Create an empty file or directory * @param {FileSystemApiCreateFileOrDirectoryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createFileOrDirectory( requestParameters: FileSystemApiCreateFileOrDirectoryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createFileOrDirectory( requestParameters.sessionId, requestParameters.fileOrDirectoryPath, requestParameters.fileProperties, requestParameters.expandPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes a file or directory. * @summary Delete a file or directory * @param {FileSystemApiDeleteFileOrDirectoryFromSystemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFileOrDirectoryFromSystem( requestParameters: FileSystemApiDeleteFileOrDirectoryFromSystemRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFileOrDirectoryFromSystem( requestParameters.sessionId, requestParameters.fileOrDirectoryPath, requestParameters.ifMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a collection of directory members from a specified directory path. * @summary Get directory members * @param {FileSystemApiGetDirectoryMembersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getDirectoryMembers( requestParameters: FileSystemApiGetDirectoryMembersRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getDirectoryMembers( requestParameters.sessionId, requestParameters.directoryPath, requestParameters.showAll, requestParameters.expandPath, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets contents of a file that is specified by the file path. If the server can determine the type of file that is returned, then the `Content-type` header returns the appropriate media type information. Otherwise, application/octet-stream data is returned for the `Content-type` header. * @summary Download file contents * @param {FileSystemApiGetFileContentFromSystemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileContentFromSystem( requestParameters: FileSystemApiGetFileContentFromSystemRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileContentFromSystem( requestParameters.sessionId, requestParameters.filePath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets file or directory properties at a specified path. * @summary Get file or directory properties * @param {FileSystemApiGetFileorDirectoryPropertiesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileorDirectoryProperties( requestParameters: FileSystemApiGetFileorDirectoryPropertiesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileorDirectoryProperties( requestParameters.sessionId, requestParameters.fileOrDirectoryPath, requestParameters.expandPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified file or directory exists. * @summary Check for file or directory properties * @param {FileSystemApiHeadersForFileorDirectoryPropertiesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFileorDirectoryProperties( requestParameters: FileSystemApiHeadersForFileorDirectoryPropertiesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFileorDirectoryProperties( requestParameters.sessionId, requestParameters.fileOrDirectoryPath, requestParameters.expandPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Creates a file or replaces an existing file. An ETag is required when you replace an existing file. * @summary Upload file content * @param {FileSystemApiUpdateFileContentOnSystemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFileContentOnSystem( requestParameters: FileSystemApiUpdateFileContentOnSystemRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFileContentOnSystem( requestParameters.sessionId, requestParameters.filePath, requestParameters.body, requestParameters.ifMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Renames a file or directory at the specified location. Can also be used to move a file or directory to a location that you specify in the `path` element of the application/vnd.sas.compute.file.properties body. If no `path` is provided, the file is moved to the current working directory. The `move` action causes the path for the new file or directory to change. * @summary Rename a file or directory * @param {FileSystemApiUpdateFileOrDirectoryOnSystemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFileOrDirectoryOnSystem( requestParameters: FileSystemApiUpdateFileOrDirectoryOnSystemRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFileOrDirectoryOnSystem( requestParameters.sessionId, requestParameters.fileOrDirectoryPath, requestParameters.ifMatch, requestParameters.fileProperties, requestParameters.overwrite, requestParameters.expandPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for copyFileOrDirectory operation in FileSystemApi. * @export * @interface FileSystemApiCopyFileOrDirectoryRequest */ export interface FileSystemApiCopyFileOrDirectoryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiCopyFileOrDirectory */ readonly sessionId: string; /** * Specifies the destination file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiCopyFileOrDirectory */ readonly destinationFileOrDirectoryPath: string; /** * Specifies the source file or directory `name` and `path` elements. The `name` element is required, and the `path` element is optional. * @type {FileRequest} * @memberof FileSystemApiCopyFileOrDirectory */ readonly fileRequest: FileRequest; /** * Specifies whether to force an overwrite of an existing file or directory if one of the same name exists at the destination path. If you specify true, the request replaces the existing file or directory. * @type {boolean} * @memberof FileSystemApiCopyFileOrDirectory */ readonly overwrite?: boolean; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiCopyFileOrDirectory */ readonly expandPath?: boolean; } /** * Request parameters for createFileOrDirectory operation in FileSystemApi. * @export * @interface FileSystemApiCreateFileOrDirectoryRequest */ export interface FileSystemApiCreateFileOrDirectoryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiCreateFileOrDirectory */ readonly sessionId: string; /** * Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiCreateFileOrDirectory */ readonly fileOrDirectoryPath: string; /** * Specifies the file or directory `name` and `path` elements. The `name` element is required and the `path` element is optional. * @type {FileProperties} * @memberof FileSystemApiCreateFileOrDirectory */ readonly fileProperties: FileProperties; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiCreateFileOrDirectory */ readonly expandPath?: boolean; } /** * Request parameters for deleteFileOrDirectoryFromSystem operation in FileSystemApi. * @export * @interface FileSystemApiDeleteFileOrDirectoryFromSystemRequest */ export interface FileSystemApiDeleteFileOrDirectoryFromSystemRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiDeleteFileOrDirectoryFromSystem */ readonly sessionId: string; /** * Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiDeleteFileOrDirectoryFromSystem */ readonly fileOrDirectoryPath: string; /** * Specifies the current ETag of the file or directory resource that you are deleting. * @type {string} * @memberof FileSystemApiDeleteFileOrDirectoryFromSystem */ readonly ifMatch: string; } /** * Request parameters for getDirectoryMembers operation in FileSystemApi. * @export * @interface FileSystemApiGetDirectoryMembersRequest */ export interface FileSystemApiGetDirectoryMembersRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiGetDirectoryMembers */ readonly sessionId: string; /** * Specifies the directory path. In the directory path, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiGetDirectoryMembers */ readonly directoryPath: string; /** * Specifies whether to return hidden members in the directory. * @type {boolean} * @memberof FileSystemApiGetDirectoryMembers */ readonly showAll?: boolean; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiGetDirectoryMembers */ readonly expandPath?: boolean; /** * Specifies the offset of the first directory member to return. The default value is 0. * @type {number} * @memberof FileSystemApiGetDirectoryMembers */ readonly start?: number; /** * Specifies the maximum number of members to return. The default value is 10. * @type {number} * @memberof FileSystemApiGetDirectoryMembers */ readonly limit?: number; } /** * Request parameters for getFileContentFromSystem operation in FileSystemApi. * @export * @interface FileSystemApiGetFileContentFromSystemRequest */ export interface FileSystemApiGetFileContentFromSystemRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiGetFileContentFromSystem */ readonly sessionId: string; /** * Specifies the file path. In the file path, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiGetFileContentFromSystem */ readonly filePath: string; } /** * Request parameters for getFileorDirectoryProperties operation in FileSystemApi. * @export * @interface FileSystemApiGetFileorDirectoryPropertiesRequest */ export interface FileSystemApiGetFileorDirectoryPropertiesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiGetFileorDirectoryProperties */ readonly sessionId: string; /** * Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiGetFileorDirectoryProperties */ readonly fileOrDirectoryPath: string; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiGetFileorDirectoryProperties */ readonly expandPath?: boolean; } /** * Request parameters for headersForFileorDirectoryProperties operation in FileSystemApi. * @export * @interface FileSystemApiHeadersForFileorDirectoryPropertiesRequest */ export interface FileSystemApiHeadersForFileorDirectoryPropertiesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiHeadersForFileorDirectoryProperties */ readonly sessionId: string; /** * Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiHeadersForFileorDirectoryProperties */ readonly fileOrDirectoryPath: string; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiHeadersForFileorDirectoryProperties */ readonly expandPath?: boolean; } /** * Request parameters for updateFileContentOnSystem operation in FileSystemApi. * @export * @interface FileSystemApiUpdateFileContentOnSystemRequest */ export interface FileSystemApiUpdateFileContentOnSystemRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiUpdateFileContentOnSystem */ readonly sessionId: string; /** * Specifies the file path. In the file path, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiUpdateFileContentOnSystem */ readonly filePath: string; /** * Specifies the content to upload to the file. * @type {File} * @memberof FileSystemApiUpdateFileContentOnSystem */ readonly body: File; /** * Specifies the current ETag of the file resource that you are deleting. * @type {string} * @memberof FileSystemApiUpdateFileContentOnSystem */ readonly ifMatch?: string; } /** * Request parameters for updateFileOrDirectoryOnSystem operation in FileSystemApi. * @export * @interface FileSystemApiUpdateFileOrDirectoryOnSystemRequest */ export interface FileSystemApiUpdateFileOrDirectoryOnSystemRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly sessionId: string; /** * Specifies the file or directory path. In the path value, replace each forward slash with ~fs~. * @type {string} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly fileOrDirectoryPath: string; /** * Specifies the current ETag of the file or directory resource that you are renaming. * @type {string} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly ifMatch: string; /** * Specifies the file or directory `name` and `path` elements. The `name` element is required and the `path` element is optional. If specified, the \'path\' value can contain an absolute path or a path that is relative to the current working directory. Do not replace forward slash characters with ~fs~ for the `path` element. * @type {FileProperties} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly fileProperties: FileProperties; /** * Specifies whether to force an overwrite of an existing file or directory if one of the same name exists at the destination path. If you specify true, the request replaces the existing file or directory. * @type {boolean} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly overwrite?: boolean; /** * Specifies whether to return fully qualified paths in response links. * @type {boolean} * @memberof FileSystemApiUpdateFileOrDirectoryOnSystem */ readonly expandPath?: boolean; } /** * FilesApi - axios parameter creator * @export */ export const FilesApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Creates or assigns a fileref for a session. * @summary Assign a fileref * @param {string} sessionId Specifies the ID of the session. * @param {FilerefRequest} filerefRequest Specifies a fileref creation request. * @param {string} [parent] To create a fileref to a member of a directory fileref, specify the directory fileref as the parent. * @param {*} [options] Override http request option. * @throws {RequiredError} */ assignFileref: async ( sessionId: string, filerefRequest: FilerefRequest, parent?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("assignFileref", "sessionId", sessionId); // verify required parameter 'filerefRequest' is not null or undefined assertParamExists("assignFileref", "filerefRequest", filerefRequest); const localVarPath = `/sessions/{sessionId}/filerefs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parent !== undefined) { localVarQueryParameter["parent"] = parent; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.fileref.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( filerefRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes the file that is referenced by the fileref. * @summary Delete a file * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFile: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteFile", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("deleteFile", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deassigns the specified fileref in a session. * @summary Deassign a fileref * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFileref: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteFileref", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("deleteFileref", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets information about a member of a directory fileref. * @summary Get a directory member * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {string} member Specifies the name of the member to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getDirectoryFileref: async ( sessionId: string, fileref: string, member: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getDirectoryFileref", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("getDirectoryFileref", "fileref", fileref); // verify required parameter 'member' is not null or undefined assertParamExists("getDirectoryFileref", "member", member); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}#directory` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (member !== undefined) { localVarQueryParameter["member"] = member; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a directory listing when a fileref refers to a directory. A collection of directory members is returned. * @summary Get directory contents * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {number} [start] Specifies the offset of the first directory member to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of members to return. The default value is \"10\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ getDirectoryFilerefContents: async ( sessionId: string, fileref: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getDirectoryFilerefContents", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("getDirectoryFilerefContents", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}/content#directory` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets contents of a file that you refer to by a fileref. If the server can determine the type of file that is returned, the Content-type header returns the appropriate media type information. Otherwise, application/octet-stream data is returned for the Content-type header. * @summary Download a file * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFile: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFile", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("getFile", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Get file information from a fileref in a session. * @summary Get fileref information * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileref: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFileref", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("getFileref", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets fileref summary information for a fileref in a session. * @summary Get fileref summary information * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFilerefSummary: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFilerefSummary", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("getFilerefSummary", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}#summary` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of all the filerefs that are defined for a session. * @summary List filerefs in a session * @param {'application/vnd.sas.compute.fileref+json'} acceptItem Specifies the desired fileref representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.fileref+json <li>application/vnd.sas.compute.fileref.summary+json <li>blank </ul> If the application/vnd.sas.compute.fileref.summary+json type is specified or no Accept-Item header is specified, the filerefs are returned as summary representation fileref objects. * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies filter criteria for returned filerefs. * @param {number} [start] Specifies the offset of the first fileref to return. * @param {number} [limit] Specifies the maximum number of filerefs to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFilerefs: async ( acceptItem: "application/vnd.sas.compute.fileref+json", sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'acceptItem' is not null or undefined assertParamExists("getFilerefs", "acceptItem", acceptItem); // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFilerefs", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/filerefs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified fileref exists in a session. * @summary Check for a fileref * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFileref: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForFileref", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("headersForFileref", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the file service is available for a session. * @summary Check endpoint availability * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies the filter criteria for returned filerefs. * @param {number} [start] Specifies the offset of the first fileref to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of filerefs to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFilerefs: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForFilerefs", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/filerefs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a file is available for download. * @summary Check file availability * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForGetFile: async ( sessionId: string, fileref: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForGetFile", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("headersForGetFile", "fileref", fileref); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Uploads a physical file that is associated with a fileref. * @summary Upload a file * @param {string} sessionId Specifies the ID of the session. * @param {string} fileref Specifies the fileref name. The name must be eight or fewer characters. * @param {string} ifMatch Specifies the ETag of the fileref that you are updating. * @param {File} body Specifies the data to upload to the fileref. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFileContent: async ( sessionId: string, fileref: string, ifMatch: string, body: File, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateFileContent", "sessionId", sessionId); // verify required parameter 'fileref' is not null or undefined assertParamExists("updateFileContent", "fileref", fileref); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateFileContent", "ifMatch", ifMatch); // verify required parameter 'body' is not null or undefined assertParamExists("updateFileContent", "body", body); const localVarPath = `/sessions/{sessionId}/filerefs/{fileref}/content` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"fileref"}}`, encodeURIComponent(String(fileref))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } localVarHeaderParameter["Content-Type"] = "application/octet-stream"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( body, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * FilesApi - functional programming interface * @export */ export const FilesApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = FilesApiAxiosParamCreator(configuration); return { /** * Creates or assigns a fileref for a session. * @summary Assign a fileref * @param {FilesApiAssignFilerefRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async assignFileref( requestParameters: FilesApiAssignFilerefRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.assignFileref( requestParameters.sessionId, requestParameters.filerefRequest, requestParameters.parent, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes the file that is referenced by the fileref. * @summary Delete a file * @param {FilesApiDeleteFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFile( requestParameters: FilesApiDeleteFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFile( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deassigns the specified fileref in a session. * @summary Deassign a fileref * @param {FilesApiDeleteFilerefRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFileref( requestParameters: FilesApiDeleteFilerefRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFileref( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets information about a member of a directory fileref. * @summary Get a directory member * @param {FilesApiGetDirectoryFilerefRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getDirectoryFileref( requestParameters: FilesApiGetDirectoryFilerefRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getDirectoryFileref( requestParameters.sessionId, requestParameters.fileref, requestParameters.member, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a directory listing when a fileref refers to a directory. A collection of directory members is returned. * @summary Get directory contents * @param {FilesApiGetDirectoryFilerefContentsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getDirectoryFilerefContents( requestParameters: FilesApiGetDirectoryFilerefContentsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getDirectoryFilerefContents( requestParameters.sessionId, requestParameters.fileref, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets contents of a file that you refer to by a fileref. If the server can determine the type of file that is returned, the Content-type header returns the appropriate media type information. Otherwise, application/octet-stream data is returned for the Content-type header. * @summary Download a file * @param {FilesApiGetFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFile( requestParameters: FilesApiGetFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFile( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Get file information from a fileref in a session. * @summary Get fileref information * @param {FilesApiGetFilerefRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileref( requestParameters: FilesApiGetFilerefRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileref( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets fileref summary information for a fileref in a session. * @summary Get fileref summary information * @param {FilesApiGetFilerefSummaryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFilerefSummary( requestParameters: FilesApiGetFilerefSummaryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFilerefSummary( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of all the filerefs that are defined for a session. * @summary List filerefs in a session * @param {FilesApiGetFilerefsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFilerefs( requestParameters: FilesApiGetFilerefsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFilerefs( requestParameters.acceptItem, requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified fileref exists in a session. * @summary Check for a fileref * @param {FilesApiHeadersForFilerefRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFileref( requestParameters: FilesApiHeadersForFilerefRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFileref( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the file service is available for a session. * @summary Check endpoint availability * @param {FilesApiHeadersForFilerefsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFilerefs( requestParameters: FilesApiHeadersForFilerefsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFilerefs( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a file is available for download. * @summary Check file availability * @param {FilesApiHeadersForGetFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForGetFile( requestParameters: FilesApiHeadersForGetFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForGetFile( requestParameters.sessionId, requestParameters.fileref, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Uploads a physical file that is associated with a fileref. * @summary Upload a file * @param {FilesApiUpdateFileContentRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFileContent( requestParameters: FilesApiUpdateFileContentRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFileContent( requestParameters.sessionId, requestParameters.fileref, requestParameters.ifMatch, requestParameters.body, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for assignFileref operation in FilesApi. * @export * @interface FilesApiAssignFilerefRequest */ export interface FilesApiAssignFilerefRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiAssignFileref */ readonly sessionId: string; /** * Specifies a fileref creation request. * @type {FilerefRequest} * @memberof FilesApiAssignFileref */ readonly filerefRequest: FilerefRequest; /** * To create a fileref to a member of a directory fileref, specify the directory fileref as the parent. * @type {string} * @memberof FilesApiAssignFileref */ readonly parent?: string; } /** * Request parameters for deleteFile operation in FilesApi. * @export * @interface FilesApiDeleteFileRequest */ export interface FilesApiDeleteFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiDeleteFile */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiDeleteFile */ readonly fileref: string; } /** * Request parameters for deleteFileref operation in FilesApi. * @export * @interface FilesApiDeleteFilerefRequest */ export interface FilesApiDeleteFilerefRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiDeleteFileref */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiDeleteFileref */ readonly fileref: string; } /** * Request parameters for getDirectoryFileref operation in FilesApi. * @export * @interface FilesApiGetDirectoryFilerefRequest */ export interface FilesApiGetDirectoryFilerefRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetDirectoryFileref */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiGetDirectoryFileref */ readonly fileref: string; /** * Specifies the name of the member to return. * @type {string} * @memberof FilesApiGetDirectoryFileref */ readonly member: string; } /** * Request parameters for getDirectoryFilerefContents operation in FilesApi. * @export * @interface FilesApiGetDirectoryFilerefContentsRequest */ export interface FilesApiGetDirectoryFilerefContentsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetDirectoryFilerefContents */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiGetDirectoryFilerefContents */ readonly fileref: string; /** * Specifies the offset of the first directory member to return. The default value is \"0\". * @type {number} * @memberof FilesApiGetDirectoryFilerefContents */ readonly start?: number; /** * Specifies the maximum number of members to return. The default value is \"10\". * @type {number} * @memberof FilesApiGetDirectoryFilerefContents */ readonly limit?: number; } /** * Request parameters for getFile operation in FilesApi. * @export * @interface FilesApiGetFileRequest */ export interface FilesApiGetFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetFile */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiGetFile */ readonly fileref: string; } /** * Request parameters for getFileref operation in FilesApi. * @export * @interface FilesApiGetFilerefRequest */ export interface FilesApiGetFilerefRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetFileref */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiGetFileref */ readonly fileref: string; } /** * Request parameters for getFilerefSummary operation in FilesApi. * @export * @interface FilesApiGetFilerefSummaryRequest */ export interface FilesApiGetFilerefSummaryRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetFilerefSummary */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiGetFilerefSummary */ readonly fileref: string; } /** * Request parameters for getFilerefs operation in FilesApi. * @export * @interface FilesApiGetFilerefsRequest */ export interface FilesApiGetFilerefsRequest { /** * Specifies the desired fileref representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.fileref+json <li>application/vnd.sas.compute.fileref.summary+json <li>blank </ul> If the application/vnd.sas.compute.fileref.summary+json type is specified or no Accept-Item header is specified, the filerefs are returned as summary representation fileref objects. * @type {'application/vnd.sas.compute.fileref+json'} * @memberof FilesApiGetFilerefs */ readonly acceptItem: "application/vnd.sas.compute.fileref+json"; /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiGetFilerefs */ readonly sessionId: string; /** * Specifies filter criteria for returned filerefs. * @type {string} * @memberof FilesApiGetFilerefs */ readonly filter?: string; /** * Specifies the offset of the first fileref to return. * @type {number} * @memberof FilesApiGetFilerefs */ readonly start?: number; /** * Specifies the maximum number of filerefs to return. * @type {number} * @memberof FilesApiGetFilerefs */ readonly limit?: number; } /** * Request parameters for headersForFileref operation in FilesApi. * @export * @interface FilesApiHeadersForFilerefRequest */ export interface FilesApiHeadersForFilerefRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiHeadersForFileref */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiHeadersForFileref */ readonly fileref: string; } /** * Request parameters for headersForFilerefs operation in FilesApi. * @export * @interface FilesApiHeadersForFilerefsRequest */ export interface FilesApiHeadersForFilerefsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiHeadersForFilerefs */ readonly sessionId: string; /** * Specifies the filter criteria for returned filerefs. * @type {string} * @memberof FilesApiHeadersForFilerefs */ readonly filter?: string; /** * Specifies the offset of the first fileref to return. The default value is \"0\". * @type {number} * @memberof FilesApiHeadersForFilerefs */ readonly start?: number; /** * Specifies the maximum number of filerefs to return. * @type {number} * @memberof FilesApiHeadersForFilerefs */ readonly limit?: number; } /** * Request parameters for headersForGetFile operation in FilesApi. * @export * @interface FilesApiHeadersForGetFileRequest */ export interface FilesApiHeadersForGetFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiHeadersForGetFile */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiHeadersForGetFile */ readonly fileref: string; } /** * Request parameters for updateFileContent operation in FilesApi. * @export * @interface FilesApiUpdateFileContentRequest */ export interface FilesApiUpdateFileContentRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FilesApiUpdateFileContent */ readonly sessionId: string; /** * Specifies the fileref name. The name must be eight or fewer characters. * @type {string} * @memberof FilesApiUpdateFileContent */ readonly fileref: string; /** * Specifies the ETag of the fileref that you are updating. * @type {string} * @memberof FilesApiUpdateFileContent */ readonly ifMatch: string; /** * Specifies the data to upload to the fileref. * @type {File} * @memberof FilesApiUpdateFileContent */ readonly body: File; } /** * FormatsApi - axios parameter creator * @export */ export const FormatsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Gets format information from a session. * @summary Get format information * @param {string} sessionId Specifies the ID of the session. * @param {string} formatName Specifies the format name. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFormat: async ( sessionId: string, formatName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFormat", "sessionId", sessionId); // verify required parameter 'formatName' is not null or undefined assertParamExists("getFormat", "formatName", formatName); const localVarPath = `/sessions/{sessionId}/formats/{formatName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"formatName"}}`, encodeURIComponent(String(formatName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of all the formats that are defined for a session. * @summary List formats in a session * @param {string} sessionId Specifies the ID of the session. * @param {'application/vnd.sas.format.summary+json' | 'application/vnd.sas.format+json'} [acceptItem] Specifies the desired format representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.format+json <li>application/vnd.sas.format.summary+json <li>blank </ul> If the application/vnd.sas.format.summary+json type is specified or no Accept-Item header is specified, then the formats are returned as summary representation format objects. * @param {string} [filter] Specifies filter criteria for returned formats. * @param {number} [start] Specifies the offset of the first format to return. * @param {number} [limit] Specifies the maximum number of formats to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFormats: async ( sessionId: string, acceptItem?: | "application/vnd.sas.format.summary+json" | "application/vnd.sas.format+json", filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getFormats", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/formats`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified format exists in a session. * @summary Check for a format * @param {string} sessionId Specifies the ID of the session. * @param {string} formatName Specifies the format name. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFormat: async ( sessionId: string, formatName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForFormat", "sessionId", sessionId); // verify required parameter 'formatName' is not null or undefined assertParamExists("headersForFormat", "formatName", formatName); const localVarPath = `/sessions/{sessionId}/formats/{formatName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"formatName"}}`, encodeURIComponent(String(formatName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the formats endpoint is available for a session. * @summary Check endpoint availability * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies the filter criteria for returned formats. * @param {number} [start] Specifies the offset of the first format to return. The default value is 0. * @param {number} [limit] Specifies the maximum number of formats to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFormats: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForFormats", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/formats`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * FormatsApi - functional programming interface * @export */ export const FormatsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = FormatsApiAxiosParamCreator(configuration); return { /** * Gets format information from a session. * @summary Get format information * @param {FormatsApiGetFormatRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFormat( requestParameters: FormatsApiGetFormatRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFormat( requestParameters.sessionId, requestParameters.formatName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of all the formats that are defined for a session. * @summary List formats in a session * @param {FormatsApiGetFormatsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFormats( requestParameters: FormatsApiGetFormatsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFormats( requestParameters.sessionId, requestParameters.acceptItem, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified format exists in a session. * @summary Check for a format * @param {FormatsApiHeadersForFormatRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFormat( requestParameters: FormatsApiHeadersForFormatRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFormat( requestParameters.sessionId, requestParameters.formatName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the formats endpoint is available for a session. * @summary Check endpoint availability * @param {FormatsApiHeadersForFormatsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFormats( requestParameters: FormatsApiHeadersForFormatsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFormats( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getFormat operation in FormatsApi. * @export * @interface FormatsApiGetFormatRequest */ export interface FormatsApiGetFormatRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FormatsApiGetFormat */ readonly sessionId: string; /** * Specifies the format name. * @type {string} * @memberof FormatsApiGetFormat */ readonly formatName: string; } /** * Request parameters for getFormats operation in FormatsApi. * @export * @interface FormatsApiGetFormatsRequest */ export interface FormatsApiGetFormatsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FormatsApiGetFormats */ readonly sessionId: string; /** * Specifies the desired format representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.format+json <li>application/vnd.sas.format.summary+json <li>blank </ul> If the application/vnd.sas.format.summary+json type is specified or no Accept-Item header is specified, then the formats are returned as summary representation format objects. * @type {'application/vnd.sas.format.summary+json' | 'application/vnd.sas.format+json'} * @memberof FormatsApiGetFormats */ readonly acceptItem?: | "application/vnd.sas.format.summary+json" | "application/vnd.sas.format+json"; /** * Specifies filter criteria for returned formats. * @type {string} * @memberof FormatsApiGetFormats */ readonly filter?: string; /** * Specifies the offset of the first format to return. * @type {number} * @memberof FormatsApiGetFormats */ readonly start?: number; /** * Specifies the maximum number of formats to return. * @type {number} * @memberof FormatsApiGetFormats */ readonly limit?: number; } /** * Request parameters for headersForFormat operation in FormatsApi. * @export * @interface FormatsApiHeadersForFormatRequest */ export interface FormatsApiHeadersForFormatRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FormatsApiHeadersForFormat */ readonly sessionId: string; /** * Specifies the format name. * @type {string} * @memberof FormatsApiHeadersForFormat */ readonly formatName: string; } /** * Request parameters for headersForFormats operation in FormatsApi. * @export * @interface FormatsApiHeadersForFormatsRequest */ export interface FormatsApiHeadersForFormatsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof FormatsApiHeadersForFormats */ readonly sessionId: string; /** * Specifies the filter criteria for returned formats. * @type {string} * @memberof FormatsApiHeadersForFormats */ readonly filter?: string; /** * Specifies the offset of the first format to return. The default value is 0. * @type {number} * @memberof FormatsApiHeadersForFormats */ readonly start?: number; /** * Specifies the maximum number of formats to return. * @type {number} * @memberof FormatsApiHeadersForFormats */ readonly limit?: number; } /** * InformatsApi - axios parameter creator * @export */ export const InformatsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Gets informat information from a session. * @summary Get informat information * @param {string} sessionId Specifies the ID of the session. * @param {string} informatName Specifies the informat name. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getInformat: async ( sessionId: string, informatName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getInformat", "sessionId", sessionId); // verify required parameter 'informatName' is not null or undefined assertParamExists("getInformat", "informatName", informatName); const localVarPath = `/sessions/{sessionId}/informats/{informatName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"informatName"}}`, encodeURIComponent(String(informatName)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of all the informats that are defined for a session. * @summary List informats in a session * @param {string} sessionId Specifies the ID of the session. * @param {'application/vnd.sas.format.summary+json' | 'application/vnd.sas.format+json'} [acceptItem] Specifies the desired format representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.format+json <li>application/vnd.sas.format.summary+json <li>blank </ul> If the application/vnd.sas.format.summary+json type is specified or no Accept-Item header is specified, then the formats are returned as summary representation format objects. * @param {string} [filter] Specifies filter criteria for returned informats. * @param {number} [start] Specifies the offset of the first informat to return. * @param {number} [limit] Specifies the maximum number of informats to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getInformats: async ( sessionId: string, acceptItem?: | "application/vnd.sas.format.summary+json" | "application/vnd.sas.format+json", filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getInformats", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/informats`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified informat exists in a session. * @summary Check for an informat * @param {string} sessionId Specifies the ID of the session. * @param {string} informatName Specifies the informat name. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForInformat: async ( sessionId: string, informatName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForInformat", "sessionId", sessionId); // verify required parameter 'informatName' is not null or undefined assertParamExists("headersForInformat", "informatName", informatName); const localVarPath = `/sessions/{sessionId}/informats/{informatName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"informatName"}}`, encodeURIComponent(String(informatName)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the informats endpoint is available for a session. * @summary Check endpoint availability * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies the filter criteria for returned informats. * @param {number} [start] Specifies the offset of the first informat to return. The default value is 0. * @param {number} [limit] Specifies the maximum number of informats to return. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForInformats: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForInformats", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/informats`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * InformatsApi - functional programming interface * @export */ export const InformatsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = InformatsApiAxiosParamCreator(configuration); return { /** * Gets informat information from a session. * @summary Get informat information * @param {InformatsApiGetInformatRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getInformat( requestParameters: InformatsApiGetInformatRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getInformat( requestParameters.sessionId, requestParameters.informatName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of all the informats that are defined for a session. * @summary List informats in a session * @param {InformatsApiGetInformatsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getInformats( requestParameters: InformatsApiGetInformatsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getInformats( requestParameters.sessionId, requestParameters.acceptItem, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified informat exists in a session. * @summary Check for an informat * @param {InformatsApiHeadersForInformatRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForInformat( requestParameters: InformatsApiHeadersForInformatRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForInformat( requestParameters.sessionId, requestParameters.informatName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the informats endpoint is available for a session. * @summary Check endpoint availability * @param {InformatsApiHeadersForInformatsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForInformats( requestParameters: InformatsApiHeadersForInformatsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForInformats( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getInformat operation in InformatsApi. * @export * @interface InformatsApiGetInformatRequest */ export interface InformatsApiGetInformatRequest { /** * Specifies the ID of the session. * @type {string} * @memberof InformatsApiGetInformat */ readonly sessionId: string; /** * Specifies the informat name. * @type {string} * @memberof InformatsApiGetInformat */ readonly informatName: string; } /** * Request parameters for getInformats operation in InformatsApi. * @export * @interface InformatsApiGetInformatsRequest */ export interface InformatsApiGetInformatsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof InformatsApiGetInformats */ readonly sessionId: string; /** * Specifies the desired format representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.format+json <li>application/vnd.sas.format.summary+json <li>blank </ul> If the application/vnd.sas.format.summary+json type is specified or no Accept-Item header is specified, then the formats are returned as summary representation format objects. * @type {'application/vnd.sas.format.summary+json' | 'application/vnd.sas.format+json'} * @memberof InformatsApiGetInformats */ readonly acceptItem?: | "application/vnd.sas.format.summary+json" | "application/vnd.sas.format+json"; /** * Specifies filter criteria for returned informats. * @type {string} * @memberof InformatsApiGetInformats */ readonly filter?: string; /** * Specifies the offset of the first informat to return. * @type {number} * @memberof InformatsApiGetInformats */ readonly start?: number; /** * Specifies the maximum number of informats to return. * @type {number} * @memberof InformatsApiGetInformats */ readonly limit?: number; } /** * Request parameters for headersForInformat operation in InformatsApi. * @export * @interface InformatsApiHeadersForInformatRequest */ export interface InformatsApiHeadersForInformatRequest { /** * Specifies the ID of the session. * @type {string} * @memberof InformatsApiHeadersForInformat */ readonly sessionId: string; /** * Specifies the informat name. * @type {string} * @memberof InformatsApiHeadersForInformat */ readonly informatName: string; } /** * Request parameters for headersForInformats operation in InformatsApi. * @export * @interface InformatsApiHeadersForInformatsRequest */ export interface InformatsApiHeadersForInformatsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof InformatsApiHeadersForInformats */ readonly sessionId: string; /** * Specifies the filter criteria for returned informats. * @type {string} * @memberof InformatsApiHeadersForInformats */ readonly filter?: string; /** * Specifies the offset of the first informat to return. The default value is 0. * @type {number} * @memberof InformatsApiHeadersForInformats */ readonly start?: number; /** * Specifies the maximum number of informats to return. * @type {number} * @memberof InformatsApiHeadersForInformats */ readonly limit?: number; } /** * JobsApi - axios parameter creator * @export */ export const JobsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Executes SAS code in the specified session. Code is always submitted asynchronously. URLs are returned that contain endpoints. The Location header contains the URI of the job resource. You might submit the code directly in a request or as a reference to a File service resource. * @summary Execute SAS code in a session * @param {string} sessionId Specifies the ID of the session. * @param {JobRequest} jobRequest Specifies the job submission request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createJob: async ( sessionId: string, jobRequest: JobRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("createJob", "sessionId", sessionId); // verify required parameter 'jobRequest' is not null or undefined assertParamExists("createJob", "jobRequest", jobRequest); const localVarPath = `/sessions/{sessionId}/jobs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.job.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( jobRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes a job and all job access points into a session from this job. The log, listing, and results that were created by the job are also deleted. Actual job resources are still available via the session, until the session is destroyed. * @summary Delete a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteJob: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteJob", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("deleteJob", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns information about a specified job. This information includes the job\'s current state and links to other endpoints that are associated with the job, such as results, log, or output. * @summary Get information about a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job to return information for. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJob: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJob", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJob", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the current state of the specified job. * @summary Get current state of a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job to return information for. * @param {number} [wait] Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @param {string} [ifNoneMatch] Specifies the ETag that is associated with a value of the job state. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobState: async ( sessionId: string, jobId: string, wait?: number, ifNoneMatch?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobState", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobState", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/state` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (wait !== undefined) { localVarQueryParameter["wait"] = wait; } if (ifNoneMatch != null) { localVarHeaderParameter["If-None-Match"] = String(ifNoneMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a collection of all the current jobs for a session. Standard paging, filtering, and sorting options are provided. * @summary Get the current jobs for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} [jobId] Returns jobs that match the specified jobId. * @param {number} [start] Specifies the offset of the first job to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of jobs to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned jobs. * @param {string} [sortBy] Sorts returned jobs. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobs: async ( sessionId: string, jobId?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobs", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/jobs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (jobId !== undefined) { localVarQueryParameter["jobId"] = jobId; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified job exists. * @summary Verify that a job exists * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job to query. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJob: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJob", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJob", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the state can be determined for a job. * @summary Check endpoint availability * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job to return information for. * @param {number} [wait] Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @param {string} [ifNoneMatch] Specifies the ETag that is associated with a value of the job state. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobState: async ( sessionId: string, jobId: string, wait?: number, ifNoneMatch?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobState", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobState", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/state` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (wait !== undefined) { localVarQueryParameter["wait"] = wait; } if (ifNoneMatch != null) { localVarHeaderParameter["If-None-Match"] = String(ifNoneMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the jobs endpoint is available for a session. * @summary Check endpoint availability * @param {string} sessionId Specifies the ID of the session. * @param {string} [jobId] Returns only jobs that match this jobId. * @param {number} [start] Specifies the offset of the first job to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of jobs to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned jobs. * @param {string} [sortBy] Sorts returned jobs. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobs: async ( sessionId: string, jobId?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobs", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/jobs`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (jobId !== undefined) { localVarQueryParameter["jobId"] = jobId; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Sets the current state of the specified job. For example, you can use this method to set the state to canceled. * @summary Set current state of a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job whose state you want to update. * @param {'canceled' | 'deleted'} value Specifies the new job state, such as canceled. * @param {string} ifMatch Specifies the current ETag of the job being updated. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateJobState: async ( sessionId: string, jobId: string, value: "canceled" | "deleted", ifMatch: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateJobState", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("updateJobState", "jobId", jobId); // verify required parameter 'value' is not null or undefined assertParamExists("updateJobState", "value", value); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateJobState", "ifMatch", ifMatch); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/state` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (value !== undefined) { localVarQueryParameter["value"] = value; } if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * JobsApi - functional programming interface * @export */ export const JobsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = JobsApiAxiosParamCreator(configuration); return { /** * Executes SAS code in the specified session. Code is always submitted asynchronously. URLs are returned that contain endpoints. The Location header contains the URI of the job resource. You might submit the code directly in a request or as a reference to a File service resource. * @summary Execute SAS code in a session * @param {JobsApiCreateJobRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createJob( requestParameters: JobsApiCreateJobRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createJob( requestParameters.sessionId, requestParameters.jobRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes a job and all job access points into a session from this job. The log, listing, and results that were created by the job are also deleted. Actual job resources are still available via the session, until the session is destroyed. * @summary Delete a job * @param {JobsApiDeleteJobRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteJob( requestParameters: JobsApiDeleteJobRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteJob( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns information about a specified job. This information includes the job\'s current state and links to other endpoints that are associated with the job, such as results, log, or output. * @summary Get information about a job * @param {JobsApiGetJobRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJob( requestParameters: JobsApiGetJobRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJob( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the current state of the specified job. * @summary Get current state of a job * @param {JobsApiGetJobStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobState( requestParameters: JobsApiGetJobStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobState( requestParameters.sessionId, requestParameters.jobId, requestParameters.wait, requestParameters.ifNoneMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a collection of all the current jobs for a session. Standard paging, filtering, and sorting options are provided. * @summary Get the current jobs for a session * @param {JobsApiGetJobsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobs( requestParameters: JobsApiGetJobsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobs( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified job exists. * @summary Verify that a job exists * @param {JobsApiHeadersForJobRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJob( requestParameters: JobsApiHeadersForJobRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJob( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the state can be determined for a job. * @summary Check endpoint availability * @param {JobsApiHeadersForJobStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobState( requestParameters: JobsApiHeadersForJobStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobState( requestParameters.sessionId, requestParameters.jobId, requestParameters.wait, requestParameters.ifNoneMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the jobs endpoint is available for a session. * @summary Check endpoint availability * @param {JobsApiHeadersForJobsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobs( requestParameters: JobsApiHeadersForJobsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobs( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Sets the current state of the specified job. For example, you can use this method to set the state to canceled. * @summary Set current state of a job * @param {JobsApiUpdateJobStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateJobState( requestParameters: JobsApiUpdateJobStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateJobState( requestParameters.sessionId, requestParameters.jobId, requestParameters.value, requestParameters.ifMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createJob operation in JobsApi. * @export * @interface JobsApiCreateJobRequest */ export interface JobsApiCreateJobRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiCreateJob */ readonly sessionId: string; /** * Specifies the job submission request. * @type {JobRequest} * @memberof JobsApiCreateJob */ readonly jobRequest: JobRequest; } /** * Request parameters for deleteJob operation in JobsApi. * @export * @interface JobsApiDeleteJobRequest */ export interface JobsApiDeleteJobRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiDeleteJob */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof JobsApiDeleteJob */ readonly jobId: string; } /** * Request parameters for getJob operation in JobsApi. * @export * @interface JobsApiGetJobRequest */ export interface JobsApiGetJobRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiGetJob */ readonly sessionId: string; /** * Specifies the ID of the job to return information for. * @type {string} * @memberof JobsApiGetJob */ readonly jobId: string; } /** * Request parameters for getJobState operation in JobsApi. * @export * @interface JobsApiGetJobStateRequest */ export interface JobsApiGetJobStateRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiGetJobState */ readonly sessionId: string; /** * Specifies the ID of the job to return information for. * @type {string} * @memberof JobsApiGetJobState */ readonly jobId: string; /** * Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @type {number} * @memberof JobsApiGetJobState */ readonly wait?: number; /** * Specifies the ETag that is associated with a value of the job state. * @type {string} * @memberof JobsApiGetJobState */ readonly ifNoneMatch?: string; } /** * Request parameters for getJobs operation in JobsApi. * @export * @interface JobsApiGetJobsRequest */ export interface JobsApiGetJobsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiGetJobs */ readonly sessionId: string; /** * Returns jobs that match the specified jobId. * @type {string} * @memberof JobsApiGetJobs */ readonly jobId?: string; /** * Specifies the offset of the first job to return. The default value is \"0\". * @type {number} * @memberof JobsApiGetJobs */ readonly start?: number; /** * Specifies the maximum number of jobs to return. The default value is \"10\". * @type {number} * @memberof JobsApiGetJobs */ readonly limit?: number; /** * Specifies the filter criteria for returned jobs. * @type {string} * @memberof JobsApiGetJobs */ readonly filter?: string; /** * Sorts returned jobs. * @type {string} * @memberof JobsApiGetJobs */ readonly sortBy?: string; } /** * Request parameters for headersForJob operation in JobsApi. * @export * @interface JobsApiHeadersForJobRequest */ export interface JobsApiHeadersForJobRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiHeadersForJob */ readonly sessionId: string; /** * Specifies the ID of the job to query. * @type {string} * @memberof JobsApiHeadersForJob */ readonly jobId: string; } /** * Request parameters for headersForJobState operation in JobsApi. * @export * @interface JobsApiHeadersForJobStateRequest */ export interface JobsApiHeadersForJobStateRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiHeadersForJobState */ readonly sessionId: string; /** * Specifies the ID of the job to return information for. * @type {string} * @memberof JobsApiHeadersForJobState */ readonly jobId: string; /** * Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @type {number} * @memberof JobsApiHeadersForJobState */ readonly wait?: number; /** * Specifies the ETag that is associated with a value of the job state. * @type {string} * @memberof JobsApiHeadersForJobState */ readonly ifNoneMatch?: string; } /** * Request parameters for headersForJobs operation in JobsApi. * @export * @interface JobsApiHeadersForJobsRequest */ export interface JobsApiHeadersForJobsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiHeadersForJobs */ readonly sessionId: string; /** * Returns only jobs that match this jobId. * @type {string} * @memberof JobsApiHeadersForJobs */ readonly jobId?: string; /** * Specifies the offset of the first job to return. The default value is \"0\". * @type {number} * @memberof JobsApiHeadersForJobs */ readonly start?: number; /** * Specifies the maximum number of jobs to return. The default value is \"10\". * @type {number} * @memberof JobsApiHeadersForJobs */ readonly limit?: number; /** * Specifies the filter criteria for returned jobs. * @type {string} * @memberof JobsApiHeadersForJobs */ readonly filter?: string; /** * Sorts returned jobs. * @type {string} * @memberof JobsApiHeadersForJobs */ readonly sortBy?: string; } /** * Request parameters for updateJobState operation in JobsApi. * @export * @interface JobsApiUpdateJobStateRequest */ export interface JobsApiUpdateJobStateRequest { /** * Specifies the ID of the session. * @type {string} * @memberof JobsApiUpdateJobState */ readonly sessionId: string; /** * Specifies the ID of the job whose state you want to update. * @type {string} * @memberof JobsApiUpdateJobState */ readonly jobId: string; /** * Specifies the new job state, such as canceled. * @type {'canceled' | 'deleted'} * @memberof JobsApiUpdateJobState */ readonly value: "canceled" | "deleted"; /** * Specifies the current ETag of the job being updated. * @type {string} * @memberof JobsApiUpdateJobState */ readonly ifMatch: string; } /** * ListingsApi - axios parameter creator * @export */ export const ListingsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Retrieves the listing output associated with a job. A job listing is a subset of the session listing. Therefore, the first line of a job listing begins at a location (offset) within the session listing. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve listing information for a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=normal or ?type=normal|hilighted. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobListing: async ( sessionId: string, jobId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobListing", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobListing", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/listing` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the listing output associated with a job as text. * @summary Retrieve listing information for a job as text. * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobListingAsText: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobListingAsText", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobListingAsText", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/listing#asText` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the listing output associated with a session. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve listing information for a session * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=normal or ?type=normal|hilighted. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionListing: async ( sessionId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionListing", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/listing`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the listing output associated with a session as text. * @summary Retrieve listing information for a session as text. * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionListingAsText: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionListingAsText", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/listing#asText`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a job listing exists. * @summary Check for a job listing * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobListing: async ( sessionId: string, jobId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobListing", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobListing", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/listing` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a job listing exists as text. * @summary Check for job listing as text * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobListingAsText: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobListingAsText", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobListingAsText", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/listing#asText` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a session listing is available. * @summary Check for a session listing * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionListing: async ( sessionId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionListing", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/listing`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a session listing is available as text. * @summary Check for session listing as text. * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionListingAsText: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists( "headersForSessionListingAsText", "sessionId", sessionId, ); const localVarPath = `/sessions/{sessionId}/listing#asText`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Uploads job listing output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload job listing output to the Files service * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {OutputStreamFileRequest} outputStreamFileRequest Specifies the request to stream output to the Files service. * @param {*} [options] Override http request option. * @throws {RequiredError} */ streamJobListingAsFile: async ( sessionId: string, jobId: string, outputStreamFileRequest: OutputStreamFileRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("streamJobListingAsFile", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("streamJobListingAsFile", "jobId", jobId); // verify required parameter 'outputStreamFileRequest' is not null or undefined assertParamExists( "streamJobListingAsFile", "outputStreamFileRequest", outputStreamFileRequest, ); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/listing` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.output.stream.file.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( outputStreamFileRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Uploads session listing output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload session listing output to the Files service * @param {string} sessionId Specifies the ID of the session. * @param {OutputStreamFileRequest} outputStreamFileRequest Specifies the request to stream output to the Files service. * @param {*} [options] Override http request option. * @throws {RequiredError} */ streamSessionListingAsFile: async ( sessionId: string, outputStreamFileRequest: OutputStreamFileRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("streamSessionListingAsFile", "sessionId", sessionId); // verify required parameter 'outputStreamFileRequest' is not null or undefined assertParamExists( "streamSessionListingAsFile", "outputStreamFileRequest", outputStreamFileRequest, ); const localVarPath = `/sessions/{sessionId}/listing`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.output.stream.file.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( outputStreamFileRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * ListingsApi - functional programming interface * @export */ export const ListingsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = ListingsApiAxiosParamCreator(configuration); return { /** * Retrieves the listing output associated with a job. A job listing is a subset of the session listing. Therefore, the first line of a job listing begins at a location (offset) within the session listing. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve listing information for a job * @param {ListingsApiGetJobListingRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobListing( requestParameters: ListingsApiGetJobListingRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobListing( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the listing output associated with a job as text. * @summary Retrieve listing information for a job as text. * @param {ListingsApiGetJobListingAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobListingAsText( requestParameters: ListingsApiGetJobListingAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobListingAsText( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the listing output associated with a session. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve listing information for a session * @param {ListingsApiGetSessionListingRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionListing( requestParameters: ListingsApiGetSessionListingRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionListing( requestParameters.sessionId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the listing output associated with a session as text. * @summary Retrieve listing information for a session as text. * @param {ListingsApiGetSessionListingAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionListingAsText( requestParameters: ListingsApiGetSessionListingAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionListingAsText( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a job listing exists. * @summary Check for a job listing * @param {ListingsApiHeadersForJobListingRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobListing( requestParameters: ListingsApiHeadersForJobListingRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobListing( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a job listing exists as text. * @summary Check for job listing as text * @param {ListingsApiHeadersForJobListingAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobListingAsText( requestParameters: ListingsApiHeadersForJobListingAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobListingAsText( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a session listing is available. * @summary Check for a session listing * @param {ListingsApiHeadersForSessionListingRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionListing( requestParameters: ListingsApiHeadersForSessionListingRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionListing( requestParameters.sessionId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a session listing is available as text. * @summary Check for session listing as text. * @param {ListingsApiHeadersForSessionListingAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionListingAsText( requestParameters: ListingsApiHeadersForSessionListingAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionListingAsText( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Uploads job listing output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload job listing output to the Files service * @param {ListingsApiStreamJobListingAsFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async streamJobListingAsFile( requestParameters: ListingsApiStreamJobListingAsFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.streamJobListingAsFile( requestParameters.sessionId, requestParameters.jobId, requestParameters.outputStreamFileRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Uploads session listing output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload session listing output to the Files service * @param {ListingsApiStreamSessionListingAsFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async streamSessionListingAsFile( requestParameters: ListingsApiStreamSessionListingAsFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.streamSessionListingAsFile( requestParameters.sessionId, requestParameters.outputStreamFileRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getJobListing operation in ListingsApi. * @export * @interface ListingsApiGetJobListingRequest */ export interface ListingsApiGetJobListingRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiGetJobListing */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof ListingsApiGetJobListing */ readonly jobId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ListingsApiGetJobListing */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof ListingsApiGetJobListing */ readonly limit?: number; /** * Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=normal or ?type=normal|hilighted. * @type {string} * @memberof ListingsApiGetJobListing */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof ListingsApiGetJobListing */ readonly timeout?: number; } /** * Request parameters for getJobListingAsText operation in ListingsApi. * @export * @interface ListingsApiGetJobListingAsTextRequest */ export interface ListingsApiGetJobListingAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiGetJobListingAsText */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof ListingsApiGetJobListingAsText */ readonly jobId: string; } /** * Request parameters for getSessionListing operation in ListingsApi. * @export * @interface ListingsApiGetSessionListingRequest */ export interface ListingsApiGetSessionListingRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiGetSessionListing */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ListingsApiGetSessionListing */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof ListingsApiGetSessionListing */ readonly limit?: number; /** * Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=normal or ?type=normal|hilighted. * @type {string} * @memberof ListingsApiGetSessionListing */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof ListingsApiGetSessionListing */ readonly timeout?: number; } /** * Request parameters for getSessionListingAsText operation in ListingsApi. * @export * @interface ListingsApiGetSessionListingAsTextRequest */ export interface ListingsApiGetSessionListingAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiGetSessionListingAsText */ readonly sessionId: string; } /** * Request parameters for headersForJobListing operation in ListingsApi. * @export * @interface ListingsApiHeadersForJobListingRequest */ export interface ListingsApiHeadersForJobListingRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiHeadersForJobListing */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof ListingsApiHeadersForJobListing */ readonly jobId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ListingsApiHeadersForJobListing */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof ListingsApiHeadersForJobListing */ readonly limit?: number; /** * Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof ListingsApiHeadersForJobListing */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof ListingsApiHeadersForJobListing */ readonly timeout?: number; } /** * Request parameters for headersForJobListingAsText operation in ListingsApi. * @export * @interface ListingsApiHeadersForJobListingAsTextRequest */ export interface ListingsApiHeadersForJobListingAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiHeadersForJobListingAsText */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof ListingsApiHeadersForJobListingAsText */ readonly jobId: string; } /** * Request parameters for headersForSessionListing operation in ListingsApi. * @export * @interface ListingsApiHeadersForSessionListingRequest */ export interface ListingsApiHeadersForSessionListingRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiHeadersForSessionListing */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ListingsApiHeadersForSessionListing */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof ListingsApiHeadersForSessionListing */ readonly limit?: number; /** * Restricts listing information to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof ListingsApiHeadersForSessionListing */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof ListingsApiHeadersForSessionListing */ readonly timeout?: number; } /** * Request parameters for headersForSessionListingAsText operation in ListingsApi. * @export * @interface ListingsApiHeadersForSessionListingAsTextRequest */ export interface ListingsApiHeadersForSessionListingAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiHeadersForSessionListingAsText */ readonly sessionId: string; } /** * Request parameters for streamJobListingAsFile operation in ListingsApi. * @export * @interface ListingsApiStreamJobListingAsFileRequest */ export interface ListingsApiStreamJobListingAsFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiStreamJobListingAsFile */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof ListingsApiStreamJobListingAsFile */ readonly jobId: string; /** * Specifies the request to stream output to the Files service. * @type {OutputStreamFileRequest} * @memberof ListingsApiStreamJobListingAsFile */ readonly outputStreamFileRequest: OutputStreamFileRequest; } /** * Request parameters for streamSessionListingAsFile operation in ListingsApi. * @export * @interface ListingsApiStreamSessionListingAsFileRequest */ export interface ListingsApiStreamSessionListingAsFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ListingsApiStreamSessionListingAsFile */ readonly sessionId: string; /** * Specifies the request to stream output to the Files service. * @type {OutputStreamFileRequest} * @memberof ListingsApiStreamSessionListingAsFile */ readonly outputStreamFileRequest: OutputStreamFileRequest; } /** * LogsApi - axios parameter creator * @export */ export const LogsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Retrieves the log output associated with a job. A job log is a subset of the session log. Therefore, the first line of a job log begins at a location (offset) within the session log. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve a job log * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {number} [start] Specifies the offset of the first item in a collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in a page. * @param {string} [type] Restricts log collection to those entries with a specified type. Specify multiple types in a query by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. If no log lines are available over this time period, an empty collection is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobLog: async ( sessionId: string, jobId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobLog", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobLog", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/log` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the entire log output associated with a job as text. * @summary Retrieve a job log as text. * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobLogAsText: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobLogAsText", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobLogAsText", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/log#asText` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the log output associated with a session. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve a session log * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts the log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionLog: async ( sessionId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionLog", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/log`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the log output associated with a session as text. * @summary Retrieve a session log as text. * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionLogAsText: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionLogAsText", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/log#asText`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether there is currently a log for a job. * @summary Check job log availability * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts a log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. If no log lines are available in this time period, an empty collection is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobLog: async ( sessionId: string, jobId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobLog", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobLog", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/log` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether there is currently a log for a job as text. * @summary Check for job log as text * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobLogAsText: async ( sessionId: string, jobId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobLogAsText", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobLogAsText", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/log#asText` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the session has a log available. * @summary Check for a session log * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items in this page. * @param {string} [type] Restricts log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @param {number} [timeout] Specifies the request time-out in seconds. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionLog: async ( sessionId: string, start?: number, limit?: number, type?: string, timeout?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionLog", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/log`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (timeout !== undefined) { localVarQueryParameter["timeout"] = timeout; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the session has a log available as text. * @summary Check for session log as text. * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionLogAsText: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionLogAsText", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/log#asText`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Uploads job log output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload job log output to the Files service * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job. * @param {OutputStreamFileRequest} outputStreamFileRequest Specifies the request to stream output to the Files service. * @param {*} [options] Override http request option. * @throws {RequiredError} */ streamJobLogAsFile: async ( sessionId: string, jobId: string, outputStreamFileRequest: OutputStreamFileRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("streamJobLogAsFile", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("streamJobLogAsFile", "jobId", jobId); // verify required parameter 'outputStreamFileRequest' is not null or undefined assertParamExists( "streamJobLogAsFile", "outputStreamFileRequest", outputStreamFileRequest, ); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/log` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.output.stream.file.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( outputStreamFileRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Uploads session log output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload session log output to the Files service * @param {string} sessionId Specifies the ID of the session. * @param {OutputStreamFileRequest} outputStreamFileRequest Specifies the request to stream output to the Files service. * @param {*} [options] Override http request option. * @throws {RequiredError} */ streamSessionLogAsFile: async ( sessionId: string, outputStreamFileRequest: OutputStreamFileRequest, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("streamSessionLogAsFile", "sessionId", sessionId); // verify required parameter 'outputStreamFileRequest' is not null or undefined assertParamExists( "streamSessionLogAsFile", "outputStreamFileRequest", outputStreamFileRequest, ); const localVarPath = `/sessions/{sessionId}/log`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.compute.output.stream.file.request+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( outputStreamFileRequest, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * LogsApi - functional programming interface * @export */ export const LogsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = LogsApiAxiosParamCreator(configuration); return { /** * Retrieves the log output associated with a job. A job log is a subset of the session log. Therefore, the first line of a job log begins at a location (offset) within the session log. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve a job log * @param {LogsApiGetJobLogRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobLog( requestParameters: LogsApiGetJobLogRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobLog( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the entire log output associated with a job as text. * @summary Retrieve a job log as text. * @param {LogsApiGetJobLogAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobLogAsText( requestParameters: LogsApiGetJobLogAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobLogAsText( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the log output associated with a session. This operation returns a collection in which each entry is of the type application/vnd.sas.compute.log.line. * @summary Retrieve a session log * @param {LogsApiGetSessionLogRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionLog( requestParameters: LogsApiGetSessionLogRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionLog( requestParameters.sessionId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the log output associated with a session as text. * @summary Retrieve a session log as text. * @param {LogsApiGetSessionLogAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionLogAsText( requestParameters: LogsApiGetSessionLogAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionLogAsText( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether there is currently a log for a job. * @summary Check job log availability * @param {LogsApiHeadersForJobLogRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobLog( requestParameters: LogsApiHeadersForJobLogRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobLog( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether there is currently a log for a job as text. * @summary Check for job log as text * @param {LogsApiHeadersForJobLogAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobLogAsText( requestParameters: LogsApiHeadersForJobLogAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobLogAsText( requestParameters.sessionId, requestParameters.jobId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the session has a log available. * @summary Check for a session log * @param {LogsApiHeadersForSessionLogRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionLog( requestParameters: LogsApiHeadersForSessionLogRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionLog( requestParameters.sessionId, requestParameters.start, requestParameters.limit, requestParameters.type, requestParameters.timeout, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the session has a log available as text. * @summary Check for session log as text. * @param {LogsApiHeadersForSessionLogAsTextRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionLogAsText( requestParameters: LogsApiHeadersForSessionLogAsTextRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionLogAsText( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Uploads job log output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload job log output to the Files service * @param {LogsApiStreamJobLogAsFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async streamJobLogAsFile( requestParameters: LogsApiStreamJobLogAsFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.streamJobLogAsFile( requestParameters.sessionId, requestParameters.jobId, requestParameters.outputStreamFileRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Uploads session log output to the Files service and returns the representation of the file resource containing the output. The file is created in one of two formats, based on the value of the property \"format\" specified in the post body. If \"collection\" is specified as the value of \"format\", the output file is rendered as application/vnd.sas.collection+json. If the format is specified as \"prefixedText\", the output is text/plain in which each line of output is prefixed with the name of the line type followed by a colon. In either case, all available output is returned; neither pagination nor filtering is supported. * @summary Upload session log output to the Files service * @param {LogsApiStreamSessionLogAsFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async streamSessionLogAsFile( requestParameters: LogsApiStreamSessionLogAsFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.streamSessionLogAsFile( requestParameters.sessionId, requestParameters.outputStreamFileRequest, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getJobLog operation in LogsApi. * @export * @interface LogsApiGetJobLogRequest */ export interface LogsApiGetJobLogRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiGetJobLog */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof LogsApiGetJobLog */ readonly jobId: string; /** * Specifies the offset of the first item in a collection. The first line is at start=0. * @type {number} * @memberof LogsApiGetJobLog */ readonly start?: number; /** * Specifies the number of items in a page. * @type {number} * @memberof LogsApiGetJobLog */ readonly limit?: number; /** * Restricts log collection to those entries with a specified type. Specify multiple types in a query by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof LogsApiGetJobLog */ readonly type?: string; /** * Specifies the request time-out in seconds. If no log lines are available over this time period, an empty collection is returned. * @type {number} * @memberof LogsApiGetJobLog */ readonly timeout?: number; } /** * Request parameters for getJobLogAsText operation in LogsApi. * @export * @interface LogsApiGetJobLogAsTextRequest */ export interface LogsApiGetJobLogAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiGetJobLogAsText */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof LogsApiGetJobLogAsText */ readonly jobId: string; } /** * Request parameters for getSessionLog operation in LogsApi. * @export * @interface LogsApiGetSessionLogRequest */ export interface LogsApiGetSessionLogRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiGetSessionLog */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof LogsApiGetSessionLog */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof LogsApiGetSessionLog */ readonly limit?: number; /** * Restricts the log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof LogsApiGetSessionLog */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof LogsApiGetSessionLog */ readonly timeout?: number; } /** * Request parameters for getSessionLogAsText operation in LogsApi. * @export * @interface LogsApiGetSessionLogAsTextRequest */ export interface LogsApiGetSessionLogAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiGetSessionLogAsText */ readonly sessionId: string; } /** * Request parameters for headersForJobLog operation in LogsApi. * @export * @interface LogsApiHeadersForJobLogRequest */ export interface LogsApiHeadersForJobLogRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiHeadersForJobLog */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof LogsApiHeadersForJobLog */ readonly jobId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof LogsApiHeadersForJobLog */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof LogsApiHeadersForJobLog */ readonly limit?: number; /** * Restricts a log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof LogsApiHeadersForJobLog */ readonly type?: string; /** * Specifies the request time-out in seconds. If no log lines are available in this time period, an empty collection is returned. * @type {number} * @memberof LogsApiHeadersForJobLog */ readonly timeout?: number; } /** * Request parameters for headersForJobLogAsText operation in LogsApi. * @export * @interface LogsApiHeadersForJobLogAsTextRequest */ export interface LogsApiHeadersForJobLogAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiHeadersForJobLogAsText */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof LogsApiHeadersForJobLogAsText */ readonly jobId: string; } /** * Request parameters for headersForSessionLog operation in LogsApi. * @export * @interface LogsApiHeadersForSessionLogRequest */ export interface LogsApiHeadersForSessionLogRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiHeadersForSessionLog */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof LogsApiHeadersForSessionLog */ readonly start?: number; /** * Specifies the number of items in this page. * @type {number} * @memberof LogsApiHeadersForSessionLog */ readonly limit?: number; /** * Restricts log collection to those entries whose type matches the query. Specify multiple types by separating them with a \'|\'. For example, you might specify ?type=error or ?type=error|warning. * @type {string} * @memberof LogsApiHeadersForSessionLog */ readonly type?: string; /** * Specifies the request time-out in seconds. * @type {number} * @memberof LogsApiHeadersForSessionLog */ readonly timeout?: number; } /** * Request parameters for headersForSessionLogAsText operation in LogsApi. * @export * @interface LogsApiHeadersForSessionLogAsTextRequest */ export interface LogsApiHeadersForSessionLogAsTextRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiHeadersForSessionLogAsText */ readonly sessionId: string; } /** * Request parameters for streamJobLogAsFile operation in LogsApi. * @export * @interface LogsApiStreamJobLogAsFileRequest */ export interface LogsApiStreamJobLogAsFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiStreamJobLogAsFile */ readonly sessionId: string; /** * Specifies the ID of the job. * @type {string} * @memberof LogsApiStreamJobLogAsFile */ readonly jobId: string; /** * Specifies the request to stream output to the Files service. * @type {OutputStreamFileRequest} * @memberof LogsApiStreamJobLogAsFile */ readonly outputStreamFileRequest: OutputStreamFileRequest; } /** * Request parameters for streamSessionLogAsFile operation in LogsApi. * @export * @interface LogsApiStreamSessionLogAsFileRequest */ export interface LogsApiStreamSessionLogAsFileRequest { /** * Specifies the ID of the session. * @type {string} * @memberof LogsApiStreamSessionLogAsFile */ readonly sessionId: string; /** * Specifies the request to stream output to the Files service. * @type {OutputStreamFileRequest} * @memberof LogsApiStreamSessionLogAsFile */ readonly outputStreamFileRequest: OutputStreamFileRequest; } /** * OptionsApi - axios parameter creator * @export */ export const OptionsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Returns the value of the option as a plain text value. * @summary Get an option by name * @param {string} sessionId Specifies the ID of the session. * @param {string} optionName Specifies the name of the requested option. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getOptionValue: async ( sessionId: string, optionName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getOptionValue", "sessionId", sessionId); // verify required parameter 'optionName' is not null or undefined assertParamExists("getOptionValue", "optionName", optionName); const localVarPath = `/sessions/{sessionId}/options/{optionName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"optionName"}}`, encodeURIComponent(String(optionName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns information about the specified option, including the value. * @summary Get an option representation * @param {string} sessionId Specifies the ID of the session. * @param {string} optionName Specifies the name of the requested option. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getOptionValueFull: async ( sessionId: string, optionName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getOptionValueFull", "sessionId", sessionId); // verify required parameter 'optionName' is not null or undefined assertParamExists("getOptionValueFull", "optionName", optionName); const localVarPath = `/sessions/{sessionId}/options/{optionName}#optionFull` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"optionName"}}`, encodeURIComponent(String(optionName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns headers for option retrieval. * @summary Verify that an option exists * @param {string} sessionId Specifies the ID of the session. * @param {string} optionName Specifies the name of the requested option. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForOptionValue: async ( sessionId: string, optionName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForOptionValue", "sessionId", sessionId); // verify required parameter 'optionName' is not null or undefined assertParamExists("headersForOptionValue", "optionName", optionName); const localVarPath = `/sessions/{sessionId}/options/{optionName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"optionName"}}`, encodeURIComponent(String(optionName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns headers for option retrieval. * @summary Verify that an option exists * @param {string} sessionId Specifies the ID of the session. * @param {string} optionName Specifies the name of the requested option. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForOptionValueFull: async ( sessionId: string, optionName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForOptionValueFull", "sessionId", sessionId); // verify required parameter 'optionName' is not null or undefined assertParamExists("headersForOptionValueFull", "optionName", optionName); const localVarPath = `/sessions/{sessionId}/options/{optionName}#optionFull` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"optionName"}}`, encodeURIComponent(String(optionName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Enables you to set or update the value of the specified option. * @summary Set or update option value * @param {string} sessionId Specifies the ID of the session. * @param {string} optionName Specifies the name of the requested option. * @param {string} body Specifies the value for the requested option. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateOptionValue: async ( sessionId: string, optionName: string, body: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateOptionValue", "sessionId", sessionId); // verify required parameter 'optionName' is not null or undefined assertParamExists("updateOptionValue", "optionName", optionName); // verify required parameter 'body' is not null or undefined assertParamExists("updateOptionValue", "body", body); const localVarPath = `/sessions/{sessionId}/options/{optionName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"optionName"}}`, encodeURIComponent(String(optionName))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "text/plain"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( body, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * OptionsApi - functional programming interface * @export */ export const OptionsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = OptionsApiAxiosParamCreator(configuration); return { /** * Returns the value of the option as a plain text value. * @summary Get an option by name * @param {OptionsApiGetOptionValueRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getOptionValue( requestParameters: OptionsApiGetOptionValueRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getOptionValue( requestParameters.sessionId, requestParameters.optionName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns information about the specified option, including the value. * @summary Get an option representation * @param {OptionsApiGetOptionValueFullRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getOptionValueFull( requestParameters: OptionsApiGetOptionValueFullRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getOptionValueFull( requestParameters.sessionId, requestParameters.optionName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns headers for option retrieval. * @summary Verify that an option exists * @param {OptionsApiHeadersForOptionValueRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForOptionValue( requestParameters: OptionsApiHeadersForOptionValueRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForOptionValue( requestParameters.sessionId, requestParameters.optionName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns headers for option retrieval. * @summary Verify that an option exists * @param {OptionsApiHeadersForOptionValueFullRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForOptionValueFull( requestParameters: OptionsApiHeadersForOptionValueFullRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForOptionValueFull( requestParameters.sessionId, requestParameters.optionName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Enables you to set or update the value of the specified option. * @summary Set or update option value * @param {OptionsApiUpdateOptionValueRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateOptionValue( requestParameters: OptionsApiUpdateOptionValueRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateOptionValue( requestParameters.sessionId, requestParameters.optionName, requestParameters.body, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getOptionValue operation in OptionsApi. * @export * @interface OptionsApiGetOptionValueRequest */ export interface OptionsApiGetOptionValueRequest { /** * Specifies the ID of the session. * @type {string} * @memberof OptionsApiGetOptionValue */ readonly sessionId: string; /** * Specifies the name of the requested option. * @type {string} * @memberof OptionsApiGetOptionValue */ readonly optionName: string; } /** * Request parameters for getOptionValueFull operation in OptionsApi. * @export * @interface OptionsApiGetOptionValueFullRequest */ export interface OptionsApiGetOptionValueFullRequest { /** * Specifies the ID of the session. * @type {string} * @memberof OptionsApiGetOptionValueFull */ readonly sessionId: string; /** * Specifies the name of the requested option. * @type {string} * @memberof OptionsApiGetOptionValueFull */ readonly optionName: string; } /** * Request parameters for headersForOptionValue operation in OptionsApi. * @export * @interface OptionsApiHeadersForOptionValueRequest */ export interface OptionsApiHeadersForOptionValueRequest { /** * Specifies the ID of the session. * @type {string} * @memberof OptionsApiHeadersForOptionValue */ readonly sessionId: string; /** * Specifies the name of the requested option. * @type {string} * @memberof OptionsApiHeadersForOptionValue */ readonly optionName: string; } /** * Request parameters for headersForOptionValueFull operation in OptionsApi. * @export * @interface OptionsApiHeadersForOptionValueFullRequest */ export interface OptionsApiHeadersForOptionValueFullRequest { /** * Specifies the ID of the session. * @type {string} * @memberof OptionsApiHeadersForOptionValueFull */ readonly sessionId: string; /** * Specifies the name of the requested option. * @type {string} * @memberof OptionsApiHeadersForOptionValueFull */ readonly optionName: string; } /** * Request parameters for updateOptionValue operation in OptionsApi. * @export * @interface OptionsApiUpdateOptionValueRequest */ export interface OptionsApiUpdateOptionValueRequest { /** * Specifies the ID of the session. * @type {string} * @memberof OptionsApiUpdateOptionValue */ readonly sessionId: string; /** * Specifies the name of the requested option. * @type {string} * @memberof OptionsApiUpdateOptionValue */ readonly optionName: string; /** * Specifies the value for the requested option. * @type {string} * @memberof OptionsApiUpdateOptionValue */ readonly body: string; } /** * ResultsApi - axios parameter creator * @export */ export const ResultsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Retrieves the results of a job as a collection. The results might be ODS output or other output. Standard paging options are available. * @summary Fetch the results of a job * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job whose results you want to retrieve. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items requested. * @param {string} [filter] Specifies the filter criteria for returned items. * @param {string} [sortBy] Sorts returned items. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getJobResults: async ( sessionId: string, jobId: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getJobResults", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("getJobResults", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/results` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the results of an entire session. This can be ODS output or other output. * @summary Fetch results for a session * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items that were requested. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionResults: async ( sessionId: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionResults", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/results`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a job has any results. * @summary Check for job results * @param {string} sessionId Specifies the ID of the session. * @param {string} jobId Specifies the ID of the job to fetch results from. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items to fetch. * @param {string} [filter] Specifies the filter criteria for returned items. * @param {string} [sortBy] Sorts returned items. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForJobResults: async ( sessionId: string, jobId: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForJobResults", "sessionId", sessionId); // verify required parameter 'jobId' is not null or undefined assertParamExists("headersForJobResults", "jobId", jobId); const localVarPath = `/sessions/{sessionId}/jobs/{jobId}/results` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace(`{${"jobId"}}`, encodeURIComponent(String(jobId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the session has any results. * @summary Check for session results * @param {string} sessionId Specifies the ID of the session. * @param {number} [start] Specifies the offset of the first item in the collection. The first line is at start=0. * @param {number} [limit] Specifies the number of items that were requested. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionResults: async ( sessionId: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionResults", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/results`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * ResultsApi - functional programming interface * @export */ export const ResultsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = ResultsApiAxiosParamCreator(configuration); return { /** * Retrieves the results of a job as a collection. The results might be ODS output or other output. Standard paging options are available. * @summary Fetch the results of a job * @param {ResultsApiGetJobResultsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getJobResults( requestParameters: ResultsApiGetJobResultsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getJobResults( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the results of an entire session. This can be ODS output or other output. * @summary Fetch results for a session * @param {ResultsApiGetSessionResultsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionResults( requestParameters: ResultsApiGetSessionResultsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionResults( requestParameters.sessionId, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a job has any results. * @summary Check for job results * @param {ResultsApiHeadersForJobResultsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForJobResults( requestParameters: ResultsApiHeadersForJobResultsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForJobResults( requestParameters.sessionId, requestParameters.jobId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the session has any results. * @summary Check for session results * @param {ResultsApiHeadersForSessionResultsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionResults( requestParameters: ResultsApiHeadersForSessionResultsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionResults( requestParameters.sessionId, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getJobResults operation in ResultsApi. * @export * @interface ResultsApiGetJobResultsRequest */ export interface ResultsApiGetJobResultsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ResultsApiGetJobResults */ readonly sessionId: string; /** * Specifies the ID of the job whose results you want to retrieve. * @type {string} * @memberof ResultsApiGetJobResults */ readonly jobId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ResultsApiGetJobResults */ readonly start?: number; /** * Specifies the number of items requested. * @type {number} * @memberof ResultsApiGetJobResults */ readonly limit?: number; /** * Specifies the filter criteria for returned items. * @type {string} * @memberof ResultsApiGetJobResults */ readonly filter?: string; /** * Sorts returned items. * @type {string} * @memberof ResultsApiGetJobResults */ readonly sortBy?: string; } /** * Request parameters for getSessionResults operation in ResultsApi. * @export * @interface ResultsApiGetSessionResultsRequest */ export interface ResultsApiGetSessionResultsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ResultsApiGetSessionResults */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ResultsApiGetSessionResults */ readonly start?: number; /** * Specifies the number of items that were requested. * @type {number} * @memberof ResultsApiGetSessionResults */ readonly limit?: number; } /** * Request parameters for headersForJobResults operation in ResultsApi. * @export * @interface ResultsApiHeadersForJobResultsRequest */ export interface ResultsApiHeadersForJobResultsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ResultsApiHeadersForJobResults */ readonly sessionId: string; /** * Specifies the ID of the job to fetch results from. * @type {string} * @memberof ResultsApiHeadersForJobResults */ readonly jobId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ResultsApiHeadersForJobResults */ readonly start?: number; /** * Specifies the number of items to fetch. * @type {number} * @memberof ResultsApiHeadersForJobResults */ readonly limit?: number; /** * Specifies the filter criteria for returned items. * @type {string} * @memberof ResultsApiHeadersForJobResults */ readonly filter?: string; /** * Sorts returned items. * @type {string} * @memberof ResultsApiHeadersForJobResults */ readonly sortBy?: string; } /** * Request parameters for headersForSessionResults operation in ResultsApi. * @export * @interface ResultsApiHeadersForSessionResultsRequest */ export interface ResultsApiHeadersForSessionResultsRequest { /** * Specifies the ID of the session. * @type {string} * @memberof ResultsApiHeadersForSessionResults */ readonly sessionId: string; /** * Specifies the offset of the first item in the collection. The first line is at start=0. * @type {number} * @memberof ResultsApiHeadersForSessionResults */ readonly start?: number; /** * Specifies the number of items that were requested. * @type {number} * @memberof ResultsApiHeadersForSessionResults */ readonly limit?: number; } /** * RootApi - axios parameter creator * @export */ export const RootApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Checks the availability of the service. * @summary Check service availability * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForRoot: async ( options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of links to the top level resources in this API. * @summary Get API resource links * @param {*} [options] Override http request option. * @throws {RequiredError} */ root: async (options: AxiosRequestConfig = {}): Promise => { const localVarPath = `/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * RootApi - functional programming interface * @export */ export const RootApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = RootApiAxiosParamCreator(configuration); return { /** * Checks the availability of the service. * @summary Check service availability * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForRoot( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForRoot(options); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of links to the top level resources in this API. * @summary Get API resource links * @param {*} [options] Override http request option. * @throws {RequiredError} */ async root(options?: AxiosRequestConfig): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.root(options); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * ServersApi - axios parameter creator * @export */ export const ServersApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Stops the specified server instance. The user must have administration permissions on the server to perform this request. * @summary Stop the server * @param {string} serverId Specifies the ID of the server definition. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteServer: async ( serverId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("deleteServer", "serverId", serverId); const localVarPath = `/servers/{serverId}`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns links and information for the active server instance. The serverId is a unique identifier for an active SAS Compute Server instance. * @summary Get links for the active server * @param {string} serverId Returns the active server for this server identifier. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getServer: async ( serverId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("getServer", "serverId", serverId); const localVarPath = `/servers/{serverId}`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets a paginated list of sessions that are owned by the requested service instance. Standard paging, filtering, and sorting options are provided. * @summary Get active sessions for server * @param {string} serverId Specifies the ID of the server definition. * @param {'application/vnd.sas.compute.session+json' | 'application/vnd.sas.compute.session.summary+json'} [acceptItem] Returns the desired session representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.session+json <li>application/vnd.sas.compute.session.summary+json <li>blank </ul> If the application/vnd.sas.compute.session.summary+json type is specified or no Accept-Item header is specified, then the sessions are returned as summary representation session objects. * @param {number} [start] Specifies the offset of first session to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of sessions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned sessions. * @param {string} [sortBy] Sorts returned sessions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getServerSessions: async ( serverId: string, acceptItem?: | "application/vnd.sas.compute.session+json" | "application/vnd.sas.compute.session.summary+json", start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("getServerSessions", "serverId", serverId); const localVarPath = `/servers/{serverId}/sessions`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets the current status of a server. The value that is returned is either running or stopped. * @summary Get server status * @param {string} serverId Specifies the ID of the server. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getServerState: async ( serverId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("getServerState", "serverId", serverId); const localVarPath = `/servers/{serverId}/state`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of active servers. Standard paging, filtering, and sorting options are provided. This method is restricted to users with ADMIN permission on this URL for monitoring purposes. By default, this endpoint returns a summary of the available information about the active servers. Specify an Accept-Item header with the value application/vnd.sas.compute.server+json to get all available information for each server. * @summary Get active servers * @param {'application/vnd.sas.compute.server+json' | 'application/vnd.sas.compute.server.summary+json'} [acceptItem] Specifies the desired server representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.server+json <li>application/vnd.sas.compute.server.summary+json <li>blank </ul> If the application/vnd.sas.compute.server.summary+json type is specified or no Accept-Item header is specified, then the servers are returned as summary representation server objects. * @param {string} [serverId] Returns only the active server that matches the serverId. The serverId is a unique identifier for an active SAS Compute Server instance. * @param {string} [contextName] Returns only active servers for the specified context definition. * @param {number} [start] Specifies the offset of first active server listing to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of active server listings to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned active server listings. * @param {string} [sortBy] Sorts returned active server listings. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getServers: async ( acceptItem?: | "application/vnd.sas.compute.server+json" | "application/vnd.sas.compute.server.summary+json", serverId?: string, contextName?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/servers`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (serverId !== undefined) { localVarQueryParameter["serverId"] = serverId; } if (contextName !== undefined) { localVarQueryParameter["contextName"] = contextName; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified server exists. * @summary Verify that a server exists * @param {string} serverId Returns the active server for this server identifier. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForServer: async ( serverId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("headersForServer", "serverId", serverId); const localVarPath = `/servers/{serverId}`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the session endpoint for a server is available. * @summary Check sessions endpoint for a server * @param {string} serverId Specifies the ID of the server definition. * @param {number} [start] Specifies the offset of first session to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of sessions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned sessions. * @param {string} [sortBy] Sorts returned sessions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForServerSessions: async ( serverId: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("headersForServerSessions", "serverId", serverId); const localVarPath = `/servers/{serverId}/sessions`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the status endpoint for a server is available. * @summary Check server status endpoint * @param {string} serverId Specifies the ID of the server. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForServerState: async ( serverId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'serverId' is not null or undefined assertParamExists("headersForServerState", "serverId", serverId); const localVarPath = `/servers/{serverId}/state`.replace( `{${"serverId"}}`, encodeURIComponent(String(serverId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determine whether the servers endpoint is currently available. * @summary Check endpoint availability * @param {string} [serverId] Returns the active server that matches a serverId. The serverId is a unique identifier for an active SAS Compute Server instance. * @param {string} [contextName] Returns active servers for the specified context definition. * @param {number} [start] Specifies the offset of the first active server listing to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of active server listings to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned active server listings. * @param {string} [sortBy] Sorts returned active server listings. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForServers: async ( serverId?: string, contextName?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/servers`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (serverId !== undefined) { localVarQueryParameter["serverId"] = serverId; } if (contextName !== undefined) { localVarQueryParameter["contextName"] = contextName; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * ServersApi - functional programming interface * @export */ export const ServersApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = ServersApiAxiosParamCreator(configuration); return { /** * Stops the specified server instance. The user must have administration permissions on the server to perform this request. * @summary Stop the server * @param {ServersApiDeleteServerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteServer( requestParameters: ServersApiDeleteServerRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteServer( requestParameters.serverId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns links and information for the active server instance. The serverId is a unique identifier for an active SAS Compute Server instance. * @summary Get links for the active server * @param {ServersApiGetServerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getServer( requestParameters: ServersApiGetServerRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getServer( requestParameters.serverId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets a paginated list of sessions that are owned by the requested service instance. Standard paging, filtering, and sorting options are provided. * @summary Get active sessions for server * @param {ServersApiGetServerSessionsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getServerSessions( requestParameters: ServersApiGetServerSessionsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getServerSessions( requestParameters.serverId, requestParameters.acceptItem, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets the current status of a server. The value that is returned is either running or stopped. * @summary Get server status * @param {ServersApiGetServerStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getServerState( requestParameters: ServersApiGetServerStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getServerState( requestParameters.serverId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of active servers. Standard paging, filtering, and sorting options are provided. This method is restricted to users with ADMIN permission on this URL for monitoring purposes. By default, this endpoint returns a summary of the available information about the active servers. Specify an Accept-Item header with the value application/vnd.sas.compute.server+json to get all available information for each server. * @summary Get active servers * @param {ServersApiGetServersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getServers( requestParameters: ServersApiGetServersRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getServers( requestParameters.acceptItem, requestParameters.serverId, requestParameters.contextName, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified server exists. * @summary Verify that a server exists * @param {ServersApiHeadersForServerRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForServer( requestParameters: ServersApiHeadersForServerRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForServer( requestParameters.serverId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the session endpoint for a server is available. * @summary Check sessions endpoint for a server * @param {ServersApiHeadersForServerSessionsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForServerSessions( requestParameters: ServersApiHeadersForServerSessionsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForServerSessions( requestParameters.serverId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the status endpoint for a server is available. * @summary Check server status endpoint * @param {ServersApiHeadersForServerStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForServerState( requestParameters: ServersApiHeadersForServerStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForServerState( requestParameters.serverId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determine whether the servers endpoint is currently available. * @summary Check endpoint availability * @param {ServersApiHeadersForServersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForServers( requestParameters: ServersApiHeadersForServersRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForServers( requestParameters.serverId, requestParameters.contextName, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for deleteServer operation in ServersApi. * @export * @interface ServersApiDeleteServerRequest */ export interface ServersApiDeleteServerRequest { /** * Specifies the ID of the server definition. * @type {string} * @memberof ServersApiDeleteServer */ readonly serverId: string; } /** * Request parameters for getServer operation in ServersApi. * @export * @interface ServersApiGetServerRequest */ export interface ServersApiGetServerRequest { /** * Returns the active server for this server identifier. * @type {string} * @memberof ServersApiGetServer */ readonly serverId: string; } /** * Request parameters for getServerSessions operation in ServersApi. * @export * @interface ServersApiGetServerSessionsRequest */ export interface ServersApiGetServerSessionsRequest { /** * Specifies the ID of the server definition. * @type {string} * @memberof ServersApiGetServerSessions */ readonly serverId: string; /** * Returns the desired session representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.session+json <li>application/vnd.sas.compute.session.summary+json <li>blank </ul> If the application/vnd.sas.compute.session.summary+json type is specified or no Accept-Item header is specified, then the sessions are returned as summary representation session objects. * @type {'application/vnd.sas.compute.session+json' | 'application/vnd.sas.compute.session.summary+json'} * @memberof ServersApiGetServerSessions */ readonly acceptItem?: | "application/vnd.sas.compute.session+json" | "application/vnd.sas.compute.session.summary+json"; /** * Specifies the offset of first session to return. The default value is \"0\". * @type {number} * @memberof ServersApiGetServerSessions */ readonly start?: number; /** * Specifies the maximum number of sessions to return. The default value is \"10\". * @type {number} * @memberof ServersApiGetServerSessions */ readonly limit?: number; /** * Specifies the filter criteria for returned sessions. * @type {string} * @memberof ServersApiGetServerSessions */ readonly filter?: string; /** * Sorts returned sessions. * @type {string} * @memberof ServersApiGetServerSessions */ readonly sortBy?: string; } /** * Request parameters for getServerState operation in ServersApi. * @export * @interface ServersApiGetServerStateRequest */ export interface ServersApiGetServerStateRequest { /** * Specifies the ID of the server. * @type {string} * @memberof ServersApiGetServerState */ readonly serverId: string; } /** * Request parameters for getServers operation in ServersApi. * @export * @interface ServersApiGetServersRequest */ export interface ServersApiGetServersRequest { /** * Specifies the desired server representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.server+json <li>application/vnd.sas.compute.server.summary+json <li>blank </ul> If the application/vnd.sas.compute.server.summary+json type is specified or no Accept-Item header is specified, then the servers are returned as summary representation server objects. * @type {'application/vnd.sas.compute.server+json' | 'application/vnd.sas.compute.server.summary+json'} * @memberof ServersApiGetServers */ readonly acceptItem?: | "application/vnd.sas.compute.server+json" | "application/vnd.sas.compute.server.summary+json"; /** * Returns only the active server that matches the serverId. The serverId is a unique identifier for an active SAS Compute Server instance. * @type {string} * @memberof ServersApiGetServers */ readonly serverId?: string; /** * Returns only active servers for the specified context definition. * @type {string} * @memberof ServersApiGetServers */ readonly contextName?: string; /** * Specifies the offset of first active server listing to return. The default value is \"0\". * @type {number} * @memberof ServersApiGetServers */ readonly start?: number; /** * Specifies the maximum number of active server listings to return. The default value is \"10\". * @type {number} * @memberof ServersApiGetServers */ readonly limit?: number; /** * Specifies the filter criteria for returned active server listings. * @type {string} * @memberof ServersApiGetServers */ readonly filter?: string; /** * Sorts returned active server listings. * @type {string} * @memberof ServersApiGetServers */ readonly sortBy?: string; } /** * Request parameters for headersForServer operation in ServersApi. * @export * @interface ServersApiHeadersForServerRequest */ export interface ServersApiHeadersForServerRequest { /** * Returns the active server for this server identifier. * @type {string} * @memberof ServersApiHeadersForServer */ readonly serverId: string; } /** * Request parameters for headersForServerSessions operation in ServersApi. * @export * @interface ServersApiHeadersForServerSessionsRequest */ export interface ServersApiHeadersForServerSessionsRequest { /** * Specifies the ID of the server definition. * @type {string} * @memberof ServersApiHeadersForServerSessions */ readonly serverId: string; /** * Specifies the offset of first session to return. The default value is \"0\". * @type {number} * @memberof ServersApiHeadersForServerSessions */ readonly start?: number; /** * Specifies the maximum number of sessions to return. The default value is \"10\". * @type {number} * @memberof ServersApiHeadersForServerSessions */ readonly limit?: number; /** * Specifies the filter criteria for returned sessions. * @type {string} * @memberof ServersApiHeadersForServerSessions */ readonly filter?: string; /** * Sorts returned sessions. * @type {string} * @memberof ServersApiHeadersForServerSessions */ readonly sortBy?: string; } /** * Request parameters for headersForServerState operation in ServersApi. * @export * @interface ServersApiHeadersForServerStateRequest */ export interface ServersApiHeadersForServerStateRequest { /** * Specifies the ID of the server. * @type {string} * @memberof ServersApiHeadersForServerState */ readonly serverId: string; } /** * Request parameters for headersForServers operation in ServersApi. * @export * @interface ServersApiHeadersForServersRequest */ export interface ServersApiHeadersForServersRequest { /** * Returns the active server that matches a serverId. The serverId is a unique identifier for an active SAS Compute Server instance. * @type {string} * @memberof ServersApiHeadersForServers */ readonly serverId?: string; /** * Returns active servers for the specified context definition. * @type {string} * @memberof ServersApiHeadersForServers */ readonly contextName?: string; /** * Specifies the offset of the first active server listing to return. The default value is \"0\". * @type {number} * @memberof ServersApiHeadersForServers */ readonly start?: number; /** * Specifies the maximum number of active server listings to return. The default value is \"10\". * @type {number} * @memberof ServersApiHeadersForServers */ readonly limit?: number; /** * Specifies the filter criteria for returned active server listings. * @type {string} * @memberof ServersApiHeadersForServers */ readonly filter?: string; /** * Sorts returned active server listings. * @type {string} * @memberof ServersApiHeadersForServers */ readonly sortBy?: string; } /** * SessionsApi - axios parameter creator * @export */ export const SessionsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Deletes the specified session. * @summary Delete session * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteSession: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("deleteSession", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a representation of the session that includes links for the session. * @summary Get current session information * @param {string} sessionId Specifies the ID of the session. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSession: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSession", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the session state. * @summary Get session state * @param {string} sessionId Specifies the ID of the session. * @param {number} [wait] Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @param {string} [ifNoneMatch] Specifies the ETag associated with a value of the session state. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessionState: async ( sessionId: string, wait?: number, ifNoneMatch?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getSessionState", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/state`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (wait !== undefined) { localVarQueryParameter["wait"] = wait; } if (ifNoneMatch != null) { localVarHeaderParameter["If-None-Match"] = String(ifNoneMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets a paginated list of sessions. Standard paging, filtering, and sorting options are provided. By default, this endpoint returns a summary of the available information about the sessions. Specify an Accept-Item header with the value application/vnd.sas.compute.session+json to get all available information for each session. * @summary Get active compute sessions * @param {'application/vnd.sas.compute.session+json' | 'application/vnd.sas.compute.session.summary+json'} [acceptItem] Specifies the desired session representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.session+json <li>application/vnd.sas.compute.session.summary+json <li>blank </ul> If the application/vnd.sas.compute.session.summary+json type is specified or no Accept-Item header is specified, then the sessions are returned as summary representation session objects. * @param {number} [start] Specifies the offset of first session to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of sessions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned sessions. * @param {string} [sortBy] Sorts returned sessions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSessions: async ( acceptItem?: | "application/vnd.sas.compute.session+json" | "application/vnd.sas.compute.session.summary+json", start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/sessions`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the specified session is available. * @summary Verify session availability * @param {string} sessionId Specifies the ID of the session that you are checking. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSession: async ( sessionId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSession", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the state endpoint is available. * @summary Check state availability * @param {string} sessionId Specifies the ID of the session whose state endpoint you are checking. * @param {number} [wait] Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @param {string} [ifNoneMatch] Specifies the ETag that is associated with a value of the session state. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessionState: async ( sessionId: string, wait?: number, ifNoneMatch?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForSessionState", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/state`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (wait !== undefined) { localVarQueryParameter["wait"] = wait; } if (ifNoneMatch != null) { localVarHeaderParameter["If-None-Match"] = String(ifNoneMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a session endpoint is available. * @summary Check endpoint availability * @param {number} [start] Specifies the offset of the first session to return. The default value is \"0\". * @param {number} [limit] Maximum number of sessions to return. The default value is \"10\". * @param {string} [filter] Specifies the filter criteria for returned sessions. * @param {string} [sortBy] Sorts returned sessions. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForSessions: async ( start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/sessions`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Sets the current state of a session. Use this method to cancel running code by setting the state to canceled. * @summary Set state of a session * @param {string} sessionId Specifies the ID of the session. * @param {'canceled' | 'deleted'} value Specifies the new session state, such as canceled. * @param {string} ifMatch Specifies the ETag of the session that you are updating. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateSessionState: async ( sessionId: string, value: "canceled" | "deleted", ifMatch: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("updateSessionState", "sessionId", sessionId); // verify required parameter 'value' is not null or undefined assertParamExists("updateSessionState", "value", value); // verify required parameter 'ifMatch' is not null or undefined assertParamExists("updateSessionState", "ifMatch", ifMatch); const localVarPath = `/sessions/{sessionId}/state`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (value !== undefined) { localVarQueryParameter["value"] = value; } if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * SessionsApi - functional programming interface * @export */ export const SessionsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = SessionsApiAxiosParamCreator(configuration); return { /** * Deletes the specified session. * @summary Delete session * @param {SessionsApiDeleteSessionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteSession( requestParameters: SessionsApiDeleteSessionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteSession( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a representation of the session that includes links for the session. * @summary Get current session information * @param {SessionsApiGetSessionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSession( requestParameters: SessionsApiGetSessionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSession( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the session state. * @summary Get session state * @param {SessionsApiGetSessionStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessionState( requestParameters: SessionsApiGetSessionStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessionState( requestParameters.sessionId, requestParameters.wait, requestParameters.ifNoneMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets a paginated list of sessions. Standard paging, filtering, and sorting options are provided. By default, this endpoint returns a summary of the available information about the sessions. Specify an Accept-Item header with the value application/vnd.sas.compute.session+json to get all available information for each session. * @summary Get active compute sessions * @param {SessionsApiGetSessionsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSessions( requestParameters: SessionsApiGetSessionsRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSessions( requestParameters.acceptItem, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the specified session is available. * @summary Verify session availability * @param {SessionsApiHeadersForSessionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSession( requestParameters: SessionsApiHeadersForSessionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSession( requestParameters.sessionId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the state endpoint is available. * @summary Check state availability * @param {SessionsApiHeadersForSessionStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessionState( requestParameters: SessionsApiHeadersForSessionStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessionState( requestParameters.sessionId, requestParameters.wait, requestParameters.ifNoneMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a session endpoint is available. * @summary Check endpoint availability * @param {SessionsApiHeadersForSessionsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForSessions( requestParameters: SessionsApiHeadersForSessionsRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForSessions( requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Sets the current state of a session. Use this method to cancel running code by setting the state to canceled. * @summary Set state of a session * @param {SessionsApiUpdateSessionStateRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateSessionState( requestParameters: SessionsApiUpdateSessionStateRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateSessionState( requestParameters.sessionId, requestParameters.value, requestParameters.ifMatch, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for deleteSession operation in SessionsApi. * @export * @interface SessionsApiDeleteSessionRequest */ export interface SessionsApiDeleteSessionRequest { /** * Specifies the ID of the session. * @type {string} * @memberof SessionsApiDeleteSession */ readonly sessionId: string; } /** * Request parameters for getSession operation in SessionsApi. * @export * @interface SessionsApiGetSessionRequest */ export interface SessionsApiGetSessionRequest { /** * Specifies the ID of the session. * @type {string} * @memberof SessionsApiGetSession */ readonly sessionId: string; } /** * Request parameters for getSessionState operation in SessionsApi. * @export * @interface SessionsApiGetSessionStateRequest */ export interface SessionsApiGetSessionStateRequest { /** * Specifies the ID of the session. * @type {string} * @memberof SessionsApiGetSessionState */ readonly sessionId: string; /** * Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @type {number} * @memberof SessionsApiGetSessionState */ readonly wait?: number; /** * Specifies the ETag associated with a value of the session state. * @type {string} * @memberof SessionsApiGetSessionState */ readonly ifNoneMatch?: string; } /** * Request parameters for getSessions operation in SessionsApi. * @export * @interface SessionsApiGetSessionsRequest */ export interface SessionsApiGetSessionsRequest { /** * Specifies the desired session representation.<br> The Accept-Item options are: <ul> <li>application/vnd.sas.compute.session+json <li>application/vnd.sas.compute.session.summary+json <li>blank </ul> If the application/vnd.sas.compute.session.summary+json type is specified or no Accept-Item header is specified, then the sessions are returned as summary representation session objects. * @type {'application/vnd.sas.compute.session+json' | 'application/vnd.sas.compute.session.summary+json'} * @memberof SessionsApiGetSessions */ readonly acceptItem?: | "application/vnd.sas.compute.session+json" | "application/vnd.sas.compute.session.summary+json"; /** * Specifies the offset of first session to return. The default value is \"0\". * @type {number} * @memberof SessionsApiGetSessions */ readonly start?: number; /** * Specifies the maximum number of sessions to return. The default value is \"10\". * @type {number} * @memberof SessionsApiGetSessions */ readonly limit?: number; /** * Specifies the filter criteria for returned sessions. * @type {string} * @memberof SessionsApiGetSessions */ readonly filter?: string; /** * Sorts returned sessions. * @type {string} * @memberof SessionsApiGetSessions */ readonly sortBy?: string; } /** * Request parameters for headersForSession operation in SessionsApi. * @export * @interface SessionsApiHeadersForSessionRequest */ export interface SessionsApiHeadersForSessionRequest { /** * Specifies the ID of the session that you are checking. * @type {string} * @memberof SessionsApiHeadersForSession */ readonly sessionId: string; } /** * Request parameters for headersForSessionState operation in SessionsApi. * @export * @interface SessionsApiHeadersForSessionStateRequest */ export interface SessionsApiHeadersForSessionStateRequest { /** * Specifies the ID of the session whose state endpoint you are checking. * @type {string} * @memberof SessionsApiHeadersForSessionState */ readonly sessionId: string; /** * Specifies the request time-out, in seconds. This parameter is ignored unless it is specified in combination with the `If-None-Match` header. If the state of the resource remains unchanged until the specified number of seconds has elapsed, then a status of 304 is returned. The request determines whether the current state matches the state when the ETag was specified via the `If-None-Match` header. If the state differs within the specified time period, then the new state is returned. * @type {number} * @memberof SessionsApiHeadersForSessionState */ readonly wait?: number; /** * Specifies the ETag that is associated with a value of the session state. * @type {string} * @memberof SessionsApiHeadersForSessionState */ readonly ifNoneMatch?: string; } /** * Request parameters for headersForSessions operation in SessionsApi. * @export * @interface SessionsApiHeadersForSessionsRequest */ export interface SessionsApiHeadersForSessionsRequest { /** * Specifies the offset of the first session to return. The default value is \"0\". * @type {number} * @memberof SessionsApiHeadersForSessions */ readonly start?: number; /** * Maximum number of sessions to return. The default value is \"10\". * @type {number} * @memberof SessionsApiHeadersForSessions */ readonly limit?: number; /** * Specifies the filter criteria for returned sessions. * @type {string} * @memberof SessionsApiHeadersForSessions */ readonly filter?: string; /** * Sorts returned sessions. * @type {string} * @memberof SessionsApiHeadersForSessions */ readonly sortBy?: string; } /** * Request parameters for updateSessionState operation in SessionsApi. * @export * @interface SessionsApiUpdateSessionStateRequest */ export interface SessionsApiUpdateSessionStateRequest { /** * Specifies the ID of the session. * @type {string} * @memberof SessionsApiUpdateSessionState */ readonly sessionId: string; /** * Specifies the new session state, such as canceled. * @type {'canceled' | 'deleted'} * @memberof SessionsApiUpdateSessionState */ readonly value: "canceled" | "deleted"; /** * Specifies the ETag of the session that you are updating. * @type {string} * @memberof SessionsApiUpdateSessionState */ readonly ifMatch: string; } /** * VariablesApi - axios parameter creator * @export */ export const VariablesApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Returns the information about the requested variable in the session. By default, the session variable resource is returned. You can get the simple value of the variable by specifying an Accept header of text/plain. * @summary Get a variable from the session * @param {string} sessionId Specifies the ID of the session. * @param {string} variableName Specifies the name of the variable to retrieve. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getVariable: async ( sessionId: string, variableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getVariable", "sessionId", sessionId); // verify required parameter 'variableName' is not null or undefined assertParamExists("getVariable", "variableName", variableName); const localVarPath = `/sessions/{sessionId}/variables/{variableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"variableName"}}`, encodeURIComponent(String(variableName)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Gets the variables that are currently defined in a session. These variables are macro variables that have been defined either by SAS or by you. A collection of application/vnd.sas.compute.variable items is returned. Standard pagination rules apply, and simple filtering is allowed. * @summary Get session variables * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies filter criteria for returned context definitions. * @param {number} [start] Specifies the offset of the first variable to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of variables to return in a page. The default value is \"50\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ getVariables: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("getVariables", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/variables`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether the requested variable exists for a session and obtains the header information for the variable. * @summary Determine whether a variable exists in a session * @param {string} sessionId Specifies the ID of the session. * @param {string} variableName Specifies the name of the variable to retrieve. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForVariable: async ( sessionId: string, variableName: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForVariable", "sessionId", sessionId); // verify required parameter 'variableName' is not null or undefined assertParamExists("headersForVariable", "variableName", variableName); const localVarPath = `/sessions/{sessionId}/variables/{variableName}` .replace(`{${"sessionId"}}`, encodeURIComponent(String(sessionId))) .replace( `{${"variableName"}}`, encodeURIComponent(String(variableName)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether it is possible to get variables for a session. * @summary Check variable availability for a session * @param {string} sessionId Specifies the ID of the session. * @param {string} [filter] Specifies the filter criteria for returned context definitions. * @param {number} [start] Specifies the offset of the first variable to return. The default value is \"0\". * @param {number} [limit] Specifies the maximum number of variables to return in a page. The default value is \"50\". * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForVariables: async ( sessionId: string, filter?: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'sessionId' is not null or undefined assertParamExists("headersForVariables", "sessionId", sessionId); const localVarPath = `/sessions/{sessionId}/variables`.replace( `{${"sessionId"}}`, encodeURIComponent(String(sessionId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * VariablesApi - functional programming interface * @export */ export const VariablesApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = VariablesApiAxiosParamCreator(configuration); return { /** * Returns the information about the requested variable in the session. By default, the session variable resource is returned. You can get the simple value of the variable by specifying an Accept header of text/plain. * @summary Get a variable from the session * @param {VariablesApiGetVariableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getVariable( requestParameters: VariablesApiGetVariableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getVariable( requestParameters.sessionId, requestParameters.variableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Gets the variables that are currently defined in a session. These variables are macro variables that have been defined either by SAS or by you. A collection of application/vnd.sas.compute.variable items is returned. Standard pagination rules apply, and simple filtering is allowed. * @summary Get session variables * @param {VariablesApiGetVariablesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getVariables( requestParameters: VariablesApiGetVariablesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getVariables( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether the requested variable exists for a session and obtains the header information for the variable. * @summary Determine whether a variable exists in a session * @param {VariablesApiHeadersForVariableRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForVariable( requestParameters: VariablesApiHeadersForVariableRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForVariable( requestParameters.sessionId, requestParameters.variableName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether it is possible to get variables for a session. * @summary Check variable availability for a session * @param {VariablesApiHeadersForVariablesRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForVariables( requestParameters: VariablesApiHeadersForVariablesRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForVariables( requestParameters.sessionId, requestParameters.filter, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getVariable operation in VariablesApi. * @export * @interface VariablesApiGetVariableRequest */ export interface VariablesApiGetVariableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof VariablesApiGetVariable */ readonly sessionId: string; /** * Specifies the name of the variable to retrieve. * @type {string} * @memberof VariablesApiGetVariable */ readonly variableName: string; } /** * Request parameters for getVariables operation in VariablesApi. * @export * @interface VariablesApiGetVariablesRequest */ export interface VariablesApiGetVariablesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof VariablesApiGetVariables */ readonly sessionId: string; /** * Specifies filter criteria for returned context definitions. * @type {string} * @memberof VariablesApiGetVariables */ readonly filter?: string; /** * Specifies the offset of the first variable to return. The default value is \"0\". * @type {number} * @memberof VariablesApiGetVariables */ readonly start?: number; /** * Specifies the maximum number of variables to return in a page. The default value is \"50\". * @type {number} * @memberof VariablesApiGetVariables */ readonly limit?: number; } /** * Request parameters for headersForVariable operation in VariablesApi. * @export * @interface VariablesApiHeadersForVariableRequest */ export interface VariablesApiHeadersForVariableRequest { /** * Specifies the ID of the session. * @type {string} * @memberof VariablesApiHeadersForVariable */ readonly sessionId: string; /** * Specifies the name of the variable to retrieve. * @type {string} * @memberof VariablesApiHeadersForVariable */ readonly variableName: string; } /** * Request parameters for headersForVariables operation in VariablesApi. * @export * @interface VariablesApiHeadersForVariablesRequest */ export interface VariablesApiHeadersForVariablesRequest { /** * Specifies the ID of the session. * @type {string} * @memberof VariablesApiHeadersForVariables */ readonly sessionId: string; /** * Specifies the filter criteria for returned context definitions. * @type {string} * @memberof VariablesApiHeadersForVariables */ readonly filter?: string; /** * Specifies the offset of the first variable to return. The default value is \"0\". * @type {number} * @memberof VariablesApiHeadersForVariables */ readonly start?: number; /** * Specifies the maximum number of variables to return in a page. The default value is \"50\". * @type {number} * @memberof VariablesApiHeadersForVariables */ readonly limit?: number; } ================================================ FILE: client/src/connection/rest/api/configuration.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Compute * The Compute API defines the replacement for the application servers that were used for SAS 9. The Compute API enables clients to perform the following tasks:
  • Submit and execute SAS code.
  • Obtain the SAS log or listing information from executed SAS code.
  • View output that is generated by a SAS code submission.
  • Access SAS data sets that are created by a SAS code submission.
  • Access SAS filerefs that are created by a SAS code submission.
  • Access SAS variables that are defined and used in a SAS code submission.
  • Retrieve information about engines that are available in a session.
* * The version of the OpenAPI document: 11 * Contact: devex@sas.com * * NOTE: This class is auto generated by OpenAPI * Do not edit the class manually. */ /* tslint:disable */ /* eslint-disable */ export interface ConfigurationParameters { apiKey?: | string | Promise | ((name: string) => string) | ((name: string) => Promise); username?: string; password?: string; accessToken?: | string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); basePath?: string; baseOptions?: any; formDataCtor?: new () => any; } export class Configuration { /** * parameter for apiKey security * @param name security name * @memberof Configuration */ apiKey?: | string | Promise | ((name: string) => string) | ((name: string) => Promise); /** * parameter for basic security * * @type {string} * @memberof Configuration */ username?: string; /** * parameter for basic security * * @type {string} * @memberof Configuration */ password?: string; /** * parameter for oauth2 security * @param name security name * @param scopes oauth2 scope * @memberof Configuration */ accessToken?: | string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); /** * override base path * * @type {string} * @memberof Configuration */ basePath?: string; /** * base options for axios calls * * @type {any} * @memberof Configuration */ baseOptions?: any; /** * The FormData constructor that will be used to create multipart form data * requests. You can inject this here so that execution environments that * do not support the FormData class can still run the generated client. * * @type {new () => FormData} */ formDataCtor?: new () => any; constructor(param: ConfigurationParameters = {}) { this.apiKey = param.apiKey; this.username = param.username; this.password = param.password; this.accessToken = param.accessToken; this.basePath = param.basePath; this.baseOptions = param.baseOptions; this.formDataCtor = param.formDataCtor; } /** * Check if the given MIME is a JSON MIME. * JSON MIME examples: * application/json * application/json; charset=UTF8 * APPLICATION/JSON * application/vnd.company+json * @param mime - MIME (Multipurpose Internet Mail Extensions) * @return True if the given MIME is JSON, false otherwise. */ public isJsonMime(mime: string): boolean { const jsonMime: RegExp = new RegExp( "^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$", "i", ); return ( mime !== null && (jsonMime.test(mime) || mime.toLowerCase() === "application/json-patch+json") ); } } ================================================ FILE: client/src/connection/rest/api/files.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Files * The Files API provides persistence of files, such as comment attachments and report images.With this version File API will now support versioned files. A solution can maintain multiple versions of a file. There are few additional parameters which will be required while creation of File, which indicates that the File is a versioned file. * * The version of the OpenAPI document: 9 * Contact: devex@sas.com * * NOTE: This class is auto generated by OpenAPI * Do not edit the class manually. */ /* tslint:disable */ /* eslint-disable */ import { AxiosRequestConfig, AxiosResponse } from "axios"; // URLSearchParams not necessarily used // @ts-ignore import { URL, URLSearchParams } from "url"; // Some imports not used depending on template conditions // @ts-ignore import { DUMMY_BASE_URL, RequestArgs, assertParamExists, createRequestFunction, serializeDataIfNeeded, setSearchParams, toPathString, } from "./common"; import { Configuration } from "./configuration"; /** * The list of links to top-level resources and operations available from the root of the API. * @export * @interface Api */ export interface Api { /** * The API\'s top-level links. * @type {Array} * @memberof Api */ links?: Array; /** * The version number of the API representation. This is version 1. * @type {number} * @memberof Api */ version?: number; } /** * The configuration settings for this service. * @export * @interface AttributesMap */ export interface AttributesMap { /** * The comma seperated list of blocked media type. * @type {Array} * @memberof AttributesMap */ blockedTypes?: Array; /** * The max files size which can be uploaded in the file service. * @type {number} * @memberof AttributesMap */ maxFileSizeMB?: number; } /** * This is a base schema used to define paginated collections of resources. This base schema is extended by other schemas in APIs by adding an \'items\' array property. These extensions define the application/vnd.sas.collection media type (version 2) * @export * @interface BaseCollection2 */ export interface BaseCollection2 { /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof BaseCollection2 */ accept?: string; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof BaseCollection2 */ count?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof BaseCollection2 */ limit?: number; /** * The links that apply to the collection. * @type {Array} * @memberof BaseCollection2 */ links?: Array; /** * The name of the collection. * @type {string} * @memberof BaseCollection2 */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof BaseCollection2 */ start?: number; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof BaseCollection2 */ version?: number; } /** * Standard media type for error response. * @export * @interface Error2 */ export interface Error2 { /** * Messages that provide additional details about the cause of the error. * @type {Array} * @memberof Error2 */ details?: Array; /** * The numeric ID for the error. * @type {number} * @memberof Error2 */ errorCode?: number; /** * Any additional errors that occurred. * @type {Array} * @memberof Error2 */ errors?: Array; /** * The HTTP status code for the error. * @type {number} * @memberof Error2 */ httpStatusCode?: number; /** * The string ID for the error. * @type {string} * @memberof Error2 */ id?: string; /** * The links that apply to the error. * @type {Array} * @memberof Error2 */ links?: Array; /** * The message for the error. * @type {string} * @memberof Error2 */ message?: string; /** * A message that describes how to resolve the error. * @type {string} * @memberof Error2 */ remediation?: string; /** * The version number of the error representation. This representation is version 2. * @type {number} * @memberof Error2 */ version?: number; } /** * The file service field to be indexed. * @export * @interface Field */ export interface Field { /** * The boolean value to represent if the field is primary key. * @type {boolean} * @memberof Field */ primaryKey?: boolean; /** * The name of the field. * @type {string} * @memberof Field */ name?: string; /** * The type of the field. * @type {string} * @memberof Field */ type?: string; /** * The label given to the field. * @type {string} * @memberof Field */ label?: string; /** * It indicates if the field is facetable. * @type {boolean} * @memberof Field */ facetable?: boolean; /** * It indicates if the field is searchable. * @type {boolean} * @memberof Field */ searchable?: boolean; /** * It indicates if the field is default facet. * @type {boolean} * @memberof Field */ defaultFacet?: boolean; /** * It indicates if the field is multivalued. * @type {boolean} * @memberof Field */ multiValued?: boolean; /** * It indicates if the field should be displayed. * @type {boolean} * @memberof Field */ displayableFacet?: boolean; } /** * Details of file resource * @export * @interface FileResource */ export interface FileResource { /** * The URI of the object that is associated with or linked to a file resource. * @type {string} * @memberof FileResource */ parentUri?: string; /** * Properties that are specific to this file. Each property uses a \"key\" : \"value\" format. Use a comma to separate properties. * @type {{ [key: string]: string; }} * @memberof FileResource */ properties?: { [key: string]: string }; /** * Value for the Content-Disposition header. It is specified in response when downloading the file. * @type {string} * @memberof FileResource */ contentDisposition?: string; /** * The type of the content. * @type {string} * @memberof FileResource */ contentType?: string; /** * The name of the author. * @type {string} * @memberof FileResource */ createdBy?: string; /** * The timestamp that indicates when the file resource was created. * @type {string} * @memberof FileResource */ creationTimeStamp?: string; /** * The description of the file resource. * @type {string} * @memberof FileResource */ description?: string; /** * The type of the file resource. * @type {string} * @memberof FileResource */ documentType?: string; /** * The encoding of the file resource. * @type {string} * @memberof FileResource */ encoding?: string; /** * The identifier of the file resource. * @type {string} * @memberof FileResource */ id?: string; /** * Links that apply to this file resource. The links are \"self\", \"content\", \"patch\", \"update\", and \"delete\". * @type {Array} * @memberof FileResource */ links?: Array; /** * The name of the user who modified this file resource. * @type {string} * @memberof FileResource */ modifiedBy?: string; /** * The timestamp when the file resource was modified. * @type {string} * @memberof FileResource */ modifiedTimeStamp?: string; /** * The name of the file resource. * @type {string} * @memberof FileResource */ name?: string; /** * The byte size of the file resource content. * @type {number} * @memberof FileResource */ size?: number; /** * The type definition name of the file. If the file is associated with a folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using the type-registry service. If it fails to find a default value, it defaults to \"file\". * @type {string} * @memberof FileResource */ typeDefName?: string; /** * It indicates if a file is searchable or not. * @type {boolean} * @memberof FileResource */ searchable?: boolean; /** * It indicates the version of the file. In case the file is not versioned then the value will be \'0\'. If the file is versioned then the file Version will be greater then \'0\'. * @type {number} * @memberof FileResource */ fileVersion?: number; /** * It indicates the fileStatus whether locked or unlocked. * @type {string} * @memberof FileResource */ fileStatus?: string; /** * An indicator specifying if a file contains virus or not. * @type {boolean} * @memberof FileResource */ virusDetected?: boolean; /** * An indicator specifying if a file of type html, JS or CSS, contains an URL. * @type {boolean} * @memberof FileResource */ urlDetected?: boolean; /** * An indicator that if a file contains vulnerability then the file will be quarantined. * @type {boolean} * @memberof FileResource */ quarantine?: boolean; } /** * A collection of file representations. * @export * @interface FileResourceCollection */ export interface FileResourceCollection { /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FileResourceCollection */ accept?: string; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FileResourceCollection */ count?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FileResourceCollection */ limit?: number; /** * The links that apply to the collection. * @type {Array} * @memberof FileResourceCollection */ links?: Array; /** * The name of the collection. * @type {string} * @memberof FileResourceCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FileResourceCollection */ start?: number; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FileResourceCollection */ version?: number; /** * The array of application/vnd.sas.file representations. * @type {Array} * @memberof FileResourceCollection */ items?: Array; } /** * * @export * @interface FileResourceCollectionAllOf */ export interface FileResourceCollectionAllOf { /** * The array of application/vnd.sas.file representations. * @type {Array} * @memberof FileResourceCollectionAllOf */ items?: Array; } /** * Collection of indexable representation of the files. * @export * @interface FileResourceIndex */ export interface FileResourceIndex { /** * The version of the representation. * @type {number} * @memberof FileResourceIndex */ version?: number; /** * * @type {Array} * @memberof FileResourceIndex */ properties?: Array; /** * The URI of the representation. * @type {string} * @memberof FileResourceIndex */ resourceUri?: string; /** * The sasType of the representation. * @type {string} * @memberof FileResourceIndex */ sasType?: string; } /** * A collection of file representations. * @export * @interface FileResourceIndexCollection */ export interface FileResourceIndexCollection { /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FileResourceIndexCollection */ accept?: string; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FileResourceIndexCollection */ count?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FileResourceIndexCollection */ limit?: number; /** * The links that apply to the collection. * @type {Array} * @memberof FileResourceIndexCollection */ links?: Array; /** * The name of the collection. * @type {string} * @memberof FileResourceIndexCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FileResourceIndexCollection */ start?: number; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FileResourceIndexCollection */ version?: number; /** * The array of file indexable representations. * @type {Array} * @memberof FileResourceIndexCollection */ items?: Array; } /** * * @export * @interface FileResourceIndexCollectionAllOf */ export interface FileResourceIndexCollectionAllOf { /** * The array of file indexable representations. * @type {Array} * @memberof FileResourceIndexCollectionAllOf */ items?: Array; } /** * A generic summary representation of a file. * @export * @interface FileResourceSummary */ export interface FileResourceSummary { /** * The name of the author. * @type {string} * @memberof FileResourceSummary */ createdBy?: string; /** * The timestamp that indicates when the file resource was created. * @type {string} * @memberof FileResourceSummary */ creationTimeStamp?: string; /** * The description of the file resource. * @type {string} * @memberof FileResourceSummary */ description?: string; /** * The identifier of the file resource. * @type {string} * @memberof FileResourceSummary */ id?: string; /** * The alternate link to fetch the complete representation of the file resource--for example, vnd.sas.file. * @type {Array} * @memberof FileResourceSummary */ links?: Array; /** * The name of the user who modified the file resource. * @type {string} * @memberof FileResourceSummary */ modifiedBy?: string; /** * The timestamp that indicates when the file resource was modified. * @type {string} * @memberof FileResourceSummary */ modifiedTimeStamp?: string; /** * The name of the file. * @type {string} * @memberof FileResourceSummary */ name?: string; /** * The timestamp that indicates when the file expires. * @type {string} * @memberof FileResourceSummary */ expirationTimeStamp?: string; /** * The type definition name of the fileIf the file is associated with a folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using type-registry service. If it fails to find a default value, it defaults to \"file\". * @type {string} * @memberof FileResourceSummary */ typeDefName?: string; /** * The version of the media type. * @type {number} * @memberof FileResourceSummary */ version?: number; } /** * A collection of file representations. * @export * @interface FileResourceSummaryCollection */ export interface FileResourceSummaryCollection { /** * A space-delimited list of media types from which an `Accept` header may be constructed. * @type {string} * @memberof FileResourceSummaryCollection */ accept?: string; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FileResourceSummaryCollection */ count?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FileResourceSummaryCollection */ limit?: number; /** * The links that apply to the collection. * @type {Array} * @memberof FileResourceSummaryCollection */ links?: Array; /** * The name of the collection. * @type {string} * @memberof FileResourceSummaryCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FileResourceSummaryCollection */ start?: number; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FileResourceSummaryCollection */ version?: number; /** * The array of file resource summary representations. * @type {Array} * @memberof FileResourceSummaryCollection */ items?: Array; } /** * * @export * @interface FileResourceSummaryCollectionAllOf */ export interface FileResourceSummaryCollectionAllOf { /** * The array of file resource summary representations. * @type {Array} * @memberof FileResourceSummaryCollectionAllOf */ items?: Array; } /** * File to Patch * @export * @interface FileToPatch */ export interface FileToPatch { /** * The URI of the object that is associated with or linked to a file resource. * @type {string} * @memberof FileToPatch */ parentUri?: string; /** * The properties that are specific to this file. Each property uses a \"key\" : \"value\" format. Use a comma to separate properties. * @type {{ [key: string]: string; }} * @memberof FileToPatch */ properties?: { [key: string]: string }; /** * The value for the Content-Disposition header. This is specified in response when downloading the file. * @type {string} * @memberof FileToPatch */ contentDisposition?: string; /** * The description of the file resource. * @type {string} * @memberof FileToPatch */ description?: string; /** * The type of the file resource. * @type {string} * @memberof FileToPatch */ documentType?: string; /** * The name of the file resource. * @type {string} * @memberof FileToPatch */ name: string; /** * It indicates if a file is searchable or not. * @type {boolean} * @memberof FileToPatch */ searchable: boolean; /** * The type definition name of the file. If the file is associated with a folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using the type-registry service. If it fails to find a default value, it defaults to \"file\". * @type {string} * @memberof FileToPatch */ typeDefName?: string; } /** * INdexable representation of the file. * @export * @interface IndexableDataElement */ export interface IndexableDataElement { /** * The name of the field. * @type {string} * @memberof IndexableDataElement */ name?: string; /** * The value of the field. * @type {string} * @memberof IndexableDataElement */ value?: string; } /** * A link to a related operation or resource. * @export * @interface Link */ export interface Link { /** * The URL for the link. * @type {string} * @memberof Link */ href?: string; /** * If this is a link to a container, `itemType` is the media type or link type for the items in the container. * @type {string} * @memberof Link */ itemType?: string; /** * The HTTP method for the link. * @type {string} * @memberof Link */ method?: string; /** * The relationship of the link to the resource. * @type {string} * @memberof Link */ rel?: string; /** * The media type or link type of the items in the response body for a `PUT`, `POST`, or `PATCH` operation. * @type {string} * @memberof Link */ responseItemType?: string; /** * The media type or link type of the response body for a `PUT`, `POST`, or `PATCH` operation. * @type {string} * @memberof Link */ responseType?: string; /** * The title for the link. * @type {string} * @memberof Link */ title?: string; /** * The media type or link type for the link. * @type {string} * @memberof Link */ type?: string; /** * The relative URI for the link. * @type {string} * @memberof Link */ uri?: string; } /** * File to Patch for quarantine status * @export * @interface QuarantineFileToPatch */ export interface QuarantineFileToPatch { /** * An indicator that if a file contains vulnerability then the file will be quarantined. * @type {boolean} * @memberof QuarantineFileToPatch */ quarantine: boolean; } /** * The schema representation of file service fields to be indexed. * @export * @interface Schema */ export interface Schema { /** * The collection of schema fields. * @type {Array} * @memberof Schema */ fields?: Array; /** * The version of the representation. * @type {number} * @memberof Schema */ version?: number; } /** * Multiple parentUri values that are specified as an array of string values. * @export * @interface Selection */ export interface Selection { /** * An array of links to related resources and actions. * @type {Array} * @memberof Selection */ links?: Array; /** * An array of resource IDs or URIs * @type {Array} * @memberof Selection */ resources?: Array; /** * A URI template in which the {id} parameter can be replaced with a value from the \"resources\" array in order to yield the URI of the identified resource. * @type {string} * @memberof Selection */ template?: string; /** * Specifies whether the resources array contains IDs, URIs, or both.
\"id\"
the array contains resource identifiers only. This is the default if \"type\" is omitted.
\"uri\"
the array contains resource URIs
\"mixed\"
the array contains a mixture of identifiers and URIs.
* @type {string} * @memberof Selection */ type?: SelectionTypeEnum; /** * The schema version number of this media type. This representation is version 1. * @type {number} * @memberof Selection */ version?: number; } export const SelectionTypeEnum = { Id: "id", Uri: "uri", Mixed: "mixed", } as const; export type SelectionTypeEnum = (typeof SelectionTypeEnum)[keyof typeof SelectionTypeEnum]; /** * The configuration settings exposed for commons usage. * @export * @interface Settings */ export interface Settings { /** * Version information for this attribute list. * @type {number} * @memberof Settings */ version: number; /** * The navigable links relative to this media type. * @type {Array} * @memberof Settings */ links: Array; /** * * @type {AttributesMap} * @memberof Settings */ attributes: AttributesMap; } /** * FilesApi - axios parameter creator * @export */ export const FilesApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Copies the file if the user has Read access to the specified file. * @summary Copy an existing file * @param {string} fileId The identifier of the file resource for which to fetch content. * @param {string} [contentDisposition] The content disposition. The previously assigned value can be changed. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @param {string} [expirationTimeStamp] The date and time at which a file expires. If not specified, the file never expires. * @param {string} [parentFolderUri] The URI of the folder in which to add the file. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createCopyOfFile: async ( fileId: string, contentDisposition?: string, expirationTimeStamp?: string, parentFolderUri?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("createCopyOfFile", "fileId", fileId); const localVarPath = `/files/{fileId}/copy`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (expirationTimeStamp !== undefined) { localVarQueryParameter["expirationTimeStamp"] = expirationTimeStamp; } if (parentFolderUri !== undefined) { localVarQueryParameter["parentFolderUri"] = parentFolderUri; } if (contentDisposition != null) { localVarHeaderParameter["Content-Disposition"] = String(contentDisposition); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Creates a new file resource by passing file content in the request body. * @summary Create new file resource * @param {string} [contentType] The actual MIME type of the file. * @param {string} [contentDisposition] The content disposition. It indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @param {string} [expirationTimeStamp] A timestamp that indicates when a file expires. If this is not specified, the file never expires. * @param {string} [parentFolderUri] The URI of the folder in which the file should be made a member. * @param {string} [searchable] An indicator specifying if a file is searchable or not. Defaulted to \'true\' indicating file is searchable. * @param {string} [typeDefName] The type definition name of the file. If the file is associated with a folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using type-registry service. If it fails to find a default value, it defaults to \"file\". * @param {boolean} [versioned] An indicator specifying if a file is a version control file or not. If set to true, the endpoint will return first version of the file. * @param {string} [body] The contents of the file to be passed in raw format in the request body. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createNewFile: async ( contentType?: string, contentDisposition?: string, expirationTimeStamp?: string, parentFolderUri?: string, searchable?: string, typeDefName?: string, versioned?: boolean, body?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/files#rawUpload`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (expirationTimeStamp !== undefined) { localVarQueryParameter["expirationTimeStamp"] = expirationTimeStamp; } if (parentFolderUri !== undefined) { localVarQueryParameter["parentFolderUri"] = parentFolderUri; } if (searchable !== undefined) { localVarQueryParameter["searchable"] = searchable; } if (typeDefName !== undefined) { localVarQueryParameter["typeDefName"] = typeDefName; } if (versioned !== undefined) { localVarQueryParameter["versioned"] = versioned; } if (contentType != null) { localVarHeaderParameter["Content-Type"] = String(contentType); } if (contentDisposition != null) { localVarHeaderParameter["Content-Disposition"] = String(contentDisposition); } localVarHeaderParameter["Content-Type"] = "application/json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( body, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Creates a new file resource by passing a file in the form of a multipart request. * @summary Create a new file resource * @param {string} [contentType] The MIME type for the multipart request. You must specify \"multipart/form-data; boundary={boundaryString}\". You can specify the actual MIME type of the file by using Content-Type as form data in the request body. * @param {string} [contentDisposition] The content disposition. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @param {string} [expirationTimeStamp] A timestamp that indicates when a file expires. If it is not specified, the file never expires. * @param {string} [parentFolderUri] The URI of the folder in which to add the file. * @param {string} [searchable] An indicator specifying if a file is searchable or not. Defaulted to \'true\' indicating file is searchable. * @param {string} [typeDefName] The type definition name of the file. If the file is associated with folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using type-registry service. If it fails to find a default value, it defaults to \"file\". * @param {boolean} [versioned] An indicator specifying if a file is a version control file or not. If set to true, the endpoint will return first version of the file. * @param {boolean} [recoverable] An indicator specifying if a file is recoverable or not.If a user deleted the file then those files can be recovered.There is a certain retention period till which the file will be retained. * @param {string} [filename] The name of the file. Clients must specify name of the file as form data in the request body. * @param {File} [file] The actual file content. The content should be listed in the format of standard form data in the request body. Only one file is permitted in a multipart request. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createNewFileMultiPart: async ( contentType?: string, contentDisposition?: string, expirationTimeStamp?: string, parentFolderUri?: string, searchable?: string, typeDefName?: string, versioned?: boolean, recoverable?: boolean, filename?: string, file?: File, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/files#multipartUpload`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; const localVarFormParams = new ( (configuration && configuration.formDataCtor) || FormData )(); if (expirationTimeStamp !== undefined) { localVarQueryParameter["expirationTimeStamp"] = expirationTimeStamp; } if (parentFolderUri !== undefined) { localVarQueryParameter["parentFolderUri"] = parentFolderUri; } if (searchable !== undefined) { localVarQueryParameter["searchable"] = searchable; } if (typeDefName !== undefined) { localVarQueryParameter["typeDefName"] = typeDefName; } if (versioned !== undefined) { localVarQueryParameter["versioned"] = versioned; } if (recoverable !== undefined) { localVarQueryParameter["recoverable"] = recoverable; } if (contentType != null) { localVarHeaderParameter["Content-Type"] = String(contentType); } if (contentDisposition != null) { localVarHeaderParameter["Content-Disposition"] = String(contentDisposition); } if (filename !== undefined) { localVarFormParams.append("filename", filename as any); } if (file !== undefined) { localVarFormParams.append("file", file as any); } localVarHeaderParameter["Content-Type"] = "multipart/form-data"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = localVarFormParams; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes the file resource. * @summary Delete a file resource * @param {string} fileId The identifier of the file resource to delete. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFileResource: async ( fileId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("deleteFileResource", "fileId", fileId); const localVarPath = `/files/{fileId}`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Deletes file resources for the specified parentUri. If the user is not authorized to delete all matching files, no files are deleted. * @summary Delete file resources * @param {string} parentUri The parent URI that is associated with the file resources to be deleted. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFileResourceForGivenParentUri: async ( parentUri: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'parentUri' is not null or undefined assertParamExists( "deleteFileResourceForGivenParentUri", "parentUri", parentUri, ); const localVarPath = `/files`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parentUri !== undefined) { localVarQueryParameter["parentUri"] = parentUri; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the file resources that are associated with multiple parentUri specifications. Request the parentUri values in the body. The returned collection is grouped by parentUri. * @summary Get file resources for multiple parentUris * @param {Selection} selection Multiple parentUri values that are specified as an array of string values. The file resources that are associated with each parentUri are retrieved. * @param {string} [acceptItem] The file resource media type value. If this is not specified, the API returns the latest version. * @param {*} [options] Override http request option. * @throws {RequiredError} */ fetchFilesForParentUris: async ( selection: Selection, acceptItem?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'selection' is not null or undefined assertParamExists("fetchFilesForParentUris", "selection", selection); const localVarPath = `/files#fetchFilesForMultipleParentUri`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.selection+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( selection, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves a file resource by specifying a fileId. * @summary Get a file resource * @param {string} fileId The identifier of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFile: async ( fileId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getFile", "fileId", fileId); const localVarPath = `/files/{fileId}`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get file resources * @param {string} [acceptItem] The file resource media type value. If this is not specified, the API returns the latest version. * @param {string} [parentUri] The URI of the associated object or parent object. * @param {number} [start] The offset of the first member to return. The default value is 0. * @param {number} [limit] The maximum number of members to return. The default value is 10. * @param {string} [filter] The filter criteria to apply to the returned member collection. * @param {string} [sortBy] The sort criteria applies to the returned member collection. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileResourceForFilterQuery: async ( acceptItem?: string, parentUri?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/files`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parentUri !== undefined) { localVarQueryParameter["parentUri"] = parentUri; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves file resources of all the versions of a given fileId. Standard paging, option is available. * @summary Get all the versions of a given file id * @param {string} fileId The specific field identifier of the file to return. * @param {number} [start] The offset of the first member to return. The default value is 0. * @param {number} [limit] The maximum number of members to return. The default value is 10. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileVersionResourceForFilterQuery: async ( fileId: string, start?: number, limit?: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists( "getFileVersionResourceForFilterQuery", "fileId", fileId, ); const localVarPath = `/files/{fileId}/versions`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the content of the file resource. * @summary Get file resource content * @param {string} fileId The identifier of the file resource for which to fetch content. * @param {boolean} [changeContentDisposition] Specifies whether to use the persisted content-disposition value. If this is specified to true and the word \"attachment\" appears in the content-disposition, it is changed to \"inline\". No other changes are made to the content-disposition value. * @param {string} [ifRange] A conditional range request. The client must specify the previously returned `ETag` as the `If-Range` header value. This determines whether the resource has been modified. If it has been modified, the entire file is returned. Otherwise, only partial content is returned using the `Range` header. * @param {string} [range] A specific range request. The value specifies the required byte range--for example, bytes=0-100. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getfileContentForGivenId: async ( fileId: string, changeContentDisposition?: boolean, ifRange?: string, range?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getfileContentForGivenId", "fileId", fileId); const localVarPath = `/files/{fileId}/content`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (changeContentDisposition !== undefined) { localVarQueryParameter["changeContentDisposition"] = changeContentDisposition; } if (ifRange != null) { localVarHeaderParameter["If-Range"] = String(ifRange); } if (range != null) { localVarHeaderParameter["Range"] = String(range); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the content of the file resource for a specified version. * @summary Get the file resource content for a specified version * @param {string} fileId The identifier of the file resource for which to fetch content. * @param {string} fileVersion The version of the file resource for which to fetch content. * @param {boolean} [changeContentDisposition] Specifies whether to use the persisted content-disposition value. If this is specified to true and the word \"attachment\" appears in the content-disposition, it is changed to \"inline\". No other changes are made to the content-disposition value. * @param {string} [ifRange] A conditional range request. The client must specify the previously returned `ETag` as the `If-Range` header value. This determines whether the resource has been modified. If it has been modified, the entire file is returned. Otherwise, only partial content is returned using the `Range` header. * @param {string} [range] A specific range request. The value specifies the required byte range--for example, bytes=0-100. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getfileContentForGivenVersion: async ( fileId: string, fileVersion: string, changeContentDisposition?: boolean, ifRange?: string, range?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getfileContentForGivenVersion", "fileId", fileId); // verify required parameter 'fileVersion' is not null or undefined assertParamExists( "getfileContentForGivenVersion", "fileVersion", fileVersion, ); const localVarPath = `/files/{fileId}/version/{fileVersion}/content` .replace(`{${"fileId"}}`, encodeURIComponent(String(fileId))) .replace(`{${"fileVersion"}}`, encodeURIComponent(String(fileVersion))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (changeContentDisposition !== undefined) { localVarQueryParameter["changeContentDisposition"] = changeContentDisposition; } if (ifRange != null) { localVarHeaderParameter["If-Range"] = String(ifRange); } if (range != null) { localVarHeaderParameter["Range"] = String(range); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves a file resource by specifying fileVersion of a fileId. * @summary Get a file resource for specific version * @param {string} fileId The identifier of the file resource. * @param {number} fileVersion The version of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getfileIdForGivenVersion: async ( fileId: string, fileVersion: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getfileIdForGivenVersion", "fileId", fileId); // verify required parameter 'fileVersion' is not null or undefined assertParamExists("getfileIdForGivenVersion", "fileVersion", fileVersion); const localVarPath = `/files/{fileId}/version/{fileVersion}` .replace(`{${"fileId"}}`, encodeURIComponent(String(fileId))) .replace(`{${"fileVersion"}}`, encodeURIComponent(String(fileVersion))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * This endpoint returns schema field to be indexed by search service. * @summary Get schema for indexing * @param {string} [accept] The type specific schema representation media type application/vnd.sas.search.type.schema+json. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getfileindexschema: async ( accept?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/files#schema`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (accept != null) { localVarHeaderParameter["Accept"] = String(accept); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a file resource exists for the specified fileId. * @summary Check if a file resource exists * @param {string} fileId The identifier of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFile: async ( fileId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("headersForFile", "fileId", fileId); const localVarPath = `/files/{fileId}`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Determines whether a file resource exists for the specified version of fileId. * @summary Check if a file resource exists for given fileVersion * @param {string} fileId The identifier of the file resource. * @param {number} fileVersion The version of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForfileIdForGivenVersion: async ( fileId: string, fileVersion: number, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("headersForfileIdForGivenVersion", "fileId", fileId); // verify required parameter 'fileVersion' is not null or undefined assertParamExists( "headersForfileIdForGivenVersion", "fileVersion", fileVersion, ); const localVarPath = `/files/{fileId}/version/{fileVersion}` .replace(`{${"fileId"}}`, encodeURIComponent(String(fileId))) .replace(`{${"fileVersion"}}`, encodeURIComponent(String(fileVersion))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the file resource information. The user can change these attributes: `name`, `description`, `parentUri`, `documentType`, `contentDisposition`, `properties`, `expirationTimeStamp`,`typeDefName` and `searchable` * @summary Update a file resource * @param {string} fileId The identifier of the file resource to update. * @param {FileToPatch} fileToPatch The file resource to update. * @param {string} [ifMatch] The entity tag that was obtained from the most recent `ETag` response header. * @param {string} [ifUnmodifiedSince] The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @param {*} [options] Override http request option. * @throws {RequiredError} */ patchFileResourceInfo: async ( fileId: string, fileToPatch: FileToPatch, ifMatch?: string, ifUnmodifiedSince?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("patchFileResourceInfo", "fileId", fileId); // verify required parameter 'fileToPatch' is not null or undefined assertParamExists("patchFileResourceInfo", "fileToPatch", fileToPatch); const localVarPath = `/files/{fileId}`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.file+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( fileToPatch, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the file resource information. The user can change these attributes: `name`, `description`, `parentUri`, `documentType`, `contentDisposition`, `properties`,`expirationTimeStamp`,`typeDefName` and `searchable` * @summary Update a file resource * @param {string} fileId The identifier of the file resource to update. * @param {FileToPatch} fileToPatch The file resource to update. * @param {string} [ifMatch] The entity tag that was obtained from the most recent `ETag` response header. * @param {string} [ifUnmodifiedSince] The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFileResource: async ( fileId: string, fileToPatch: FileToPatch, ifMatch?: string, ifUnmodifiedSince?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("updateFileResource", "fileId", fileId); // verify required parameter 'fileToPatch' is not null or undefined assertParamExists("updateFileResource", "fileToPatch", fileToPatch); const localVarPath = `/files/{fileId}`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.file+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( fileToPatch, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the content of the file resource. * @summary Update file resource content * @param {string} fileId The identifier of the file resource for which to fetch content. * @param {string} contentType The content type. Specify this as \"multipart/form-data\" if you are using a multipart request, or specify the actual MIME type of the file if the request is a raw data upload. * @param {File} file The file data. If you are using a raw data upload request, the request body should contain only the file data (the actual file content). If you are using a multipart request, the request body should be in multipart or form-data format, where the file data is listed as `file` in the form data. Only one file is permitted in a multipart request. * @param {string} [ifMatch] The entity tag that was obtained from the most recent `ETag` response header. * @param {string} [ifUnmodifiedSince] The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @param {string} [contentDisposition] The content disposition. The previously assigned value can be changed. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @param {*} [options] Override http request option. * @throws {RequiredError} */ updatedFileContent: async ( fileId: string, contentType: string, file: File, ifMatch?: string, ifUnmodifiedSince?: string, contentDisposition?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("updatedFileContent", "fileId", fileId); // verify required parameter 'contentType' is not null or undefined assertParamExists("updatedFileContent", "contentType", contentType); // verify required parameter 'file' is not null or undefined assertParamExists("updatedFileContent", "file", file); const localVarPath = `/files/{fileId}/content`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; const localVarFormParams = new ( (configuration && configuration.formDataCtor) || FormData )(); if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } if (contentType != null) { localVarHeaderParameter["Content-Type"] = String(contentType); } if (contentDisposition != null) { localVarHeaderParameter["Content-Disposition"] = String(contentDisposition); } if (file !== undefined) { localVarFormParams.append("file", file as any); } localVarHeaderParameter["Content-Type"] = "multipart/form-data"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = localVarFormParams; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * FilesApi - functional programming interface * @export */ export const FilesApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = FilesApiAxiosParamCreator(configuration); return { /** * Copies the file if the user has Read access to the specified file. * @summary Copy an existing file * @param {FilesApiCreateCopyOfFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createCopyOfFile( requestParameters: FilesApiCreateCopyOfFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createCopyOfFile( requestParameters.fileId, requestParameters.contentDisposition, requestParameters.expirationTimeStamp, requestParameters.parentFolderUri, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Creates a new file resource by passing file content in the request body. * @summary Create new file resource * @param {FilesApiCreateNewFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createNewFile( requestParameters: FilesApiCreateNewFileRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createNewFile( requestParameters.contentType, requestParameters.contentDisposition, requestParameters.expirationTimeStamp, requestParameters.parentFolderUri, requestParameters.searchable, requestParameters.typeDefName, requestParameters.versioned, requestParameters.body, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Creates a new file resource by passing a file in the form of a multipart request. * @summary Create a new file resource * @param {FilesApiCreateNewFileMultiPartRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createNewFileMultiPart( requestParameters: FilesApiCreateNewFileMultiPartRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createNewFileMultiPart( requestParameters.contentType, requestParameters.contentDisposition, requestParameters.expirationTimeStamp, requestParameters.parentFolderUri, requestParameters.searchable, requestParameters.typeDefName, requestParameters.versioned, requestParameters.recoverable, requestParameters.filename, requestParameters.file, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes the file resource. * @summary Delete a file resource * @param {FilesApiDeleteFileResourceRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFileResource( requestParameters: FilesApiDeleteFileResourceRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFileResource( requestParameters.fileId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Deletes file resources for the specified parentUri. If the user is not authorized to delete all matching files, no files are deleted. * @summary Delete file resources * @param {FilesApiDeleteFileResourceForGivenParentUriRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFileResourceForGivenParentUri( requestParameters: FilesApiDeleteFileResourceForGivenParentUriRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFileResourceForGivenParentUri( requestParameters.parentUri, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the file resources that are associated with multiple parentUri specifications. Request the parentUri values in the body. The returned collection is grouped by parentUri. * @summary Get file resources for multiple parentUris * @param {FilesApiFetchFilesForParentUrisRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async fetchFilesForParentUris( requestParameters: FilesApiFetchFilesForParentUrisRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.fetchFilesForParentUris( requestParameters.selection, requestParameters.acceptItem, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves a file resource by specifying a fileId. * @summary Get a file resource * @param {FilesApiGetFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFile( requestParameters: FilesApiGetFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFile( requestParameters.fileId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get file resources * @param {FilesApiGetFileResourceForFilterQueryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileResourceForFilterQuery( requestParameters: FilesApiGetFileResourceForFilterQueryRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileResourceForFilterQuery( requestParameters.acceptItem, requestParameters.parentUri, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves file resources of all the versions of a given fileId. Standard paging, option is available. * @summary Get all the versions of a given file id * @param {FilesApiGetFileVersionResourceForFilterQueryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileVersionResourceForFilterQuery( requestParameters: FilesApiGetFileVersionResourceForFilterQueryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileVersionResourceForFilterQuery( requestParameters.fileId, requestParameters.start, requestParameters.limit, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the content of the file resource. * @summary Get file resource content * @param {FilesApiGetfileContentForGivenIdRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getfileContentForGivenId( requestParameters: FilesApiGetfileContentForGivenIdRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getfileContentForGivenId( requestParameters.fileId, requestParameters.changeContentDisposition, requestParameters.ifRange, requestParameters.range, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the content of the file resource for a specified version. * @summary Get the file resource content for a specified version * @param {FilesApiGetfileContentForGivenVersionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getfileContentForGivenVersion( requestParameters: FilesApiGetfileContentForGivenVersionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getfileContentForGivenVersion( requestParameters.fileId, requestParameters.fileVersion, requestParameters.changeContentDisposition, requestParameters.ifRange, requestParameters.range, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves a file resource by specifying fileVersion of a fileId. * @summary Get a file resource for specific version * @param {FilesApiGetfileIdForGivenVersionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getfileIdForGivenVersion( requestParameters: FilesApiGetfileIdForGivenVersionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getfileIdForGivenVersion( requestParameters.fileId, requestParameters.fileVersion, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * This endpoint returns schema field to be indexed by search service. * @summary Get schema for indexing * @param {FilesApiGetfileindexschemaRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getfileindexschema( requestParameters: FilesApiGetfileindexschemaRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getfileindexschema( requestParameters.accept, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a file resource exists for the specified fileId. * @summary Check if a file resource exists * @param {FilesApiHeadersForFileRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFile( requestParameters: FilesApiHeadersForFileRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFile( requestParameters.fileId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Determines whether a file resource exists for the specified version of fileId. * @summary Check if a file resource exists for given fileVersion * @param {FilesApiHeadersForfileIdForGivenVersionRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForfileIdForGivenVersion( requestParameters: FilesApiHeadersForfileIdForGivenVersionRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForfileIdForGivenVersion( requestParameters.fileId, requestParameters.fileVersion, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the file resource information. The user can change these attributes: `name`, `description`, `parentUri`, `documentType`, `contentDisposition`, `properties`, `expirationTimeStamp`,`typeDefName` and `searchable` * @summary Update a file resource * @param {FilesApiPatchFileResourceInfoRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async patchFileResourceInfo( requestParameters: FilesApiPatchFileResourceInfoRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.patchFileResourceInfo( requestParameters.fileId, requestParameters.fileToPatch, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the file resource information. The user can change these attributes: `name`, `description`, `parentUri`, `documentType`, `contentDisposition`, `properties`,`expirationTimeStamp`,`typeDefName` and `searchable` * @summary Update a file resource * @param {FilesApiUpdateFileResourceRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFileResource( requestParameters: FilesApiUpdateFileResourceRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFileResource( requestParameters.fileId, requestParameters.fileToPatch, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the content of the file resource. * @summary Update file resource content * @param {FilesApiUpdatedFileContentRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updatedFileContent( requestParameters: FilesApiUpdatedFileContentRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updatedFileContent( requestParameters.fileId, requestParameters.contentType, requestParameters.file, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, requestParameters.contentDisposition, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createCopyOfFile operation in FilesApi. * @export * @interface FilesApiCreateCopyOfFileRequest */ export interface FilesApiCreateCopyOfFileRequest { /** * The identifier of the file resource for which to fetch content. * @type {string} * @memberof FilesApiCreateCopyOfFile */ readonly fileId: string; /** * The content disposition. The previously assigned value can be changed. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @type {string} * @memberof FilesApiCreateCopyOfFile */ readonly contentDisposition?: string; /** * The date and time at which a file expires. If not specified, the file never expires. * @type {string} * @memberof FilesApiCreateCopyOfFile */ readonly expirationTimeStamp?: string; /** * The URI of the folder in which to add the file. * @type {string} * @memberof FilesApiCreateCopyOfFile */ readonly parentFolderUri?: string; } /** * Request parameters for createNewFile operation in FilesApi. * @export * @interface FilesApiCreateNewFileRequest */ export interface FilesApiCreateNewFileRequest { /** * The actual MIME type of the file. * @type {string} * @memberof FilesApiCreateNewFile */ readonly contentType?: string; /** * The content disposition. It indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @type {string} * @memberof FilesApiCreateNewFile */ readonly contentDisposition?: string; /** * A timestamp that indicates when a file expires. If this is not specified, the file never expires. * @type {string} * @memberof FilesApiCreateNewFile */ readonly expirationTimeStamp?: string; /** * The URI of the folder in which the file should be made a member. * @type {string} * @memberof FilesApiCreateNewFile */ readonly parentFolderUri?: string; /** * An indicator specifying if a file is searchable or not. Defaulted to \'true\' indicating file is searchable. * @type {string} * @memberof FilesApiCreateNewFile */ readonly searchable?: string; /** * The type definition name of the file. If the file is associated with a folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using type-registry service. If it fails to find a default value, it defaults to \"file\". * @type {string} * @memberof FilesApiCreateNewFile */ readonly typeDefName?: string; /** * An indicator specifying if a file is a version control file or not. If set to true, the endpoint will return first version of the file. * @type {boolean} * @memberof FilesApiCreateNewFile */ readonly versioned?: boolean; /** * The contents of the file to be passed in raw format in the request body. * @type {string} * @memberof FilesApiCreateNewFile */ readonly body?: string; } /** * Request parameters for createNewFileMultiPart operation in FilesApi. * @export * @interface FilesApiCreateNewFileMultiPartRequest */ export interface FilesApiCreateNewFileMultiPartRequest { /** * The MIME type for the multipart request. You must specify \"multipart/form-data; boundary={boundaryString}\". You can specify the actual MIME type of the file by using Content-Type as form data in the request body. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly contentType?: string; /** * The content disposition. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly contentDisposition?: string; /** * A timestamp that indicates when a file expires. If it is not specified, the file never expires. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly expirationTimeStamp?: string; /** * The URI of the folder in which to add the file. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly parentFolderUri?: string; /** * An indicator specifying if a file is searchable or not. Defaulted to \'true\' indicating file is searchable. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly searchable?: string; /** * The type definition name of the file. If the file is associated with folder and the client does not provide the value of this parameter, the file-service tries to find the best possible value using type-registry service. If it fails to find a default value, it defaults to \"file\". * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly typeDefName?: string; /** * An indicator specifying if a file is a version control file or not. If set to true, the endpoint will return first version of the file. * @type {boolean} * @memberof FilesApiCreateNewFileMultiPart */ readonly versioned?: boolean; /** * An indicator specifying if a file is recoverable or not.If a user deleted the file then those files can be recovered.There is a certain retention period till which the file will be retained. * @type {boolean} * @memberof FilesApiCreateNewFileMultiPart */ readonly recoverable?: boolean; /** * The name of the file. Clients must specify name of the file as form data in the request body. * @type {string} * @memberof FilesApiCreateNewFileMultiPart */ readonly filename?: string; /** * The actual file content. The content should be listed in the format of standard form data in the request body. Only one file is permitted in a multipart request. * @type {File} * @memberof FilesApiCreateNewFileMultiPart */ readonly file?: File; } /** * Request parameters for deleteFileResource operation in FilesApi. * @export * @interface FilesApiDeleteFileResourceRequest */ export interface FilesApiDeleteFileResourceRequest { /** * The identifier of the file resource to delete. * @type {string} * @memberof FilesApiDeleteFileResource */ readonly fileId: string; } /** * Request parameters for deleteFileResourceForGivenParentUri operation in FilesApi. * @export * @interface FilesApiDeleteFileResourceForGivenParentUriRequest */ export interface FilesApiDeleteFileResourceForGivenParentUriRequest { /** * The parent URI that is associated with the file resources to be deleted. * @type {string} * @memberof FilesApiDeleteFileResourceForGivenParentUri */ readonly parentUri: string; } /** * Request parameters for fetchFilesForParentUris operation in FilesApi. * @export * @interface FilesApiFetchFilesForParentUrisRequest */ export interface FilesApiFetchFilesForParentUrisRequest { /** * Multiple parentUri values that are specified as an array of string values. The file resources that are associated with each parentUri are retrieved. * @type {Selection} * @memberof FilesApiFetchFilesForParentUris */ readonly selection: Selection; /** * The file resource media type value. If this is not specified, the API returns the latest version. * @type {string} * @memberof FilesApiFetchFilesForParentUris */ readonly acceptItem?: string; } /** * Request parameters for getFile operation in FilesApi. * @export * @interface FilesApiGetFileRequest */ export interface FilesApiGetFileRequest { /** * The identifier of the file resource. * @type {string} * @memberof FilesApiGetFile */ readonly fileId: string; } /** * Request parameters for getFileResourceForFilterQuery operation in FilesApi. * @export * @interface FilesApiGetFileResourceForFilterQueryRequest */ export interface FilesApiGetFileResourceForFilterQueryRequest { /** * The file resource media type value. If this is not specified, the API returns the latest version. * @type {string} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly acceptItem?: string; /** * The URI of the associated object or parent object. * @type {string} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly parentUri?: string; /** * The offset of the first member to return. The default value is 0. * @type {number} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly start?: number; /** * The maximum number of members to return. The default value is 10. * @type {number} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly limit?: number; /** * The filter criteria to apply to the returned member collection. * @type {string} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly filter?: string; /** * The sort criteria applies to the returned member collection. * @type {string} * @memberof FilesApiGetFileResourceForFilterQuery */ readonly sortBy?: string; } /** * Request parameters for getFileVersionResourceForFilterQuery operation in FilesApi. * @export * @interface FilesApiGetFileVersionResourceForFilterQueryRequest */ export interface FilesApiGetFileVersionResourceForFilterQueryRequest { /** * The specific field identifier of the file to return. * @type {string} * @memberof FilesApiGetFileVersionResourceForFilterQuery */ readonly fileId: string; /** * The offset of the first member to return. The default value is 0. * @type {number} * @memberof FilesApiGetFileVersionResourceForFilterQuery */ readonly start?: number; /** * The maximum number of members to return. The default value is 10. * @type {number} * @memberof FilesApiGetFileVersionResourceForFilterQuery */ readonly limit?: number; } /** * Request parameters for getfileContentForGivenId operation in FilesApi. * @export * @interface FilesApiGetfileContentForGivenIdRequest */ export interface FilesApiGetfileContentForGivenIdRequest { /** * The identifier of the file resource for which to fetch content. * @type {string} * @memberof FilesApiGetfileContentForGivenId */ readonly fileId: string; /** * Specifies whether to use the persisted content-disposition value. If this is specified to true and the word \"attachment\" appears in the content-disposition, it is changed to \"inline\". No other changes are made to the content-disposition value. * @type {boolean} * @memberof FilesApiGetfileContentForGivenId */ readonly changeContentDisposition?: boolean; /** * A conditional range request. The client must specify the previously returned `ETag` as the `If-Range` header value. This determines whether the resource has been modified. If it has been modified, the entire file is returned. Otherwise, only partial content is returned using the `Range` header. * @type {string} * @memberof FilesApiGetfileContentForGivenId */ readonly ifRange?: string; /** * A specific range request. The value specifies the required byte range--for example, bytes=0-100. * @type {string} * @memberof FilesApiGetfileContentForGivenId */ readonly range?: string; } /** * Request parameters for getfileContentForGivenVersion operation in FilesApi. * @export * @interface FilesApiGetfileContentForGivenVersionRequest */ export interface FilesApiGetfileContentForGivenVersionRequest { /** * The identifier of the file resource for which to fetch content. * @type {string} * @memberof FilesApiGetfileContentForGivenVersion */ readonly fileId: string; /** * The version of the file resource for which to fetch content. * @type {string} * @memberof FilesApiGetfileContentForGivenVersion */ readonly fileVersion: string; /** * Specifies whether to use the persisted content-disposition value. If this is specified to true and the word \"attachment\" appears in the content-disposition, it is changed to \"inline\". No other changes are made to the content-disposition value. * @type {boolean} * @memberof FilesApiGetfileContentForGivenVersion */ readonly changeContentDisposition?: boolean; /** * A conditional range request. The client must specify the previously returned `ETag` as the `If-Range` header value. This determines whether the resource has been modified. If it has been modified, the entire file is returned. Otherwise, only partial content is returned using the `Range` header. * @type {string} * @memberof FilesApiGetfileContentForGivenVersion */ readonly ifRange?: string; /** * A specific range request. The value specifies the required byte range--for example, bytes=0-100. * @type {string} * @memberof FilesApiGetfileContentForGivenVersion */ readonly range?: string; } /** * Request parameters for getfileIdForGivenVersion operation in FilesApi. * @export * @interface FilesApiGetfileIdForGivenVersionRequest */ export interface FilesApiGetfileIdForGivenVersionRequest { /** * The identifier of the file resource. * @type {string} * @memberof FilesApiGetfileIdForGivenVersion */ readonly fileId: string; /** * The version of the file resource. * @type {number} * @memberof FilesApiGetfileIdForGivenVersion */ readonly fileVersion: number; } /** * Request parameters for getfileindexschema operation in FilesApi. * @export * @interface FilesApiGetfileindexschemaRequest */ export interface FilesApiGetfileindexschemaRequest { /** * The type specific schema representation media type application/vnd.sas.search.type.schema+json. * @type {string} * @memberof FilesApiGetfileindexschema */ readonly accept?: string; } /** * Request parameters for headersForFile operation in FilesApi. * @export * @interface FilesApiHeadersForFileRequest */ export interface FilesApiHeadersForFileRequest { /** * The identifier of the file resource. * @type {string} * @memberof FilesApiHeadersForFile */ readonly fileId: string; } /** * Request parameters for headersForfileIdForGivenVersion operation in FilesApi. * @export * @interface FilesApiHeadersForfileIdForGivenVersionRequest */ export interface FilesApiHeadersForfileIdForGivenVersionRequest { /** * The identifier of the file resource. * @type {string} * @memberof FilesApiHeadersForfileIdForGivenVersion */ readonly fileId: string; /** * The version of the file resource. * @type {number} * @memberof FilesApiHeadersForfileIdForGivenVersion */ readonly fileVersion: number; } /** * Request parameters for patchFileResourceInfo operation in FilesApi. * @export * @interface FilesApiPatchFileResourceInfoRequest */ export interface FilesApiPatchFileResourceInfoRequest { /** * The identifier of the file resource to update. * @type {string} * @memberof FilesApiPatchFileResourceInfo */ readonly fileId: string; /** * The file resource to update. * @type {FileToPatch} * @memberof FilesApiPatchFileResourceInfo */ readonly fileToPatch: FileToPatch; /** * The entity tag that was obtained from the most recent `ETag` response header. * @type {string} * @memberof FilesApiPatchFileResourceInfo */ readonly ifMatch?: string; /** * The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @type {string} * @memberof FilesApiPatchFileResourceInfo */ readonly ifUnmodifiedSince?: string; } /** * Request parameters for updateFileResource operation in FilesApi. * @export * @interface FilesApiUpdateFileResourceRequest */ export interface FilesApiUpdateFileResourceRequest { /** * The identifier of the file resource to update. * @type {string} * @memberof FilesApiUpdateFileResource */ readonly fileId: string; /** * The file resource to update. * @type {FileToPatch} * @memberof FilesApiUpdateFileResource */ readonly fileToPatch: FileToPatch; /** * The entity tag that was obtained from the most recent `ETag` response header. * @type {string} * @memberof FilesApiUpdateFileResource */ readonly ifMatch?: string; /** * The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @type {string} * @memberof FilesApiUpdateFileResource */ readonly ifUnmodifiedSince?: string; } /** * Request parameters for updatedFileContent operation in FilesApi. * @export * @interface FilesApiUpdatedFileContentRequest */ export interface FilesApiUpdatedFileContentRequest { /** * The identifier of the file resource for which to fetch content. * @type {string} * @memberof FilesApiUpdatedFileContent */ readonly fileId: string; /** * The content type. Specify this as \"multipart/form-data\" if you are using a multipart request, or specify the actual MIME type of the file if the request is a raw data upload. * @type {string} * @memberof FilesApiUpdatedFileContent */ readonly contentType: string; /** * The file data. If you are using a raw data upload request, the request body should contain only the file data (the actual file content). If you are using a multipart request, the request body should be in multipart or form-data format, where the file data is listed as `file` in the form data. Only one file is permitted in a multipart request. * @type {File} * @memberof FilesApiUpdatedFileContent */ readonly file: File; /** * The entity tag that was obtained from the most recent `ETag` response header. * @type {string} * @memberof FilesApiUpdatedFileContent */ readonly ifMatch?: string; /** * The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @type {string} * @memberof FilesApiUpdatedFileContent */ readonly ifUnmodifiedSince?: string; /** * The content disposition. The previously assigned value can be changed. This indicates whether the content is expected to be displayed inline in a browser (as a web page or part of a web page) or as an attachment that is downloaded and saved locally. If a filename is specified in the header, it is used as the default name of the file. * @type {string} * @memberof FilesApiUpdatedFileContent */ readonly contentDisposition?: string; } /** * IndexApi - axios parameter creator * @export */ export const IndexApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Retrieves indexable representations of files that are associated with multiple parentUri specifications. Request the parentUri values in the body. The returned collection is grouped by parentUri. * @summary Get indexable representations for parentUris * @param {string} acceptItem The value of the file resource media type. You must specify this as \"application/vnd.sas.search.indexable.data\". * @param {Selection} selection Multiple parentUri values that are specified as an array of string values. The file resources that are associated with each parentUri are retrieved. * @param {*} [options] Override http request option. * @throws {RequiredError} */ fetchFilesIndexableRepForParentUris: async ( acceptItem: string, selection: Selection, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'acceptItem' is not null or undefined assertParamExists( "fetchFilesIndexableRepForParentUris", "acceptItem", acceptItem, ); // verify required parameter 'selection' is not null or undefined assertParamExists( "fetchFilesIndexableRepForParentUris", "selection", selection, ); const localVarPath = `/files#fetchIndexableRepresentationCollection`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.selection+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( selection, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves a generic indexable representation of file for the specified identifier. * @summary Get a generic indexable representation * @param {string} fileId The identifier of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFileIndexableRep: async ( fileId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getFileIndexableRep", "fileId", fileId); const localVarPath = `/files/{fileId}#getIndexableRepresentation`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves indexable representations of file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get indexable representations for files * @param {string} acceptItem The value of the file resource media type. You must specify this as \"application/vnd.sas.search.indexable.data\". * @param {string} [parentUri] The URI of the associated object or parent object. * @param {number} [start] The offset of the first member to return. The default is 0. * @param {number} [limit] The maximum number of members to return. The default value is 10. * @param {string} [filter] The filter criteria to apply to the returned member collection. * @param {string} [sortBy] The sort criteria to apply to the returned member collection. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFilesIndexableResource: async ( acceptItem: string, parentUri?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'acceptItem' is not null or undefined assertParamExists("getFilesIndexableResource", "acceptItem", acceptItem); const localVarPath = `/files#getIndexableRepresentationCollection`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parentUri !== undefined) { localVarQueryParameter["parentUri"] = parentUri; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * IndexApi - functional programming interface * @export */ export const IndexApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = IndexApiAxiosParamCreator(configuration); return { /** * Retrieves indexable representations of files that are associated with multiple parentUri specifications. Request the parentUri values in the body. The returned collection is grouped by parentUri. * @summary Get indexable representations for parentUris * @param {IndexApiFetchFilesIndexableRepForParentUrisRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async fetchFilesIndexableRepForParentUris( requestParameters: IndexApiFetchFilesIndexableRepForParentUrisRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.fetchFilesIndexableRepForParentUris( requestParameters.acceptItem, requestParameters.selection, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves a generic indexable representation of file for the specified identifier. * @summary Get a generic indexable representation * @param {IndexApiGetFileIndexableRepRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFileIndexableRep( requestParameters: IndexApiGetFileIndexableRepRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFileIndexableRep( requestParameters.fileId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves indexable representations of file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get indexable representations for files * @param {IndexApiGetFilesIndexableResourceRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFilesIndexableResource( requestParameters: IndexApiGetFilesIndexableResourceRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFilesIndexableResource( requestParameters.acceptItem, requestParameters.parentUri, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for fetchFilesIndexableRepForParentUris operation in IndexApi. * @export * @interface IndexApiFetchFilesIndexableRepForParentUrisRequest */ export interface IndexApiFetchFilesIndexableRepForParentUrisRequest { /** * The value of the file resource media type. You must specify this as \"application/vnd.sas.search.indexable.data\". * @type {string} * @memberof IndexApiFetchFilesIndexableRepForParentUris */ readonly acceptItem: string; /** * Multiple parentUri values that are specified as an array of string values. The file resources that are associated with each parentUri are retrieved. * @type {Selection} * @memberof IndexApiFetchFilesIndexableRepForParentUris */ readonly selection: Selection; } /** * Request parameters for getFileIndexableRep operation in IndexApi. * @export * @interface IndexApiGetFileIndexableRepRequest */ export interface IndexApiGetFileIndexableRepRequest { /** * The identifier of the file resource. * @type {string} * @memberof IndexApiGetFileIndexableRep */ readonly fileId: string; } /** * Request parameters for getFilesIndexableResource operation in IndexApi. * @export * @interface IndexApiGetFilesIndexableResourceRequest */ export interface IndexApiGetFilesIndexableResourceRequest { /** * The value of the file resource media type. You must specify this as \"application/vnd.sas.search.indexable.data\". * @type {string} * @memberof IndexApiGetFilesIndexableResource */ readonly acceptItem: string; /** * The URI of the associated object or parent object. * @type {string} * @memberof IndexApiGetFilesIndexableResource */ readonly parentUri?: string; /** * The offset of the first member to return. The default is 0. * @type {number} * @memberof IndexApiGetFilesIndexableResource */ readonly start?: number; /** * The maximum number of members to return. The default value is 10. * @type {number} * @memberof IndexApiGetFilesIndexableResource */ readonly limit?: number; /** * The filter criteria to apply to the returned member collection. * @type {string} * @memberof IndexApiGetFilesIndexableResource */ readonly filter?: string; /** * The sort criteria to apply to the returned member collection. * @type {string} * @memberof IndexApiGetFilesIndexableResource */ readonly sortBy?: string; } /** * RootApi - axios parameter creator * @export */ export const RootApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Indicates whether the service is available. * @summary Check the state of the service * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForRoot: async ( options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of links to the top-level resources that are available through the API. These top-level links include create and retrieve operations for /files. * @summary Get top-level resource links * @param {*} [options] Override http request option. * @throws {RequiredError} */ root: async (options: AxiosRequestConfig = {}): Promise => { const localVarPath = `/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * RootApi - functional programming interface * @export */ export const RootApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = RootApiAxiosParamCreator(configuration); return { /** * Indicates whether the service is available. * @summary Check the state of the service * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForRoot( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForRoot(options); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of links to the top-level resources that are available through the API. These top-level links include create and retrieve operations for /files. * @summary Get top-level resource links * @param {*} [options] Override http request option. * @throws {RequiredError} */ async root(options?: AxiosRequestConfig): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.root(options); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * SecurityApi - axios parameter creator * @export */ export const SecurityApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Updates the quarantine file resource information. The user can change only `quarantine` status. This end-Point is only accessible to SAS Administrators. * @summary Update the quarantine status of file resource * @param {string} fileId The identifier of the file resource to update. * @param {QuarantineFileToPatch} quarantineFileToPatch The file resource to update for quarantine status. * @param {string} [ifMatch] The entity tag that was obtained from the most recent `ETag` response header. * @param {string} [ifUnmodifiedSince] The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @param {*} [options] Override http request option. * @throws {RequiredError} */ patchFileResourceQuarantine: async ( fileId: string, quarantineFileToPatch: QuarantineFileToPatch, ifMatch?: string, ifUnmodifiedSince?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("patchFileResourceQuarantine", "fileId", fileId); // verify required parameter 'quarantineFileToPatch' is not null or undefined assertParamExists( "patchFileResourceQuarantine", "quarantineFileToPatch", quarantineFileToPatch, ); const localVarPath = `/files/{fileId}/quarantine`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.file+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( quarantineFileToPatch, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * SecurityApi - functional programming interface * @export */ export const SecurityApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = SecurityApiAxiosParamCreator(configuration); return { /** * Updates the quarantine file resource information. The user can change only `quarantine` status. This end-Point is only accessible to SAS Administrators. * @summary Update the quarantine status of file resource * @param {SecurityApiPatchFileResourceQuarantineRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async patchFileResourceQuarantine( requestParameters: SecurityApiPatchFileResourceQuarantineRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.patchFileResourceQuarantine( requestParameters.fileId, requestParameters.quarantineFileToPatch, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for patchFileResourceQuarantine operation in SecurityApi. * @export * @interface SecurityApiPatchFileResourceQuarantineRequest */ export interface SecurityApiPatchFileResourceQuarantineRequest { /** * The identifier of the file resource to update. * @type {string} * @memberof SecurityApiPatchFileResourceQuarantine */ readonly fileId: string; /** * The file resource to update for quarantine status. * @type {QuarantineFileToPatch} * @memberof SecurityApiPatchFileResourceQuarantine */ readonly quarantineFileToPatch: QuarantineFileToPatch; /** * The entity tag that was obtained from the most recent `ETag` response header. * @type {string} * @memberof SecurityApiPatchFileResourceQuarantine */ readonly ifMatch?: string; /** * The timestamp that was obtained from the most recent `Last-Modified` response header. This is ignored when `If-Match` is specified. * @type {string} * @memberof SecurityApiPatchFileResourceQuarantine */ readonly ifUnmodifiedSince?: string; } /** * SettingsApi - axios parameter creator * @export */ export const SettingsApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Returns the possible configuration settings that this API/service shares. * @summary Get the API/service configuration settings * @param {*} [options] Override http request option. * @throws {RequiredError} */ getSettings: async ( options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/commons/settings`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * SettingsApi - functional programming interface * @export */ export const SettingsApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = SettingsApiAxiosParamCreator(configuration); return { /** * Returns the possible configuration settings that this API/service shares. * @summary Get the API/service configuration settings * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getSettings( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getSettings(options); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * SummaryApi - axios parameter creator * @export */ export const SummaryApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Retrieves summary representations of file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get summary representations * @param {string} acceptItem The value of the file resource media type. You must specify this as \"application/vnd.sas.summary\". * @param {string} [parentUri] The URI of the associated object or parent object. * @param {number} [start] The offset of the first member to return. The default value is 0. * @param {number} [limit] The maximum number of members to return. The default value is 10. * @param {string} [filter] The filter criteria to apply to the returned member collection. * @param {string} [sortBy] The sort criteria to apply to the returned member collection. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFilesSummaryForFilter: async ( acceptItem: string, parentUri?: string, start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'acceptItem' is not null or undefined assertParamExists("getFilesSummaryForFilter", "acceptItem", acceptItem); const localVarPath = `/files#getSummaryRepresentationCollection`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parentUri !== undefined) { localVarQueryParameter["parentUri"] = parentUri; } if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves a generic summary representation of a file for the specified identifier. * @summary Get a generic summary representation * @param {string} fileId The identifier of the file resource. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getfileSummaryRepForGivenId: async ( fileId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'fileId' is not null or undefined assertParamExists("getfileSummaryRepForGivenId", "fileId", fileId); const localVarPath = `/files/{fileId}#getSummaryRepresentation`.replace( `{${"fileId"}}`, encodeURIComponent(String(fileId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * SummaryApi - functional programming interface * @export */ export const SummaryApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = SummaryApiAxiosParamCreator(configuration); return { /** * Retrieves summary representations of file resources for the specified criteria. Standard paging, filtering, and sorting options are available. * @summary Get summary representations * @param {SummaryApiGetFilesSummaryForFilterRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFilesSummaryForFilter( requestParameters: SummaryApiGetFilesSummaryForFilterRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFilesSummaryForFilter( requestParameters.acceptItem, requestParameters.parentUri, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves a generic summary representation of a file for the specified identifier. * @summary Get a generic summary representation * @param {SummaryApiGetfileSummaryRepForGivenIdRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getfileSummaryRepForGivenId( requestParameters: SummaryApiGetfileSummaryRepForGivenIdRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getfileSummaryRepForGivenId( requestParameters.fileId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for getFilesSummaryForFilter operation in SummaryApi. * @export * @interface SummaryApiGetFilesSummaryForFilterRequest */ export interface SummaryApiGetFilesSummaryForFilterRequest { /** * The value of the file resource media type. You must specify this as \"application/vnd.sas.summary\". * @type {string} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly acceptItem: string; /** * The URI of the associated object or parent object. * @type {string} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly parentUri?: string; /** * The offset of the first member to return. The default value is 0. * @type {number} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly start?: number; /** * The maximum number of members to return. The default value is 10. * @type {number} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly limit?: number; /** * The filter criteria to apply to the returned member collection. * @type {string} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly filter?: string; /** * The sort criteria to apply to the returned member collection. * @type {string} * @memberof SummaryApiGetFilesSummaryForFilter */ readonly sortBy?: string; } /** * Request parameters for getfileSummaryRepForGivenId operation in SummaryApi. * @export * @interface SummaryApiGetfileSummaryRepForGivenIdRequest */ export interface SummaryApiGetfileSummaryRepForGivenIdRequest { /** * The identifier of the file resource. * @type {string} * @memberof SummaryApiGetfileSummaryRepForGivenId */ readonly fileId: string; } ================================================ FILE: client/src/connection/rest/api/folders.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Folders * The Folders API provides an organizational structure for SAS and external content. It can also be used for favorites folders or a history of objects accessed. The resources that are stored in folders (members) use a URI to point back to those resources.

Terminology:

folder

A virtual container for other folders, or any resource that can be represented with a URI.

member

A resource contained in a folder. A member can itself be a folder, creating a hierarchical structure for folders and subfolders. Members have two types: child and reference. A child member inherits authorizations from its container, and a given resource can be a child only in a single folder. Reference members do not inherit authorizations, and a resource can have many references in many different folders. * * The version of the OpenAPI document: 4 * Contact: devex@sas.com * * NOTE: This class is auto generated by OpenAPI * Do not edit the class manually. */ /* tslint:disable */ /* eslint-disable */ import { AxiosRequestConfig, AxiosResponse } from "axios"; // URLSearchParams not necessarily used // @ts-ignore import { URL, URLSearchParams } from "url"; // Some imports not used depending on template conditions // @ts-ignore import { DUMMY_BASE_URL, RequestArgs, assertParamExists, createRequestFunction, serializeDataIfNeeded, setSearchParams, toPathString, } from "./common"; import { Configuration } from "./configuration"; /** * An ancestor entry that is returned from an ancestor\'s request. * @export * @interface Ancestor */ export interface Ancestor { /** * The URI whose ancestry was requested. * @type {string} * @memberof Ancestor */ childUri?: string; /** * An ordered list of the folders that parent the URI, starting with the immediate parent. * @type {Array} * @memberof Ancestor */ ancestors?: Array; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof Ancestor */ version?: number; } /** * A collection of ancestor entries that are returned from an ancestors request. * @export * @interface AncestorCollection */ export interface AncestorCollection { /** * The name of the collection. * @type {string} * @memberof AncestorCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof AncestorCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof AncestorCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof AncestorCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof AncestorCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof AncestorCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof AncestorCollection */ version?: number; /** * The collection of ancestor results. * @type {Array} * @memberof AncestorCollection */ items?: Array; } /** * * @export * @interface AncestorCollectionAllOf */ export interface AncestorCollectionAllOf { /** * The collection of ancestor results. * @type {Array} * @memberof AncestorCollectionAllOf */ items?: Array; } /** * This is a base schema used to define paginated collections of resources. This base schema is extended by other schemas in APIs by adding an \'items\' array property. These extensions define the application/vnd.sas.collection media type (version 2) * @export * @interface BaseCollection */ export interface BaseCollection { /** * The name of the collection. * @type {string} * @memberof BaseCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof BaseCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof BaseCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof BaseCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof BaseCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof BaseCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof BaseCollection */ version?: number; } /** * A representation of a delegate identifier that is recognized by the Folders API. * @export * @interface Delegate */ export interface Delegate { /** * The delegate name, always starting with \'@\'. * @type {string} * @memberof Delegate */ name?: string; /** * The folder name of the delegate, for example, for @myFolder, My Folder. * @type {string} * @memberof Delegate */ folderName?: string; /** * The value of the type field for this delegate. For example, for @myFolder, myFolder. * @type {string} * @memberof Delegate */ folderType?: string; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof Delegate */ version?: number; } /** * A collection of delegate objects. * @export * @interface DelegateCollection */ export interface DelegateCollection { /** * The name of the collection. * @type {string} * @memberof DelegateCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof DelegateCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof DelegateCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof DelegateCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof DelegateCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof DelegateCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof DelegateCollection */ version?: number; /** * The collection of delegate definitions. * @type {Array} * @memberof DelegateCollection */ items?: Array; } /** * * @export * @interface DelegateCollectionAllOf */ export interface DelegateCollectionAllOf { /** * The collection of delegate definitions. * @type {Array} * @memberof DelegateCollectionAllOf */ items?: Array; } /** * The representation of an error. * @export * @interface ErrorResponse */ export interface ErrorResponse { /** * The error message. * @type {string} * @memberof ErrorResponse */ message?: string; /** * The string ID for the error. * @type {string} * @memberof ErrorResponse */ id?: string; /** * The numeric ID for the error. * @type {number} * @memberof ErrorResponse */ errorCode?: number; /** * The HTTP status code for the error. * @type {number} * @memberof ErrorResponse */ httpStatusCode: number; /** * Messages that provide additional details about the cause of the error. * @type {Array} * @memberof ErrorResponse */ details?: Array; /** * A message that describes how to resolve the error. * @type {string} * @memberof ErrorResponse */ remediation?: string; /** * Any additional errors that occurred * @type {Array} * @memberof ErrorResponse */ errors?: Array; /** * The links that apply to the error. * @type {Array} * @memberof ErrorResponse */ links?: Array; /** * The version number of the error representation. This representation is version 2. * @type {number} * @memberof ErrorResponse */ version: number; } /** * The full representation of a folder object. * @export * @interface Folder */ export interface Folder { /** * Folder id. * @type {string} * @memberof Folder */ id?: string; /** * Localizable folder name. * @type {string} * @memberof Folder */ name?: string; /** * Folder description. * @type {string} * @memberof Folder */ description?: string; /** * The URI of this folder\'s parent folder. This is writable by the client. In order to perform a move, PUT this folder with an updated parentFolderUri pointing to the new parent. It is valid for this field to be null, which indicates a root folder. * @type {string} * @memberof Folder */ parentFolderUri?: string; /** * Timestamp of folder creation. * @type {string} * @memberof Folder */ creationTimeStamp?: string; /** * Timestamp of last folder modification. * @type {string} * @memberof Folder */ modifiedTimeStamp?: string; /** * The name of the user who created this folder. * @type {string} * @memberof Folder */ createdBy?: string; /** * The name of the last user who modified this object. * @type {string} * @memberof Folder */ modifiedBy?: string; /** * The folder type. * @type {string} * @memberof Folder */ type?: string; /** * The folder icon URI. * @type {string} * @memberof Folder */ iconUri?: string; /** * The number of members in the folder. * @type {number} * @memberof Folder */ memberCount?: number; /** * Links that apply to this object. Includes \"self\", \"members\", and \"delete\". * @type {Array} * @memberof Folder */ links?: Array; /** * A collection of name/value pairs that help describe the folder. * @type {{ [key: string]: string; }} * @memberof Folder */ properties?: { [key: string]: string }; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof Folder */ version?: number; } /** * A collection of folders. * @export * @interface FolderCollection */ export interface FolderCollection { /** * The name of the collection. * @type {string} * @memberof FolderCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FolderCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FolderCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FolderCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof FolderCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof FolderCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FolderCollection */ version?: number; /** * The actual results of a query. * @type {Array} * @memberof FolderCollection */ items?: Array; } /** * * @export * @interface FolderCollectionAllOf */ export interface FolderCollectionAllOf { /** * The actual results of a query. * @type {Array} * @memberof FolderCollectionAllOf */ items?: Array; } /** * The schema for creating a new folder. * @export * @interface FolderIn */ export interface FolderIn { /** * Localizable folder name. * @type {string} * @memberof FolderIn */ name: string; /** * Localizable folder description. * @type {string} * @memberof FolderIn */ description?: string; /** * Specialized subtype for this folder. The default value is \'folder\'. * @type {string} * @memberof FolderIn */ folderType?: string; /** * The URI of this folder\'s parent folder. This is writable by the client. In order to perform a move, PUT this folder with an updated parentFolderUri pointing to the new parent. It is valid for this field to be null, which indicates a root folder. * @type {string} * @memberof FolderIn */ parentFolderUri?: string; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof FolderIn */ version?: number; } /** * A representation of a folder type. * @export * @interface FolderType */ export interface FolderType { /** * The name of the folder type. This is the value that goes in the folderType field of a folder. * @type {string} * @memberof FolderType */ name?: string; /** * The localizable label that can be presented to a user. * @type {string} * @memberof FolderType */ label?: string; /** * True if the type is acceptable to use in a folder being created by a client. * @type {boolean} * @memberof FolderType */ userAssignable?: boolean; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof FolderType */ version?: number; } /** * A collection of folder types. * @export * @interface FolderTypeCollection */ export interface FolderTypeCollection { /** * The name of the collection. * @type {string} * @memberof FolderTypeCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof FolderTypeCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof FolderTypeCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof FolderTypeCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof FolderTypeCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof FolderTypeCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof FolderTypeCollection */ version?: number; /** * The collection of folder types. * @type {Array} * @memberof FolderTypeCollection */ items?: Array; } /** * * @export * @interface FolderTypeCollectionAllOf */ export interface FolderTypeCollectionAllOf { /** * The collection of folder types. * @type {Array} * @memberof FolderTypeCollectionAllOf */ items?: Array; } /** * A link to a related operation or resource. * @export * @interface Link */ export interface Link { /** * The HTTP method to invoke this endpoint. * @type {string} * @memberof Link */ method?: string; /** * The relationship of this URL to the object. * @type {string} * @memberof Link */ rel?: string; /** * The relative URI of the REST endpoint. * @type {string} * @memberof Link */ uri?: string; /** * The full URL of the REST endpoint. * @type {string} * @memberof Link */ href?: string; /** * The media type consumed/produced. * @type {string} * @memberof Link */ type?: string; } /** * The full representation of a folder member. * @export * @interface Member */ export interface Member { /** * Member id. * @type {string} * @memberof Member */ id?: string; /** * The URI of the item that the member represents. The service does not make any attempt to validate this field, so it can be anything. However, if this is a folder, it MUST be the folder\'s URI. It should come from the folder\'s \"self\" link, and not be assembled from pieces. * @type {string} * @memberof Member */ uri?: string; /** * Timestamp when member was last added to folder. * @type {string} * @memberof Member */ added?: string; /** * Must be \"child\" or \"reference\". Child members are deleted when the parent folder is deleted. Child members that rely on SAS authorization checking inherit authorization settings from the parent folder. An object can be a child of one and only one folder. Reference members have no such restrictions. Any member object can be referenced from an unrestricted number of containers. * @type {string} * @memberof Member */ type?: string; /** * The URI of this member\'s parent folder. This is writable by the client. In order to perform a move, PUT this member with an updated parentFolderUri pointing to the new parent. * @type {string} * @memberof Member */ parentFolderUri?: string; /** * Localizable name of the member object. This attribute is persisted with the folder for performance reasons. For SAS managed objects, this value is intended to be synchronized with the attribute persisted with the object. * @type {string} * @memberof Member */ name?: string; /** * Localizable description of the member object. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof Member */ description?: string; /** * The user name of the user who created the object represented by this member. * @type {string} * @memberof Member */ createdBy?: string; /** * Timestamp of member object creation. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof Member */ creationTimeStamp?: string; /** * The user name of the user who last modified the object represented by this member. * @type {string} * @memberof Member */ modifiedBy?: string; /** * Timestamp of last member object modification. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof Member */ modifiedTimeStamp?: string; /** * Member object type. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof Member */ contentType?: string; /** * (version 2) If the resource has a subtype that applies, the client can specify it when creating the member. This gives the client navigating the members more information for filtering, sorting, or searching for matching members. * @type {string} * @memberof Member */ typeDefName?: string; /** * Member object icon URI. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof Member */ iconUri?: string; /** * Optional ordering specifier to provide user ordering of members. When retrieving members, if no other ordering is specified, members are ordered by this field in ascending order. The values do not have to be sequential; the results are ordered according to the values provided. They also do not have to be unique. However, duplicates result in arbitrary ordering of records with duplicate values. * @type {number} * @memberof Member */ orderNum?: number; /** * Links that apply to this object. Links for members include \"self\" and \"delete\". * @type {Array} * @memberof Member */ links?: Array; /** * This media type\'s schema version number. This representation is version 2. * @type {number} * @memberof Member */ version?: number; } /** * A collection of folder members. * @export * @interface MemberCollection */ export interface MemberCollection { /** * The name of the collection. * @type {string} * @memberof MemberCollection */ name?: string; /** * The zero-based index of the first item in the collection. * @type {number} * @memberof MemberCollection */ start?: number; /** * The number of items that were requested for the collection. * @type {number} * @memberof MemberCollection */ limit?: number; /** * If populated indicates the number of items in the collection. * @type {number} * @memberof MemberCollection */ count?: number; /** * A space-delimited list of media types from which an `Accept` header can be constructed. * @type {string} * @memberof MemberCollection */ accept?: string; /** * The links that apply to the collection. * @type {Array} * @memberof MemberCollection */ links?: Array; /** * The version number of the collection representation. This representation is version 2. * @type {number} * @memberof MemberCollection */ version?: number; /** * The actual results of a query. * @type {Array} * @memberof MemberCollection */ items?: Array; } /** * * @export * @interface MemberCollectionAllOf */ export interface MemberCollectionAllOf { /** * The actual results of a query. * @type {Array} * @memberof MemberCollectionAllOf */ items?: Array; } /** * The schema for creating a new folder member. * @export * @interface MemberIn */ export interface MemberIn { /** * The URI of the item that the member represents. The service does not make any attempt to validate this field, so it can be anything. However, if this is a folder, it MUST be the folder\'s URI. It should come from the folder\'s \"self\" link, and not be assembled from pieces. * @type {string} * @memberof MemberIn */ uri: string; /** * Must be \"child\" or \"reference\". Child members are deleted when the parent folder is deleted. Child members that rely on SAS authorization checking inherit authorization settings from the parent folder. An object can be a child of one and only one folder. Reference members have no such restrictions. Any member object can be referenced from an unrestricted number of containers. * @type {string} * @memberof MemberIn */ type: string; /** * The URI of this member\'s parent folder. This is writable by the client. In order to perform a move, PUT this member with an updated parentFolderUri pointing to the new parent. * @type {string} * @memberof MemberIn */ parentFolderUri?: string; /** * Localizable name of the member object. This attribute is persisted with the folder for performance reasons. For SAS managed objects, this value is intended to be synchronized with the attribute persisted with the object. * @type {string} * @memberof MemberIn */ name: string; /** * Localizable description of the member object. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof MemberIn */ description?: string; /** * Timestamp of member object creation. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof MemberIn */ creationTimeStamp?: string; /** * Timestamp of last member object modification. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof MemberIn */ modifiedTimeStamp?: string; /** * Member object type. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof MemberIn */ contentType?: string; /** * (version 2) If the resource has a subtype that applies, the client can specify it when creating the member. This gives the client navigating the members more information for filtering, sorting, or searching for matching members. * @type {string} * @memberof MemberIn */ typeDefName?: string; /** * Member object icon URI. Member attribute is synchronized with attribute of member object for SAS managed objects. * @type {string} * @memberof MemberIn */ iconUri?: string; /** * Optional ordering specifier to provide user ordering of members. When retrieving members, if no other ordering is specified, members are ordered by this field in ascending order. The values do not have to be sequential; the results are ordered according to the values provided. The values also do not have to be unique. However, duplicates result in arbitrary ordering of records with duplicate values. * @type {number} * @memberof MemberIn */ orderNum?: number; /** * This media type\'s schema version number. This representation is version 2. * @type {number} * @memberof MemberIn */ version?: number; } /** * A representation of a path request. * @export * @interface Path */ export interface Path { /** * An ordered list of parent folder names, with the desired object\'s name at the end of the list. * @type {Array} * @memberof Path */ items?: Array; /** * The content type of the object to return. Must match the content type of the Member entry. * @type {string} * @memberof Path */ contentType?: string; /** * The type definition name of the member being requested. * @type {string} * @memberof Path */ typeDefName?: string; /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof Path */ version?: number; } /** * The summarized representation of a resource. Often used in collection responses when more specific details are not needed. * @export * @interface Summary */ export interface Summary { /** * The unique identifier for the resource. * @type {string} * @memberof Summary */ id: string; /** * The name of the resource. * @type {string} * @memberof Summary */ name?: string; /** * The type of the resource. * @type {string} * @memberof Summary */ type?: string; /** * The description of the resource. * @type {string} * @memberof Summary */ description?: string; /** * The user who created the resource. * @type {string} * @memberof Summary */ createdBy?: string; /** * The timestamp in YYYY-MM-DDThh:mm:ss.sssZ format when the resource was created. * @type {string} * @memberof Summary */ creationTimeStamp?: string; /** * The user who most recently modified the resource. * @type {string} * @memberof Summary */ modifiedBy?: string; /** * The timestamp in YYYY-MM-DDThh:mm:ss.sssZ format when the resource was last modified. * @type {string} * @memberof Summary */ modifiedTimeStamp?: string; /** * The links that apply to the resource. * @type {Array} * @memberof Summary */ links: Array; /** * The version number of the resource. This representation is version 1. * @type {number} * @memberof Summary */ version: number; } /** * The response from a pre-flight validation request. For APIs that support validation, the client can run operations (typically on resources in the `/commons/validation`) with `application/vnd.sas.validation+json` as the requested response type (via the `Accept:` request header). The service will validate the request but not execute the request, and return this response to indicate whether the request was valid at the time it was made. * @export * @interface Validation */ export interface Validation { /** * This media type\'s schema version number. This representation is version 1. * @type {number} * @memberof Validation */ version: number; /** * `true` if and only if the validation was successful. * @type {boolean} * @memberof Validation */ valid: boolean; /** * * @type {ErrorResponse} * @memberof Validation */ error?: ErrorResponse; /** * An array of links to related resources and actions. * @type {Array} * @memberof Validation */ links?: Array; } /** * FolderApi - axios parameter creator * @export */ export const FolderApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Creates a new empty folder. Members can be added to the folder using the `/folders/{folderId}/members` endpoint. This service maintains name uniqueness at any given level in the folder structure. In other words, if you try to create a root folder named \"newRootFolder\", and a root folder with that name exists, the operation fails with a 409 status. If you try to create a subfolder using the `?parentFolderUri` parameter, and the parent already has a subfolder with the same name, the operation fails with a 409 status. * @summary Create a new folder * @param {string} parentFolderUri URI of folder to add new folder as a child. This parameter is required. An explicit value of \"none\" indicates that the client wants to create a root folder. * @param {FolderIn} [folderIn] Folder * @param {*} [options] Override http request option. * @throws {RequiredError} */ createFolder: async ( parentFolderUri: string, folderIn?: FolderIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'parentFolderUri' is not null or undefined assertParamExists("createFolder", "parentFolderUri", parentFolderUri); const localVarPath = `/folders`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (parentFolderUri !== undefined) { localVarQueryParameter["parentFolderUri"] = parentFolderUri; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( folderIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * The specified folder is deleted. If the folder is not empty, a recursive option can be specified to indicate a recursive delete. If the folder is not empty and no recursive option is present, an error response is returned. Any non-folder content will not be deleted. * @summary Delete a folder * @param {string} folderId The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {boolean} [recursive] do a recursive delete of the folder * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFolder: async ( folderId: string, recursive?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("deleteFolder", "folderId", folderId); const localVarPath = `/folders/{folderId}`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (recursive !== undefined) { localVarQueryParameter["recursive"] = recursive; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Find an object, if it exists, by path. The client provides an ordered list of parent folder names, the object name, and the object content type. * @summary Find an object by path * @param {Path} path The set of parent names, the object name, and the object content type. * @param {*} [options] Override http request option. * @throws {RequiredError} */ findByPath: async ( path: Path, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'path' is not null or undefined assertParamExists("findByPath", "path", path); const localVarPath = `/paths`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder.path+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( path, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the folders for the given set of delegate names, or all delegate folders if no names are provided. * @summary Get the folders for a given set of delegate names * @param {string} [name] The name of the delegate (including the leading \'@\') desired. Multiple values of the name parameter can be provided. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getDelegateFolders: async ( name?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/delegateFolders`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (name !== undefined) { localVarQueryParameter["name"] = name; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the specified folder. * @summary Get a folder * @param {string} folderId The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} [acceptLanguage] Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolder: async ( folderId: string, acceptLanguage?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("getFolder", "folderId", folderId); const localVarPath = `/folders/{folderId}`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (acceptLanguage != null) { localVarHeaderParameter["Accept-Language"] = String(acceptLanguage); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Get a folder with a resource wildcard. Either a path or a child URI is required. The result must be exactly one matching folder. If the childUri parameter is provided, the parent folder of the member with the matching URI is returned, if it exists. If the path is provided, it must be a slash-delimited path to the desired folder. * @summary Get a folder with a path or a child URI * @param {string} [childUri] The URI of a resource whose parent folder you want to return. This can be a folder or non-folder resource. * @param {string} [path] The slash-delimited path to a folder. For example, `/root/child/grandchild/greatgrandchild` would return the folder greatgrandchild. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolderItem: async ( childUri?: string, path?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/folders/@item`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (childUri !== undefined) { localVarQueryParameter["childUri"] = childUri; } if (path !== undefined) { localVarQueryParameter["path"] = path; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of folders. Standard paging, filtering, and sorting options are provided. * @summary Get a list of folders * @param {number} [start] 0-based offset of first folder to return. The default value is 0. * @param {number} [limit] Maximum number of folders to return. The default value is 20. * @param {string} [filter] Filter criteria for returned folders. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). <br>Any member of the Folder object can be used to filter the results: id, name, description, createdBy, modifiedBy, properties, folderType, or parent. Date fields currently cannot be used to filter results. <br>Sample queries<br> <ul> <li>Get Root Folders: `/folders?filter=isNull(parent)`</li> <li>Get folders by name: `/folders?filter=contains(name, \'Sample\')`</li> <li>Get folders by folderType: `/folders?filter=in(folderType, \'history\', \'favorites\')`</li> </ul> * @param {string} [sortBy] Sort returned folder. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting).<br> The default sort order is name:ascending. Other valid sorting options are <ul><li><code>orderNum</code> the order specified by the user</li> <li><code>added</code> the timestamp when the item was added to the folder</li> <li><code>name</code> the folder name </ul> * @param {string} [childUri] Return only folders containing a child member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. The childUri has special semantics, because it should return only a single item. The URL form `/folders/.?childUri={resourceUri}` can be used to return a single item. * @param {string} [referenceUri] Return only folders containing a reference member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. * @param {string} [memberUri] Return only folders containing any member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. * @param {string} [acceptLanguage] Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @param {string} [acceptItem] If provided, this should be an alternative media type that the service recognizes. If the media type is not one that the service can provide, a 406 response is returned. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolders: async ( start?: number, limit?: number, filter?: string, sortBy?: string, childUri?: string, referenceUri?: string, memberUri?: string, acceptLanguage?: string, acceptItem?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/folders`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (childUri !== undefined) { localVarQueryParameter["childUri"] = childUri; } if (referenceUri !== undefined) { localVarQueryParameter["referenceUri"] = referenceUri; } if (memberUri !== undefined) { localVarQueryParameter["memberUri"] = memberUri; } if (acceptLanguage != null) { localVarHeaderParameter["Accept-Language"] = String(acceptLanguage); } if (acceptItem != null) { localVarHeaderParameter["Accept-Item"] = String(acceptItem); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of root folders. Standard paging, filtering, and sorting options are provided. * @summary Get a list of root folders * @param {number} [start] 0-based offset of first folder to return. The default value is 0. * @param {number} [limit] Maximum number of folders to return. The default value is 20. * @param {string} [filter] Filter criteria for returned folders. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). <br>Any member of the Folder object can be used to filter the results: id, name, description, createdBy, modifiedBy, properties, folderType, or parent. Date fields currently cannot be used to filter results. * @param {string} [sortBy] Sort returned folder. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting).<br> The default sort order is name:ascending. Other valid sorting options are <li><code>added</code> the timestamp when the item was added to the folder</li> <li><code>name</code> the folder name </ul> * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRootFolders: async ( start?: number, limit?: number, filter?: string, sortBy?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/rootFolders`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the specified folder. * @summary Get a folder * @param {string} folderId The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} [acceptLanguage] Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFolder: async ( folderId: string, acceptLanguage?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("headersForFolder", "folderId", folderId); const localVarPath = `/folders/{folderId}`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (acceptLanguage != null) { localVarHeaderParameter["Accept-Language"] = String(acceptLanguage); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the provided fields of a folder. The client can provide a sparsely populated object, and only the non-null fields contribute to the updates. A body such as { \"name\": \"NewFolderName\" } causes the folder to have its name changed, but no other field is affected. The full resulting object is returned in the response. * @summary Make a partial update to a folder * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} [ifMatch] The ETag that was returned from a GET, POST, or PUT of this folder. * @param {string} [ifUnmodifiedSince] The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @param {FolderIn} [folderIn] Folder * @param {*} [options] Override http request option. * @throws {RequiredError} */ patchFolder: async ( folderId: string, ifMatch?: string, ifUnmodifiedSince?: string, folderIn?: FolderIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("patchFolder", "folderId", folderId); const localVarPath = `/folders/{folderId}`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( folderIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Move the child member for the resource specified by childUri to the folder specified by parentFolderUri. * @summary Move the child member for a resource to a folder specified by the parentFolderUri * @param {string} [childUri] The URI of a resource whose parent folder is to be changed. * @param {string} [parentFolderUri] The URI of the target folder to move the resource to. * @param {*} [options] Override http request option. * @throws {RequiredError} */ patchMoveFolderItem: async ( childUri?: string, parentFolderUri?: string, options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/folders/@item`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (childUri !== undefined) { localVarQueryParameter["childUri"] = childUri; } if (parentFolderUri !== undefined) { localVarQueryParameter["parentFolderUri"] = parentFolderUri; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Replaces an existing folder. * @summary Update a folder * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} [ifMatch] The ETag that was returned from a GET, POST, or PUT of this folder. * @param {string} [ifUnmodifiedSince] The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @param {FolderIn} [folderIn] Folder * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFolder: async ( folderId: string, ifMatch?: string, ifUnmodifiedSince?: string, folderIn?: FolderIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("updateFolder", "folderId", folderId); const localVarPath = `/folders/{folderId}`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( folderIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * FolderApi - functional programming interface * @export */ export const FolderApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = FolderApiAxiosParamCreator(configuration); return { /** * Creates a new empty folder. Members can be added to the folder using the `/folders/{folderId}/members` endpoint. This service maintains name uniqueness at any given level in the folder structure. In other words, if you try to create a root folder named \"newRootFolder\", and a root folder with that name exists, the operation fails with a 409 status. If you try to create a subfolder using the `?parentFolderUri` parameter, and the parent already has a subfolder with the same name, the operation fails with a 409 status. * @summary Create a new folder * @param {FolderApiCreateFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createFolder( requestParameters: FolderApiCreateFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createFolder( requestParameters.parentFolderUri, requestParameters.folderIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * The specified folder is deleted. If the folder is not empty, a recursive option can be specified to indicate a recursive delete. If the folder is not empty and no recursive option is present, an error response is returned. Any non-folder content will not be deleted. * @summary Delete a folder * @param {FolderApiDeleteFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFolder( requestParameters: FolderApiDeleteFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFolder( requestParameters.folderId, requestParameters.recursive, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Find an object, if it exists, by path. The client provides an ordered list of parent folder names, the object name, and the object content type. * @summary Find an object by path * @param {FolderApiFindByPathRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async findByPath( requestParameters: FolderApiFindByPathRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.findByPath( requestParameters.path, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the folders for the given set of delegate names, or all delegate folders if no names are provided. * @summary Get the folders for a given set of delegate names * @param {FolderApiGetDelegateFoldersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getDelegateFolders( requestParameters: FolderApiGetDelegateFoldersRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getDelegateFolders( requestParameters.name, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the specified folder. * @summary Get a folder * @param {FolderApiGetFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolder( requestParameters: FolderApiGetFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolder( requestParameters.folderId, requestParameters.acceptLanguage, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Get a folder with a resource wildcard. Either a path or a child URI is required. The result must be exactly one matching folder. If the childUri parameter is provided, the parent folder of the member with the matching URI is returned, if it exists. If the path is provided, it must be a slash-delimited path to the desired folder. * @summary Get a folder with a path or a child URI * @param {FolderApiGetFolderItemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolderItem( requestParameters: FolderApiGetFolderItemRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolderItem( requestParameters.childUri, requestParameters.path, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of folders. Standard paging, filtering, and sorting options are provided. * @summary Get a list of folders * @param {FolderApiGetFoldersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolders( requestParameters: FolderApiGetFoldersRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolders( requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, requestParameters.childUri, requestParameters.referenceUri, requestParameters.memberUri, requestParameters.acceptLanguage, requestParameters.acceptItem, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of root folders. Standard paging, filtering, and sorting options are provided. * @summary Get a list of root folders * @param {FolderApiGetRootFoldersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getRootFolders( requestParameters: FolderApiGetRootFoldersRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getRootFolders( requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the specified folder. * @summary Get a folder * @param {FolderApiHeadersForFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFolder( requestParameters: FolderApiHeadersForFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFolder( requestParameters.folderId, requestParameters.acceptLanguage, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the provided fields of a folder. The client can provide a sparsely populated object, and only the non-null fields contribute to the updates. A body such as { \"name\": \"NewFolderName\" } causes the folder to have its name changed, but no other field is affected. The full resulting object is returned in the response. * @summary Make a partial update to a folder * @param {FolderApiPatchFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async patchFolder( requestParameters: FolderApiPatchFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.patchFolder( requestParameters.folderId, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, requestParameters.folderIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Move the child member for the resource specified by childUri to the folder specified by parentFolderUri. * @summary Move the child member for a resource to a folder specified by the parentFolderUri * @param {FolderApiPatchMoveFolderItemRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async patchMoveFolderItem( requestParameters: FolderApiPatchMoveFolderItemRequest = {}, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.patchMoveFolderItem( requestParameters.childUri, requestParameters.parentFolderUri, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Replaces an existing folder. * @summary Update a folder * @param {FolderApiUpdateFolderRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFolder( requestParameters: FolderApiUpdateFolderRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFolder( requestParameters.folderId, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, requestParameters.folderIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createFolder operation in FolderApi. * @export * @interface FolderApiCreateFolderRequest */ export interface FolderApiCreateFolderRequest { /** * URI of folder to add new folder as a child. This parameter is required. An explicit value of \"none\" indicates that the client wants to create a root folder. * @type {string} * @memberof FolderApiCreateFolder */ readonly parentFolderUri: string; /** * Folder * @type {FolderIn} * @memberof FolderApiCreateFolder */ readonly folderIn?: FolderIn; } /** * Request parameters for deleteFolder operation in FolderApi. * @export * @interface FolderApiDeleteFolderRequest */ export interface FolderApiDeleteFolderRequest { /** * The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof FolderApiDeleteFolder */ readonly folderId: string; /** * do a recursive delete of the folder * @type {boolean} * @memberof FolderApiDeleteFolder */ readonly recursive?: boolean; } /** * Request parameters for findByPath operation in FolderApi. * @export * @interface FolderApiFindByPathRequest */ export interface FolderApiFindByPathRequest { /** * The set of parent names, the object name, and the object content type. * @type {Path} * @memberof FolderApiFindByPath */ readonly path: Path; } /** * Request parameters for getDelegateFolders operation in FolderApi. * @export * @interface FolderApiGetDelegateFoldersRequest */ export interface FolderApiGetDelegateFoldersRequest { /** * The name of the delegate (including the leading \'@\') desired. Multiple values of the name parameter can be provided. * @type {string} * @memberof FolderApiGetDelegateFolders */ readonly name?: string; } /** * Request parameters for getFolder operation in FolderApi. * @export * @interface FolderApiGetFolderRequest */ export interface FolderApiGetFolderRequest { /** * The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof FolderApiGetFolder */ readonly folderId: string; /** * Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @type {string} * @memberof FolderApiGetFolder */ readonly acceptLanguage?: string; } /** * Request parameters for getFolderItem operation in FolderApi. * @export * @interface FolderApiGetFolderItemRequest */ export interface FolderApiGetFolderItemRequest { /** * The URI of a resource whose parent folder you want to return. This can be a folder or non-folder resource. * @type {string} * @memberof FolderApiGetFolderItem */ readonly childUri?: string; /** * The slash-delimited path to a folder. For example, `/root/child/grandchild/greatgrandchild` would return the folder greatgrandchild. * @type {string} * @memberof FolderApiGetFolderItem */ readonly path?: string; } /** * Request parameters for getFolders operation in FolderApi. * @export * @interface FolderApiGetFoldersRequest */ export interface FolderApiGetFoldersRequest { /** * 0-based offset of first folder to return. The default value is 0. * @type {number} * @memberof FolderApiGetFolders */ readonly start?: number; /** * Maximum number of folders to return. The default value is 20. * @type {number} * @memberof FolderApiGetFolders */ readonly limit?: number; /** * Filter criteria for returned folders. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). <br>Any member of the Folder object can be used to filter the results: id, name, description, createdBy, modifiedBy, properties, folderType, or parent. Date fields currently cannot be used to filter results. <br>Sample queries<br> <ul> <li>Get Root Folders: `/folders?filter=isNull(parent)`</li> <li>Get folders by name: `/folders?filter=contains(name, \'Sample\')`</li> <li>Get folders by folderType: `/folders?filter=in(folderType, \'history\', \'favorites\')`</li> </ul> * @type {string} * @memberof FolderApiGetFolders */ readonly filter?: string; /** * Sort returned folder. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting).<br> The default sort order is name:ascending. Other valid sorting options are <ul><li><code>orderNum</code> the order specified by the user</li> <li><code>added</code> the timestamp when the item was added to the folder</li> <li><code>name</code> the folder name </ul> * @type {string} * @memberof FolderApiGetFolders */ readonly sortBy?: string; /** * Return only folders containing a child member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. The childUri has special semantics, because it should return only a single item. The URL form `/folders/.?childUri={resourceUri}` can be used to return a single item. * @type {string} * @memberof FolderApiGetFolders */ readonly childUri?: string; /** * Return only folders containing a reference member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. * @type {string} * @memberof FolderApiGetFolders */ readonly referenceUri?: string; /** * Return only folders containing any member with the specified URI. For now, childUri, referenceUri, memberUri, and filter are mutually exclusive. * @type {string} * @memberof FolderApiGetFolders */ readonly memberUri?: string; /** * Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @type {string} * @memberof FolderApiGetFolders */ readonly acceptLanguage?: string; /** * If provided, this should be an alternative media type that the service recognizes. If the media type is not one that the service can provide, a 406 response is returned. * @type {string} * @memberof FolderApiGetFolders */ readonly acceptItem?: string; } /** * Request parameters for getRootFolders operation in FolderApi. * @export * @interface FolderApiGetRootFoldersRequest */ export interface FolderApiGetRootFoldersRequest { /** * 0-based offset of first folder to return. The default value is 0. * @type {number} * @memberof FolderApiGetRootFolders */ readonly start?: number; /** * Maximum number of folders to return. The default value is 20. * @type {number} * @memberof FolderApiGetRootFolders */ readonly limit?: number; /** * Filter criteria for returned folders. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). <br>Any member of the Folder object can be used to filter the results: id, name, description, createdBy, modifiedBy, properties, folderType, or parent. Date fields currently cannot be used to filter results. * @type {string} * @memberof FolderApiGetRootFolders */ readonly filter?: string; /** * Sort returned folder. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting).<br> The default sort order is name:ascending. Other valid sorting options are <li><code>added</code> the timestamp when the item was added to the folder</li> <li><code>name</code> the folder name </ul> * @type {string} * @memberof FolderApiGetRootFolders */ readonly sortBy?: string; } /** * Request parameters for headersForFolder operation in FolderApi. * @export * @interface FolderApiHeadersForFolderRequest */ export interface FolderApiHeadersForFolderRequest { /** * The identifier of a specific folder or one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof FolderApiHeadersForFolder */ readonly folderId: string; /** * Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @type {string} * @memberof FolderApiHeadersForFolder */ readonly acceptLanguage?: string; } /** * Request parameters for patchFolder operation in FolderApi. * @export * @interface FolderApiPatchFolderRequest */ export interface FolderApiPatchFolderRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof FolderApiPatchFolder */ readonly folderId: string; /** * The ETag that was returned from a GET, POST, or PUT of this folder. * @type {string} * @memberof FolderApiPatchFolder */ readonly ifMatch?: string; /** * The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @type {string} * @memberof FolderApiPatchFolder */ readonly ifUnmodifiedSince?: string; /** * Folder * @type {FolderIn} * @memberof FolderApiPatchFolder */ readonly folderIn?: FolderIn; } /** * Request parameters for patchMoveFolderItem operation in FolderApi. * @export * @interface FolderApiPatchMoveFolderItemRequest */ export interface FolderApiPatchMoveFolderItemRequest { /** * The URI of a resource whose parent folder is to be changed. * @type {string} * @memberof FolderApiPatchMoveFolderItem */ readonly childUri?: string; /** * The URI of the target folder to move the resource to. * @type {string} * @memberof FolderApiPatchMoveFolderItem */ readonly parentFolderUri?: string; } /** * Request parameters for updateFolder operation in FolderApi. * @export * @interface FolderApiUpdateFolderRequest */ export interface FolderApiUpdateFolderRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof FolderApiUpdateFolder */ readonly folderId: string; /** * The ETag that was returned from a GET, POST, or PUT of this folder. * @type {string} * @memberof FolderApiUpdateFolder */ readonly ifMatch?: string; /** * The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @type {string} * @memberof FolderApiUpdateFolder */ readonly ifUnmodifiedSince?: string; /** * Folder * @type {FolderIn} * @memberof FolderApiUpdateFolder */ readonly folderIn?: FolderIn; } /** * MemberApi - axios parameter creator * @export */ export const MemberApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Adds a new member to the folder. If the member type is \'child\' and the object referenced is already a member of any folder (including the specified parent), this operation fails with a 409 status (conflict). If the object being added is a folder, this method checks that the name is unique (among other members that are of the same type). If a name collision occurs, a 409 status is returned. * @summary Add a member to a folder * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {boolean} [abortOnMetadataFailure] If true, the member creation is aborted if the GET to retrieve the member metadata fails. If false, the member creation succeeds regardless of the metadata retrieval status. The default value is false. * @param {boolean} [forceMove] If true, if this is a creation of a child member and if the URI in the member already exists in another folder, the member is moved to the requested folder. If it is already a member of the requested folder, the request succeeds. The default value is false. * @param {MemberIn} [memberIn] Member * @param {*} [options] Override http request option. * @throws {RequiredError} */ createFolderMember: async ( folderId: string, abortOnMetadataFailure?: boolean, forceMove?: boolean, memberIn?: MemberIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("createFolderMember", "folderId", folderId); const localVarPath = `/folders/{folderId}/members`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (abortOnMetadataFailure !== undefined) { localVarQueryParameter["abortOnMetadataFailure"] = abortOnMetadataFailure; } if (forceMove !== undefined) { localVarQueryParameter["forceMove"] = forceMove; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder.member+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( memberIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the modification date for a history member. If the object URI exists as a reference in the history folder, the information including the added field is updated. If it does not exist, a new member is added, and an eviction is performed if the folder is already at the maximum members threshold. * @summary Update the modification date for a history member * @param {string} folderId The identifier of a specific history folder, or the delegate string: @myHistory. * @param {boolean} [abortOnMetadataFailure] If true, if the GET to retrieve the member metadata fails, abort the member creation. If false, the member creation succeeds regardless of the metadata retrieval status. The default value is false. * @param {MemberIn} [memberIn] Member * @param {*} [options] Override http request option. * @throws {RequiredError} */ createHistory: async ( folderId: string, abortOnMetadataFailure?: boolean, memberIn?: MemberIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("createHistory", "folderId", folderId); const localVarPath = `/folders/{folderId}/histories`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (abortOnMetadataFailure !== undefined) { localVarQueryParameter["abortOnMetadataFailure"] = abortOnMetadataFailure; } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder.member+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( memberIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Removes the specified member from the folder. This does not delete the target resource. The proper way to delete a resource is to use the resource\'s persistence service to delete it. Using that service generates an event that causes the folders service to clean up any members that have that target resource\'s URI. * @summary Remove a member from a folder * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} memberId Member id. * @param {*} [options] Override http request option. * @throws {RequiredError} */ deleteFolderMember: async ( folderId: string, memberId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("deleteFolderMember", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("deleteFolderMember", "memberId", memberId); const localVarPath = `/folders/{folderId}/members/{memberId}` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "DELETE", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the specified member. * @summary Get a folder member * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} memberId Member id. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolderMember: async ( folderId: string, memberId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("getFolderMember", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("getFolderMember", "memberId", memberId); const localVarPath = `/folders/{folderId}/members/{memberId}` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of folder members. Standard paging, filtering, and sorting options are available. The media type of the returned collection items is application/vnd.sas.content.folder.member. Default sorting for this collection is name:ascending, unless the folder is of the history folder type. Default sorting for history folders is added:descending, which orders the elements starting with the most recently added. * @summary Get a list of folder members * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {number} [start] Offset of first member to return. The default value is 0. * @param {number} [limit] Maximum number of members to return. The default value is 20. * @param {string} [filter] Filter criteria for returned members. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). For example, you can filter for a member with a given name as a way to test if a folder already has a member with that name: <code>?filter=eq(name, \'bobsyouruncle\')</code> * @param {string} [sortBy] Sort returned collection of members. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting). The member collection can be sorted by folders first by using sortBy=eq(contentType,\'folder\'):descending Use :ascending to soft by folders last. Specifying sortBy=eq(contentType,\'folder\'):descending,name:ascending,type:ascending sorts by folders first, then by name, then by type. * @param {boolean} [recursive] If true, the members of the requested folder, plus all of its descendants, are returned in a flat list (no order is guaranteed). Reference members that refer to folders are not followed unless the followReferences parameter is true. The default value of this parameter is false. * @param {boolean} [followReferences] If true, references to other folders are followed when returning the recursive list of members. If recursive is false, then the value of this parameter is meaningless. The default value of this parameter is false. * @param {string} [acceptLanguage] Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolderMembers: async ( folderId: string, start?: number, limit?: number, filter?: string, sortBy?: string, recursive?: boolean, followReferences?: boolean, acceptLanguage?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("getFolderMembers", "folderId", folderId); const localVarPath = `/folders/{folderId}/members`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (recursive !== undefined) { localVarQueryParameter["recursive"] = recursive; } if (followReferences !== undefined) { localVarQueryParameter["followReferences"] = followReferences; } if (acceptLanguage != null) { localVarHeaderParameter["Accept-Language"] = String(acceptLanguage); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the specified member. * @summary Get a folder member * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} memberId Member id. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFolderMember: async ( folderId: string, memberId: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("headersForFolderMember", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("headersForFolderMember", "memberId", memberId); const localVarPath = `/folders/{folderId}/members/{memberId}` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns a list of folder members. Standard paging, filtering, and sorting options are available. The media type of the returned collection items is application/vnd.sas.content.folder.member. Default sorting for this collection is name:ascending, unless the folder is of the history folder type. Default sorting for history folders is added:descending, which orders the elements starting with the most recently added. * @summary Get a list of folder members * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {number} [start] Offset of first member to return. The default value is 0. * @param {number} [limit] Maximum number of members to return. The default value is 20. * @param {string} [filter] Filter criteria for returned members. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). For example, you can filter for a member with a given name as a way to test if a folder already has a member with that name: <code>?filter=eq(name, \'bobsyouruncle\')</code> * @param {string} [sortBy] Sort returned collection of members. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting). The member collection can be sorted by folders first by using sortBy=eq(contentType,\'folder\'):descending Use :ascending to soft by folders last. Specifying sortBy=eq(contentType,\'folder\'):descending,name:ascending,type:ascending sorts by folders first, then by name, then by type. * @param {boolean} [recursive] If true, the members of the requested folder, plus all of its descendants, are returned in a flat list (no order is guaranteed). Reference members that refer to folders are not followed unless the followReferences parameter is true. The default value of this parameter is false. * @param {boolean} [followReferences] If true, references to other folders are followed when returning the recursive list of members. If recursive is false, then the value of this parameter is meaningless. The default value of this parameter is false. * @param {string} [acceptLanguage] Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @param {*} [options] Override http request option. * @throws {RequiredError} */ headersForFolderMembers: async ( folderId: string, start?: number, limit?: number, filter?: string, sortBy?: string, recursive?: boolean, followReferences?: boolean, acceptLanguage?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("headersForFolderMembers", "folderId", folderId); const localVarPath = `/folders/{folderId}/members`.replace( `{${"folderId"}}`, encodeURIComponent(String(folderId)), ); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "HEAD", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (start !== undefined) { localVarQueryParameter["start"] = start; } if (limit !== undefined) { localVarQueryParameter["limit"] = limit; } if (filter !== undefined) { localVarQueryParameter["filter"] = filter; } if (sortBy !== undefined) { localVarQueryParameter["sortBy"] = sortBy; } if (recursive !== undefined) { localVarQueryParameter["recursive"] = recursive; } if (followReferences !== undefined) { localVarQueryParameter["followReferences"] = followReferences; } if (acceptLanguage != null) { localVarHeaderParameter["Accept-Language"] = String(acceptLanguage); } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Updates the provided fields of a member. The client can provide a sparsely populated object, and only the non-null fields contribute to the updates. So, a body like { \"name\": \"NewMemberName\" } causes the member to have its name changed, but no other field is affected. The full resulting object is returned in the response. * @summary Make a partial update to a folder member * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} memberId Member id. * @param {string} [ifMatch] The ETag that was returned from a GET, POST, or PUT of this folder. * @param {string} [ifUnmodifiedSince] The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @param {MemberIn} [memberIn] Member * @param {*} [options] Override http request option. * @throws {RequiredError} */ patchFolderMember: async ( folderId: string, memberId: string, ifMatch?: string, ifUnmodifiedSince?: string, memberIn?: MemberIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("patchFolderMember", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("patchFolderMember", "memberId", memberId); const localVarPath = `/folders/{folderId}/members/{memberId}` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PATCH", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder.member+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( memberIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Replaces an existing folder member. Changing the parentUri affects a move operation. Neither the URI or the type of the member can be changed. * @summary Update a folder member * @param {string} folderId The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @param {string} memberId Member id. * @param {string} [ifMatch] The ETag that was returned from a GET, POST, or PUT of this folder. * @param {string} [ifUnmodifiedSince] The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @param {MemberIn} [memberIn] Member * @param {*} [options] Override http request option. * @throws {RequiredError} */ updateFolderMember: async ( folderId: string, memberId: string, ifMatch?: string, ifUnmodifiedSince?: string, memberIn?: MemberIn, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("updateFolderMember", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("updateFolderMember", "memberId", memberId); const localVarPath = `/folders/{folderId}/members/{memberId}` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (ifMatch != null) { localVarHeaderParameter["If-Match"] = String(ifMatch); } if (ifUnmodifiedSince != null) { localVarHeaderParameter["If-Unmodified-Since"] = String(ifUnmodifiedSince); } localVarHeaderParameter["Content-Type"] = "application/vnd.sas.content.folder.member+json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( memberIn, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * This endpoint can be used by a client to test whether creating or renaming a member would create a naming conflict before actually attempting the operation. When creating a new member, a memberId of @new indicates that the attempted operation would create a new member, where a folderId of @root is a placeholder representing the root level of the folder hierarchy. For example,
PUT /commons/validations/folders/@root/members/@new/name?value=TestFolder1&type=folder
would check if one could successfully create a root folder named TestFolder1 and respond appropriately.
PUT /commons/validations/folders/@myFolder/members/@new/name?value=TestReport1&type=report
would check whether a new member named TestReport1 of type report could be added to the user\'s My Folder. * @summary Validate that a member can be named or renamed to the given value without creating a conflict * @param {string} folderId The identifier of the folder whose members are to be checked. A value of @root indicates checking a root-level folder, and type must be folder. * @param {string} memberId If a rename is being attempted, the identifier of the member being renamed. If a new member is being created, the @new placeholder is used. * @param {string} value The name to be tested. * @param {string} type The type of the member to be tested. Members of the same type have to be named uniquely, so both the new name and type are required. * @param {string} [typeDefName] The Type definition name to test against. This must match exactly with the desired value. A null value is compared with null values in the repository. * @param {*} [options] Override http request option. * @throws {RequiredError} */ validateMemberName: async ( folderId: string, memberId: string, value: string, type: string, typeDefName?: string, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'folderId' is not null or undefined assertParamExists("validateMemberName", "folderId", folderId); // verify required parameter 'memberId' is not null or undefined assertParamExists("validateMemberName", "memberId", memberId); // verify required parameter 'value' is not null or undefined assertParamExists("validateMemberName", "value", value); // verify required parameter 'type' is not null or undefined assertParamExists("validateMemberName", "type", type); const localVarPath = `/commons/validations/folders/{folderId}/members/{memberId}/name` .replace(`{${"folderId"}}`, encodeURIComponent(String(folderId))) .replace(`{${"memberId"}}`, encodeURIComponent(String(memberId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "PUT", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (value !== undefined) { localVarQueryParameter["value"] = value; } if (type !== undefined) { localVarQueryParameter["type"] = type; } if (typeDefName !== undefined) { localVarQueryParameter["typeDefName"] = typeDefName; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * MemberApi - functional programming interface * @export */ export const MemberApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = MemberApiAxiosParamCreator(configuration); return { /** * Adds a new member to the folder. If the member type is \'child\' and the object referenced is already a member of any folder (including the specified parent), this operation fails with a 409 status (conflict). If the object being added is a folder, this method checks that the name is unique (among other members that are of the same type). If a name collision occurs, a 409 status is returned. * @summary Add a member to a folder * @param {MemberApiCreateFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createFolderMember( requestParameters: MemberApiCreateFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createFolderMember( requestParameters.folderId, requestParameters.abortOnMetadataFailure, requestParameters.forceMove, requestParameters.memberIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the modification date for a history member. If the object URI exists as a reference in the history folder, the information including the added field is updated. If it does not exist, a new member is added, and an eviction is performed if the folder is already at the maximum members threshold. * @summary Update the modification date for a history member * @param {MemberApiCreateHistoryRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createHistory( requestParameters: MemberApiCreateHistoryRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createHistory( requestParameters.folderId, requestParameters.abortOnMetadataFailure, requestParameters.memberIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Removes the specified member from the folder. This does not delete the target resource. The proper way to delete a resource is to use the resource\'s persistence service to delete it. Using that service generates an event that causes the folders service to clean up any members that have that target resource\'s URI. * @summary Remove a member from a folder * @param {MemberApiDeleteFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async deleteFolderMember( requestParameters: MemberApiDeleteFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.deleteFolderMember( requestParameters.folderId, requestParameters.memberId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the specified member. * @summary Get a folder member * @param {MemberApiGetFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolderMember( requestParameters: MemberApiGetFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolderMember( requestParameters.folderId, requestParameters.memberId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of folder members. Standard paging, filtering, and sorting options are available. The media type of the returned collection items is application/vnd.sas.content.folder.member. Default sorting for this collection is name:ascending, unless the folder is of the history folder type. Default sorting for history folders is added:descending, which orders the elements starting with the most recently added. * @summary Get a list of folder members * @param {MemberApiGetFolderMembersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolderMembers( requestParameters: MemberApiGetFolderMembersRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolderMembers( requestParameters.folderId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, requestParameters.recursive, requestParameters.followReferences, requestParameters.acceptLanguage, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the specified member. * @summary Get a folder member * @param {MemberApiHeadersForFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFolderMember( requestParameters: MemberApiHeadersForFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFolderMember( requestParameters.folderId, requestParameters.memberId, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns a list of folder members. Standard paging, filtering, and sorting options are available. The media type of the returned collection items is application/vnd.sas.content.folder.member. Default sorting for this collection is name:ascending, unless the folder is of the history folder type. Default sorting for history folders is added:descending, which orders the elements starting with the most recently added. * @summary Get a list of folder members * @param {MemberApiHeadersForFolderMembersRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async headersForFolderMembers( requestParameters: MemberApiHeadersForFolderMembersRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.headersForFolderMembers( requestParameters.folderId, requestParameters.start, requestParameters.limit, requestParameters.filter, requestParameters.sortBy, requestParameters.recursive, requestParameters.followReferences, requestParameters.acceptLanguage, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Updates the provided fields of a member. The client can provide a sparsely populated object, and only the non-null fields contribute to the updates. So, a body like { \"name\": \"NewMemberName\" } causes the member to have its name changed, but no other field is affected. The full resulting object is returned in the response. * @summary Make a partial update to a folder member * @param {MemberApiPatchFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async patchFolderMember( requestParameters: MemberApiPatchFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.patchFolderMember( requestParameters.folderId, requestParameters.memberId, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, requestParameters.memberIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Replaces an existing folder member. Changing the parentUri affects a move operation. Neither the URI or the type of the member can be changed. * @summary Update a folder member * @param {MemberApiUpdateFolderMemberRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async updateFolderMember( requestParameters: MemberApiUpdateFolderMemberRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.updateFolderMember( requestParameters.folderId, requestParameters.memberId, requestParameters.ifMatch, requestParameters.ifUnmodifiedSince, requestParameters.memberIn, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * This endpoint can be used by a client to test whether creating or renaming a member would create a naming conflict before actually attempting the operation. When creating a new member, a memberId of @new indicates that the attempted operation would create a new member, where a folderId of @root is a placeholder representing the root level of the folder hierarchy. For example,
PUT /commons/validations/folders/@root/members/@new/name?value=TestFolder1&type=folder
would check if one could successfully create a root folder named TestFolder1 and respond appropriately.
PUT /commons/validations/folders/@myFolder/members/@new/name?value=TestReport1&type=report
would check whether a new member named TestReport1 of type report could be added to the user\'s My Folder. * @summary Validate that a member can be named or renamed to the given value without creating a conflict * @param {MemberApiValidateMemberNameRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async validateMemberName( requestParameters: MemberApiValidateMemberNameRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.validateMemberName( requestParameters.folderId, requestParameters.memberId, requestParameters.value, requestParameters.type, requestParameters.typeDefName, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createFolderMember operation in MemberApi. * @export * @interface MemberApiCreateFolderMemberRequest */ export interface MemberApiCreateFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiCreateFolderMember */ readonly folderId: string; /** * If true, the member creation is aborted if the GET to retrieve the member metadata fails. If false, the member creation succeeds regardless of the metadata retrieval status. The default value is false. * @type {boolean} * @memberof MemberApiCreateFolderMember */ readonly abortOnMetadataFailure?: boolean; /** * If true, if this is a creation of a child member and if the URI in the member already exists in another folder, the member is moved to the requested folder. If it is already a member of the requested folder, the request succeeds. The default value is false. * @type {boolean} * @memberof MemberApiCreateFolderMember */ readonly forceMove?: boolean; /** * Member * @type {MemberIn} * @memberof MemberApiCreateFolderMember */ readonly memberIn?: MemberIn; } /** * Request parameters for createHistory operation in MemberApi. * @export * @interface MemberApiCreateHistoryRequest */ export interface MemberApiCreateHistoryRequest { /** * The identifier of a specific history folder, or the delegate string: @myHistory. * @type {string} * @memberof MemberApiCreateHistory */ readonly folderId: string; /** * If true, if the GET to retrieve the member metadata fails, abort the member creation. If false, the member creation succeeds regardless of the metadata retrieval status. The default value is false. * @type {boolean} * @memberof MemberApiCreateHistory */ readonly abortOnMetadataFailure?: boolean; /** * Member * @type {MemberIn} * @memberof MemberApiCreateHistory */ readonly memberIn?: MemberIn; } /** * Request parameters for deleteFolderMember operation in MemberApi. * @export * @interface MemberApiDeleteFolderMemberRequest */ export interface MemberApiDeleteFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiDeleteFolderMember */ readonly folderId: string; /** * Member id. * @type {string} * @memberof MemberApiDeleteFolderMember */ readonly memberId: string; } /** * Request parameters for getFolderMember operation in MemberApi. * @export * @interface MemberApiGetFolderMemberRequest */ export interface MemberApiGetFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiGetFolderMember */ readonly folderId: string; /** * Member id. * @type {string} * @memberof MemberApiGetFolderMember */ readonly memberId: string; } /** * Request parameters for getFolderMembers operation in MemberApi. * @export * @interface MemberApiGetFolderMembersRequest */ export interface MemberApiGetFolderMembersRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiGetFolderMembers */ readonly folderId: string; /** * Offset of first member to return. The default value is 0. * @type {number} * @memberof MemberApiGetFolderMembers */ readonly start?: number; /** * Maximum number of members to return. The default value is 20. * @type {number} * @memberof MemberApiGetFolderMembers */ readonly limit?: number; /** * Filter criteria for returned members. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). For example, you can filter for a member with a given name as a way to test if a folder already has a member with that name: <code>?filter=eq(name, \'bobsyouruncle\')</code> * @type {string} * @memberof MemberApiGetFolderMembers */ readonly filter?: string; /** * Sort returned collection of members. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting). The member collection can be sorted by folders first by using sortBy=eq(contentType,\'folder\'):descending Use :ascending to soft by folders last. Specifying sortBy=eq(contentType,\'folder\'):descending,name:ascending,type:ascending sorts by folders first, then by name, then by type. * @type {string} * @memberof MemberApiGetFolderMembers */ readonly sortBy?: string; /** * If true, the members of the requested folder, plus all of its descendants, are returned in a flat list (no order is guaranteed). Reference members that refer to folders are not followed unless the followReferences parameter is true. The default value of this parameter is false. * @type {boolean} * @memberof MemberApiGetFolderMembers */ readonly recursive?: boolean; /** * If true, references to other folders are followed when returning the recursive list of members. If recursive is false, then the value of this parameter is meaningless. The default value of this parameter is false. * @type {boolean} * @memberof MemberApiGetFolderMembers */ readonly followReferences?: boolean; /** * Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @type {string} * @memberof MemberApiGetFolderMembers */ readonly acceptLanguage?: string; } /** * Request parameters for headersForFolderMember operation in MemberApi. * @export * @interface MemberApiHeadersForFolderMemberRequest */ export interface MemberApiHeadersForFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiHeadersForFolderMember */ readonly folderId: string; /** * Member id. * @type {string} * @memberof MemberApiHeadersForFolderMember */ readonly memberId: string; } /** * Request parameters for headersForFolderMembers operation in MemberApi. * @export * @interface MemberApiHeadersForFolderMembersRequest */ export interface MemberApiHeadersForFolderMembersRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiHeadersForFolderMembers */ readonly folderId: string; /** * Offset of first member to return. The default value is 0. * @type {number} * @memberof MemberApiHeadersForFolderMembers */ readonly start?: number; /** * Maximum number of members to return. The default value is 20. * @type {number} * @memberof MemberApiHeadersForFolderMembers */ readonly limit?: number; /** * Filter criteria for returned members. See [Filtering in REST APIs](https://developer.sas.com/apis/rest/Topics/#filters). For example, you can filter for a member with a given name as a way to test if a folder already has a member with that name: <code>?filter=eq(name, \'bobsyouruncle\')</code> * @type {string} * @memberof MemberApiHeadersForFolderMembers */ readonly filter?: string; /** * Sort returned collection of members. See [Sorting in REST APIs](https://developer.sas.com/apis/rest/Topics/#sorting). The member collection can be sorted by folders first by using sortBy=eq(contentType,\'folder\'):descending Use :ascending to soft by folders last. Specifying sortBy=eq(contentType,\'folder\'):descending,name:ascending,type:ascending sorts by folders first, then by name, then by type. * @type {string} * @memberof MemberApiHeadersForFolderMembers */ readonly sortBy?: string; /** * If true, the members of the requested folder, plus all of its descendants, are returned in a flat list (no order is guaranteed). Reference members that refer to folders are not followed unless the followReferences parameter is true. The default value of this parameter is false. * @type {boolean} * @memberof MemberApiHeadersForFolderMembers */ readonly recursive?: boolean; /** * If true, references to other folders are followed when returning the recursive list of members. If recursive is false, then the value of this parameter is meaningless. The default value of this parameter is false. * @type {boolean} * @memberof MemberApiHeadersForFolderMembers */ readonly followReferences?: boolean; /** * Enumerates the languages that the client prefers to use for the response. This can be used to provide localized data where available. * @type {string} * @memberof MemberApiHeadersForFolderMembers */ readonly acceptLanguage?: string; } /** * Request parameters for patchFolderMember operation in MemberApi. * @export * @interface MemberApiPatchFolderMemberRequest */ export interface MemberApiPatchFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiPatchFolderMember */ readonly folderId: string; /** * Member id. * @type {string} * @memberof MemberApiPatchFolderMember */ readonly memberId: string; /** * The ETag that was returned from a GET, POST, or PUT of this folder. * @type {string} * @memberof MemberApiPatchFolderMember */ readonly ifMatch?: string; /** * The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @type {string} * @memberof MemberApiPatchFolderMember */ readonly ifUnmodifiedSince?: string; /** * Member * @type {MemberIn} * @memberof MemberApiPatchFolderMember */ readonly memberIn?: MemberIn; } /** * Request parameters for updateFolderMember operation in MemberApi. * @export * @interface MemberApiUpdateFolderMemberRequest */ export interface MemberApiUpdateFolderMemberRequest { /** * The identifier of a specific folder, or of one of the delegate strings @myFolder, @appDataFolder, @myHistory, @myFavorites, or @public. * @type {string} * @memberof MemberApiUpdateFolderMember */ readonly folderId: string; /** * Member id. * @type {string} * @memberof MemberApiUpdateFolderMember */ readonly memberId: string; /** * The ETag that was returned from a GET, POST, or PUT of this folder. * @type {string} * @memberof MemberApiUpdateFolderMember */ readonly ifMatch?: string; /** * The value of the lastModified date of the folder. If the folder has been updated since this time, the update fails. * @type {string} * @memberof MemberApiUpdateFolderMember */ readonly ifUnmodifiedSince?: string; /** * Member * @type {MemberIn} * @memberof MemberApiUpdateFolderMember */ readonly memberIn?: MemberIn; } /** * Request parameters for validateMemberName operation in MemberApi. * @export * @interface MemberApiValidateMemberNameRequest */ export interface MemberApiValidateMemberNameRequest { /** * The identifier of the folder whose members are to be checked. A value of @root indicates checking a root-level folder, and type must be folder. * @type {string} * @memberof MemberApiValidateMemberName */ readonly folderId: string; /** * If a rename is being attempted, the identifier of the member being renamed. If a new member is being created, the @new placeholder is used. * @type {string} * @memberof MemberApiValidateMemberName */ readonly memberId: string; /** * The name to be tested. * @type {string} * @memberof MemberApiValidateMemberName */ readonly value: string; /** * The type of the member to be tested. Members of the same type have to be named uniquely, so both the new name and type are required. * @type {string} * @memberof MemberApiValidateMemberName */ readonly type: string; /** * The Type definition name to test against. This must match exactly with the desired value. A null value is compared with null values in the repository. * @type {string} * @memberof MemberApiValidateMemberName */ readonly typeDefName?: string; } /** * MetainfoApi - axios parameter creator * @export */ export const MetainfoApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Get the ancestors of a set of URIs. Each URI is represented in the result as an Ancestor object. * @summary Get ancestors for a list of resource URIs * @param {Array} requestBody The list of URIs for which to retrieve ancestry. * @param {boolean} [allowPartialPath] Allow a partial path from the item if the user does not have access to all the folders in the path. * @param {*} [options] Override http request option. * @throws {RequiredError} */ createBulkAncestors: async ( requestBody: Array, allowPartialPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'requestBody' is not null or undefined assertParamExists("createBulkAncestors", "requestBody", requestBody); const localVarPath = `/ancestors`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "POST", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (allowPartialPath !== undefined) { localVarQueryParameter["allowPartialPath"] = allowPartialPath; } localVarHeaderParameter["Content-Type"] = "application/json"; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; localVarRequestOptions.data = serializeDataIfNeeded( requestBody, localVarRequestOptions, configuration, ); return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Get the ancestors of a resource by URI as a flat list, ordered starting with the parent folder of the resource, and continuing up to the root folder. * @summary Get a resource\'s ancestors * @param {string} childUri The URI of the target resource whose ancestry is desired. * @param {boolean} [allowPartialPath] Allow a partial path from the item if the user does not have access to all the folders in the path. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getAncestors: async ( childUri: string, allowPartialPath?: boolean, options: AxiosRequestConfig = {}, ): Promise => { // verify required parameter 'childUri' is not null or undefined assertParamExists("getAncestors", "childUri", childUri); const localVarPath = `/ancestors`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; if (childUri !== undefined) { localVarQueryParameter["childUri"] = childUri; } if (allowPartialPath !== undefined) { localVarQueryParameter["allowPartialPath"] = allowPartialPath; } setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Returns the set of delegates known to the folders service. * @summary Get a list of known delegate-represented folders * @param {*} [options] Override http request option. * @throws {RequiredError} */ getDelegateInfo: async ( options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/delegateInfo`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, /** * Retrieves the list of folder types that are recognized by the folders service. Returns a collection of application/vnd.sas.content.folder.type+json objects. * @summary Get a list of acceptable folder types * @param {*} [options] Override http request option. * @throws {RequiredError} */ getFolderTypes: async ( options: AxiosRequestConfig = {}, ): Promise => { const localVarPath = `/folderTypes`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * MetainfoApi - functional programming interface * @export */ export const MetainfoApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = MetainfoApiAxiosParamCreator(configuration); return { /** * Get the ancestors of a set of URIs. Each URI is represented in the result as an Ancestor object. * @summary Get ancestors for a list of resource URIs * @param {MetainfoApiCreateBulkAncestorsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async createBulkAncestors( requestParameters: MetainfoApiCreateBulkAncestorsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.createBulkAncestors( requestParameters.requestBody, requestParameters.allowPartialPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Get the ancestors of a resource by URI as a flat list, ordered starting with the parent folder of the resource, and continuing up to the root folder. * @summary Get a resource\'s ancestors * @param {MetainfoApiGetAncestorsRequest} requestParameters Request parameters. * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getAncestors( requestParameters: MetainfoApiGetAncestorsRequest, options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getAncestors( requestParameters.childUri, requestParameters.allowPartialPath, options, ); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Returns the set of delegates known to the folders service. * @summary Get a list of known delegate-represented folders * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getDelegateInfo( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getDelegateInfo(options); return createRequestFunction(localVarAxiosArgs, configuration); }, /** * Retrieves the list of folder types that are recognized by the folders service. Returns a collection of application/vnd.sas.content.folder.type+json objects. * @summary Get a list of acceptable folder types * @param {*} [options] Override http request option. * @throws {RequiredError} */ async getFolderTypes( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.getFolderTypes(options); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; /** * Request parameters for createBulkAncestors operation in MetainfoApi. * @export * @interface MetainfoApiCreateBulkAncestorsRequest */ export interface MetainfoApiCreateBulkAncestorsRequest { /** * The list of URIs for which to retrieve ancestry. * @type {Array} * @memberof MetainfoApiCreateBulkAncestors */ readonly requestBody: Array; /** * Allow a partial path from the item if the user does not have access to all the folders in the path. * @type {boolean} * @memberof MetainfoApiCreateBulkAncestors */ readonly allowPartialPath?: boolean; } /** * Request parameters for getAncestors operation in MetainfoApi. * @export * @interface MetainfoApiGetAncestorsRequest */ export interface MetainfoApiGetAncestorsRequest { /** * The URI of the target resource whose ancestry is desired. * @type {string} * @memberof MetainfoApiGetAncestors */ readonly childUri: string; /** * Allow a partial path from the item if the user does not have access to all the folders in the path. * @type {boolean} * @memberof MetainfoApiGetAncestors */ readonly allowPartialPath?: boolean; } /** * RootApi - axios parameter creator * @export */ export const RootApiAxiosParamCreator = function ( configuration?: Configuration, ) { return { /** * Returns a list of links to the top-level collections surfaced through this API. These top-level links include /folders and /ancestors. * @summary Get a list of top-level links * @param {*} [options] Override http request option. * @throws {RequiredError} */ root: async (options: AxiosRequestConfig = {}): Promise => { const localVarPath = `/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = { method: "GET", ...baseOptions, ...options, }; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = { ...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers, }; return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, }; }, }; }; /** * RootApi - functional programming interface * @export */ export const RootApi = function (configuration?: Configuration) { const localVarAxiosParamCreator = RootApiAxiosParamCreator(configuration); return { /** * Returns a list of links to the top-level collections surfaced through this API. These top-level links include /folders and /ancestors. * @summary Get a list of top-level links * @param {*} [options] Override http request option. * @throws {RequiredError} */ async root( options?: AxiosRequestConfig, ): Promise> { const localVarAxiosArgs = await localVarAxiosParamCreator.root(options); return createRequestFunction(localVarAxiosArgs, configuration); }, }; }; ================================================ FILE: client/src/connection/rest/auth.ts ================================================ // Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { CancellationTokenSource, Uri, env, l10n, window } from "vscode"; import axios from "axios"; import { createHash } from "crypto"; import { URLSearchParams } from "url"; import { Config } from "."; import { RootApi } from "./api/compute"; import { Configuration } from "./api/configuration"; interface Tokens { access_token: string; refresh_token: string; } export async function refreshToken( config: Config, tokens: Tokens, ): Promise { const clientId = config.clientId || "vscode"; const clientSecret = config.clientSecret ?? ""; const rootApi = RootApi( new Configuration({ basePath: config.endpoint + "/compute", accessToken: tokens.access_token, }), ); await rootApi.headersForRoot().catch((err) => { if (err.response?.status === 401) { // token expired, try refresh token return axios .post( `${config.endpoint}/SASLogon/oauth/token`, new URLSearchParams({ client_id: clientId, client_secret: clientSecret, grant_type: "refresh_token", refresh_token: tokens?.refresh_token, }).toString(), ) .then( (res) => { tokens = res.data; }, () => { // refresh token failed, has to login again tokens = undefined; }, ); } throw err; }); return tokens; } export async function getTokens( config: Config, tokens?: Tokens, ): Promise { const clientId = config.clientId || "vscode"; const clientSecret = config.clientSecret ?? ""; const { codeVerifier, codeChallenge } = getPKCE(); const callbackUrl = await env.asExternalUri( Uri.parse(`${env.uriScheme}://sas.sas-lsp`), ); const params = new URLSearchParams([ ["client_id", clientId], ["response_type", "code"], ["code_challenge_method", "S256"], ["code_challenge", codeChallenge], ["state", encodeURIComponent(callbackUrl.toString(true))], ]); await env.openExternal( Uri.parse( `${config.endpoint}/SASLogon/oauth/authorize?${params.toString()}`, ), ); const cancellationToken = new CancellationTokenSource(); let authCode: string; const handler = window.registerUriHandler({ handleUri: (uri) => { const code = new URLSearchParams(uri.query).get("code"); if (code) { authCode = code; cancellationToken.cancel(); } }, }); const inputCode = await window.showInputBox( { placeHolder: l10n.t("Paste authorization code here"), password: true, ignoreFocusOut: true, }, cancellationToken.token, ); handler.dispose(); if (!authCode && inputCode) { authCode = inputCode; } if (!authCode) { throw new Error(l10n.t("No authorization code")); } tokens = ( await axios.post( `${config.endpoint}/SASLogon/oauth/token`, new URLSearchParams({ client_id: clientId, client_secret: clientSecret, grant_type: "authorization_code", code: authCode, code_verifier: codeVerifier, }).toString(), ) ).data; return tokens; } function getPKCE() { // Refers to https://www.rfc-editor.org/rfc/rfc7636 const LENGTH = 128; const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"; let codeVerifier = ""; for (let i = 0; i < LENGTH; i++) { codeVerifier += possible.charAt( Math.floor(Math.random() * possible.length), ); } const codeChallenge = createHash("sha256") .update(codeVerifier) .digest("base64") .replace(/=/g, "") .replace(/\+/g, "-") .replace(/\//g, "_"); return { codeVerifier, codeChallenge }; } ================================================ FILE: client/src/connection/rest/common.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { AxiosRequestConfig, AxiosResponse } from "axios"; import { format as formatMediaType, parse as parseMediaType, } from "media-typer"; import { RequestArgs, createRequestFunction } from "./api/common"; import { Link } from "./api/compute"; import { Configuration } from "./api/configuration"; /** * States that can be on a Job or Session */ export enum ComputeState { Error = "error", Canceled = "canceled", Done = "done", Warning = "warning", Completed = "completed", Running = "running", Pending = "pending", Idle = "idle", } export interface stateOptions { onChange?: boolean; wait?: number; } export interface BaseCompute { links?: Array; } //global api config const apiConfig = new Configuration({ baseOptions: {} }); export function getApiConfig(): Configuration { return apiConfig; } export function computeMediaType(type: string): string { const parsed = parseMediaType(type); if ( parsed.type === "application" && parsed.subtype?.startsWith("vnd.sas") && parsed.suffix === undefined ) { parsed.suffix = "json"; return formatMediaType(parsed); } return type; } /** * Base class for compute like objects */ export class Compute { etag: string; async self(): Promise { throw new Error("Not implemented"); } //Shortcut function to get a link by its name getLink(links: Array, rel: string): Link | undefined { return links.find((link: Link) => link.rel === rel); } /* Get the options for a link This sets the URL, accept/content-type headers as well as the Method and etag headers if needed */ getLinkOptions(link: Link, options?: AxiosRequestConfig): RequestArgs { const headers = options ? { ...options?.headers } : {}; if (link.method === "POST") { if (link.type !== undefined) { headers["Content-Type"] = computeMediaType(link.type); } if (link.responseType !== undefined) { headers.Accept = computeMediaType(link.responseType); } } else if (link.method === "PUT") { if (link.type !== undefined) { headers["Content-Type"] = computeMediaType(link.type); } if (link.responseType !== undefined) { headers.Accept = computeMediaType(link.responseType); } if (this.etag !== undefined) { headers["If-Match"] = this.etag; } } else if (link.method === "DELETE") { if (this.etag !== undefined) { headers["If-Match"] = this.etag; } } else if (link.type !== undefined) { headers.Accept = computeMediaType(link.type); } //The link must have an href if (!link.href) { throw new Error(); } //Take the optional options given and merge in the link options const processedConfig: AxiosRequestConfig = { ...options, headers: headers, method: link.method, url: link.href, }; //TODO: We should not have to remove the /compute from the link return { url: link.href.replace("/compute", ""), options: processedConfig }; } /* Make a request via a link */ async requestLink( link: Link, options?: AxiosRequestConfig, ): Promise> { const apiConfig = getApiConfig(); /* Ideally we would use the base options as the root, and overwrite any options coming in on the function call. Right now the only option we are looking at in base options is headers, but I dont know a way to "merge" intefaces in typescipt. */ const processedConfig: AxiosRequestConfig = { ...options, headers: { ...apiConfig.baseOptions?.headers, ...options?.headers, }, }; const linkOptions = this.getLinkOptions(link, processedConfig); return createRequestFunction(linkOptions, apiConfig); } } ================================================ FILE: client/src/connection/rest/context.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import axios, { AxiosResponse } from "axios"; import { Context, ContextSummary, ContextsApi, Link, SessionRequest, } from "./api/compute"; import { BaseCompute, Compute, getApiConfig } from "./common"; import { ComputeSession } from "./session"; export class ComputeContext extends Compute { api; _self: Context | (ContextSummary & BaseCompute); constructor(id: string, name: string, launchType: string) { super(); this._self = { id, name, launchType, launchContext: {} }; this.api = ContextsApi(getApiConfig()); } static fromInterface(context: Context | ContextSummary): ComputeContext { const ctx = new ComputeContext("", "", ""); ctx._self = context; return ctx; } static fromResponse(response: AxiosResponse): ComputeContext { const ctx = ComputeContext.fromInterface(response.data); ctx.etag = response.headers.etag; return ctx; } static async getContextByName(name: string): Promise { const contextsApi = ContextsApi(getApiConfig()); const context = ( await contextsApi.getContexts({ filter: `eq(name,'${name}')`, }) ).data.items[0]; if (!context?.id) { throw new Error(l10n.t("Compute Context not found: {name}", { name })); } return ComputeContext.fromInterface(context); } get id(): string { return this._self?.id || ""; } get links(): Array { return this._self?.links || []; } async self(): Promise { if (this._self.id === undefined) { throw new Error(l10n.t("Cannot call self on object with no id")); } throw new Error(l10n.t("Not implemented")); } async createSession(): Promise { if (this._self.links === undefined) { await this.self(); } const link = this.getLink(this.links, "createSession"); if (link === undefined) { throw new Error(l10n.t("Server does not have createSession link")); } //Create the session const body: SessionRequest = { version: 1, name: "mysess", description: "This is a session", attributes: {}, environment: { options: ["-validmemname EXTEND", "-validvarname ANY"], autoExecLines: [], }, }; const options = this.getLinkOptions(link, { data: body }); let resp: AxiosResponse; try { resp = await this.requestLink(link, options); } catch (error) { if (axios.isAxiosError(error)) { throw new Error(error.message); } } //Create the session from the http resposne return ComputeSession.fromResponse(resp); } } ================================================ FILE: client/src/connection/rest/identities.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import axios from "axios"; export interface User { id: string; name: string; } // It's used by AuthProvider before a new authentication session returned // So has to pass access token mannually export async function getCurrentUser(options: { endpoint: string; accessToken: string; }) { return ( await axios .create({ baseURL: options.endpoint, headers: { Authorization: "Bearer " + options.accessToken, }, }) .get("/identities/users/@currentUser") ).data; } ================================================ FILE: client/src/connection/rest/index.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { authentication, l10n } from "vscode"; import { BaseConfig, RunResult } from ".."; import { SASAuthProvider } from "../../components/AuthProvider"; import { getContextValue, setContextValue, } from "../../components/ExtensionContext"; import { updateStatusBarItem } from "../../components/StatusBarItem"; import { Session, SessionContextAttributes } from "../session"; import { Context, ContextsApi, SessionsApi } from "./api/compute"; import { ComputeState, getApiConfig } from "./common"; import { ComputeJob } from "./job"; import { ComputeServer } from "./server"; import { ComputeSession } from "./session"; let sessionInstance: RestSession; export interface Config extends BaseConfig { endpoint: string; clientId?: string; clientSecret?: string; context?: string; serverId?: string; reconnect?: boolean; } class RestSession extends Session { private _config: Config; private _computeSession: ComputeSession | undefined; private _cachedContext: Context | undefined; constructor() { super(); } public set config(value: Config) { this._config = value; } public async contextAttributes(): Promise { const context = await this.getContext(); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions return context.attributes as SessionContextAttributes; } public async getContext() { const contextName = this._config.context || "SAS Job Execution compute context"; if (this._cachedContext && this._cachedContext.name === contextName) { return this._cachedContext; } const contextsApi = ContextsApi(getApiConfig()); const context = ( await contextsApi.getContexts({ filter: `eq(name,'${contextName}')`, }) ).data.items[0]; if (!context?.id) { throw new Error( l10n.t("Compute Context not found: {name}", { name: contextName }), ); } // Lets use the id to get context details const contextResponse = await contextsApi.getContext({ contextId: context.id, }); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions this._cachedContext = contextResponse.data || (context as Context); return this._cachedContext; } protected establishConnection = async (): Promise => { const apiConfig = getApiConfig(); let formattedOpts: string[] = []; const autoExecLines = this._config.autoExecLines || []; if (this._config.sasOptions) { formattedOpts = this.formatSASOptions(); } if (!this._config.serverId) { const session = await authentication.getSession(SASAuthProvider.id, [], { createIfNone: true, }); apiConfig.accessToken = session.accessToken; } if (this._computeSession && this._computeSession.sessionId) { const state = await this._computeSession .getState() .catch(() => (this._computeSession = undefined)); if (state === ComputeState.Error) { await this._computeSession.cancel(); } else if (this._computeSession !== undefined) { //This might look weird, but I dont know how to detect the session being in //syntax check mode right now so we need to send the cancel every time to make //sure the session is in a good state. await this._computeSession.cancel(); } } if (this._computeSession) { return; } //Set the locale in the base options so it appears on all api calls let locale = JSON.parse(process.env.VSCODE_NLS_CONFIG ?? "{}").locale; if (locale === "qps-ploc") { // VS Code's pseudo locale, not supported in Viya server locale = "en"; } apiConfig.baseOptions.headers = { "Accept-Language": locale }; //Check to see if we can reconnect to a session first this._computeSession = await this.reconnectComputeSession(); if (this._computeSession) { //reconnected to a running session, so just return await this.printSessionLog(this._computeSession); updateStatusBarItem(true); return; } //Start a new session if (this._config.serverId) { const server1 = new ComputeServer(this._config.serverId); server1.options = formattedOpts; server1.autoExecLines = this._config.autoExecLines; this._computeSession = await server1.getSession(); //Maybe wait for session to be initialized? } else { const contextsApi = ContextsApi(apiConfig); const context = await this.getContext(); //Create session from context const sess = ( await contextsApi.createSession( { contextId: context.id, sessionRequest: { environment: { options: [...formattedOpts], autoExecLines: [...autoExecLines], }, }, }, { headers: { "accept-language": locale } }, ) ).data; this._computeSession = ComputeSession.fromInterface(sess); } await this.printSessionLog(this._computeSession); //Save the current sessionId setContextValue("SAS.sessionId", this._computeSession.sessionId); updateStatusBarItem(true); }; protected _run = async (code: string, ...args) => { if (!this._computeSession?.sessionId) { throw new Error(); } //Check the args for extra information const variables: { [key: string]: string } = {}; //If baseDirectory is passed in, use it as a sas variable const runArgs = args[0] || {}; const basePath = runArgs.baseDirectory || undefined; if (basePath) { variables._SASPROGRAMDIR = basePath; } //Get the job const job = await this._computeSession.execute({ code: [code], variables: variables, }); //Clear out the logs await this.printJobLog(job); //Now get the results const results = await job.results(); const res: RunResult = { html5: "", title: "", }; /* We can return more than just html, but for right now we are only returning the last HTML file that we get. The last one is returned so that the one created from the vscode injected ods statement is always returned. */ for (const result of results.reverse()) { const link = result.links[0]; if (link?.type === "text/html") { const html5 = (await job.requestLink(link)).data; //Make sure that the html has a valid body if (html5.search('<*id="IDX*.+">') !== -1) { res.html5 = html5; res.title = result.name; } break; } } return res; }; protected _close = async () => { this._cachedContext = undefined; if (this.sessionId()) { this._computeSession.delete(); this._computeSession = undefined; //Since the session is being closed, remove the cached session id setContextValue("SAS.sessionId", undefined); updateStatusBarItem(false); } }; public sessionId = (): string => { return this._computeSession && this._computeSession.sessionId; }; public cancel = async (): Promise => { this._cachedContext = undefined; if (this._computeSession) { await this._computeSession.self(); await this._computeSession.cancel(); } }; /** * Formats the connection profile sasOptions into a format that the compute * API can understand. * * Examples: * * ``` * ["-PAGESIZE=MAX"] -> ["-PAGESIZE MAX"] * ["-NOTERMINAL"] -> ["-NOTERMINAL"] * ``` * * @returns formatted SAS Options */ private formatSASOptions = (): string[] => { const formattedOpts = this._config.sasOptions.map((opt) => { let formatted = opt; formatted = formatted.replace(/=/gi, " "); return formatted; }); return formattedOpts; }; private reconnectComputeSession = async (): Promise => { let session: ComputeSession = undefined; if (!this._config.reconnect) { return undefined; } //Grab the sessionId const sessionId: string = await getContextValue("SAS.sessionId"); if (sessionId === undefined) { //No sessionId in the cache means nothing to reconnect to return undefined; } //At this point a sessionId was retrieved, so try and re-connect if (this._config.serverId) { const computeServer = new ComputeServer(this._config.serverId); try { session = await computeServer.getSession(sessionId); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { console.log( `Attempt to reconnect to session ${sessionId} failed. A new session will be started`, ); } } else { const apiConfig = getApiConfig(); const sessions = SessionsApi(apiConfig); try { const mySession = (await sessions.getSession({ sessionId: sessionId })) .data; session = ComputeSession.fromInterface(mySession); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { console.log( `Attempt to reconnect to session ${sessionId} failed. A new session will be started`, ); } } if (session === undefined) { //If we tried to reconnect and failed, set the cached sessionId to undefined setContextValue("SAS.sessionId", undefined); } return session; }; /** * Prints the job log in an async manner. * @param job a job id to print logs for. */ private printJobLog = async (job: ComputeJob) => { const logs = job.getLogStream(); for await (const log of logs) { if (log?.length > 0) { this._onExecutionLogFn(log); } } }; /** * Prints the session log in an async manner. * @param session a session id to print logs for. */ private printSessionLog = async (session: ComputeSession) => { const logs = await session.getLogStream(); for await (const log of logs) { if (log?.length > 0 && this._onSessionLogFn) { this._onSessionLogFn(log); } } }; } export function getSession(c: Config): Session { getApiConfig().basePath = c.endpoint + "/compute"; if (!sessionInstance) { sessionInstance = new RestSession(); } sessionInstance.config = c; return sessionInstance; } ================================================ FILE: client/src/connection/rest/job.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import { AxiosRequestConfig, AxiosResponse } from "axios"; import { throttle } from "../../components/utils/throttle"; import { Job, JobsApi, JobsApiGetJobStateRequest, Link, LogLine, LogsApi, Result, ResultCollection, } from "./api/compute"; import { Compute, getApiConfig, stateOptions } from "./common"; export class ComputeJob extends Compute { api: ReturnType; logs: ReturnType; _self: Job; constructor(id: string) { super(); //set the id this._self = { id: id }; //Get the apis I need this.api = JobsApi(getApiConfig()); this.logs = LogsApi(getApiConfig()); } get id(): string { return this._self?.id || ""; } static fromInterface(job: Job): ComputeJob { const obj = new ComputeJob(""); obj._self = job; return obj; } static fromResponse(response: AxiosResponse): ComputeJob { const obj = ComputeJob.fromInterface(response.data); obj.etag = response.headers.etag; return obj; } async followLink( linkName: string, options?: AxiosRequestConfig, ): Promise> { if (this._self.links === undefined) { await this.self(); } const link = this.getLink(this._self.links, linkName); if (link === undefined) { throw new Error( l10n.t("Job does not have '{linkName}' link", { linkName, }), ); } return await this.requestLink(link, options); } async getState(options?: stateOptions): Promise { const parms: JobsApiGetJobStateRequest = { sessionId: this._self.sessionId, jobId: this.id, wait: options?.wait, ifNoneMatch: options?.onChange ? this.etag : undefined, }; const resp = await this.api.getJobState(parms, { validateStatus: (status) => { return status >= 200 && status < 400; }, }); if (resp.status === 200) { //Set the new etag this.etag = resp.headers.etag; //return the state return resp.data; } else if (resp.status === 304) { //Not modified return await this.getState(); //This is bad. We need to cache the last state value } else { throw new Error(l10n.t("Something went wrong")); } } //Get the job log as a stream. async *getLogStream(options?: { timeout?: number; }): AsyncGenerator { let state = await this.getState(); const timeout = options?.timeout ?? 10; let start = 0; const states = ["done", "canceled", "error", "warning", "completed"]; while (states.indexOf(state) === -1) { //Get a log page const resp = await this.logs.getJobLog({ sessionId: this._self.sessionId, jobId: this.id, start: start, timeout: timeout, }); if (resp.status === 200) { const items = resp.data.items; const num = items.length; yield items; //increase start location start += num; //get new state state = await this.getState(); } else { break; } } //There is a chance that the job ended between our last read and now. //Need to make sure we clear out the log let nextLink: Link = undefined; let resp = await this.logs.getJobLog({ sessionId: this._self.sessionId, jobId: this.id, start: start, timeout: timeout, }); //To clear out the log, we yield all lines until there is not "next" link do { if (resp.status === 200) { nextLink = resp.data.links?.find((link) => link.rel === "next"); const items = resp.data.items; yield items; if (nextLink) { resp = await this.requestLink(nextLink); } } else { break; } } while (nextLink !== undefined); } /* Check to see if the job is done. Done is defined as the job having run to some sort of completed state ie. the job stopped because it finished executing or is was stopped due to an error or other signal. */ async isDone(state?: string): Promise { const doneStates = ["done", "canceled", "error", "warning", "completed"]; return doneStates.indexOf(state || (await this.getState())) === -1; } /* Return job results */ async results(type?: string): Promise { const link = this.getLink(this._self.links, "results"); const resp = await this.requestLink(link, { params: { filter: `eq(type,${type ?? "ODS"})`, }, }); const count = resp.data.count; const limit = resp.data.limit; if (count <= limit) { return resp.data.items; } // get all pages const requests: Array<() => Promise>> = []; for (let i = limit; i < count; i += limit) { requests.push(() => this.requestLink(link, { params: { filter: `eq(type,${type ?? "ODS"})`, start: i, limit, }, }), ); } const results = await throttle(requests, 3); return results.reduce( (prev, resp) => prev.concat(resp.data.items), resp.data.items, ); } } ================================================ FILE: client/src/connection/rest/server.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import { AxiosResponse } from "axios"; import { Link, Server, ServersApi, SessionRequest } from "./api/compute"; import { BaseCompute, Compute, getApiConfig, stateOptions } from "./common"; import { ComputeSession } from "./session"; const DEFAULT_COMPUTE_OPTS = ["-validmemname EXTEND", "-validvarname ANY"]; export class ComputeServer extends Compute { api; _self: Server & BaseCompute; _options?: string[]; _autoExecLines?: string[]; constructor(id: string) { super(); this._self = { id: id }; this.api = ServersApi(getApiConfig()); } get id(): string { return this._self?.id || ""; } get links(): Array { return this._self?.links || []; } set options(value: string[]) { this._options = value; } set autoExecLines(value: string[]) { this._autoExecLines = value; } static fromInterface(server: Server): ComputeServer { const _server = new ComputeServer(""); _server._self = server; return _server; } static fromResponse(response: AxiosResponse): ComputeServer { const _server = ComputeServer.fromInterface(response.data); _server.etag = response.headers.etag; return _server; } async self(): Promise { if (this._self.id === undefined) { throw new Error(l10n.t("Cannot call self on object with no id")); } const res = await this.api.getServer({ serverId: this.id }); if (res.status === 200) { this._self = res.data; this.etag = res.headers.etag; return res.data; } else { throw new Error( l10n.t("Error getting server with ID {id} - {message}", { id: this.id, message: res.message, }), ); } } async createSession(): Promise { if (this._self.links === undefined) { await this.self(); } const link = this.getLink(this.links, "createSession"); if (link === undefined) { throw new Error(l10n.t("Server does not have createSession link")); } //Create the session const body: SessionRequest = { version: 1, name: "mysess", description: "This is a session", attributes: {}, environment: { options: [...DEFAULT_COMPUTE_OPTS, ...this._options], autoExecLines: this._autoExecLines || [], }, }; const resp = await this.requestLink(link, { data: body }); //Create the session from the http resposne const session = ComputeSession.fromResponse(resp); return session; } async getSession(sessionId?: string): Promise { if (sessionId !== undefined) { const sess = new ComputeSession(sessionId); await sess.self(); return sess; } else { return this.createSession(); } } async getState(options?: stateOptions): Promise { if (this._self.links === undefined) { await this.self(); } const params: { timeout?: number } = {}; const headers = {}; if (options !== undefined) { if (options.onChange) { headers["If-None-Match"] = this.etag; } if (options.wait) { params.timeout = options.wait; } } const link = this.getLink(this._self.links, "state"); if (link === undefined) { throw new Error(l10n.t("Server does not have state link")); } const { data, status } = await this.requestLink(link, { params: params, headers: headers, }); if (status === 200) { return data; } else { throw new Error(l10n.t("Something went wrong")); } } } ================================================ FILE: client/src/connection/rest/session.ts ================================================ // Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import { AxiosRequestConfig, AxiosResponse } from "axios"; import { JobRequest, JobsApiAxiosParamCreator, Link, LogLine, LogsApi, Session, SessionsApi, SessionsApiGetSessionStateRequest, } from "./api/compute"; import { BaseCompute, Compute, ComputeState, getApiConfig, stateOptions, } from "./common"; import { ComputeJob } from "./job"; export class ComputeSession extends Compute { api; //Session api logs; //Logs api _self: Session & BaseCompute; constructor(id: string) { super(); //Set at least Id in self. this._self = { id: id }; //Get the api objects we need this.api = SessionsApi(getApiConfig()); this.logs = LogsApi(getApiConfig()); } get sessionId(): string { return this._self?.id || ""; } static fromInterface(session: Session): ComputeSession { const sess = new ComputeSession(""); sess._self = session; return sess; } static fromResponse(response: AxiosResponse): ComputeSession { const sess = ComputeSession.fromInterface(response.data); sess.etag = response.headers.etag; return sess; } async getSession(sessionId?: string): Promise { const id = sessionId || this.sessionId; const res = await this.api.getSession({ sessionId: id }); if (res.status === 200) { return res.data; } else { throw new Error( l10n.t("Error getting session with ID {id} - {message}", { id, message: res.message, }), ); } } async self(): Promise { if (this._self.id === undefined) { throw new Error(l10n.t("Cannot call self on ComputeSession with no id")); } const res = await this.api.getSession({ sessionId: this.sessionId }); if (res.status === 200) { this._self = res.data; this.etag = res.headers.etag; return res.data; } else { throw new Error( l10n.t("Error getting server with ID {id} - {message}", { id: this._self.id, message: res.message, }), ); } } async getState(options?: stateOptions): Promise { const parms: SessionsApiGetSessionStateRequest = { sessionId: this.sessionId, wait: options?.wait, ifNoneMatch: options?.onChange ? this.etag : undefined, }; const resp = await this.api.getSessionState(parms); if (resp?.data) { this.etag = resp.headers.etag; return resp.data; } throw new Error( l10n.t("Failed to get state from Session {sessionId}", { sessionId: this.sessionId, }), ); } async followLink( linkName: string, options?: AxiosRequestConfig, ): Promise> { if (this._self.links === undefined) { await this.self(); } const link = this.getLink(this._self.links, linkName); if (link === undefined) { throw new Error( l10n.t("Session does not have '{linkName}' link", { linkName }), ); } return await this.requestLink(link, options); } /** * Set the state of a session. * Not all states may be set on a session. * * @param state */ async setState(state: ComputeState): Promise> { return this.api.updateSessionState( { sessionId: this.sessionId, value: state, ifMatch: this.etag, }, { headers: { "Content-Type": "text/plain" } }, ); } /** * Cancel a session. * This is used to recover from syntax check mode. * @returns */ async cancel(): Promise { const resp = await this.setState(ComputeState.Canceled); if (resp.status === 200) { this.etag = resp.headers.etag; return true; } else if (resp.status === 412) { await this.self(); return await this.cancel(); } return false; } /** * Execute code in the SAS session * @param request * @returns */ async execute(request: JobRequest): Promise { const paramCreator = JobsApiAxiosParamCreator(getApiConfig()); const options = (await paramCreator.createJob(this.sessionId, request)) .options; //Submit the job. //This does not wait for the job to complete, just to return the definition const resp = await this.followLink("execute", options); //Now create the job object return ComputeJob.fromResponse(resp); } /** * Delete a session. * * This shuts down the SAS session. */ async delete(): Promise { await this.followLink("delete"); } async *getLogStream(options?: { timeout?: number; }): AsyncGenerator { let state = await this.getState(); const timeout = options?.timeout ?? 10; let start = 0; const states = [ "done", "canceled", "error", "warning", "completed", "idle", "failed", ]; while (states.indexOf(state) === -1) { //Get a log page const resp = await this.logs.getSessionLog({ sessionId: this.sessionId, start: start, timeout: timeout, }); if (resp.status === 200) { const items = resp.data.items; const num = items.length; yield items; //increase start location start += num; //get new state state = await this.getState(); } else { break; } } //There is a chance that the job ended between our last read and now. //Need to make sure we clear out the log let nextLink: Link = undefined; let resp = await this.logs.getSessionLog({ sessionId: this.sessionId, start: start, }); //To clear out the log, we yeild all lines until there is not "next" link do { if (resp.status === 200) { nextLink = resp.data.links?.find((link) => link.rel === "next"); const items = resp.data.items; yield items; if (nextLink) { resp = await this.requestLink(nextLink); } } else { break; } } while (nextLink !== undefined); } } ================================================ FILE: client/src/connection/rest/util.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Uri } from "vscode"; import { DATAFLOW_TYPE, FAVORITES_FOLDER_TYPE, FILE_TYPES, FOLDER_TYPE, TRASH_FOLDER_TYPE, } from "../../components/ContentNavigator/const"; import { ContentItem, ContentSourceType, Link, Permission, } from "../../components/ContentNavigator/types"; import { getTypeName, isRootFolder, } from "../../components/ContentNavigator/utils"; export const getLink = ( links: Array, method: string, relationship: string, ): Link | null => !links || links.length === 0 ? null : links.find((link) => link.method === method && link.rel === relationship); export const getResourceIdFromItem = (item: ContentItem): string | null => { // Only members have uri attribute. if (item.uri) { return item.uri; } return getLink(item.links, "GET", "self")?.uri || null; }; export const getSasContentUri = (item: ContentItem, readOnly?: boolean): Uri => Uri.parse( `${readOnly ? `${ContentSourceType.SASContent}ReadOnly` : ContentSourceType.SASContent}:/${ item.name ? item.name.replace(/#/g, "%23").replace(/\?/g, "%3F") : item.name }?id=${getResourceIdFromItem(item)}`, ); export const getSasServerUri = (item: ContentItem, readOnly?: boolean): Uri => Uri.parse( `${readOnly ? `${ContentSourceType.SASServer}ReadOnly` : ContentSourceType.SASServer}:/${ item.name ? item.name.replace(/#/g, "%23").replace(/\?/g, "%3F") : item.name }?id=${getResourceIdFromItem(item)}`, ); export const getPermission = (item: ContentItem): Permission => { const itemType = getTypeName(item); return [FOLDER_TYPE, ...FILE_TYPES].includes(itemType) // normal folders and files ? { write: !!getLink(item.links, "PUT", "update"), delete: !!getLink(item.links, "DELETE", "deleteResource"), addMember: !!getLink(item.links, "POST", "createChild"), } : { // delegate folders, user folder and user root folder write: false, delete: false, addMember: itemType !== TRASH_FOLDER_TYPE && itemType !== FAVORITES_FOLDER_TYPE && !!getLink(item.links, "POST", "createChild"), }; }; export const getItemContentType = (item: ContentItem): string | undefined => { const itemIsReference = item.type === "reference"; if (itemIsReference || isRootFolder(item)) { return undefined; } if (item.contentType === DATAFLOW_TYPE) { return "application/json"; } return "application/vnd.sas.file+json"; }; export const getResourceId = (uri: Uri): string => uri.query.substring(3); // ?id=... ================================================ FILE: client/src/connection/session.ts ================================================ // Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ProgressLocation, l10n, window } from "vscode"; import type { OnLogFn, RunResult } from "."; export type SessionContextAttributes = | { fileNavigationCustomRootPath: string | undefined; fileNavigationRoot: "CUSTOM" | "SYSTEM" | "USER" | undefined; } | undefined; export abstract class Session { protected _rejectRun: (reason?: unknown) => void | undefined; protected _connectionPromise: Promise | undefined; protected _onSessionLogFn: OnLogFn | undefined; public set onSessionLogFn(value: OnLogFn) { this._onSessionLogFn = value; } protected _onExecutionLogFn: OnLogFn | undefined; public set onExecutionLogFn(value: OnLogFn) { this._onExecutionLogFn = value; } async setup(silent?: boolean): Promise { // If we already have a connection promise we're awaiting, lets use that. // Otherwise, establish a new connection this._connectionPromise ||= this.establishConnection(); if (silent) { const resolvedData = await this._connectionPromise; this._connectionPromise = undefined; return resolvedData; } await window.withProgress( { location: ProgressLocation.Notification, title: l10n.t("Connecting to SAS session..."), }, async () => { const resolvedData = await this._connectionPromise; this._connectionPromise = undefined; return resolvedData; }, ); } protected abstract establishConnection(): Promise; run(code: string, ...args): Promise { return new Promise((resolve, reject) => { this._rejectRun = reject; this._run(code, ...args) .then(resolve, reject) .finally(() => (this._rejectRun = undefined)); }); } protected abstract _run(code: string, ...args): Promise; cancel?(): Promise; close(): Promise | void { if (this._rejectRun) { this._rejectRun({ message: l10n.t("The SAS session has closed.") }); this._rejectRun = undefined; } this._connectionPromise = undefined; return this._close(); } protected abstract _close(): Promise | void; abstract sessionId?(): string | undefined; contextAttributes?(): Promise; } ================================================ FILE: client/src/connection/ssh/auth.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n, window } from "vscode"; import { readFileSync } from "fs"; import { AgentAuthMethod, KeyboardInteractiveAuthMethod, ParsedKey, PasswordAuthMethod, Prompt, PublicKeyAuthMethod, utils, } from "ssh2"; /** * Abstraction for presenting authentication prompts to the user. */ export interface AuthPresenter { /** * Prompt the user for a passphrase. * @returns the passphrase entered by the user */ presentPasswordPrompt: (username: string) => Promise; /** * Prompt the user for a password. * @returns the password entered by the user */ presentPassphrasePrompt: () => Promise; /** * Present multiple prompts to the user. * This scenario can happen when the server sends multiple input prompts to the user during keyboard-interactive authentication. * Auth setups involving MFA or PAM can trigger this scenario. * One input box will be presented for each prompt. * @param prompts an array of prompts to present to the user * @returns array of answers to the prompts */ presentMultiplePrompts: ( username: string, prompts: Prompt[], ) => Promise; } class AuthPresenterImpl implements AuthPresenter { presentPasswordPrompt = async (username: string): Promise => { return this.presentPrompt( l10n.t("Enter the password for user: {username}", { username }), l10n.t("Password Required"), true, ); }; presentPassphrasePrompt = async (): Promise => { return this.presentPrompt( l10n.t("Enter the passphrase for the private key"), l10n.t("Passphrase Required"), true, ); }; presentMultiplePrompts = async ( username: string, prompts: Prompt[], ): Promise => { const answers: string[] = []; for (const prompt of prompts) { const answer = await this.presentPrompt( undefined, l10n.t("User {username} {prompt}", { username, prompt: prompt.prompt, }), !prompt.echo, ); if (answer) { answers.push(answer); } } return answers; }; /** * Present a secure prompt to the user. * @param prompt the prompt to display to the user * @param title optional title for the prompt * @param isSecureInput whether the input should be hidden * @returns the user's response to the prompt */ private presentPrompt = async ( prompt: string, title?: string, isSecureInput?: boolean, ): Promise => { return window.showInputBox({ ignoreFocusOut: true, prompt: prompt, title: title, password: isSecureInput, }); }; } /** * Handles the authentication process for the ssh connection. * */ export class AuthHandler { private _authPresenter: AuthPresenter; private _keyParser: KeyParser; constructor(authPresenter?: AuthPresenter, keyParser?: KeyParser) { this._authPresenter = authPresenter; this._keyParser = keyParser; if (!authPresenter) { this._authPresenter = new AuthPresenterImpl(); } if (!keyParser) { this._keyParser = new KeyParserImpl(); } } /** * Authenticate to the server using the password method. * @param cb ssh2 NextHandler callback instance. This is used to pass the authentication information to the ssh server. * @param resolve a function that resolves the promise that is waiting for the password * @param username the user name to use for the connection */ passwordAuth = async (username: string): Promise => { const pw = await this._authPresenter.presentPasswordPrompt(username); return { type: "password", password: pw, username: username, }; }; /** * Authenticate to the server using the keyboard-interactive method. * @param cb ssh2 NextHandler callback instance. This is used to pass the authentication information to the ssh server. * @param resolve a function that resolves the promise that is waiting for authentication * @param username the user name to use for the connection */ keyboardInteractiveAuth = async ( username: string, ): Promise => { return { type: "keyboard-interactive", username: username, prompt: (_name, _instructions, _instructionsLang, prompts, finish) => { // often, the server will only send a single prompt for the password. // however, PAM can send multiple prompts, so we need to handle that case this._authPresenter .presentMultiplePrompts(username, prompts) .then((answers) => { finish(answers); }); }, }; }; /** * Authenticate to the server using the ssh-agent. See the extension Docs for more information on how to set up the ssh-agent. * @param cb ssh2 NextHandler callback instance. This is used to pass the authentication information to the ssh server. * @param username the user name to use for the connection */ sshAgentAuth = (username: string): AgentAuthMethod => { return { type: "agent", agent: process.env.SSH_AUTH_SOCK, username: username, }; }; /** * Authenticate to the server using a private key file. * If a private key file is defined in the connection profile, this function will read the file and use it to authenticate to the server. * If the key is encrypted, the user will be prompted for the passphrase. * @param cb ssh2 NextHandler callback instance. This is used to pass the authentication information to the ssh server. * @param resolve a function that resolves the promise that is waiting for authentication * @param privateKeyFilePath the path to the private key file defined in the connection profile * @param username the user name to use for the connection */ privateKeyAuth = async ( privateKeyFilePath: string, username: string, ): Promise => { // first, try to parse the key file without a passphrase const parsedKeyResult = this._keyParser.parseKey(privateKeyFilePath); const hasParseError = parsedKeyResult instanceof Error; const passphraseRequired = hasParseError && parsedKeyResult.message === "Encrypted private OpenSSH key detected, but no passphrase given"; // key is encrypted, prompt for passphrase if (passphraseRequired) { const passphrase = await this._authPresenter.presentPassphrasePrompt(); //parse the keyfile using the passphrase const passphrasedKeyContentsResult = this._keyParser.parseKey( privateKeyFilePath, passphrase, ); if (passphrasedKeyContentsResult instanceof Error) { throw passphrasedKeyContentsResult; } else { return { type: "publickey", key: passphrasedKeyContentsResult, passphrase: passphrase, username: username, }; } } else { if (hasParseError) { throw parsedKeyResult; } else { return { type: "publickey", key: parsedKeyResult, username: username, }; } } }; } /** * Parses a private key file. */ export interface KeyParser { /** * Parse the private key file. * If a passphrase is specified, the key will be decrypted using the passphrase. * @param privateKeyPath the path to the private key file * @param passphrase the passphrase to decrypt the key if applicable * @returns the parsed key or an error if the key could not be parsed */ parseKey: (privateKeyPath: string, passphrase?: string) => ParsedKey | Error; } class KeyParserImpl implements KeyParser { private readKeyFile = (privateKeyPath: string): Buffer => { try { return readFileSync(privateKeyPath); } catch (e) { throw new Error( l10n.t("Error reading private key file: {filePath}, error: {message}", { filePath: privateKeyPath, message: e.message, }), ); } }; public parseKey = ( privateKeyPath: string, passphrase?: string, ): ParsedKey | Error => { const keyContents = this.readKeyFile(privateKeyPath); return utils.parseKey(keyContents, passphrase); }; } ================================================ FILE: client/src/connection/ssh/const.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 const SECOND = 1000; const MINUTE = 60 * SECOND; export const KEEPALIVE_INTERVAL = 60 * SECOND; //How often (in milliseconds) to send SSH-level keepalive packets to the server. Set to 0 to disable. export const KEEPALIVE_UNANSWERED_THRESHOLD = (15 * MINUTE) / KEEPALIVE_INTERVAL; //How many consecutive, unanswered SSH-level keepalive packets that can be sent to the server before disconnection. export const WORK_DIR_START_TAG = "WORKDIR"; export const WORK_DIR_END_TAG = "WORKDIREND"; export const CONNECT_READY_TIMEOUT = 5 * MINUTE; //allow extra time due to possible prompting ================================================ FILE: client/src/connection/ssh/index.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { l10n } from "vscode"; import { AgentAuthMethod, AuthHandlerMiddleware, AuthenticationType, Client, ClientChannel, ConnectConfig, KeyboardInteractiveAuthMethod, NextAuthHandler, PasswordAuthMethod, PublicKeyAuthMethod, } from "ssh2"; import { BaseConfig, RunResult } from ".."; import { updateStatusBarItem } from "../../components/StatusBarItem"; import { Session } from "../session"; import { extractOutputHtmlFileName } from "../util"; import { AuthHandler } from "./auth"; import { CONNECT_READY_TIMEOUT, KEEPALIVE_INTERVAL, KEEPALIVE_UNANSWERED_THRESHOLD, WORK_DIR_END_TAG, WORK_DIR_START_TAG, } from "./const"; import { LineCodes } from "./types"; let sessionInstance: SSHSession; export interface Config extends BaseConfig { host: string; username: string; saspath: string; port: number; privateKeyFilePath?: string; } export function getSession(c: Config): Session { if (!sessionInstance) { sessionInstance = new SSHSession(c, new Client()); } return sessionInstance; } export class SSHSession extends Session { private _conn: Client; private _stream: ClientChannel | undefined; private _config: Config; private _resolve: ((value?) => void) | undefined; private _reject: ((reason?) => void) | undefined; private _html5FileName = ""; private _sessionReady: boolean; private _authHandler: AuthHandler; private _workDirectory: string; private _authsLeft: AuthenticationType[]; constructor(c?: Config, client?: Client) { super(); this._config = c; this._conn = client; this._sessionReady = false; this._authHandler = new AuthHandler(); this._authsLeft = []; } public sessionId? = (): string => { throw new Error(l10n.t("Method not implemented.")); }; set config(newValue: Config) { this._config = newValue; } protected establishConnection = (): Promise => { return new Promise((pResolve, pReject) => { this._resolve = pResolve; this._reject = pReject; if (this._stream) { this._resolve?.({}); return; } const authHandlerFn = this.handleSSHAuthentication(); const cfg: ConnectConfig = { host: this._config.host, port: this._config.port, username: this._config.username, readyTimeout: CONNECT_READY_TIMEOUT, keepaliveInterval: KEEPALIVE_INTERVAL, keepaliveCountMax: KEEPALIVE_UNANSWERED_THRESHOLD, authHandler: (methodsLeft, partialSuccess, callback) => ( authHandlerFn(methodsLeft, partialSuccess, callback), undefined ), }; if (!this._conn) { this._conn = new Client(); } this._conn .on("close", this.onConnectionClose) .on("ready", () => { this._conn.shell(this.onShell); }) .on("error", this.onConnectionError); this._conn.connect(cfg); }); }; protected _run = (code: string): Promise => { this._html5FileName = ""; return new Promise((_resolve, _reject) => { this._resolve = _resolve; this._reject = _reject; this._stream?.write(`${code}\n`); this._stream?.write(`%put ${LineCodes.RunEndCode};\n`); }); }; protected _close = (): void | Promise => { if (!this._stream) { this.disposeResources(); return; } this._stream.write("endsas;\n"); this._stream.close(); }; private onConnectionClose = () => { if (!this._sessionReady) { this._reject?.(new Error(l10n.t("Could not connect to the SAS server."))); } this.disposeResources(); }; private disposeResources = () => { this._stream = undefined; this._resolve = undefined; this._reject = undefined; this._html5FileName = ""; this._workDirectory = undefined; this.clearAuthState(); sessionInstance = undefined; this._authsLeft = []; }; private onConnectionError = (err: Error) => { this.clearAuthState(); this._reject?.(err); }; private getResult = (): void => { const runResult: RunResult = {}; if (!this._html5FileName) { this._resolve?.(runResult); return; } let fileContents = ""; this._conn.exec( `cat ${this._workDirectory}/${this._html5FileName}.htm`, (err: Error, s: ClientChannel) => { if (err) { this._reject?.(err); return; } s.on("data", (data) => { fileContents += data.toString(); }).on("close", (code) => { const rc: number = code; if (rc === 0) { //Make sure that the html has a valid body //TODO #185: should this be refactored into a shared location? if (fileContents.search('<*id="IDX*.+">') !== -1) { runResult.html5 = fileContents; runResult.title = l10n.t("Result"); } } this._resolve?.(runResult); }); }, ); }; private onStreamClose = (): void => { this._conn.end(); updateStatusBarItem(false); }; private resolveSystemVars = (): void => { const code = `%let wd = %sysfunc(pathname(work)); %let rc = %sysfunc(dlgcdir("&wd")); data _null_; length x $ 4096; file STDERR; x = resolve('&wd'); put '${WORK_DIR_START_TAG}' x '${WORK_DIR_END_TAG}'; run; `; this._stream.write(code); }; private onStreamData = (data: Buffer): void => { const output = data.toString().trimEnd(); if (!this._sessionReady && output.endsWith("?")) { this._sessionReady = true; this._resolve?.(); this.resolveSystemVars(); updateStatusBarItem(true); return; } if (this._sessionReady && !this._workDirectory) { const match = output.match( `${WORK_DIR_START_TAG}(/[\\s\\S]*?)${WORK_DIR_END_TAG}`, ); if (match && match.length > 1) { this._workDirectory = match[1].trimEnd().replace(/(\r\n|\n|\r)/gm, ""); } } const outputLines = output.split(/\n|\r\n/); outputLines.forEach((line) => { if (!line) { return; } const trimmedLine = line.trimEnd(); if (trimmedLine.endsWith(LineCodes.RunEndCode)) { // run completed this.getResult(); } if (!(trimmedLine.endsWith("?") || trimmedLine.endsWith(">"))) { this._html5FileName = extractOutputHtmlFileName( line, this._html5FileName, ); this._onExecutionLogFn?.([{ type: "normal", line }]); } }); }; private onShell = (err: Error, s: ClientChannel): void => { if (err) { this._reject?.(err); return; } this._stream = s; if (!this._stream) { this._reject?.(err); return; } this._stream.on("close", this.onStreamClose); this._stream.on("data", this.onStreamData); const resolvedEnv: string[] = [ "env", '_JAVA_OPTIONS="-Djava.awt.headless=true"', ]; const execArgs: string = resolvedEnv.join(" "); const resolvedSasOpts: string[] = [ "-nodms", "-noterminal", "-nosyntaxcheck", ]; if (this._config.sasOptions?.length > 0) { resolvedSasOpts.push(...this._config.sasOptions); } const execSasOpts: string = resolvedSasOpts.join(" "); this._stream.write(`${execArgs} ${this._config.saspath} ${execSasOpts} \n`); }; /** * Resets the SSH auth state. */ private clearAuthState = (): void => { this._sessionReady = false; this._authsLeft = []; }; private handleSSHAuthentication = (): AuthHandlerMiddleware => { //The ssh2 library supports sending false to stop the authentication process // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const END_AUTH = false as unknown as AuthenticationType; return async ( authsLeft: AuthenticationType[], partialSuccess: boolean, //used in scenarios which require multiple auth methods to denote partial success nextAuth: NextAuthHandler, ) => { if (!authsLeft) { return nextAuth({ type: "none", username: this._config.username }); //sending none will prompt the server to send supported auth methods } else { if (authsLeft.length === 0) { return nextAuth(END_AUTH); } if (this._authsLeft.length === 0 || partialSuccess) { this._authsLeft = authsLeft; } const authMethod = this._authsLeft.shift(); try { let authPayload: | PublicKeyAuthMethod | AgentAuthMethod | PasswordAuthMethod | KeyboardInteractiveAuthMethod; switch (authMethod) { case "publickey": { //user set a keyfile path in profile config if (this._config.privateKeyFilePath) { authPayload = await this._authHandler.privateKeyAuth( this._config.privateKeyFilePath, this._config.username, ); } else if (process.env.SSH_AUTH_SOCK) { authPayload = this._authHandler.sshAgentAuth( this._config.username, ); } break; } case "password": { authPayload = await this._authHandler.passwordAuth( this._config.username, ); break; } case "keyboard-interactive": { authPayload = await this._authHandler.keyboardInteractiveAuth( this._config.username, ); break; } default: nextAuth(authMethod); } return nextAuth(authPayload); } catch (e) { this._reject?.(e); return nextAuth(END_AUTH); } } }; }; } ================================================ FILE: client/src/connection/ssh/types.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { BaseConfig } from ".."; export interface Config extends BaseConfig { host: string; username: string; saspath: string; port: number; privateKeyFilePath: string; } export enum LineCodes { ResultsFetchedCode = "--vscode-sas-extension-results-fetched--", RunCancelledCode = "--vscode-sas-extension-run-cancelled--", RunEndCode = "--vscode-sas-extension-submit-end--", LogLineType = "--vscode-sas-extension-log-line-type--", } ================================================ FILE: client/src/connection/studio/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { AxiosInstance } from "axios"; function getStudioSessionRequest(connection: AxiosInstance) { const date = new Date(); const timeZoneOffset = date.getTimezoneOffset(); // Extract hours and minutes from the time zone offset const hoursOffset = Math.floor(Math.abs(timeZoneOffset) / 60); const minutesOffset = Math.abs(timeZoneOffset) % 60; // Convert the time zone offset to the desired format (e.g., "GMT+02:00") const formattedTimeZoneOffset = `GMT${ timeZoneOffset >= 0 ? "-" : "+" }${hoursOffset.toString().padStart(2, "0")}:${minutesOffset .toString() .padStart(2, "0")}`; // Create the request body return JSON.stringify({ baseUri: connection.getUri() + "/SASStudio/", locale: "en_US", zone: formattedTimeZoneOffset, }); } function getflowObjRequest( name: string, resourceId: string, parentResourceId: string, ) { return JSON.stringify({ name: name, uri: "sascontent:" + resourceId, parentUri: "sascontent:" + parentResourceId, currentParentUri: null, }); } export async function createStudioSession( connection: AxiosInstance, ): Promise { const studioSessionRequest = getStudioSessionRequest(connection); const res = await connection.post("/studio/sessions", studioSessionRequest, { headers: { "Content-Type": "application/json", Accept: "application/json", }, }); return res.data.id; } export async function associateFlowObject( name: string, resourceId: string, parentResourceId: string, sessionId: string, connection: AxiosInstance, ): Promise { const flowObjRequest = getflowObjRequest(name, resourceId, parentResourceId); const response = await connection.post( "/SASStudio/sasexec/{sessionId}/associateFlowObj".replace( `{${"sessionId"}}`, sessionId, ), flowObjRequest, { headers: { "Content-Type": "application/json", Accept: "*/*", }, }, ); return response.data.uri; } ================================================ FILE: client/src/connection/util.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export function extractOutputHtmlFileName( line: string, defaultValue: string, ): string { return ( line.match(/body="(.{8}-.{4}-.{4}-.{4}-.{12}).htm"/)?.[1] ?? defaultValue ); } export const extractTextBetweenTags = ( text: string, startTag: string = "", endTag: string = "", ): string => { return startTag && endTag ? text .slice(text.lastIndexOf(startTag), text.lastIndexOf(endTag)) .replace(startTag, "") .replace(endTag, "") .replace(/^\n/, "") .replace(/\n$/, "") : text; }; export const getColumnIconType = ({ type, format, }: { index: number; type: string; name: string; format: string; }) => { format = format.toUpperCase(); const isDateFormat = () => [ "DAT", "MM", "DD", "YY", "EURDF", "JUL", "YEAR", "DAY", "MONTH", "MON", "DOWNAME", ].some((f) => format.includes(f)) && ![ "TIME", "HH", "SS", "COMM", "DATEAMPM", "DATETIME", "NLDATMTM", "NLDATM", "NLDATMAP", "NLDATMW", ].some((f) => format.includes(f)); const isTimeFormat = () => ["TIME", "TIMAP", "HOUR", "HH", "MM", "SS", "NLDATMTM"].some((f) => format.includes(f), ) && !["DATEAMPM", "DATETIME", "COMMA"].some((f) => format.includes(f)); const isDateTimeFormat = () => ["DATEAMPM", "DATETIME", "NLDATM", "NLDATMAP", "NLDATMW"].some((f) => format.includes(f), ); const isCurrencyFormat = () => ["NLMNI", "NLMNL", "NLMNY", "YEN", "DOLLAR", "EURO"].some((f) => format.includes(f), ); if (type !== "num") { return type; } if (isDateFormat()) { return "date"; } if (isTimeFormat()) { return "time"; } if (isDateTimeFormat()) { return "datetime"; } if (isCurrencyFormat()) { return "currency"; } return type; }; ================================================ FILE: client/src/node/extension.ts ================================================ // Copyright © 2022-2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { ConfigurationChangeEvent, ExtensionContext, Uri, authentication, commands, l10n, languages, tasks, window, workspace, } from "vscode"; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, } from "vscode-languageclient/node"; import * as path from "path"; import { checkProfileAndAuthorize } from "../commands/authorize"; import { closeSession } from "../commands/closeSession"; import { newSASFile, newSASNotebook } from "../commands/new"; import { addProfile, deleteProfile, profileConfig, switchProfile, updateProfile, } from "../commands/profile"; import { run, runRegion, runSelected } from "../commands/run"; import { toggleLineComment } from "../commands/toggleLineComment"; import { getRestAPIs } from "../components/APIProvider"; import { SASAuthProvider } from "../components/AuthProvider"; import { installCAs } from "../components/CAHelper"; import ContentNavigator from "../components/ContentNavigator"; import { ContentSourceType } from "../components/ContentNavigator/types"; import { setContext } from "../components/ExtensionContext"; import LibraryNavigator from "../components/LibraryNavigator"; import { ResultPanelSubscriptionProvider, SAS_RESULT_PANEL, deserializeWebviewPanel, } from "../components/ResultPanel"; import { getStatusBarItem, resetStatusBarItem, updateStatusBarItem, } from "../components/StatusBarItem"; import { LogTokensProvider, legend } from "../components/logViewer"; import { sasDiagnostic } from "../components/logViewer/sasDiagnostics"; import { NotebookController } from "../components/notebook/Controller"; import { NotebookSerializer } from "../components/notebook/Serializer"; import { exportNotebook, saveOutput } from "../components/notebook/exporters"; import { ConnectionType } from "../components/profile"; import { SasTaskProvider } from "../components/tasks/SasTaskProvider"; import { SAS_TASK_TYPE } from "../components/tasks/SasTasks"; let client: LanguageClient; export let extensionContext: ExtensionContext | undefined; export function activate(context: ExtensionContext) { // The server is implemented in node extensionContext = context; const serverModule = context.asAbsolutePath( path.join("server", "dist", "node", "server.js"), ); // The debug options for the server // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging const debugOptions = { execArgv: ["--nolazy", "--inspect=6009"] }; // If the extension is launched in debug mode then the debug server options are used // Otherwise the run options are used const serverOptions: ServerOptions = { run: { module: serverModule, transport: TransportKind.ipc }, debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions, }, }; // Options to control the language client const clientOptions: LanguageClientOptions = { // Register the server for sas file documentSelector: [{ language: "sas" }], }; // Create the language client and start the client. client = new LanguageClient( "sas-lsp", "SAS Language Server", serverOptions, clientOptions, ); // Start the client. This will also launch the server client.start(); installCAs(); setContext(context); const libraryNavigator = new LibraryNavigator(context); // Below we have two content navigators. We'll have one to navigate // SAS Content and another to navigate SAS Server. Both of these will // also determine which adapter to use for processing. The options look // like this: // - rest connection w/ sourceType="sasContent" uses a RestContentAdapter // - rest connection w/ sourceType="sasServer" uses a RestServerAdapter // - itc/iom connection w/ sourceType="sasServer" uses ItcServerAdapter const sasContentNavigator = new ContentNavigator(context, { mimeType: "application/vnd.code.tree.contentdataprovider", sourceType: ContentSourceType.SASContent, treeIdentifier: "contentdataprovider", }); const sasServerNavigator = new ContentNavigator(context, { mimeType: "application/vnd.code.tree.serverdataprovider", sourceType: ContentSourceType.SASServer, treeIdentifier: "serverdataprovider", }); const handleFileUpdated = (e) => { switch (e.type) { case "rename": sasDiagnostic.updateDiagnosticUri(e.uri, e.newUri); break; case "recycle": case "delete": sasDiagnostic.ignoreAll(e.uri); break; } }; const resultPanelSubscriptionProvider = new ResultPanelSubscriptionProvider(); window.registerWebviewPanelSerializer(SAS_RESULT_PANEL, { deserializeWebviewPanel, }); context.subscriptions.push( commands.registerCommand("SAS.run", async () => { await run(); await libraryNavigator.refresh(); }), commands.registerCommand("SAS.runSelected", async (uri: Uri) => { await runSelected(uri); await libraryNavigator.refresh(); }), commands.registerCommand("SAS.runRegion", async () => { await runRegion(client); await libraryNavigator.refresh(); }), commands.registerCommand("SAS.close", (silent) => { closeSession( silent === true ? undefined : l10n.t("The SAS session has closed."), ); }), commands.registerCommand("SAS.switchProfile", switchProfile), commands.registerCommand("SAS.addProfile", addProfile), commands.registerCommand("SAS.deleteProfile", deleteProfile), commands.registerCommand("SAS.updateProfile", updateProfile), commands.registerCommand( "SAS.authorize", checkProfileAndAuthorize(libraryNavigator), ), authentication.registerAuthenticationProvider( SASAuthProvider.id, "SAS", new SASAuthProvider(), ), languages.registerDocumentSemanticTokensProvider( { language: "sas-log" }, LogTokensProvider, legend, ), getStatusBarItem(), ...libraryNavigator.getSubscriptions(), ...sasContentNavigator.getSubscriptions(), ...sasServerNavigator.getSubscriptions(), ...resultPanelSubscriptionProvider.getSubscriptions(), sasContentNavigator.onDidManipulateFile(handleFileUpdated), sasServerNavigator.onDidManipulateFile(handleFileUpdated), // If configFile setting is changed, update watcher to watch new configuration file workspace.onDidChangeConfiguration((event: ConfigurationChangeEvent) => { if (event.affectsConfiguration("SAS.connectionProfiles")) { triggerProfileUpdate(); updateViewSettings(); } }), workspace.registerNotebookSerializer( "sas-notebook", new NotebookSerializer(), ), new NotebookController(), commands.registerCommand("SAS.notebook.new", newSASNotebook), commands.registerCommand("SAS.file.new", newSASFile), commands.registerCommand("SAS.notebook.export", () => exportNotebook(client), ), commands.registerCommand("SAS.notebook.saveOutput", saveOutput), tasks.registerTaskProvider(SAS_TASK_TYPE, new SasTaskProvider()), ...sasDiagnostic.getSubscriptions(), commands.registerTextEditorCommand("SAS.toggleLineComment", (editor) => { toggleLineComment(editor, client); }), ); // Reset first to set "No Active Profiles" resetStatusBarItem(); // Update status bar if profile is found updateStatusBarItem(); profileConfig.migrateLegacyProfiles(); triggerProfileUpdate(); updateViewSettings(); return { getRestAPIs, }; } function updateViewSettings(): void { const activeProfile = profileConfig.getProfileByName( profileConfig.getActiveProfile(), ); const settings = { canSignIn: !activeProfile || activeProfile.connectionType !== ConnectionType.SSH, librariesEnabled: false, contentEnabled: false, librariesDisplayed: false, serverEnabled: false, serverDisplayed: false, }; if (activeProfile) { settings.librariesEnabled = activeProfile.connectionType !== ConnectionType.SSH; settings.serverEnabled = activeProfile.connectionType !== ConnectionType.SSH; settings.contentEnabled = activeProfile.connectionType === ConnectionType.Rest; } Object.entries(settings).forEach(([key, value]) => commands.executeCommand("setContext", `SAS.${key}`, value), ); } function triggerProfileUpdate(): void { commands.executeCommand("SAS.close", true); const profileList = profileConfig.getAllProfiles(); const activeProfileName = profileConfig.getActiveProfile(); if (profileList[activeProfileName]) { updateStatusBarItem(); const connectionType = profileList[activeProfileName].connectionType || ConnectionType.Rest; //Set the connection type commands.executeCommand("setContext", "SAS.connectionType", connectionType); //See if the connection is direct (ie. serverId) commands.executeCommand( "setContext", "SAS.connection.direct", connectionType === ConnectionType.Rest && "serverId" in profileList[activeProfileName], ); } else { profileConfig.updateActiveProfileSetting(""); commands.executeCommand( "setContext", "SAS.connectionType", ConnectionType.Rest, ); } } export function deactivate(): Thenable | undefined { if (!client) { return undefined; } return client.stop(); } ================================================ FILE: client/src/panels/DataViewer.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Uri, l10n, window } from "vscode"; import type { ColumnState, SortModelItem } from "ag-grid-community"; import PaginatedResultSet from "../components/LibraryNavigator/PaginatedResultSet"; import { TableData, TableQuery } from "../components/LibraryNavigator/types"; import { Column } from "../connection/rest/api/compute"; import { WebView } from "./WebviewManager"; export type ViewProperties = { columnState?: ColumnState[]; query?: TableQuery; }; class DataViewer extends WebView { protected viewProperties: ViewProperties = {}; public constructor( extensionUri: Uri, uid: string, protected readonly paginator: PaginatedResultSet<{ data: TableData; error?: Error; }>, protected readonly fetchColumns: () => Column[], protected readonly loadColumnProperties: (columnName: string) => void, ) { super(extensionUri, uid); } public l10nMessages() { return { "Ascending (add to sorting)": l10n.t("Ascending (add to sorting)"), "Descending (add to sorting)": l10n.t("Descending (add to sorting)"), "Enter expression": l10n.t("Enter expression"), "No data matches the current filters.": l10n.t( "No data matches the current filters.", ), "Not pinned": l10n.t("Not pinned"), "Pinned to the left": l10n.t("Pinned to the left"), "Pinned to the right": l10n.t("Pinned to the right"), "Remove all sorting": l10n.t("Remove all sorting"), "Remove sorting": l10n.t("Remove sorting"), "Row number": l10n.t("Row number"), "Sorted, Ascending": l10n.t("Sorted, Ascending"), "Sorted, Descending": l10n.t("Sorted, Descending"), Ascending: l10n.t("Ascending"), Character: l10n.t("Character"), Clear: l10n.t("Clear"), Currency: l10n.t("Currency"), Date: l10n.t("Date"), Datetime: l10n.t("Datetime"), Descending: l10n.t("Descending"), Numeric: l10n.t("Numeric"), Options: l10n.t("Options"), Pin: l10n.t("Pin"), Properties: l10n.t("Properties"), Search: l10n.t("Search"), Sort: l10n.t("Sort"), }; } public styles() { return ["DataViewer.css"]; } public scripts() { return ["DataViewer.js"]; } public body() { return `

`; } public async processMessage( event: Event & { key: string; command: string; data?: { start?: number; end?: number; sortModel?: SortModelItem[]; columnName?: string; viewProperties?: Partial; query: TableQuery | undefined; }; }, ): Promise { switch (event.command) { case "request:loadData": { const { data, error } = await this.paginator.getData( event.data!.start!, event.data!.end!, event.data!.sortModel!, event.data!.query!, ); this.panel.webview.postMessage({ command: "response:loadData", key: event.key, data, }); if (error) { await window.showErrorMessage(error.message); } break; } case "request:loadColumns": this.panel.webview.postMessage({ key: event.key, command: "response:loadColumns", data: { columns: await this.fetchColumns(), viewProperties: this.viewProperties, }, }); break; case "request:loadColumnProperties": if (event.data.columnName) { this.loadColumnProperties(event.data.columnName); } break; case "request:storeViewProperties": if (event.data.viewProperties) { this.viewProperties = { ...this.viewProperties, ...event.data.viewProperties, }; } break; default: break; } } } export default DataViewer; ================================================ FILE: client/src/panels/TablePropertiesViewer.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Uri, l10n } from "vscode"; import { Column, TableInfo } from "../connection/rest/api/compute"; import { WebView } from "./WebviewManager"; class TablePropertiesViewer extends WebView { l10nMessages = undefined; constructor( extensionUri: Uri, private readonly tableName: string, private readonly tableInfo: TableInfo, private readonly columns: Column[], private readonly showColumns: boolean = false, private readonly focusedColumn: string = "", ) { super(extensionUri, l10n.t("Table Properties")); } public body(): string { return `

${l10n.t("Table: {tableName}", { tableName: this.tableName })}

${this.generatePropertiesContent()}
${this.generateColumnsContent()}
`; } public scripts(): string[] { return ["TablePropertiesViewer.js"]; } public styles(): string[] { return ["TablePropertiesViewer.css"]; } public processMessage(): void { // No messages to process for this static viewer } private generatePropertiesContent(): string { const formatValue = (value: unknown): string => { if (value === null || value === undefined) { return ""; } if (typeof value === "number") { return value.toLocaleString(); } return String(value); }; const formatDate = (value: unknown): string => { try { const stringVal = String(value); let dateVal = new Date(stringVal); if (!isNaN(dateVal.getTime())) { return dateVal.toLocaleString(); } const numVal = parseFloat(stringVal); if (numVal > 0) { // SAS datetime is seconds since 1960-01-01; subtract the offset of 315619200 seconds to shift to Unix epoch (1970-01-01), then multiply by 1000 for JavaScript milliseconds. dateVal = new Date((numVal - 315619200) * 1000); if (!isNaN(dateVal.getTime())) { return dateVal.toLocaleString(); } } return stringVal; } catch { return String(value); } }; return `
${l10n.t("General Information")}
${l10n.t("Name")} ${formatValue(this.tableInfo.name)}
${l10n.t("Library")} ${formatValue(this.tableInfo.libref)}
${l10n.t("Type")} ${formatValue(this.tableInfo.type)}
${l10n.t("Label")} ${formatValue(this.tableInfo.label)}
${l10n.t("Engine")} ${formatValue(this.tableInfo.engine)}
${l10n.t("Extended Type")} ${formatValue(this.tableInfo.extendedType)}
${l10n.t("Size Information")}
${l10n.t("Number of Rows")} ${formatValue(this.tableInfo.rowCount)}
${l10n.t("Number of Columns")} ${formatValue(this.tableInfo.columnCount)}
${l10n.t("Logical Record Count")} ${formatValue(this.tableInfo.logicalRecordCount)}
${l10n.t("Physical Record Count")} ${formatValue(this.tableInfo.physicalRecordCount)}
${l10n.t("Record Length")} ${formatValue(this.tableInfo.recordLength)}
${l10n.t("Technical Information")}
${l10n.t("Created")} ${formatDate(this.tableInfo.creationTimeStamp)}
${l10n.t("Modified")} ${formatDate(this.tableInfo.modifiedTimeStamp)}
${l10n.t("Compression")} ${formatValue(this.tableInfo.compressionRoutine)}
${l10n.t("Character Encoding")} ${formatValue(this.tableInfo.encoding)}
${l10n.t("Bookmark Length")} ${formatValue(this.tableInfo.bookmarkLength)}
`; } private generateColumnsContent(): string { const formatValue = (value: unknown): string => { if (value === null || value === undefined) { return ""; } return String(value); }; const columnsRows = this.columns .map( (column, index) => ` ${index + 1} ${formatValue(column.name)} ${formatValue(column.type)} ${formatValue(column.length)} ${formatValue(column.format?.name ? column.format?.name : column.format)} ${formatValue(column.informat?.name ? column.informat?.name : column.informat)} ${formatValue(column.label)} `, ) .join(""); return `
${l10n.t("Columns ({count})", { count: this.columns.length })}
${columnsRows}
${l10n.t("#")} ${l10n.t("Name")} ${l10n.t("Type")} ${l10n.t("Length")} ${l10n.t("Format")} ${l10n.t("Informat")} ${l10n.t("Label")}
`; } } export default TablePropertiesViewer; ================================================ FILE: client/src/panels/WebviewManager.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { Disposable, Uri, ViewColumn, WebviewPanel, window } from "vscode"; export class WebViewManager { public panels: Record = {}; public render(webview: WebView, uid: string, forceReRender: boolean = false) { if (this.panels[uid]) { if (forceReRender) { this.panels[uid] = webview .withPanel(this.panels[uid].getPanel()) .render(); } this.panels[uid].display(); return; } const panel = window.createWebviewPanel("webView", uid, ViewColumn.One, { enableScripts: true, }); webview.onDispose = () => delete this.panels[uid]; this.panels[uid] = webview.withPanel(panel).render(); } } export abstract class WebView { protected panel: WebviewPanel; private _disposables: Disposable[] = []; private _onDispose: () => void; public constructor( protected readonly extensionUri: Uri, protected readonly title: string, ) {} set onDispose(disposeCallback: () => void) { this._onDispose = disposeCallback; } abstract body(): string; abstract l10nMessages?(): Record; abstract scripts?(): string[]; abstract styles?(): string[]; public render(): WebView { const policies = [ `default-src 'none';`, `font-src ${this.panel.webview.cspSource} data:;`, `img-src ${this.panel.webview.cspSource} data:;`, `script-src ${this.panel.webview.cspSource};`, `style-src ${this.panel.webview.cspSource};`, ]; const styles = (this?.styles() || []) .map( (style) => ``, ) .join(""); const scripts = (this?.scripts() || []) .map( (script) => ``, ) .join(""); this.panel.webview.html = ` ${styles} ${this.title} ${this.body()} ${scripts} `; return this; } abstract processMessage(event: Event): void; public withPanel(webviewPanel: WebviewPanel): WebView { this.panel = webviewPanel; this.panel.onDidDispose(() => this.dispose(), null, this._disposables); this.panel.webview.onDidReceiveMessage(this.processMessage.bind(this)); return this; } public getPanel() { return this.panel; } public dispose() { this.panel.dispose(); while (this._disposables.length) { const disposable = this._disposables.pop(); if (disposable) { disposable.dispose(); } } this._onDispose && this._onDispose(); } public display() { this.panel.reveal(ViewColumn.One); } public webviewUri(extensionUri: Uri, name: string): Uri { return this.panel.webview.asWebviewUri( Uri.joinPath(extensionUri, "client", "dist", "webview", name), ); } } ================================================ FILE: client/src/store/index.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export { useStore as useLogStore } from "./log/store"; export { useStore as useRunStore } from "./run/store"; ================================================ FILE: client/src/store/log/actions.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { StateCreator } from "zustand/vanilla"; import type { Store } from "./store"; export interface LogActions { /** * Resets producedExecutionOutput to its default value. */ setProducedExecutionLogOutput: (boolean) => void; } export const createLogActions: StateCreator = ( set, ) => ({ setProducedExecutionLogOutput: (producedExecutionOutput: boolean) => set({ producedExecutionOutput }), }); ================================================ FILE: client/src/store/log/initialState.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //TODO: when session is refactored to flux pattern, types will move over export interface LogState { producedExecutionOutput: boolean; } export const initialState: LogState = { producedExecutionOutput: false, }; ================================================ FILE: client/src/store/log/selectors.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import type { LogState } from "./initialState"; const selectProducedExecutionOutput = (store: LogState) => { return store.producedExecutionOutput; }; export const logSelectors = { selectProducedExecutionOutput, }; ================================================ FILE: client/src/store/log/store.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { subscribeWithSelector } from "zustand/middleware"; import { StateCreator, createStore } from "zustand/vanilla"; import { LogActions, createLogActions } from "./actions"; import { LogState, initialState } from "./initialState"; export type Store = LogState & LogActions; const createdStore: StateCreator = (...parameters) => ({ ...initialState, ...createLogActions(...parameters), }); export const useStore = createStore()( subscribeWithSelector(createdStore), ); ================================================ FILE: client/src/store/middleware.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 /** * Middleware that will log state changes to the console. Useful for debugging purposes. * @param config */ export const logger = (config) => (set, get, api) => { return config( (args) => { const newState = typeof args === "function" ? args(get()) : args; console.info(`State changed:`, newState); set(newState); }, get, api, ); }; ================================================ FILE: client/src/store/run/actions.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { StateCreator } from "zustand/vanilla"; import { type Store } from "./store"; export interface RunActions { setIsExecutingCode: (isExecuting: boolean, isUserExecuting?: boolean) => void; } export const createRunActions: StateCreator = ( set, ) => ({ setIsExecutingCode: (isExecutingCode, isUserExecuting = true) => { set({ isExecutingCode, isUserExecuting, }); }, }); ================================================ FILE: client/src/store/run/initialState.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export interface RunState { isExecutingCode: boolean; isUserExecuting: boolean; } export const initialState: RunState = { isExecutingCode: false, isUserExecuting: false, }; ================================================ FILE: client/src/store/run/selectors.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { RunState } from "./initialState"; const selectIsExecutingCode = (store: RunState) => { return store.isExecutingCode; }; export const runSelectors = { selectIsExecutingCode, }; ================================================ FILE: client/src/store/run/store.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { subscribeWithSelector } from "zustand/middleware"; import { StateCreator, createStore } from "zustand/vanilla"; import { RunActions, createRunActions } from "./actions"; import { RunState, initialState } from "./initialState"; export type Store = RunState & RunActions; const createdStore: StateCreator = (...parameters) => ({ ...initialState, ...createRunActions(...parameters), }); export const useStore = createStore()( subscribeWithSelector(createdStore), ); ================================================ FILE: client/src/store/selectors.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 export { logSelectors } from "./log/selectors"; export { runSelectors } from "./run/selectors"; ================================================ FILE: client/src/webview/ColumnHeader.tsx ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useRef } from "react"; import { AgColumn, GridApi } from "ag-grid-community"; import localize from "./localize"; import useTheme from "./useTheme"; const getIconForColumnType = (type: string) => { switch (type.toLocaleLowerCase()) { case "float": case "num": return "float"; case "date": return "date"; case "time": return "time"; case "datetime": return "date-time"; case "currency": return "currency"; case "char": return "char"; default: return ""; } }; const getTermForColumnType = (type: string) => { switch (type.toLocaleLowerCase()) { case "float": case "num": return localize("Numeric"); case "date": return localize("Date"); case "time": case "datetime": return localize("Datetime"); case "currency": return localize("Currency"); case "char": default: return localize("Character"); } }; const ColumnHeader = ({ api, column, currentColumn: getCurrentColumn, columnType, displayMenuForColumn, }: { api: GridApi; column: AgColumn; currentColumn: () => AgColumn | undefined; columnType: string; displayMenuForColumn: (api: GridApi, column: AgColumn, rect: DOMRect) => void; }) => { const theme = useTheme(); const ref = useRef(undefined!); const currentColumn = getCurrentColumn(); const currentSortedColumns = api.getColumnState().filter((c) => c.sort); const sort = column.getSort(); const columnNumber = sort && currentSortedColumns.length > 1 ? `${column.sortIndex + 1}` : ""; const dropdownClassname = currentColumn?.colId === column.colId ? "active dropdown" : "dropdown"; const sortTitle = sort === "asc" ? localize("Sorted, Ascending") : localize("Sorted, Descending"); const displayColumnMenu = () => displayMenuForColumn(api, column, ref.current.getBoundingClientRect()); return (
{column.colId} {!!sort && ( <> {!!columnNumber && {columnNumber}} )}
); }; export default ColumnHeader; ================================================ FILE: client/src/webview/ColumnMenu.tsx ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { AgColumn, ColumnState, GridApi } from "ag-grid-community"; import GridMenu from "./GridMenu"; import localize from "./localize"; import { applyColumnState } from "./useDataViewer"; import useTheme from "./useTheme"; export interface ColumnMenuProps { column: AgColumn; dismissMenu: () => void; hasSort: boolean; left: number; loadColumnProperties: () => void; pinColumn: (side: "left" | "right" | false) => void; removeAllSorting: () => void; removeFromSort: () => void; sortColumn: (direction: "asc" | "desc") => void; top: number; } // Lets pick off only the column properties we care about. const filteredColumnState = (columnState: ColumnState[]) => { return columnState.map(({ colId, sort, sortIndex, pinned }) => { return { colId, sort, sortIndex, pinned }; }); }; export const getColumnMenu = ( api: GridApi, column: AgColumn, { height, top, left }: DOMRect, dismissMenu: () => void, loadColumnProperties: (columnName: string) => void, ): ColumnMenuProps => ({ column, dismissMenu, hasSort: api.getColumnState().some((c) => c.sort), left, top: top + height, pinColumn: (side: "left" | "right" | false) => { const columnState = filteredColumnState(api.getColumnState()); const foundColumn = columnState.find((col) => col.colId === column.colId); foundColumn.pinned = side; applyColumnState(api, columnState); }, sortColumn: (direction: "asc" | "desc" | null) => { const columnState = filteredColumnState(api.getColumnState()); const foundColumn = columnState.find((col) => col.colId === column.colId); const currentSortValue = foundColumn.sort; foundColumn.sort = direction; if (!currentSortValue) { foundColumn.sortIndex = api.getColumnState().filter((c) => c.sort).length; } applyColumnState(api, columnState); }, removeAllSorting: () => applyColumnState( api, filteredColumnState(api.getColumnState()).map((c) => ({ ...c, sort: null, })), ), removeFromSort: () => { // First, lets remove from sort let newColumnState = filteredColumnState(api.getColumnState()) .sort((a, b) => a.sortIndex - b.sortIndex) .map((c) => ({ ...c, sort: column.colId === c.colId ? null : c.sort, })); // Next, lets assign updated sort indices let sortIndex = 0; newColumnState = newColumnState.map((c) => { if (!c.sort) { return c; } return { ...c, sortIndex: sortIndex++ }; }); applyColumnState(api, newColumnState); }, loadColumnProperties: () => { loadColumnProperties(column.colId); }, }); const ColumnMenu = ({ column, dismissMenu, hasSort, left, loadColumnProperties, pinColumn, removeAllSorting, removeFromSort, sortColumn, top, }: ColumnMenuProps) => { const theme = useTheme(); const sort = column.getSort(); const pinned = column.getPinned(); const menuItems = [ { name: localize("Pin"), children: [ { name: localize("Pinned to the left"), checked: pinned === "left", onPress: () => { pinColumn("left"); dismissMenu(); }, }, { name: localize("Pinned to the right"), checked: pinned === "right", onPress: () => { pinColumn("right"); dismissMenu(); }, }, { name: localize("Not pinned"), checked: !pinned, onPress: () => { pinColumn(false); dismissMenu(); }, }, ], }, "separator", { name: localize("Sort"), children: [ { name: hasSort && !sort ? localize("Ascending (add to sorting)") : localize("Ascending"), checked: sort === "asc", onPress: () => { sortColumn("asc"); dismissMenu(); }, }, { name: hasSort && !sort ? localize("Descending (add to sorting)") : localize("Descending"), checked: sort === "desc", onPress: () => { sortColumn("desc"); dismissMenu(); }, }, "separator", { name: localize("Remove sorting"), onPress: () => { removeFromSort(); dismissMenu(); }, disabled: !hasSort || !sort, }, { name: localize("Remove all sorting"), onPress: () => { removeAllSorting(); dismissMenu(); }, disabled: !hasSort, }, ], }, "separator", { name: localize("Properties"), onPress: loadColumnProperties, }, ]; return ; }; export default ColumnMenu; ================================================ FILE: client/src/webview/DataViewer.css ================================================ body { padding: 0; } html, body { min-height: 100%; } html, body, .data-viewer-container, .data-viewer { height: 100%; } .data-viewer-container { overflow: hidden; } .data-viewer { padding: 1rem 1rem 0 1rem; } .header-icon.float, .header-icon.date, .header-icon.time, .header-icon.date-time, .header-icon.currency, .header-icon.char { width: 16px; height: 22px; margin-right: 0.25rem; } /* DEFAULT ICONS */ .header-icon.float { background: url(../../../icons/light/tableHeaderNumericTypeLight.svg) center no-repeat; } .header-icon.time, .header-icon.date-time, .header-icon.date { background: url(../../../icons/light/tableHeaderDateLight.svg) center no-repeat; } .header-icon.currency { background: url(../../../icons/light/tableHeaderCurrencyLight.svg) center no-repeat; } .header-icon.char { background: url(../../../icons/light/tableHeaderCharacterTypeLight.svg) center no-repeat; } /* DARK MODE ICONS */ .vscode-dark .header-icon.float, .vscode-high-contrast .header-icon.float { background: url(../../../icons/dark/tableHeaderNumericTypeDark.svg) center no-repeat; } .header-icon.time, .header-icon.date-time, .vscode-dark .header-icon.date, .vscode-high-contrast .header-icon.date { background: url(../../../icons/dark/tableHeaderDateDark.svg) center no-repeat; } .vscode-dark .header-icon.currency, .vscode-high-contrast .header-icon.currency { background: url(../../../icons/dark/tableHeaderCurrencyDark.svg) center no-repeat; } .vscode-dark .header-icon.char, .vscode-high-contrast .header-icon.char { background: url(../../../icons/dark/tableHeaderCharacterTypeDark.svg) center no-repeat; } .ag-cell-label-container button { background: none; border: none; margin: 0; padding: 0; } .ag-cell-label-container { position: relative; } .ag-cell-label-container .dropdown { display: none; margin-left: 0.25rem; } button, .ag-menu-option:not(.ag-menu-option-disabled) { cursor: pointer; } .dropdown button { display: block; width: 16px; height: 16px; } .dropdown button { background: url(../../../icons/light/more.svg); background-size: 16px 16px; } .vscode-dark .dropdown button { background: url(../../../icons/dark/more.svg); background-size: 16px 16px; } .ag-header-active .ag-cell-label-container .dropdown, .ag-cell-label-container .dropdown.active { display: flex; } .sort-icon-wrapper { margin-left: auto; } .sort-icon-wrapper .icon, .sort-icon-wrapper .number { width: 16px; height: 16px; display: inline-block; vertical-align: middle; } .sort-icon-wrapper .icon.asc { background: url(../../../icons/light/arrow-up.svg); background-size: 16px 16px; } .vscode-dark .sort-icon-wrapper .icon.asc { background: url(../../../icons/dark/arrow-up.svg); background-size: 16px 16px; } .sort-icon-wrapper .icon.desc { background: url(../../../icons/light/arrow-down.svg); background-size: 16px 16px; } .vscode-dark .sort-icon-wrapper .icon.desc { background: url(../../../icons/dark/arrow-down.svg); background-size: 16px 16px; } .filter-wrapper .filter-input { background: var(--vscode-input-background); margin-bottom: 1rem; position: relative; } .filter-wrapper .filter-input input { color: var(--vscode-input-foreground); background: transparent; border: none; padding: 0.5rem; width: 100%; box-sizing: border-box; padding-right: calc(32px + 2rem); outline: 1px solid var(--vscode-editorGroup-border); } .filter-wrapper .filter-input input:focus { outline: 1px solid var(--vscode-inputOption-activeBorder); } .filter-wrapper .filter-input button { width: 16px; height: 16px; position: absolute; top: 0; padding: 1rem; border: 0; right: 0; } .filter-wrapper .filter-input button.clear { right: calc(16px + 1rem); } .vscode-dark .filter-wrapper .filter-input button.clear { background: url(../../../icons/dark/close.svg) center no-repeat; background-size: 16px 16px; } .vscode-dark .filter-wrapper .filter-input button.search { background: url(../../../icons/dark/search.svg) center no-repeat; background-size: 16px 16px; } .vscode-light .filter-wrapper .filter-input button.clear { background: url(../../../icons/light/close.svg) center no-repeat; background-size: 16px 16px; } .vscode-light .filter-wrapper .filter-input button.search { background: url(../../../icons/light/search.svg) center no-repeat; background-size: 16px 16px; } ================================================ FILE: client/src/webview/DataViewer.tsx ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useCallback, useEffect } from "react"; import { createRoot } from "react-dom/client"; import { AgGridReact } from "ag-grid-react"; import "."; import ColumnMenu from "./ColumnMenu"; import TableFilter from "./TableFilter"; import localize from "./localize"; import useDataViewer from "./useDataViewer"; import useTheme from "./useTheme"; import "./DataViewer.css"; import "ag-grid-community/styles/ag-grid.css"; import "ag-grid-community/styles/ag-theme-alpine.css"; const gridStyles = { "--ag-borders": "none", "--ag-row-border-width": "0px", height: "calc(100% - 9.2rem)", width: "100%", }; const DataViewer = () => { const title = document .querySelector("[data-title]") .getAttribute("data-title"); const theme = useTheme(); const { columnMenu, columns, dismissMenu, gridRef, onGridReady, refreshResults, viewProperties, } = useDataViewer(); const handleKeydown = useCallback( (event) => { if (event.key === "Escape" && columnMenu) { dismissMenu(); } }, [columnMenu, dismissMenu], ); const dismissMenuWithoutFocus = useCallback( () => dismissMenu(false), [dismissMenu], ); useEffect(() => { document.addEventListener("keydown", handleKeydown); window.addEventListener("blur", dismissMenuWithoutFocus); return () => { document.removeEventListener("keydown", handleKeydown); window.removeEventListener("blur", dismissMenuWithoutFocus); }; }, [handleKeydown, dismissMenuWithoutFocus]); if (columns.length === 0) { return null; } return (

{title}

{ refreshResults({ filterValue: value }); }} initialValue={viewProperties()?.query?.filterValue ?? ""} /> {columnMenu && }
columnMenu && dismissMenuWithoutFocus()} > localize("No data matches the current filters.") } suppressDragLeaveHidesColumns />
); }; const root = createRoot(document.querySelector(".data-viewer-container")); root.render(); ================================================ FILE: client/src/webview/GridMenu.tsx ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useCallback, useEffect, useRef, useState } from "react"; const MENU_RIGHT_OFFSET = 30; interface MenuItem { checked?: boolean; children?: (MenuItem | string)[]; disabled?: boolean; name: string; onPress?: () => void; } const GridMenu = ({ dismissMenu, // note: `id` is used to distinguish one menu from another, so that we trigger // a resize when the menu contents have changed. id, left: incomingLeft, menuItems, parentDimensions, subMenu: isSubMenu, theme, top, }: { dismissMenu?: () => void; id?: number; left?: number; menuItems: (MenuItem | string)[]; parentDimensions?: { left: number; width: number }; subMenu?: boolean; theme: string; top: number; }) => { const menuRef = useRef(undefined); const [activeIndex, setActiveIndex] = useState(-1); const [subMenu, setSubMenu] = useState< { items: (MenuItem | string)[]; index: number } | undefined >(undefined); const className = isSubMenu ? `ag-menu ag-ltr ag-popup-child ${theme}` : `ag-menu ag-column-menu ag-ltr ag-popup-child ag-popup-positioned-under ${theme}`; // The following useEffect positions our column header menu. There are three general // ways of laying things out. // - option 1. If there is enough room for the parent menu and child menu to the right, the //. menus are displayed left to right. // - option 2. If the parent menu has enough room, we don't shift it. If the child menu doesn't //. fit to the right, we move it to the left side. // - option 3. The parent menu doesn't fit on the screen, so we shift it to the left and // put the child menu on the left side. const [left, setLeft] = useState(parentDimensions?.left ?? incomingLeft); const [width, setWidth] = useState(0); const [selectedIndex, setSelectedIndex] = useState(0); const handleClickMenuItem = useCallback( (index: number, menuItem: MenuItem) => { if (menuItem.disabled) { return; } if (menuItem.onPress) { return menuItem.onPress(); } if (menuItem.children) { setSubMenu({ items: menuItem.children, index }); } }, [], ); const focusItem = (index: number) => { setTimeout(() => { const item = menuRef.current && // eslint-disable-next-line @typescript-eslint/consistent-type-assertions (menuRef.current.querySelector( `[data-index="${index}"]`, ) as HTMLElement); if (!item) { return; } item.focus(); setSelectedIndex(index); }, 0); }; const handleKeydown = useCallback( (event: KeyboardEvent) => { if (subMenu || typeof menuItems[selectedIndex] === "string") { return; } switch (event.key) { case "ArrowLeft": case "Escape": if (event.key === "ArrowLeft") { event.stopPropagation(); } if (dismissMenu) { return dismissMenu(); } break; case "ArrowDown": return focusItem(nextIndex()); case "ArrowUp": return focusItem(previousIndex()); case "Enter": case " ": handleClickMenuItem(selectedIndex, menuItems[selectedIndex]); return event.stopPropagation(); case "ArrowRight": if (!menuItems[selectedIndex].children) { break; } handleClickMenuItem(selectedIndex, menuItems[selectedIndex]); return event.stopPropagation(); default: break; } function nextIndex() { return menuItems.findIndex( (menuItem, index) => index > selectedIndex && typeof menuItem !== "string", ); } function previousIndex() { for (let index = menuItems.length - 1; index >= 0; --index) { if (index < selectedIndex && typeof menuItems[index] !== "string") { return index; } } return 0; } }, [handleClickMenuItem, selectedIndex, menuItems, dismissMenu, subMenu], ); useEffect(() => { document.addEventListener("keydown", handleKeydown); return () => { document.removeEventListener("keydown", handleKeydown); }; }, [handleKeydown]); useEffect(() => { const clientWidth = menuRef.current.closest("body").clientWidth; const width = menuRef.current.getBoundingClientRect().width; setWidth(width); focusItem(0); if (parentDimensions) { // First, lets put the child menu to the right let adjustedLeft = parentDimensions.left + parentDimensions.width; // If that's off screen, lets instead place it to the left if (adjustedLeft + width > clientWidth) { adjustedLeft = parentDimensions.left - width; } setLeft(adjustedLeft); return; } if (left + width > clientWidth) { setLeft(left - (left + width - clientWidth + MENU_RIGHT_OFFSET)); } }, [id]); // eslint-disable-line react-hooks/exhaustive-deps return ( <> {subMenu && subMenu.items.length > 0 && ( { focusItem(subMenu.index); setSubMenu(undefined); }} menuItems={subMenu.items} parentDimensions={{ left, width }} subMenu theme={theme} top={top} /> )}
{menuItems.map((menuItem, index) => { if (typeof menuItem === "string") { return ; } return ( ); })}
); }; const Separator = () => ( ); export default GridMenu; ================================================ FILE: client/src/webview/TableFilter.tsx ================================================ // Copyright © 2026, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useState } from "react"; import localize from "./localize"; interface TableFilterProps { onCommit: (value: string) => void; initialValue: string; } const TableFilter = ({ onCommit, initialValue }: TableFilterProps) => { const [filterValue, setFilterValue] = useState(initialValue); return (
setFilterValue(e.target.value)} onKeyUp={(e) => { if (e.key === "Enter") { onCommit(filterValue); } }} /> {filterValue ? ( ) : undefined}
); }; export default TableFilter; ================================================ FILE: client/src/webview/TablePropertiesViewer.css ================================================ body { font-family: var(--vscode-font-family); font-size: var(--vscode-font-size); font-weight: var(--vscode-font-weight); color: var(--vscode-foreground); background-color: var(--vscode-editor-background); margin: 0; padding: 16px; } .container { max-width: 1200px; margin: 0 auto; } .tabs { display: flex; border-bottom: 1px solid var(--vscode-panel-border); margin-bottom: 16px; } .tab { padding: 10px 20px; cursor: pointer; border: none; background: none; color: var(--vscode-foreground); border-bottom: 2px solid transparent; font-family: inherit; font-size: inherit; } .tab:hover { background-color: var(--vscode-list-hoverBackground); } .tab.active { border-bottom-color: var(--vscode-focusBorder); color: var(--vscode-tab-activeForeground); } .tab-content { display: none; padding: 20px 0; } .tab-content.active { display: block; } .properties-table { width: 100%; border-collapse: collapse; margin-bottom: 16px; } .properties-table th, .properties-table td { border: 1px solid var(--vscode-panel-border); padding: 8px 12px; text-align: left; } .properties-table th { background-color: var(--vscode-list-hoverBackground); font-weight: bold; } .properties-table tr:nth-child(even) { background-color: var(--vscode-list-hoverBackground); } .properties-table tr.active { color: var(--vscode-list-activeSelectionForeground); background-color: var(--vscode-list-activeSelectionBackground); } .property-label { font-weight: bold; min-width: 200px; } .section-title { font-size: 1.2em; font-weight: bold; margin: 20px 0 10px 0; color: var(--vscode-foreground); } ================================================ FILE: client/src/webview/TablePropertiesViewer.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import "./TablePropertiesViewer.css"; function showTab(tabName: string, clickedTab?: HTMLElement): void { const contents = document.querySelectorAll(".tab-content"); contents.forEach((content) => content.classList.remove("active")); const tabs = document.querySelectorAll(".tab"); tabs.forEach((tab) => tab.classList.remove("active")); const selectedContent = document.getElementById(tabName); if (selectedContent) { selectedContent.classList.add("active"); } if (clickedTab) { clickedTab.classList.add("active"); } } const eventListeners: Array<{ element: Element; handler: EventListener; }> = []; function setupEventListeners(): void { const tabButtons = document.querySelectorAll(".tab"); tabButtons.forEach((button) => { const handler = (event: Event) => { const target = event.currentTarget; if (target instanceof HTMLElement) { const tabName = target.getAttribute("data-tab"); if (tabName) { showTab(tabName, target); } } }; button.addEventListener("click", handler); eventListeners.push({ element: button, handler }); }); } function cleanupEventListeners(): void { eventListeners.forEach(({ element, handler }) => { element.removeEventListener("click", handler); }); eventListeners.length = 0; } document.addEventListener("DOMContentLoaded", setupEventListeners); window.addEventListener("beforeunload", cleanupEventListeners); export {}; ================================================ FILE: client/src/webview/index.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // This declares a global type for DedicatedWorkerGlobalScope which // doesn't exist in the DOM library. This is necessary because there are conflicts // when including both DOM & WebWorker. See https://github.com/microsoft/TypeScript/issues/20595 // for more information. declare global { type DedicatedWorkerGlobalScope = Worker; } export {}; ================================================ FILE: client/src/webview/localize.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // `localize` provides functionality to use localized strings in react webviews // This expects for translations to be defined in a script block with an id of // `l10-messages`. let localizedTerms = null; const localize = (term: string, replacments?: Record) => { if (!localizedTerms) { try { localizedTerms = JSON.parse( document.body.getAttribute("data-l10n") || "{}", ); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return term; } } let translatedString = localizedTerms[term] ?? term; if (replacments) { Object.entries(replacments).forEach( ([key, value]) => (translatedString = translatedString.replace(`{${key}}`, value)), ); } return translatedString; }; export default localize; ================================================ FILE: client/src/webview/useDataViewer.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useCallback, useEffect, useRef, useState } from "react"; import { AgColumn, AllCommunityModule, ColDef, ColumnState, GridApi, GridReadyEvent, IGetRowsParams, ModuleRegistry, SortModelItem, SuppressHeaderKeyboardEventParams, } from "ag-grid-community"; import { AgGridReact } from "ag-grid-react"; import { v4 } from "uuid"; import type { TableData, TableQuery, } from "../components/LibraryNavigator/types"; import { Column } from "../connection/rest/api/compute"; import type { ViewProperties } from "../panels/DataViewer"; import ColumnHeader from "./ColumnHeader"; import { ColumnMenuProps, getColumnMenu } from "./ColumnMenu"; import localize from "./localize"; declare const acquireVsCodeApi; const vscode = acquireVsCodeApi(); ModuleRegistry.registerModules([AllCommunityModule]); const contextMenuHandler = (e) => { e.stopImmediatePropagation(); }; export const applyColumnState = (api: GridApi, state: ColumnState[]) => { api.applyColumnState({ state, defaultState: { sort: null } }); api.ensureIndexVisible(0); storeViewProperties({ columnState: state }); }; const defaultTimeout = 60 * 1000; // 60 seconds (accounting for compute session expiration) let queryTableDataTimeoutId: ReturnType | null = null; const clearQueryTimeout = (): void => { if (!queryTableDataTimeoutId) { return; } clearTimeout(queryTableDataTimeoutId); queryTableDataTimeoutId = null; }; const queryTableData = ( start: number, end: number, sortModel: SortModelItem[], query: TableQuery | undefined, ): Promise => { const requestKey = v4(); vscode.postMessage({ command: "request:loadData", key: requestKey, data: { start, end, sortModel, query }, }); return new Promise((resolve, reject) => { const commandHandler = (event) => { const { data } = event.data; if (event.data.key !== requestKey) { return; } if (event.data.command === "response:loadData") { window.removeEventListener("message", commandHandler); clearQueryTimeout(); resolve(data); } }; clearQueryTimeout(); queryTableDataTimeoutId = setTimeout(() => { window.removeEventListener("message", commandHandler); reject(new Error("Timeout exceeded")); }, defaultTimeout); window.addEventListener("message", commandHandler); }); }; let fetchColumnsTimeoutId: ReturnType | null = null; const clearFetchColumnsTimeout = () => fetchColumnsTimeoutId && clearTimeout(fetchColumnsTimeoutId); const fetchColumns = (): Promise<{ columns: Column[]; viewProperties?: ViewProperties; }> => { const requestKey = v4(); vscode.postMessage({ command: "request:loadColumns", key: requestKey }); return new Promise((resolve, reject) => { const commandHandler = (event) => { const { data } = event.data; if (event.data.key !== requestKey) { return; } if (event.data.command === "response:loadColumns") { window.removeEventListener("message", commandHandler); clearFetchColumnsTimeout(); resolve(data); } }; clearFetchColumnsTimeout(); fetchColumnsTimeoutId = setTimeout(() => { window.removeEventListener("message", commandHandler); reject(new Error("Timeout exceeded")); }, defaultTimeout); window.addEventListener("message", commandHandler); }); }; export const storeViewProperties = (viewProperties: ViewProperties) => vscode.postMessage({ command: "request:storeViewProperties", data: { viewProperties }, }); const useDataViewer = () => { const gridRef = useRef(null); const [columns, setColumns] = useState([]); const [columnMenu, setColumnMenu] = useState(); const [queryParams, setQueryParamsState] = useState( undefined, ); const setQueryParams = (query: TableQuery | undefined) => { setQueryParamsState(query); storeViewProperties({ query }); }; const columnMenuRef = useRef(columnMenu); const columnStateRef = useRef(undefined); const loadedViewPropertiesRef = useRef(undefined); useEffect(() => { columnMenuRef.current = columnMenu; }, [columnMenu]); const dataSource = useCallback( (incomingQueryParams?: TableQuery) => ({ rowCount: undefined, getRows: async (params: IGetRowsParams) => { params.api.setGridOption("activeOverlay", undefined); const tableData = await queryTableData( params.startRow, params.endRow, params.sortModel, incomingQueryParams || queryParams, ); if (tableData.rows.length === 0) { params.api.setGridOption("activeOverlay", "agNoRowsOverlay"); } const { rows, count } = tableData; const rowData = rows.map(({ cells }) => { const row = cells.reduce( (carry, cell, index) => ({ ...carry, [columns[index].field]: cell, }), {}, ); return row; }); params.successCallback( rowData, // If we've returned less than 100 rows, we can assume that's the last page // of the data and stop searching. rowData.length < 100 && count === undefined ? rowData[rowData.length - 1]["#"] : count, ); }, }), [columns, queryParams], ); const onGridReady = useCallback( (event: GridReadyEvent) => { const { columnState, query } = loadedViewPropertiesRef.current; event.api.setGridOption("datasource", dataSource(query)); // Re-hydrate our view with persisted view properties if (!loadedViewPropertiesRef.current) { return; } if (query) { setQueryParams(query); } if (columnState && columnState.length > 0) { applyColumnState(event.api, columnState); event.api.refreshHeader(); columnStateRef.current = undefined; } }, [dataSource], ); const dismissMenu = (focusColumn: boolean = true) => { if (focusColumn && columnMenuRef.current?.column.colId) { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const headerElement = document.querySelector( `.ag-header-cell[col-id="${columnMenuRef.current.column.colId}"]`, ) as HTMLElement; if (headerElement) { headerElement.focus(); } } setColumnMenu(undefined); }; const refreshResults = useCallback( (query: TableQuery | undefined) => { const params = queryParams ? { ...queryParams, ...(query || {}) } : query; setQueryParams(params); gridRef.current.api.setGridOption("datasource", dataSource(params)); }, [dataSource, queryParams], ); const displayMenuForColumn = useCallback( (api: GridApi, column: AgColumn, rect: DOMRect) => { if (columnMenuRef.current?.column) { return setColumnMenu(undefined); } setColumnMenu( getColumnMenu(api, column, rect, dismissMenu, (columnName: string) => { vscode.postMessage({ command: "request:loadColumnProperties", data: { columnName }, }); }), ); }, [], ); useEffect(() => { if (columns.length > 0) { return; } fetchColumns().then(({ columns: columnsData, viewProperties }) => { if (viewProperties.columnState && viewProperties.columnState.length > 0) { columnStateRef.current = viewProperties.columnState; } loadedViewPropertiesRef.current = viewProperties; const columns: ColDef[] = columnsData.map((column) => ({ field: column.name, headerComponent: ColumnHeader, headerComponentParams: { columnType: column.type, currentColumn: () => columnMenuRef.current?.column, displayMenuForColumn, }, suppressHeaderKeyboardEvent: ( params: SuppressHeaderKeyboardEventParams, ) => { // If a user tabs to a different column, dismiss the column menu if (params.event.key === "Tab") { setColumnMenu(undefined); return false; } if ( params.event.key === "Enter" || (params.event.key === "F10" && params.event.shiftKey) ) { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const dropdown = (params.event.target as HTMLElement).querySelector( ".dropdown", ); if (!dropdown) { return true; } if (!dropdown.classList.contains("active")) { dropdown.classList.add("active"); } const dropdownButton = dropdown.querySelector("button"); displayMenuForColumn( params.api, // eslint-disable-next-line @typescript-eslint/consistent-type-assertions params.column as AgColumn, dropdownButton.getBoundingClientRect(), ); params.event.stopPropagation(); return true; } return false; }, })); columns.unshift({ field: "#", headerTooltip: localize("Row number"), pinned: "left", lockPinned: true, lockPosition: true, sortable: false, suppressMovable: true, }); setColumns(columns); }); }, [columns.length, displayMenuForColumn]); useEffect(() => { window.addEventListener("contextmenu", contextMenuHandler, true); return () => { window.removeEventListener("contextmenu", contextMenuHandler); }; }, []); return { columnMenu, columns, dismissMenu, gridRef, onGridReady, refreshResults, viewProperties: () => loadedViewPropertiesRef.current, }; }; export default useDataViewer; ================================================ FILE: client/src/webview/useTheme.ts ================================================ // Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { useEffect, useMemo, useState } from "react"; const THEME_ATTRIBUTE = "data-vscode-theme-kind"; const SELECTOR = `[${THEME_ATTRIBUTE}]`; /** * This listens for changes to vscode's theme kind and updates our internal * theme to match. * @returns theme:string matching the ag grid theme for the vscode theme kind */ const useTheme = () => { const [themeKind, setThemeKind] = useState( document.querySelector(SELECTOR).getAttribute(THEME_ATTRIBUTE), ); useEffect(() => { const obs = new MutationObserver((record) => setThemeKind( // eslint-disable-next-line @typescript-eslint/consistent-type-assertions (record[0].target as HTMLElement).getAttribute(THEME_ATTRIBUTE), ), ); obs.observe(document.querySelector(SELECTOR), { attributes: true, attributeFilter: [THEME_ATTRIBUTE], }); return () => { obs.disconnect(); }; }, []); const theme = useMemo(() => { switch (themeKind) { case "vscode-high-contrast-light": case "vscode-light": return "ag-theme-alpine"; case "vscode-high-contrast": case "vscode-dark": return "ag-theme-alpine-dark"; } }, [themeKind]); return theme; }; export default useTheme; ================================================ FILE: client/test/components/ContentNavigator/ContentDataProvider.test.ts ================================================ import { DataTransfer, DataTransferItem, FileStat, FileType, TreeItem, Uri, authentication, } from "vscode"; import axios, { AxiosInstance, HeadersDefaults } from "axios"; import { expect } from "chai"; import * as sinon from "sinon"; import { StubbedInstance, stubInterface } from "ts-sinon"; import ContentDataProvider from "../../../src/components/ContentNavigator/ContentDataProvider"; import { ContentModel } from "../../../src/components/ContentNavigator/ContentModel"; import { FAVORITES_FOLDER_TYPE, ROOT_FOLDER, TRASH_FOLDER_TYPE, } from "../../../src/components/ContentNavigator/const"; import { ContentItem, ContentSourceType, } from "../../../src/components/ContentNavigator/types"; import RestContentAdapter from "../../../src/connection/rest/RestContentAdapter"; import { getSasContentUri as getUri } from "../../../src/connection/rest/util"; import { getUri as getTestUri } from "../../utils"; let stub; let axiosInstance: StubbedInstance; const defaultConfig = { mimeType: "application/vnd.code.tree.contentdataprovider", sourceType: ContentSourceType.SASContent, treeIdentifier: "contentdataprovider", }; const mockContentItem = ( initialContentItem: Partial = {}, ): ContentItem => { const contentItem = { id: "abc123", type: "file", fileStat: { type: FileType.File, ctime: 1234, mtime: 1234, size: 0, }, creationTimeStamp: 1234, links: [ { rel: "self", uri: "uri://self", method: "GET", href: "uri://self", type: "test", }, ], modifiedTimeStamp: 1234, name: "testFile", uri: "uri://test", permission: { write: false, addMember: false, delete: false, }, flags: { isInRecycleBin: false, isInMyFavorites: false, }, uid: "unique-id", ...initialContentItem, }; return { ...contentItem, vscUri: getUri(contentItem), }; }; const createDataProvider = () => { const adapter = new RestContentAdapter(); const mockGetRootFolder = sinon.stub(adapter, "getRootFolder"); mockGetRootFolder.withArgs("@myRecycleBin").returns( mockContentItem({ type: "trashFolder", name: "Recycle Bin", links: [ { rel: "self", uri: "uri://self", method: "GET", href: "uri://self", type: "test", }, ], uri: "uri://recyleBin", }), ); mockGetRootFolder.withArgs("@myFavorites").returns( mockContentItem({ type: "favoritesFolder", name: "My Favorites", links: [ { rel: "addMember", uri: "uri://addMember", method: "POST", href: "uri://addMember", type: "test", }, ], uri: "uri://myFavorites", }), ); return new ContentDataProvider( new ContentModel(adapter), Uri.from({ scheme: "http" }), defaultConfig, ); }; describe("ContentDataProvider", async function () { let authStub; beforeEach(() => { authStub = sinon.stub(authentication, "getSession").resolves({ accessToken: "12345", account: { id: "id", label: "label" }, id: "id", scopes: [], }); axiosInstance = stubInterface(); axiosInstance.interceptors.response = { use: () => null, eject: () => null, clear: () => null, }; const defaultHeader: HeadersDefaults = { common: { Authorization: "", }, put: {}, post: {}, patch: {}, delete: {}, head: {}, get: {}, }; axiosInstance.defaults = { // eslint-disable-next-line @typescript-eslint/consistent-type-assertions headers: defaultHeader as AxiosInstance["defaults"]["headers"], }; stub = sinon.stub(axios, "create").returns(axiosInstance); }); afterEach(() => { if (stub) { stub.restore(); } authStub.restore(); axiosInstance = undefined; }); it("getTreeItem - returns a file tree item for file reference", async () => { const contentItem: ContentItem = mockContentItem(); const dataProvider = createDataProvider(); const treeItem = await dataProvider.getTreeItem(contentItem); const uri = contentItem.vscUri; const expectedTreeItem: TreeItem = { id: "unique-id", label: "testFile", command: { command: "vscode.open", arguments: [uri], title: "Open SAS File", }, resourceUri: uri, }; expect(treeItem).to.deep.include(expectedTreeItem); }); it("getTreeItem - returns a folder tree item for file reference", async () => { const contentItem: ContentItem = mockContentItem({ type: "folder", name: "testFolder", }); const dataProvider = createDataProvider(); const treeItem = await dataProvider.getTreeItem(contentItem); const expectedTreeItem: TreeItem = { id: "unique-id", label: "testFolder", }; expect(treeItem).to.deep.include(expectedTreeItem); }); it("getChildren - returns no children if not authorized", async () => { const dataProvider = createDataProvider(); const children = await dataProvider.getChildren(); expect(children.length).to.equal(0); }); it("getChildren - returns root children without content item", async function () { const dataProvider = createDataProvider(); axiosInstance.get.withArgs("/folders/folders/@myFavorites").resolves({ data: mockContentItem({ name: "@myFavorites", type: "folder", }), }); axiosInstance.get.withArgs("/folders/folders/@myFolder").resolves({ data: mockContentItem({ name: "@myFolder", type: "folder", }), }); axiosInstance.get.withArgs("/folders/folders/@myRecycleBin").resolves({ data: mockContentItem({ name: "@myRecycleBin", type: "folder", }), }); await dataProvider.connect("http://test.io"); const children = await dataProvider.getChildren(); expect(children.length).to.equal(4); expect(children[0].name).to.equal("@myFavorites"); expect(children[1].name).to.equal("@myFolder"); expect(children[2].name).to.equal(ROOT_FOLDER.name); expect(children[3].name).to.equal("@myRecycleBin"); }); it("getChildren - returns children with content item", async function () { const childItem = mockContentItem({ flags: { isInMyFavorites: true, isInRecycleBin: false, }, uid: "my-favorite/0", }); const dataProvider = createDataProvider(); axiosInstance.get.withArgs("/deploymentData/cadenceVersion").resolves({ data: { cadenceVersion: "2023.07" }, }); axiosInstance.get .withArgs( "uri://myFavorites?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [childItem], }, }); await dataProvider.connect("http://test.io"); const children = await dataProvider.getChildren( mockContentItem({ name: "@myFavorites", type: "folder", links: [ { rel: "members", uri: "uri://myFavorites", method: "GET", href: "uri://@myFavorites", type: "test", }, ], uri: "uri://myFavorites", uid: "my-favorite", }), ); expect(children.length).to.equal(1); expect(children[0]).to.deep.include(childItem); }); it("stat - returns file data", async function () { const childItem = mockContentItem(); const dataProvider = createDataProvider(); axiosInstance.get.withArgs("uri://test").resolves({ data: childItem, headers: { etag: "1234", "last-modified": "5678" }, }); await dataProvider.connect("http://test.io"); const fileData: FileStat = await dataProvider.stat(getUri(childItem)); expect(fileData).to.deep.include({ type: FileType.File, ctime: 1234, mtime: 1234, size: 0, }); }); it("stat - returns folder data", async function () { const childItem = mockContentItem({ type: "folder" }); const dataProvider = createDataProvider(); axiosInstance.get.withArgs("uri://test").resolves({ data: childItem, headers: { etag: "1234", "last-modified": "5678" }, }); await dataProvider.connect("http://test.io"); const folderData: FileStat = await dataProvider.stat(getUri(childItem)); expect(folderData).to.deep.include({ type: FileType.Directory, ctime: 1234, mtime: 1234, size: 0, }); }); it("readFile - returns file contents", async function () { const childItem = mockContentItem(); const dataProvider = createDataProvider(); axiosInstance.get.withArgs("uri://test/content").resolves({ data: "/* file content */", headers: { etag: "1234", "last-modified": "5678" }, }); await dataProvider.connect("http://test.io"); const fileData: Uint8Array = await dataProvider.readFile(getUri(childItem)); expect(new TextDecoder().decode(fileData)).to.equal("/* file content */"); }); it("createFolder - creates a folder", async function () { const parentItem = mockContentItem({ type: "folder", uri: "uri://parent-folder", }); const createdFolder = mockContentItem({ type: "folder", name: "folder-test", }); const dataProvider = createDataProvider(); axiosInstance.post .withArgs("/folders/folders?parentFolderUri=uri://parent-folder", { name: "folder-test", }) .resolves({ data: createdFolder, }); await dataProvider.connect("http://test.io"); const uri: Uri = await dataProvider.createFolder(parentItem, "folder-test"); expect(uri).to.deep.equal(getUri(createdFolder)); }); it("createFolder - fails to create a folder without parent folder", async function () { const parentItem = mockContentItem({ type: "folder", uri: "" }); const dataProvider = createDataProvider(); const item = await dataProvider.createFolder(parentItem, "folder-test"); expect(item).to.equal(undefined); }); it("createFile - creates a file and adds it to a folder", async function () { const parentItem = mockContentItem({ type: "folder", uri: "uri://parent-folder", links: [ { rel: "addMember", uri: "uri://addMember", method: "POST", href: "uri://addMember", type: "test", }, ], }); const createdFile = mockContentItem({ type: "file", name: "file.sas", }); const dataProvider = createDataProvider(); axiosInstance.post .withArgs( "/files/files#rawUpload?typeDefName=programFile", Buffer.from("", "binary"), ) .resolves({ data: createdFile, }); axiosInstance.post .withArgs("uri://addMember", { uri: "uri://self", type: "CHILD", name: "file.sas", contentType: "programFile", }) .resolves({ data: {} }); await dataProvider.connect("http://test.io"); const uri: Uri = await dataProvider.createFile(parentItem, "file.sas"); expect(uri).to.deep.equal(getUri(createdFile)); }); it("renameResource - fail if the new name is conflicted", async function () { const origItem = mockContentItem({ type: "file", name: "file.sas", uri: "uri://rename", links: [ { method: "PUT", rel: "validateRename", uri: "uri://validate?value={newname}&type={newtype}", href: "uri://validate?value={newname}&type={newtype}", type: "test", }, ], }); axiosInstance.get.withArgs("uri://rename").resolves({ data: origItem, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.put .withArgs("uri://validate?value=new-file.sas&type=file") .rejects({ data: { status: 409, }, }); axiosInstance.get .withArgs( "uri://myFavorites/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [] } }); axiosInstance.get .withArgs( "uri://test/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: [] }); const dataProvider = createDataProvider(); await dataProvider.connect("http://test.io"); const uri: Uri = await dataProvider.renameResource( origItem, "new-file.sas", ); expect(uri).to.equal(undefined); }); it("renameResource - renames resource and returns uri", async function () { const origItem = mockContentItem({ type: "file", name: "file.sas", uri: "uri://rename", }); const newItem = mockContentItem({ type: "file", name: "new-file.sas", uri: "uri://rename", }); axiosInstance.get.withArgs("uri://rename").resolves({ data: origItem, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.put.withArgs("uri://rename").resolves({ data: { ...origItem, name: "new-file.sas" }, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.get .withArgs( "uri://myFavorites/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [] } }); axiosInstance.get .withArgs( "uri://rename/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [] } }); const dataProvider = createDataProvider(); await dataProvider.connect("http://test.io"); const uri: Uri = await dataProvider.renameResource( origItem, "new-file.sas", ); expect(uri).to.deep.equal(getUri(newItem)); }); it("renameResource - renames reference resource and returns uri of referenced item", async function () { const item = mockContentItem({ type: "reference", name: "favorite-link.sas", uri: "uri://rename", }); const referencedFile = mockContentItem({ type: "file", name: "the-real-file.sas", }); const dataProvider = createDataProvider(); axiosInstance.get.withArgs("uri://self").resolves({ data: item, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.put.withArgs("uri://self").resolves({ data: { ...item, name: "favorite-link.sas" }, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.get.withArgs("uri://rename").resolves({ data: referencedFile, headers: { etag: "1234", "last-modified": "5678" }, }); axiosInstance.get .withArgs( "uri://myFavorites/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [] } }); axiosInstance.get .withArgs( "uri://test/members?limit=1000000&filter=in(contentType,'file','dataFlow','RootFolder','folder','myFolder','favoritesFolder','userFolder','userRoot','trashFolder')&sortBy=eq(contentType,'folder'):descending,name:primary:ascending,type:ascending", ) .resolves({ data: { items: [] } }); await dataProvider.connect("http://test.io"); const uri: Uri = await dataProvider.renameResource( item, "favorite-link.sas", ); expect(uri).to.deep.equal(getUri(referencedFile)); }); it("writeFile - saves text based content to file", async function () { const item = mockContentItem({ type: "file", name: "file.sas", }); const dataProvider = createDataProvider(); // Make initial request and store file token data axiosInstance.get.withArgs("uri://test/content").resolves({ data: "/* file content */", headers: { etag: "1234", "last-modified": "5678" }, }); await dataProvider.connect("http://test.io"); axiosInstance.put .withArgs("uri://test/content", "/* This is the content */") .resolves({ data: item, headers: { etag: "1234", "last-modified": "5678" }, }); await dataProvider.connect("http://test.io"); await dataProvider.writeFile( getUri(item), new TextEncoder().encode("/* This is the content */"), ); }); it("delete - deletes item and underlying resource", async function () { const item = mockContentItem({ type: "file", name: "file.sas", links: [ { rel: "delete", uri: "uri://delete", method: "DELETE", href: "uri://delete", type: "test", }, { rel: "deleteResource", uri: "uri://delete-resource", method: "DELETE", href: "uri://delete-resource", type: "test", }, ], }); const dataProvider = createDataProvider(); axiosInstance.delete.withArgs("uri://delete").resolves({ data: {} }); axiosInstance.delete .withArgs("uri://delete-resource") .resolves({ data: {} }); await dataProvider.connect("http://test.io"); const deleted = await dataProvider.deleteResource(item); expect(deleted).to.equal(true); }); it("recycleResource - move item to the recycle bin", async function () { const item = mockContentItem({ type: "file", name: "file.sas", links: [ { rel: "update", uri: "uri://update", method: "PUT", href: "uri://update", type: "test", }, ], }); const dataProvider = createDataProvider(); axiosInstance.put.withArgs("uri://update").resolves({ data: {} }); await dataProvider.connect("http://test.io"); const recycled = await dataProvider.recycleResource(item); expect(recycled).to.equal(true); }); it("restoreResource - restore item to the previous parent folder", async function () { const item = mockContentItem({ type: "file", name: "file.sas", links: [ { rel: "update", uri: "uri://update", method: "PUT", href: "uri://update", type: "test", }, { rel: "previousParent", uri: "uri://previous.parent", method: "GET", href: "previousParent", type: "test", }, ], }); const dataProvider = createDataProvider(); axiosInstance.put.withArgs("uri://update").resolves({ data: {} }); await dataProvider.connect("http://test.io"); const deleted = await dataProvider.restoreResource(item); expect(deleted).to.equal(true); }); it("add to favorites - Add the reference of an item to My Favorites folder", async function () { const item = mockContentItem({ type: "file", name: "file.sas", links: [ { rel: "getResource", uri: "uri://resource", method: "GET", href: "uri://resource", type: "test", }, ], }); const dataProvider = createDataProvider(); axiosInstance.post.withArgs("uri://addMember").resolves({ data: {} }); await dataProvider.connect("http://test.io"); const success = await dataProvider.addToMyFavorites(item); expect(success).to.equal(true); }); it("remove from favorites - Remove the reference of an item from the resource", async function () { const item = mockContentItem({ type: "file", name: "file.sas", flags: { favoriteUri: "uri://myFavorites/members/favorite-id", }, }); const dataProvider = createDataProvider(); axiosInstance.get.resolves({ data: { items: [item] } }); axiosInstance.delete .withArgs("uri://myFavorites/members/favorite-id") .resolves({ data: {} }); await dataProvider.connect("http://test.io"); const success = await dataProvider.removeFromMyFavorites(item); expect(success).to.equal(true); }); it("handleDrop - allows dropping files", async function () { const parentItem = mockContentItem({ type: "folder", name: "parent", }); const uri = getTestUri("SampleCode.sas").toString(); const item = mockContentItem(); const model = new ContentModel(new RestContentAdapter()); const stub: sinon.SinonStub = sinon.stub(model, "createFile"); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); const dataTransfer = new DataTransfer(); const dataTransferItem = new DataTransferItem(uri); dataTransfer.set("text/uri-list", dataTransferItem); stub.returns(new Promise((resolve) => resolve(item))); await dataProvider.handleDrop(parentItem, dataTransfer); expect(stub.calledOnceWith(parentItem, "SampleCode.sas")).to.be.true; }); it("handleDrop - allows dropping folder", async function () { const parentItem = mockContentItem({ type: "folder", name: "parent", }); const newParentItem = mockContentItem({ type: "folder", name: "new-parent", }); const uriObject = getTestUri("TestFolder"); const uri = uriObject.toString(); const item = mockContentItem(); const model = new ContentModel(new RestContentAdapter()); const createFileStub: sinon.SinonStub = sinon.stub(model, "createFile"); const createFolderStub: sinon.SinonStub = sinon.stub(model, "createFolder"); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); const dataTransfer = new DataTransfer(); const dataTransferItem = new DataTransferItem(uri); dataTransfer.set("text/uri-list", dataTransferItem); createFileStub.returns(new Promise((resolve) => resolve(item))); createFolderStub.returns(new Promise((resolve) => resolve(newParentItem))); await dataProvider.handleDrop(parentItem, dataTransfer); expect(createFolderStub.calledWith(parentItem, "TestFolder")).to.be.true; expect(createFileStub.calledWith(newParentItem, "SampleCode1.sas")).to.be .true; expect(createFolderStub.calledWith(newParentItem, "TestSubFolder")).to.be .true; expect(createFileStub.calledWith(newParentItem, "SampleCode2.sas")).to.be .true; }); it("handleDrop - allows dropping content items", async function () { const parentItem = mockContentItem({ name: "parent", resourceId: "/resource-id", type: "folder", }); const item = mockContentItem(); const model = new ContentModel(new RestContentAdapter()); const stub: sinon.SinonStub = sinon.stub(model, "moveTo"); stub.returns(new Promise((resolve) => resolve(true))); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); const dataTransfer = new DataTransfer(); const dataTransferItem = new DataTransferItem([item]); dataTransfer.set( "application/vnd.code.tree.contentdataprovider", dataTransferItem, ); await dataProvider.handleDrop(parentItem, dataTransfer); expect(stub.calledWith(item, "/resource-id")).to.be.true; }); it("handleDrop - allows dropping content items to favorites", async function () { const parentItem = mockContentItem({ type: FAVORITES_FOLDER_TYPE, name: "favorites", links: [ { rel: "addMember", uri: "uri://addfav", method: "POST", href: "uri://addfav", type: "test", }, ], }); const item = mockContentItem({ uri: "uri://favitem", links: [ { rel: "getResource", uri: "uri://favitem", method: "GET", href: "uri://favitem", type: "test", }, ], }); const adapter = new RestContentAdapter(); const model = new ContentModel(adapter); const stub: sinon.SinonStub = sinon.stub(adapter, "addChildItem"); stub.returns(new Promise((resolve) => resolve(true))); sinon.stub(adapter, "getRootFolder").returns(parentItem); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); const dataTransfer = new DataTransfer(); const dataTransferItem = new DataTransferItem([item]); dataTransfer.set( "application/vnd.code.tree.contentdataprovider", dataTransferItem, ); await dataProvider.handleDrop(parentItem, dataTransfer); expect(stub.calledWith("uri://favitem", "uri://addfav")).to.be.true; }); it("handleDrop - allows dropping content items to trash", async function () { const parentItem = mockContentItem({ type: TRASH_FOLDER_TYPE, name: "trash", links: [ { rel: "self", uri: "uri://trash", method: "GET", href: "uri://trash", type: "test", }, ], }); const item = mockContentItem(); const adapter = new RestContentAdapter(); const model = new ContentModel(adapter); const stub: sinon.SinonStub = sinon.stub(model, "recycleResource"); stub.returns( new Promise((resolve) => resolve({ newUri: "new", oldUri: "old" })), ); sinon.stub(adapter, "getRootFolder").returns(parentItem); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); const dataTransfer = new DataTransfer(); const dataTransferItem = new DataTransferItem([item]); dataTransfer.set( "application/vnd.code.tree.contentdataprovider", dataTransferItem, ); await dataProvider.handleDrop(parentItem, dataTransfer); expect(stub.calledWith(item)).to.be.true; }); it("getFileFolderPath - returns empty path for folder", async function () { const item = mockContentItem({ type: "folder", name: "folder", }); const model = new ContentModel(new RestContentAdapter()); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); await dataProvider.connect("http://test.io"); const path = await model.getFileFolderPath(item); expect(path).to.equal(""); }); it("getFileFolderPath - traverses parentFolderUri to find path", async function () { const grandparent = mockContentItem({ type: "folder", name: "grandparent", id: "/id/grandparent", }); const parent = mockContentItem({ type: "folder", name: "parent", id: "/id/parent", parentFolderUri: "/id/grandparent", }); const item = mockContentItem({ type: "file", name: "file.sas", parentFolderUri: "/id/parent", }); const item2 = mockContentItem({ type: "file", name: "file2.sas", parentFolderUri: "/id/parent", }); const model = new ContentModel(new RestContentAdapter()); const dataProvider = new ContentDataProvider( model, Uri.from({ scheme: "http" }), defaultConfig, ); axiosInstance.get.withArgs("/id/parent").resolves({ data: parent, }); axiosInstance.get.withArgs("/id/grandparent").resolves({ data: grandparent, }); await dataProvider.connect("http://test.io"); // We expect both files to have the same folder path expect(await model.getFileFolderPath(item)).to.equal("/grandparent/parent"); expect(await model.getFileFolderPath(item2)).to.equal( "/grandparent/parent", ); }); }); ================================================ FILE: client/test/components/ContentNavigator/convert.test.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { workspace } from "vscode"; import { deepEqual } from "assert"; import { convertNotebookToFlow } from "../../../src/components/ContentNavigator/convert"; import { getTestFixtureContent } from "../../utils"; function parseFlowData(flowDataString) { const flowData = JSON.parse( flowDataString .replace(/\n/g, "\\n") .replace(/\t/g, "\\t") .replace(/\r/g, "\\r"), ); return flowData; } function removeIdsNodes(flowData) { flowData.creationTimeStamp = ""; flowData.modifiedTimeStamp = ""; flowData.createdBy = ""; flowData.modifiedBy = ""; flowData.links = []; flowData.name = "test.flw"; const keys = Object.keys(flowData.nodes); for (let i = 0; i < keys.length; i++) { const newKey = "IDNODE" + i.toString(); const oldKey = keys[i]; flowData.nodes[newKey] = flowData.nodes[oldKey]; delete flowData.nodes[oldKey]; flowData.nodes[newKey].id = newKey; flowData.nodes[newKey].note.id = "IDNOTE" + i.toString(); flowData.nodes[newKey].properties.UI_PROP_NODE_DATA_MODIFIED_DATE = ""; } if (flowData.connections.length === 2) { flowData.connections[0].sourcePort.node = "IDNODE0"; flowData.connections[0].targetPort.node = "IDNODE1"; flowData.connections[1].sourcePort.node = "IDNODE1"; flowData.connections[1].targetPort.node = "IDNODE2"; } else if (flowData.connections.length === 1) { flowData.connections[0].sourcePort.node = "IDNODE0"; flowData.connections[0].targetPort.node = "IDNODE1"; } else { flowData.connections = []; } return flowData; } function removeIdsSwimlanes(flowData) { flowData.creationTimeStamp = ""; flowData.modifiedTimeStamp = ""; flowData.createdBy = ""; flowData.modifiedBy = ""; flowData.links = []; flowData.name = "test.flw"; const keys = Object.keys(flowData.nodes); for (let i = 0; i < keys.length; i++) { const newKey = "IDSWIMLANE" + i.toString(); const oldKey = keys[i]; flowData.nodes[newKey] = flowData.nodes[oldKey]; delete flowData.nodes[oldKey]; flowData.nodes[newKey].id = newKey; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.creationTimeStamp = ""; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.modifiedTimeStamp = ""; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.createdBy = ""; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.modifiedBy = ""; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.links = []; const nodeKeys = Object.keys( flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes, ); for (let j = 0; j < nodeKeys.length; j++) { const newNodeKey = "IDNODE" + i.toString() + j.toString(); const oldNodeKey = nodeKeys[j]; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[newNodeKey] = flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[oldNodeKey]; delete flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[ oldNodeKey ]; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[newNodeKey].id = newNodeKey; flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[ newNodeKey ].note.id = "IDNOTE" + i.toString() + j.toString(); flowData.nodes[newKey].dataFlowAndBindings.dataFlow.nodes[ newNodeKey ].properties.UI_PROP_NODE_DATA_MODIFIED_DATE = ""; } } return flowData; } function removeIds(flowData, mode) { if (mode === "Node") { return removeIdsNodes(flowData); } return removeIdsSwimlanes(flowData); } function convertAndRemoveIds(inputContent, inputName, expectedFlowData, mode) { const flowDataString = convertNotebookToFlow( inputContent, inputName, "test.flw", ); let flowDataNode = parseFlowData(flowDataString); flowDataNode = removeIds(flowDataNode, mode); let expectedflowDataOut = {}; if (typeof expectedFlowData === "string") { expectedflowDataOut = parseFlowData(expectedFlowData); expectedflowDataOut = removeIds(expectedflowDataOut, mode); } else { expectedflowDataOut = removeIds(expectedFlowData, mode); } return [flowDataNode, expectedflowDataOut]; } async function updateWorkspaceSettings(Mode) { const configuration = workspace.getConfiguration(); // Get the workspace configuration await configuration.update("SAS.flowConversionMode", Mode, true); } describe("Notebook Conversion", async () => { it("convert the multi cell sas notebook to node flow", async () => { await updateWorkspaceSettings("Node"); const contentSASNotebookMulti = getTestFixtureContent("test_multi.sasnb").toString(); const flowDataSASNotebookMulti = getTestFixtureContent( "test_multi_node.flw", ).toString(); const [flowDataActual, flowDataExpected] = convertAndRemoveIds( contentSASNotebookMulti, "test.sasnb", flowDataSASNotebookMulti, workspace.getConfiguration().get("SAS.flowConversionMode"), ); deepEqual(flowDataActual, flowDataExpected, "The flow data is not correct"); }); it("convert the single cell sas notebook to node flow", async () => { await updateWorkspaceSettings("Node"); const contentSASNotebookSingle = getTestFixtureContent("test_single.sasnb").toString(); const flowDataSASNotebookSingle = getTestFixtureContent( "test_single_node.flw", ).toString(); const [flowDataActual, flowDataExpected] = convertAndRemoveIds( contentSASNotebookSingle, "test.sasnb", flowDataSASNotebookSingle, workspace.getConfiguration().get("SAS.flowConversionMode"), ); deepEqual(flowDataActual, flowDataExpected, "The flow data is not correct"); }); it("convert the multi cell sas notebook to swimlane flow", async () => { await updateWorkspaceSettings("Swimlane"); const contentSASNotebookMulti = getTestFixtureContent("test_multi.sasnb").toString(); const flowDataSASNotebookMulti = getTestFixtureContent( "test_multi_swimlane.flw", ).toString(); const [flowDataActual, flowDataExpected] = convertAndRemoveIds( contentSASNotebookMulti, "test.sasnb", flowDataSASNotebookMulti, workspace.getConfiguration().get("SAS.flowConversionMode"), ); deepEqual(flowDataActual, flowDataExpected, "The flow data is not correct"); }); it("convert the single cell sas notebook to swimlane flow", async () => { await updateWorkspaceSettings("Swimlane"); const contentSASNotebookSingle = getTestFixtureContent("test_single.sasnb").toString(); const flowDataSASNotebookSingle = getTestFixtureContent( "test_single_swimlane.flw", ).toString(); const [flowDataActual, flowDataExpected] = convertAndRemoveIds( contentSASNotebookSingle, "test.sasnb", flowDataSASNotebookSingle, workspace.getConfiguration().get("SAS.flowConversionMode"), ); deepEqual(flowDataActual, flowDataExpected, "The flow data is not correct"); }); }); ================================================ FILE: client/test/components/ContentNavigator/utils.test.ts ================================================ import { expect } from "chai"; import { getFileStatement } from "../../../src/components/ContentNavigator/utils"; describe("utils", async function () { it("getFileStatement - returns extensionless name + numeric suffix with no content", () => { expect(getFileStatement("testcsv.csv", "", "/path").value).to.equal( `filename \${1:fileref} filesrvc folderpath='/path' filename='testcsv.csv';\n`, ); }); it("getFileStatement - returns uppercase name + suffix with uppercase content", () => { expect( getFileStatement("testcsv.csv", "UPPER CASE CONTENT", "/path").value, ).to.equal( `FILENAME \${1:FILEREF} FILESRVC FOLDERPATH='/path' FILENAME='testcsv.csv';\n`, ); }); it("getFileStatement - returns encoded filename when filename contains quotes", () => { expect( getFileStatement("testcsv-'withquotes'.csv", "", "/path").value, ).to.equal( `filename \${1:fileref} filesrvc folderpath='/path' filename='testcsv-''withquotes''.csv';\n`, ); }); }); ================================================ FILE: client/test/components/LibraryNavigator/LibraryDataProvider.test.ts ================================================ import { TreeItemCollapsibleState, Uri, l10n } from "vscode"; import { AxiosResponse } from "axios"; import { expect } from "chai"; import * as sinon from "sinon"; import LibraryDataProvider from "../../../src/components/LibraryNavigator/LibraryDataProvider"; import LibraryModel from "../../../src/components/LibraryNavigator/LibraryModel"; import { DefaultRecordLimit, Icons, Messages, } from "../../../src/components/LibraryNavigator/const"; import { LibraryItem } from "../../../src/components/LibraryNavigator/types"; import RestLibraryAdapter from "../../../src/connection/rest/RestLibraryAdapter"; import { DataAccessApi } from "../../../src/connection/rest/api/compute"; import { getApiConfig } from "../../../src/connection/rest/common"; class MockRestLibraryAdapter extends RestLibraryAdapter { constructor(api: ReturnType) { super(); this.dataAccessApi = api; this.sessionId = "1234"; } } class MockLibraryModel extends LibraryModel { constructor(api: ReturnType) { super(new MockRestLibraryAdapter(api)); } } const dataAccessApi = () => { const apiConfig = getApiConfig(); apiConfig.baseOptions.baseURL = "https://test.local"; return DataAccessApi(apiConfig); }; const libraryDataProvider = ( api: ReturnType = dataAccessApi(), ) => new LibraryDataProvider( new MockLibraryModel(api), Uri.from({ scheme: "file" }), ); describe("LibraryDataProvider", async function () { it("getChildren - returns an empty array when no adapter is specified", async () => { const libraryDataProvider = new LibraryDataProvider( new LibraryModel(undefined), Uri.from({ scheme: "file" }), ); const children = await libraryDataProvider.getChildren(); expect(children.length).to.equal(0); }); it("getChildren - returns tables with a content item", async () => { const library: LibraryItem = { uid: "lib", id: "lib", name: "lib", type: "library", readOnly: false, }; const api = dataAccessApi(); const getTablesStub = sinon.stub(api, "getTables"); getTablesStub .withArgs({ sessionId: "1234", libref: library.id, limit: DefaultRecordLimit, start: 0, }) .resolves({ data: { items: [ { id: "table", name: "table", }, ], count: 0, }, } as AxiosResponse); const provider = libraryDataProvider(api); const children = await provider.getChildren(library); expect(children[0]).to.deep.equal({ library: library.id, uid: `${library.id}.table`, id: "table", name: "table", type: "table", readOnly: library.readOnly, }); getTablesStub.restore(); }); it("getChildren - returns libraries without content item", async () => { const api = dataAccessApi(); // One call to get libraries const getLibrariesStub = sinon.stub(api, "getLibraries").resolves({ data: { items: [ { id: "library", name: "library", }, ], count: 0, }, } as AxiosResponse); // One to get library summary const getLibrarySummaryStub = sinon .stub(api, "getLibrarySummary") .resolves({ data: { readOnly: true, }, } as AxiosResponse); const provider = libraryDataProvider(api); const children = await provider.getChildren(); expect(children[0]).to.deep.equal({ library: undefined, uid: `.library`, id: "library", name: "library", type: "library", readOnly: true, }); getLibrariesStub.restore(); getLibrarySummaryStub.restore(); }); it("getTreeItem - returns table tree item", async () => { const item: LibraryItem = { uid: "test", id: "test", name: "test", type: "table", readOnly: false, }; const provider = libraryDataProvider(); const treeItem = await provider.getTreeItem(item); expect(treeItem.id).to.equal(item.id); expect(Object.values(treeItem.iconPath)[0].path).to.contain( Icons.DataSet.light, ); expect(treeItem.contextValue).to.contain("table-actionable"); expect(treeItem.collapsibleState).to.equal(TreeItemCollapsibleState.None); expect(treeItem.command).to.contain({ command: "SAS.viewTable" }); }); it("getTreeItem - returns read only library", async () => { const item: LibraryItem = { uid: "test", id: "test", name: "test", type: "library", readOnly: true, }; const provider = libraryDataProvider(); const treeItem = await provider.getTreeItem(item); expect(treeItem.id).to.equal(item.id); expect(Object.values(treeItem.iconPath)[0].path).to.contain( Icons.ReadOnlyLibrary.light, ); expect(treeItem.contextValue).to.contain("library-readonly"); expect(treeItem.collapsibleState).to.equal( TreeItemCollapsibleState.Collapsed, ); expect(treeItem.command === undefined).to.equal(true); }); it("getTreeItem - returns regular library", async () => { const item: LibraryItem = { uid: "test", id: "test", name: "test", type: "library", readOnly: false, }; const provider = libraryDataProvider(); const treeItem = await provider.getTreeItem(item); expect(treeItem.id).to.equal(item.id); expect(Object.values(treeItem.iconPath)[0].path).to.contain( Icons.Library.light, ); expect(treeItem.contextValue).to.contain("library-actionable"); expect(treeItem.collapsibleState).to.equal( TreeItemCollapsibleState.Collapsed, ); expect(treeItem.command === undefined).to.equal(true); }); it("getTreeItem - returns work library", async () => { const item: LibraryItem = { uid: "WORK", id: "WORK", name: "WORK", type: "library", readOnly: false, }; const provider = libraryDataProvider(); const treeItem = await provider.getTreeItem(item); expect(treeItem.id).to.equal(item.id); expect(Object.values(treeItem.iconPath)[0].path).to.contain( Icons.WorkLibrary.light, ); expect(treeItem.contextValue).to.contain("library-actionable"); expect(treeItem.collapsibleState).to.equal( TreeItemCollapsibleState.Collapsed, ); expect(treeItem.command === undefined).to.equal(true); }); it("deleteTables - deletes a single table successfully", async () => { const items: LibraryItem[] = [ { uid: "test", id: "test", name: "test", type: "table", readOnly: false, library: "lib", }, ]; const api = dataAccessApi(); const deleteTableStub = sinon.stub(api, "deleteTable"); const provider = libraryDataProvider(api); await provider.deleteTables(items); expect(deleteTableStub.calledOnce).to.equal(true); deleteTableStub.restore(); }); it("deleteTables - fails with error message for single table", async () => { const items: LibraryItem[] = [ { uid: "test", id: "test", name: "test", type: "table", readOnly: false, library: "lib", }, ]; const api = dataAccessApi(); const deleteTableStub = sinon.stub(api, "deleteTable"); deleteTableStub.throwsException(new Error()); const provider = libraryDataProvider(api); try { await provider.deleteTables(items); } catch (error) { expect(error.message).to.equal( new Error(l10n.t(Messages.TableDeletionError, { tableName: "test" })) .message, ); } deleteTableStub.restore(); }); it("deleteTables - deletes multiple tables successfully", async () => { const items: LibraryItem[] = [ { uid: "lib.table1", id: "table1", name: "table1", type: "table", readOnly: false, library: "lib", }, { uid: "lib.table2", id: "table2", name: "table2", type: "table", readOnly: false, library: "lib", }, ]; const api = dataAccessApi(); const deleteTableStub = sinon.stub(api, "deleteTable"); const provider = libraryDataProvider(api); await provider.deleteTables(items); expect(deleteTableStub.callCount).to.equal(2); deleteTableStub.restore(); }); it("deleteTables - reports failures when some tables fail to delete", async () => { const items: LibraryItem[] = [ { uid: "lib.table1", id: "table1", name: "table1", type: "table", readOnly: false, library: "lib", }, { uid: "lib.table2", id: "table2", name: "table2", type: "table", readOnly: false, library: "lib", }, { uid: "lib.table3", id: "table3", name: "table3", type: "table", readOnly: false, library: "lib", }, ]; const api = dataAccessApi(); const deleteTableStub = sinon.stub(api, "deleteTable"); // First table succeeds deleteTableStub.onFirstCall().resolves(); // Second table fails deleteTableStub .onSecondCall() .throwsException(new Error("Failed to delete")); // Third table succeeds deleteTableStub.onThirdCall().resolves(); const provider = libraryDataProvider(api); try { await provider.deleteTables(items); expect.fail("Should have thrown an error"); } catch (error) { expect(error.message).to.contain("lib.table2"); expect(deleteTableStub.callCount).to.equal(3); } deleteTableStub.restore(); }); }); ================================================ FILE: client/test/components/LibraryNavigator/PaginatedResultSet.test.ts ================================================ import { AxiosHeaders, AxiosResponse } from "axios"; import { expect } from "chai"; import PaginatedResultSet from "../../../src/components/LibraryNavigator/PaginatedResultSet"; const axiosResponseDefaults = { status: 200, statusText: "OK", headers: {}, config: { headers: new AxiosHeaders(), }, }; describe("PaginatedResultSet", async function () { it("returns a basic response", async () => { const mockAxiosResponse: AxiosResponse = { ...axiosResponseDefaults, data: { limit: 0, count: 100, test: "yes", }, }; const paginatedResultSet = new PaginatedResultSet( async () => mockAxiosResponse, ); expect( await paginatedResultSet.getData(0, 100, [], undefined), ).to.deep.equal(mockAxiosResponse); }); }); ================================================ FILE: client/test/components/logViewer/log.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { LogLine } from "../../../src/connection"; export const logWith13Problems: LogLine[] = [ { line: "28 /** LOG_START_INDICATOR **/", type: "source", version: 1, }, { line: "29 title;footnote;ods _all_ close;", type: "source", version: 1 }, { line: "30 ods graphics on;", type: "source", version: 1 }, { line: "31 ods html5 style=Illuminate options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml2.htm", type: "note", version: 1, }, { line: "32 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error3.sas));", type: "source", version: 1, }, { line: "33 ", type: "source", version: 1 }, { line: "34 ", type: "source", version: 1 }, { line: "35 ", type: "source", version: 1 }, { line: "36 /* I am comment */", type: "source", version: 1 }, { line: "37 options ls=72;", type: "source", version: 1 }, { line: "38 data pf70 pm70 pf80 pm80;", type: "source", version: 1 }, { line: "39 \\tinput state $ pop_f70 pop_m70 pop_f80 pop_m80 @@;", type: "source", version: 1, }, { line: "40 \\tdrop pop_m70 pop_f70 pop_m80 pop_f80;", type: "source", version: 1, }, { line: "41 \\tdecade= 70;", type: "source", version: 1 }, { line: "42 \\tsex= 'Female'", type: "source", version: 1 }, { line: "43 \\tpop= pop_f70; output pf70;", type: "source", version: 1 }, { line: " ---", type: "error", version: 1 }, { line: " 22", type: "error", version: 1 }, { line: "ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, ", type: "error", version: 1, }, { line: " *, **, +, -, /, ;, <, <=, <>, =, >, ><, >=, AND, EQ, GE, ", type: "error", version: 1, }, { line: " GT, IN, LE, LT, MAX, MIN, NE, NG, NL, NOTIN, OR, ^=, |, ", type: "error", version: 1, }, { line: " ||, ~=. ", type: "error", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "44 \\tsex= 'Male';", type: "source", version: 1 }, { line: "45 \\tpop= pop_m70; output pm70;", type: "source", version: 1 }, { line: "46 \\tdecade= 80;", type: "source", version: 1 }, { line: "47 \\tpop= pop_m80; output pm80;", type: "source", version: 1 }, { line: "48 \\tsex= 'Female';", type: "source", version: 1 }, { line: "49 \\tpop= pop_f80; output pf80;", type: "source", version: 1 }, { line: "50 \\tcards,", type: "source", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 22", type: "error", version: 1 }, { line: " 76", type: "error", version: 1 }, { line: "ERROR 22-322: Syntax error, expecting one of the following: ;, CANCEL, ", type: "error", version: 1, }, { line: " PGM. ", type: "error", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "ERROR 76-322: Syntax error, statement will be ignored.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "51 ALA 1.78 1.66 2.02 1.87 ALASKA 0.14 0.16 0.19 0.21", type: "source", version: 1, }, { line: "52 ARIZ 0.90 0.87 1.38 1.34 ARK 0.99 0.93 1.18 1.10", type: "source", version: 1, }, { line: "53 CALIF 10.14 9.82 12.00 11.67 COLO 1.12 1.09 1.46 1.43", type: "source", version: 1, }, { line: "54 CONN 1.56 1.47 1.61 1.50 DEL 0.28 0.27 0.31 0.29", type: "source", version: 1, }, { line: "55 FLA 3.51 3.28 5.07 4.68 GA 2.36 2.23 2.82 2.64", type: "source", version: 1, }, { line: "56 HAW 0.37 0.40 0.47 0.49 IDAHO 0.36 0.36 0.47 0.47", type: "source", version: 1, }, { line: "57 ILL 5.72 5.39 5.89 5.54 IND 2.66 2.53 2.82 2.67", type: "source", version: 1, }, { line: "58 IOWA 1.45 1.37 1.50 1.41 KAN 1.15 1.02 1.21 1.16", type: "source", version: 1, }, { line: "59 KY 1.64 1.58 1.87 1.79 LA 1.87 1.77 2.17 2.04", type: "source", version: 1, }, { line: "60 ME 0.51 0.48 0.58 0.55 MD 2.01 1.92 2.17 2.04", type: "source", version: 1, }, { line: "61 MASS 2.97 2.72 3.01 2.73 MICH 4.53 4.39 4.75 4.52", type: "source", version: 1, }, { line: "62 MINN 1.94 1.86 2.08 2.00 MISS 1.14 1.07 1.31 1.21", type: "source", version: 1, }, { line: "63 MO 2.42 2.26 2.55 2.37 MONT 0.35 0.35 0.39 0.39", type: "source", version: 1, }, { line: "64 NEB 0.76 0.72 0.80 0.77 NEV 0.24 0.25 0.40 0.41", type: "source", version: 1, }, { line: "65 NH 0.38 0.36 0.47 0.45 NJ 3.70 3.47 3.83 3.53", type: "source", version: 1, }, { line: "4 The SAS System", type: "title", version: 1, }, { line: " Friday, January 19, 2024 08:12:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: "66 NM 0.52 0.50 0.66 0.64 NY 9.52 8.72 9.22 8.34", type: "source", version: 1, }, { line: "67 NC 2.59 2.49 3.03 2.86 ND 0.31 0.31 0.32 0.33", type: "source", version: 1, }, { line: "68 OHIO 5.49 5.16 5.58 5.22 OKLA 1.31 1.25 1.55 1.48", type: "source", version: 1, }, { line: "69 ORE 1.07 1.02 1.34 1.30 PA 6.13 5.67 6.18 5.68", type: "source", version: 1, }, { line: "70 RI 0.48 0.46 0.50 0.45 SC 1.32 1.27 1.60 1.52", type: "source", version: 1, }, { line: "71 SD 0.34 0.33 0.35 0.34 TENN 2.03 1.90 2.37 2.22", type: "source", version: 1, }, { line: "72 TEXAS 5.72 5.48 7.23 7.00 UTAH 0.54 0.52 0.74 0.72", type: "source", version: 1, }, { line: "73 VT 0.23 0.22 0.26 0.25 VA 2.35 2.30 2.73 2.62", type: "source", version: 1, }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.01 seconds", type: "note", version: 1 }, { line: " cpu time 0.02 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "NOTE: Character values have been converted to numeric ", type: "note", version: 1, }, { line: " values at the places given by: (Line):(Column).", type: "note", version: 1, }, { line: " 42:7 44:7 48:7 ", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "WARNING: The data set WORK.PF70 may be incomplete. When this step was ", type: "warning", version: 1, }, { line: " stopped there were 0 observations and 4 variables.", type: "warning", version: 1, }, { line: "WARNING: The data set WORK.PM70 may be incomplete. When this step was ", type: "warning", version: 1, }, { line: " stopped there were 0 observations and 4 variables.", type: "warning", version: 1, }, { line: "WARNING: The data set WORK.PF80 may be incomplete. When this step was ", type: "warning", version: 1, }, { line: " stopped there were 0 observations and 4 variables.", type: "warning", version: 1, }, { line: "WARNING: The data set WORK.PM80 may be incomplete. When this step was ", type: "warning", version: 1, }, { line: " stopped there were 0 observations and 4 variables.", type: "warning", version: 1, }, { line: "74 WASH 1.72 1.69 2.08 2.05 W.VA 0.90 0.84 1.00 0.95", type: "source", version: 1, }, { line: "75 WIS 2.25 2.17 2.40 2.31 WYO 0.16 0.17 0.23 0.24", type: "source", version: 1, }, { line: "76 XX . . . . YY . . . .", type: "source", version: 1, }, { line: "77 ;", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "78 data popstate;", type: "source", version: 1 }, { line: "79 \\tset pf70 pm70 pf80 pm80;", type: "source", version: 1 }, { line: "80 \\tlabel pop= 'Census Population In Millions';", type: "source", version: 1, }, { line: "81 title 'The SAS System';", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The data set WORK.POPSTATE has 0 observations and 4 variables.", type: "note", version: 1, }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "82 proc univariate data=popstate freq plot normal;", type: "source", version: 1, }, { line: "83 \\tvar2 pop;", type: "source", version: 1 }, { line: " ----", type: "warning", version: 1 }, { line: " 1", type: "warning", version: 1 }, { line: "WARNING 1-322: Assuming the symbol VAR was misspelled as var2.", type: "warning", version: 1, }, { line: "84 \\tid state;", type: "source", version: 1 }, { line: "85 \\tby decade sex;", type: "source", version: 1 }, { line: "86 \\toutput out= univout mean= popnmean median= popn50", type: "source", version: 1, }, { line: "87 \\t\\tpctlpre= pop_ pctlpts= 50, 95 to 100 by 2.5;", type: "source", version: 1, }, { line: "", type: "note", version: 1 }, { line: "NOTE: The data set WORK.UNIVOUT has 0 observations and 0 variables.", type: "note", version: 1, }, { line: "NOTE: PROCEDURE UNIVARIATE used (Total process time):", type: "note", version: 1, }, { line: " real time 0.01 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "5 The SAS System", type: "title", version: 1, }, { line: " Friday, January 19, 2024 08:12:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: "88 proc print data= univout;", type: "source", version: 1 }, { line: "89 \\ttitle 'Output Dataset From PROC UNIVARIATE';", type: "source", version: 1, }, { line: "90 \\tformat popn50 pop_50 pop_95 pop_97_5 pop_100 best8.;", type: "source", version: 1, }, { line: "WARNING: Variable POPN50 not found in data set WORK.UNIVOUT.", type: "warning", version: 1, }, { line: "WARNING: Variable POP_50 not found in data set WORK.UNIVOUT.", type: "warning", version: 1, }, { line: "WARNING: Variable POP_95 not found in data set WORK.UNIVOUT.", type: "warning", version: 1, }, { line: "WARNING: Variable POP_97_5 not found in data set WORK.UNIVOUT.", type: "warning", version: 1, }, { line: "WARNING: Variable POP_100 not found in data set WORK.UNIVOUT.", type: "warning", version: 1, }, { line: "91 ", type: "source", version: 1 }, { line: "92 ;*';*\\\";*/;run;", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: PROCEDURE PRINT used (Total process time):", type: "note", version: 1, }, { line: " real time 0.01 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "92 ! quit;ods html5 close;", type: "source", version: 1, }, ]; export const logWith7Problems: LogLine[] = [ { line: "28 /** LOG_START_INDICATOR **/", type: "source", version: 1, }, { line: "29 title;footnote;ods _all_ close;", type: "source", version: 1 }, { line: "30 ods graphics on;", type: "source", version: 1 }, { line: "31 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml2.htm", type: "note", version: 1, }, { line: "32 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error4.sas));", type: "source", version: 1, }, { line: "33 proc foo; run;", type: "source", version: 1 }, { line: "ERROR: Procedure FOO not found.", type: "error", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "NOTE: PROCEDURE FOO used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "34 ", type: "source", version: 1 }, { line: "35 options option=foo;", type: "source", version: 1 }, { line: " ------", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name OPTION.", type: "error", version: 1, }, { line: "36 ", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "37 data x;", type: "source", version: 1 }, { line: "38 ", type: "source", version: 1 }, { line: "39 print(x);", type: "source", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 22", type: "error", version: 1 }, { line: " 76", type: "error", version: 1 }, { line: "ERROR: Undeclared array referenced: print.", type: "error", version: 1, }, { line: "ERROR 22-322: Syntax error, expecting one of the following: +, =. ", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "ERROR 76-322: Syntax error, statement will be ignored.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "40 ", type: "source", version: 1 }, { line: "41 run;", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "WARNING: The data set WORK.X may be incomplete. When this step was stopped there were 0 observations and 1 variables.", type: "warning", version: 1, }, { line: "WARNING: Data set WORK.X was not replaced because this step was stopped.", type: "warning", version: 1, }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "42 ;*';*\\\";*/;run;quit;ods html5 close;", type: "source", version: 1, }, ]; export const logWith3Problems: LogLine[] = [ { line: "1 The SAS System Monday, January 22, 2024 02:43:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: "NOTE: Copyright (c) 2016-2023 by SAS Institute Inc., Cary, NC, USA. ", type: "note", version: 1, }, { line: "NOTE: SAS (r) Proprietary Software V.04.00 (TS M0 MBCS3170) ", type: "note", version: 1, }, { line: " Licensed to SCI-VA-VIYA4CD-LAX-RELEASE-TESTREADY, Site 70180938.", type: "note", version: 1, }, { line: "NOTE: This session is executing on the Linux 4.18.0-425.3.1.el8.x86_64 (LIN X64) platform.", type: "note", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "NOTE: Additional host information:", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: " Linux LIN X64 4.18.0-425.3.1.el8.x86_64 #1 SMP Wed Nov 9 20:13:27 UTC 2022 x86_64 Red Hat Enterprise Linux release 8.9 (Ootpa) ", type: "note", version: 1, }, { line: "", type: "note", version: 1 }, { line: "NOTE: SAS initialization used:", type: "note", version: 1 }, { line: " real time 0.04 seconds", type: "note", version: 1 }, { line: " cpu time 0.04 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: AUTOEXEC processing beginning; file is /opt/sas/viya/config/etc/compsrv/default/autoexec.sas.", type: "note", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.01 seconds", type: "note", version: 1 }, { line: " cpu time 0.02 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "NOTE: AUTOEXEC processing completed.", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The LOCKDOWN option has been set. SAS is now in the lockdown state.", type: "note", version: 1, }, { line: "", type: "note", version: 1 }, { line: "NOTE: NOTE: The LOCKDOWN option has been set. SAS is now in the lockdown state.", type: "note", version: 1, }, { line: "1 /** LOG_START_INDICATOR **/", type: "source", version: 1, }, { line: "2 title;footnote;ods _all_ close;", type: "source", version: 1 }, { line: "3 ods graphics on;", type: "source", version: 1 }, { line: "4 ods html5 style=Illuminate options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml.htm", type: "note", version: 1, }, { line: "5 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error5.sas));", type: "source", version: 1, }, { line: "6 option ls=72,", type: "source", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name ,.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "7 ", type: "source", version: 1 }, { line: "8 data pf70;", type: "source", version: 1 }, { line: " ----", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name DATA.", type: "error", version: 1, }, { line: "", type: "error", version: 1 }, { line: "8 ! data pf70;", type: "source", version: 1 }, { line: " ----", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name PF70.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "9 ;*';*\\\";*/;run;quit;ods html5 close;", type: "source", version: 1, }, ]; export const replayedLogWith7Problems: LogLine[] = [ { line: "1 The SAS System Monday, January 22, 2024 05:24:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: "NOTE: Copyright (c) 2016-2023 by SAS Institute Inc., Cary, NC, USA. ", type: "note", version: 1, }, { line: "NOTE: SAS (r) Proprietary Software V.04.00 (TS M0 MBCS3170) ", type: "note", version: 1, }, { line: " Licensed to SCI-VA-VIYA4CD-LAX-RELEASE-TESTREADY, Site 70180938.", type: "note", version: 1, }, { line: "NOTE: This session is executing on the Linux 4.18.0-425.3.1.el8.x86_64 (LIN X64) platform.", type: "note", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "NOTE: Additional host information:", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: " Linux LIN X64 4.18.0-425.3.1.el8.x86_64 #1 SMP Wed Nov 9 20:13:27 UTC 2022 x86_64 Red Hat Enterprise Linux release 8.9 (Ootpa) ", type: "note", version: 1, }, { line: "", type: "note", version: 1 }, { line: "NOTE: SAS initialization used:", type: "note", version: 1 }, { line: " real time 0.04 seconds", type: "note", version: 1 }, { line: " cpu time 0.03 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: AUTOEXEC processing beginning; file is /opt/sas/viya/config/etc/compsrv/default/autoexec.sas.", type: "note", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.01 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "NOTE: AUTOEXEC processing completed.", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The LOCKDOWN option has been set. SAS is now in the lockdown state.", type: "note", version: 1, }, { line: "", type: "note", version: 1 }, { line: "NOTE: NOTE: The LOCKDOWN option has been set. SAS is now in the lockdown state.", type: "note", version: 1, }, { line: "1 /** LOG_START_INDICATOR **/", type: "source", version: 1, }, { line: "2 title;footnote;ods _all_ close;", type: "source", version: 1, }, { line: "3 ods graphics on;", type: "source", version: 1 }, { line: "4 ods html5 style=Illuminate options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml.htm", type: "note", version: 1, }, { line: "5 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error4.sas));", type: "source", version: 1, }, { line: "6 proc foo; run;", type: "source", version: 1 }, { line: "ERROR: Procedure FOO not found.", type: "error", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "NOTE: Due to ERROR(s) above, SAS set option OBS=0, enabling syntax check mode. ", type: "note", version: 1, }, { line: " This prevents execution of subsequent data modification statements.", type: "note", version: 1, }, { line: "NOTE: PROCEDURE FOO used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "7 ", type: "source", version: 1 }, { line: "8 options option=foo;", type: "source", version: 1 }, { line: " ------", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name OPTION.", type: "error", version: 1, }, { line: "9 ", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "10 data x;", type: "source", version: 1 }, { line: "11 ", type: "source", version: 1 }, { line: "12 print(x);", type: "source", version: 1 }, { line: "2 The SAS System Monday, January 22, 2024 05:24:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 22", type: "error", version: 1 }, { line: " 76", type: "error", version: 1 }, { line: "ERROR: Undeclared array referenced: print.", type: "error", version: 1, }, { line: "ERROR 22-322: Syntax error, expecting one of the following: +, =. ", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "ERROR 76-322: Syntax error, statement will be ignored.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "13 ", type: "source", version: 1 }, { line: "14 run;", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "WARNING: The data set WORK.X may be incomplete. When this step was stopped there were 0 observations and 1 variables.", type: "warning", version: 1, }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.02 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "15 ;*';*\\\";*/;run;quit;ods html5 close;", type: "source", version: 1, }, { line: "16 title;footnote;ods _all_ close;", type: "source", version: 1 }, { line: "17 ods graphics on;", type: "source", version: 1 }, { line: "18 ods html5 style=Illuminate options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml1.htm", type: "note", version: 1, }, { line: "19 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error4.sas));", type: "source", version: 1, }, { line: "20 ;", type: "source", version: 1 }, { line: "21 ;*';*\\\";*/;run;quit;ods html5 close;", type: "source", version: 1, }, { line: "22 title;footnote;ods _all_ close;", type: "source", version: 1 }, { line: "23 ods graphics on;", type: "source", version: 1 }, { line: "24 ods html5 style=Illuminate options(bitmap_mode='inline' svg_mode='inline');", type: "source", version: 1, }, { line: "NOTE: Writing HTML5 Body file: sashtml2.htm", type: "note", version: 1, }, { line: "25 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error4.sas));", type: "source", version: 1, }, { line: "26 proc foo; run;", type: "source", version: 1 }, { line: "ERROR: Procedure FOO not found.", type: "error", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "NOTE: PROCEDURE FOO used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "27 ", type: "source", version: 1 }, { line: "28 options option=foo;", type: "source", version: 1 }, { line: " ------", type: "error", version: 1 }, { line: " 13", type: "error", version: 1 }, { line: "ERROR 13-12: Unrecognized SAS option name OPTION.", type: "error", version: 1, }, { line: "29 ", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "30 data x;", type: "source", version: 1 }, { line: "31 ", type: "source", version: 1 }, { line: "32 print(x);", type: "source", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 22", type: "error", version: 1 }, { line: " 76", type: "error", version: 1 }, { line: "ERROR: Undeclared array referenced: print.", type: "error", version: 1, }, { line: "ERROR 22-322: Syntax error, expecting one of the following: +, =. ", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "ERROR 76-322: Syntax error, statement will be ignored.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "3 The SAS System Monday, January 22, 2024 05:24:00 AM", type: "title", version: 1, }, { line: "", type: "title", version: 1 }, { line: "33 ", type: "source", version: 1 }, { line: "34 run;", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, { line: "NOTE: The SAS System stopped processing this step because of errors.", type: "note", version: 1, }, { line: "WARNING: The data set WORK.X may be incomplete. When this step was stopped there were 0 observations and 1 variables.", type: "warning", version: 1, }, { line: "WARNING: Data set WORK.X was not replaced because this step was stopped.", type: "warning", version: 1, }, { line: "NOTE: DATA statement used (Total process time):", type: "note", version: 1, }, { line: " real time 0.00 seconds", type: "note", version: 1 }, { line: " cpu time 0.00 seconds", type: "note", version: 1 }, { line: " ", type: "note", version: 1 }, { line: "", type: "note", version: 1 }, { line: "35 ;*';*\\\";*/;run;quit;ods html5 close;", type: "source", version: 1, }, ]; export const logWithLongSourceCode: LogLine[] = [ { line: "6 /** LOG_START_INDICATOR **/", type: "source", version: 1, }, { line: "7 %let _SASPROGRAMFILE = ", type: "source", version: 1, }, { line: "7 ! %nrquote(%nrstr(c:\\SAS\\GIT\\GitHub\\TestData\\error7.sas));", type: "source", version: 1, }, { line: "8 proc casutil;", type: "source", version: 1 }, { line: "ERROR: A connection to the Cloud Analytic Services session could not be made.", type: "error", version: 1, }, { line: "ERROR: An error has occurred.", type: "error", version: 1 }, { line: '8 ! load data=SASHELP.BASEBALL outcaslib="CASUSER" casout="CASBALL"; run;', type: "source", version: 1, }, { line: "ERROR: An error has occurred.", type: "error", version: 1 }, { line: "", type: "note", version: 1 }, { line: "9 ", type: "source", version: 1 }, { line: "", type: "note", version: 1 }, ]; export const logWithMultipleIndicatorInOneLine: LogLine[] = [ { line: "36 /** LOG_START_INDICATOR **/", type: "source", version: 1 }, { line: "37 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\SAS\\GIT\\GitHub\\TestData\\errot9.sas));", type: "source", version: 1, }, { line: "38 /* PROC PRINT DATA=SASHELP.CLASS;", type: "source", version: 1, }, { line: "39 RUN;*/", type: "source", version: 1 }, { line: "40 /*", type: "source", version: 1 }, { line: "41 %MACRO NAME;", type: "source", version: 1 }, { line: "42 %MEND; */", type: "source", version: 1 }, { line: "43 ", type: "source", version: 1 }, { line: "44 /* %macro name;", type: "source", version: 1 }, { line: "45 %mend; */", type: "source", version: 1 }, { line: "46 ", type: "source", version: 1 }, { line: "47 data _null_;", type: "source", version: 1 }, { line: "48 set one;", type: "source", version: 1 }, { line: "ERROR: File WORK.ONE.DATA does not exist.", type: "error", version: 1, }, { line: "49 call call symputx('mac', quote(strip(emple)));", type: "source", version: 1, }, { line: " ------- -", type: "error", version: 1, }, { line: " 22 79", type: "error", version: 1, }, { line: " 68", type: "error", version: 1 }, { line: " ----", type: "error", version: 1 }, { line: " 251", type: "error", version: 1 }, { line: "ERROR 22-322: Syntax error, expecting one of the following: (, ;. ", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "ERROR 79-322: Expecting a ).", type: "error", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "ERROR 68-185: The function SYMPUTX is unknown, or cannot be accessed.", type: "error", version: 1, }, { line: "", type: "normal", version: 1 }, { line: "ERROR 251-185: The subroutine CALL is unknown, or cannot be accessed. Check your spelling. ", type: "error", version: 1, }, { line: " Either it was not found in the path(s) of executable images, or there was incorrect or missing subroutine descriptor ", type: "error", version: 1, }, { line: " information.", type: "error", version: 1 }, { line: "", type: "normal", version: 1 }, { line: "50 call execute(%let list=&list &mac);", type: "source", version: 1, }, { line: "WARNING: Apparent symbolic reference MAC not resolved.", type: "warning", version: 1, }, { line: "WARNING: Apparent symbolic reference MAC not resolved.", type: "warning", version: 1, }, { line: "51 run;", type: "source", version: 1 }, { line: " -", type: "error", version: 1 }, { line: " 79", type: "error", version: 1 }, { line: "", type: "note", version: 1 }, { line: "ERROR 79-322: Expecting a ).", type: "error", version: 1 }, { line: "", type: "normal", version: 1 }, ]; export const multipleSameProblemIndexAtOneLine: LogLine[] = [ { type: "title", line: "16 The SAS System 15:44 Friday, March 22, 2024", }, { type: "source", line: "261 /** LOG_START_INDICATOR **/" }, { type: "source", line: "262 title;footnote;ods _all_ close;" }, { type: "source", line: "263 ods graphics on;" }, { type: "source", line: "264 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline')", }, { type: "source", line: '264 ! body=\\"574c9522-8068-4c99-aeb5-4137a53ae941.htm\\";', }, { type: "note", line: "NOTE: Writing HTML5 Body file: 574c9522-8068-4c99-aeb5-4137a53ae941.htm", }, { type: "source", line: "265 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_04.sas));", }, { type: "source", line: "266 /*=========================*/" }, { type: "source", line: "267 /* Pass-Through Sample 1 */" }, { type: "source", line: "268 /*=========================*/" }, { type: "source", line: "269 /* BLANK LINE*/" }, { type: "source", line: "270 title 'Pass-Through Sample 1: Brief Data for All Invoices';", }, { type: "source", line: "271 /* BLANK LINE*/" }, { type: "source", line: "272 options linesize=120;" }, { type: "source", line: "273 /* BLANK LINE*/" }, { type: "source", line: "274 proc sql;" }, { type: "source", line: "275 connect to &dbms as mydb (&CONNOPT);" }, { type: "error", line: " _ _" }, { type: "error", line: " 22 79" }, { type: "error", line: " 200 200" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "warning", line: "WARNING: Apparent symbolic reference CONNOPT not resolved.", }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "error", line: "ERROR 79-322: Expecting a )." }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "note", line: "NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.", }, { type: "source", line: "276 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "277 /* BLANK LINE*/" }, { type: "source", line: "278 select INVNUM, NAME, BILLEDON," }, { type: "source", line: "279 AMTINUS format=dollar20.2" }, { type: "source", line: "280 from connection to mydb" }, { type: "source", line: "281 (select INVNUM, BILLEDON, AMTINUS, NAME", }, { type: "source", line: "282 from SAMDAT9, SAMDAT11" }, { type: "source", line: "283 where SAMDAT9.BILLEDTO=SAMDAT11.CUSTOMER", }, { type: "source", line: "284 order by BILLEDON, INVNUM);" }, { type: "error", line: "ERROR: The MYDB engine cannot be found." }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "285 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "286 /* BLANK LINE*/" }, { type: "source", line: "287 disconnect from mydb;" }, { type: "note", line: "NOTE: Statement not executed due to NOEXEC option." }, { type: "source", line: "288 quit;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SQL used (Total process time):" }, { type: "note", line: " real time 0.02 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "289 /* BLANK LINE*/" }, { type: "source", line: "290 proc sql;" }, { type: "title", line: "17 The SAS System 15:44 Friday, March 22, 2024", }, { type: "source", line: "291 connect to &dbms as mydb (&CONNOPT);" }, { type: "error", line: " _ _" }, { type: "error", line: " 22 79" }, { type: "error", line: " 200 200" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "warning", line: "WARNING: Apparent symbolic reference CONNOPT not resolved.", }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "error", line: "ERROR 79-322: Expecting a )." }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "note", line: "NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.", }, { type: "source", line: "292 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "293 /* BLANK LINE*/" }, { type: "source", line: "294 create view samples.brief as" }, { type: "source", line: "295 select INVNUM, NAME, BILLEDON," }, { type: "source", line: "296 AMTINUS format=dollar20.2" }, { type: "source", line: "297 from connection to mydb" }, { type: "source", line: "298 (select INVNUM, BILLEDON, AMTINUS, NAME", }, { type: "source", line: "299 from SAMDAT9, SAMDAT11" }, { type: "source", line: "300 where SAMDAT9.BILLEDTO=SAMDAT11.CUSTOMER);", }, { type: "note", line: "NOTE: Statement not executed due to NOEXEC option." }, { type: "source", line: "301 /* BLANK LINE*/" }, { type: "source", line: "302 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "303 /* BLANK LINE*/" }, { type: "source", line: "304 disconnect from mydb;" }, { type: "note", line: "NOTE: Statement not executed due to NOEXEC option." }, { type: "source", line: "305 /* BLANK LINE*/" }, { type: "source", line: "306 options ls=120 label;" }, { type: "source", line: "307 /* BLANK LINE*/" }, { type: "source", line: "308 select * from samples.brief" }, { type: "source", line: "309 order by BILLEDON, INVNUM;" }, { type: "error", line: "ERROR: Libref SAMPLES is not assigned." }, { type: "source", line: "310 /* BLANK LINE*/" }, { type: "source", line: "311 quit;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SQL used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "312 /* BLANK LINE*/" }, { type: "source", line: "313 /*=========================*/" }, { type: "source", line: "314 /* Pass-Through Sample 2 */" }, { type: "source", line: "315 /*=========================*/" }, { type: "source", line: "316 /* BLANK LINE*/" }, { type: "source", line: "317 options ls=120;" }, { type: "source", line: "318 /* BLANK LINE*/" }, { type: "source", line: "319 title 'Pass-Through Sample 2: Interns Who Are Family Members of Employees';", }, { type: "source", line: "320 /* BLANK LINE*/" }, { type: "source", line: "321 proc sql;" }, { type: "source", line: "322 connect to &dbms as mydb (&CONNOPT);" }, { type: "error", line: " _ _" }, { type: "error", line: " 22 79" }, { type: "title", line: "18 The SAS System 15:44 Friday, March 22, 2024", }, { type: "error", line: " 200 200" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "warning", line: "WARNING: Apparent symbolic reference CONNOPT not resolved.", }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "error", line: "ERROR 79-322: Expecting a )." }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "note", line: "NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.", }, { type: "source", line: "323 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "324 /* BLANK LINE*/" }, { type: "source", line: "325 select samdat13.LASTNAME, samdat13.FIRSTNAM,", }, { type: "source", line: "326 samdat13.EMPID, samdat13.FAMILYID,", }, { type: "source", line: "327 samdat13.GENDER, samdat13.DEPT," }, { type: "source", line: "328 samdat13.HIREDATE" }, { type: "source", line: "329 from connection to mydb" }, { type: "source", line: "330 (select * from SAMDAT10) as query1, samples.samdat13", }, { type: "source", line: "331 where query1.EMPID=samdat13.FAMILYID;", }, { type: "error", line: "ERROR: The MYDB engine cannot be found." }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "error", line: "ERROR: Libref SAMPLES is not assigned." }, { type: "source", line: "332 /* BLANK LINE*/" }, { type: "source", line: "333 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "334 /* BLANK LINE*/" }, { type: "source", line: "335 disconnect from mydb;" }, { type: "note", line: "NOTE: Statement not executed due to NOEXEC option." }, { type: "source", line: "336 quit;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SQL used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "337 /* BLANK LINE*/" }, { type: "source", line: "338 /* BLANK LINE*/" }, { type: "source", line: "339 /*=========================*/" }, { type: "source", line: "340 /* Pass-Through Sample 3 */" }, { type: "source", line: "341 /*=========================*/" }, { type: "source", line: "342 /* BLANK LINE*/" }, { type: "source", line: "343 proc sql;" }, { type: "source", line: "344 /* BLANK LINE*/" }, { type: "source", line: "345 create view samples.allemp as" }, { type: "source", line: "346 select * from mydblib.SAMDAT10;" }, { type: "error", line: "ERROR: Libref SAMPLES is not assigned." }, { type: "error", line: "ERROR: Create View failed." }, { type: "note", line: "NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.", }, { type: "source", line: "347 /* BLANK LINE*/" }, { type: "source", line: "348 quit;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SQL used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "349 /* BLANK LINE*/" }, { type: "title", line: "19 The SAS System 15:44 Friday, March 22, 2024", }, { type: "source", line: "350 %let dept='ACC%';" }, { type: "source", line: "351 /* BLANK LINE*/" }, { type: "source", line: "352 proc sql stimer;" }, { type: "note", line: "NOTE: SQL Statement used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "353 title 'Pass-Through Sample 3: Employees Who Earn Below the Dept Average", }, { type: "source", line: "354 Salary';" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "warning", line: "WARNING: Apparent symbolic reference CONNOPT not resolved.", }, { type: "source", line: "355 connect to &dbms (&CONNOPT);" }, { type: "error", line: " _" }, { type: "error", line: " 22" }, { type: "error", line: " 200" }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "note", line: "NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.", }, { type: "note", line: "NOTE: SQL Statement used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "356 /* BLANK LINE*/" }, { type: "source", line: "357 select EMPID, LASTNAME" }, { type: "source", line: "358 from samples.allemp" }, { type: "source", line: "359 where DEPT like &dept and SALARY <" }, { type: "source", line: "360 (select avg(SALARY)" }, { type: "source", line: "361 from connection to &dbms" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "source", line: "361 from connection to &dbms" }, { type: "error", line: " _" }, { type: "error", line: " 22" }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "source", line: "361 from connection to &dbms" }, { type: "error", line: " _" }, { type: "error", line: " 76" }, { type: "error", line: "ERROR 76-322: Syntax error, statement will be ignored.", }, { type: "source", line: "362 (select SALARY from SAMDAT10", }, { type: "source", line: "363 where DEPT like &dept));", }, { type: "note", line: "NOTE: SQL Statement used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "364 %put %superq(sqlxmsg);" }, { type: "error", line: "ERROR: A Connection to the mydb DBMS is not currently supported, or is not installed at your site.", }, { type: "source", line: "365 disconnect from &dbms;" }, { type: "error", line: " _" }, { type: "error", line: " 22" }, { type: "error", line: " 200" }, { type: "warning", line: "WARNING: Apparent symbolic reference DBMS not resolved.", }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "title", line: "20 The SAS System 15:44 Friday, March 22, 2024", }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "note", line: "NOTE: SQL Statement used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "366 /* BLANK LINE*/" }, { type: "source", line: "367 quit;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SQL used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "368 ;*';*\\\";*/;run;quit;ods html5 close;" }, { type: "source", line: "369 %put --vscode-sas-extension-submit-end--;", }, ]; export const case4: LogLine[] = [ { type: "title", line: "11 The SAS System 15:30 Thursday, April 18, 2024", }, { type: "source", line: "177 /** LOG_START_INDICATOR **/" }, { type: "source", line: "178 title;footnote;ods _all_ close;" }, { type: "source", line: "179 ods graphics on;" }, { type: "source", line: "180 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline')", }, { type: "source", line: '180 ! body=\\"38b4ac72-54cd-45d5-8f57-39931d8b55f5.htm\\";', }, { type: "note", line: "NOTE: Writing HTML5 Body file: 38b4ac72-54cd-45d5-8f57-39931d8b55f5.htm", }, { type: "source", line: "181 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_4.sas));", }, { type: "source", line: '182 data CUSTOMERS (label=\\"Customer data for geocoding\\");', }, { type: "source", line: "183 infiles datalines x dlm=# dlm=# dlm=## dlm=# dlm=# dlm=# dlm=# dlm=#;", }, { type: "error", line: " _______ _ _ _ __ _ _ _ _ _", }, { type: "error", line: " 1 23 24 24 24 24 24 24 24 24", }, { type: "error", line: " 24 24 24 24 24 24 24 24", }, { type: "warning", line: "WARNING 1-322: Assuming the symbol INFILE was misspelled as infiles.", }, { type: "error", line: "ERROR 23-2: Invalid option name X." }, { type: "error", line: "ERROR 24-322: Variable name is not valid." }, { type: "error", line: "ERROR 24-2: Invalid value for the DLM option." }, { type: "source", line: "184 length address $ 24 city $ 24 state $ 2;", }, { type: "source", line: "185 input address /* House number and street name */", }, { type: "source", line: "186 zip /* Customer ZIP code (numeric) */", }, { type: "source", line: "187 city /* City name */", }, { type: "source", line: "188 state /* State abbreviation */;", }, { type: "source", line: "189 cust_ID = _n_; /* Assign customer ID number */", }, { type: "source", line: "190 datalines;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "warning", line: "WARNING: The data set WORK.CUSTOMERS may be incomplete. When this step was stopped there were 0 observations and 5 ", }, { type: "warning", line: " variables." }, { type: "warning", line: "WARNING: Data set WORK.CUSTOMERS was not replaced because this step was stopped.", }, { type: "note", line: "NOTE: DATA statement used (Total process time):" }, { type: "note", line: " real time 0.03 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "192 ;" }, { type: "source", line: "193 run;" }, { type: "source", line: "194 ;*';*\\\";*/;run;quit;ods html5 close;" }, { type: "source", line: "195 %put --vscode-sas-extension-submit-end--;", }, ]; export const case5: LogLine[] = [ { type: "title", line: "12 The SAS System 15:30 Thursday, April 18, 2024", }, { type: "source", line: "196 /** LOG_START_INDICATOR **/" }, { type: "source", line: "197 title;footnote;ods _all_ close;" }, { type: "source", line: "198 ods graphics on;" }, { type: "source", line: "199 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline')", }, { type: "source", line: '199 ! body=\\"0677d731-e06b-434b-bf34-7389838b5f25.htm\\";', }, { type: "note", line: "NOTE: Writing HTML5 Body file: 0677d731-e06b-434b-bf34-7389838b5f25.htm", }, { type: "source", line: "200 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_5.sas));", }, { type: "source", line: '201 proc sgscatter data=sashelp.iris(=(species=\\"Virginica\\"));', }, { type: "error", line: " _ _", }, { type: "error", line: " 22 22", }, { type: "error", line: " 200", }, { type: "error", line: "ERROR 22-7: Invalid option name =." }, { type: "error", line: "ERROR 22-322: Syntax error, expecting one of the following: ;, BACKCOLOR, DATA, DATACOLORS, DATACONTRASTCOLORS, ", }, { type: "error", line: " DATALINEPATTERNS, DATASYMBOLS, DATTRMAP, DESCRIPTION, NOOPAQUE, NOSUBPIXEL, OPAQUE, PAD, RATTRMAP, ", }, { type: "error", line: " SGANNO, SUBPIXEL, TMPLOUT, WALLCOLOR. ", }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "source", line: '201 ! proc sgscatter data=sashelp.iris(=(species=\\"Virginica\\"));', }, { type: "error", line: " _______", }, { type: "error", line: " 22" }, { type: "error", line: "ERROR 22-7: Invalid option name SPECIES." }, { type: "source", line: '202 title \\"Multi-Celled Spline Curve for Species Virginica\\";', }, { type: "source", line: "203 plot (sepallength sepalwidth)*(petallength petalwidth)", }, { type: "source", line: "204 / pbspline;" }, { type: "source", line: "205 run;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SGSCATTER used (Total process time):", }, { type: "note", line: " real time 0.01 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "206 title;" }, { type: "source", line: "207 ;*';*\\\";*/;run;quit;ods html5 close;" }, { type: "source", line: "208 %put --vscode-sas-extension-submit-end--;", }, ]; export const case6: LogLine[] = [ { type: "title", line: "13 The SAS System 15:30 Thursday, April 18, 2024", }, { type: "source", line: "209 /** LOG_START_INDICATOR **/" }, { type: "source", line: "210 title;footnote;ods _all_ close;" }, { type: "source", line: "211 ods graphics on;" }, { type: "source", line: "212 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline')", }, { type: "source", line: '212 ! body=\\"39fc438c-e10b-4931-a6e4-1f34c082c876.htm\\";', }, { type: "note", line: "NOTE: Writing HTML5 Body file: 39fc438c-e10b-4931-a6e4-1f34c082c876.htm", }, { type: "source", line: "213 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_6.sas));", }, { type: "note", line: "NOTE: PROCEDURE HPCLUS used (Total process time):" }, { type: "note", line: " real time 0.03 seconds" }, { type: "note", line: " cpu time 0.01 seconds" }, { type: "note", line: " " }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "source", line: "214 proc hpclus data=sampsio.dmairis maxclusters=9", }, { type: "source", line: "215 NOC=ABCB=10 minclusters=2 align=PCA criterion=FIRSTPEAK);", }, { type: "error", line: " _____" }, { type: "error", line: " 1 22" }, { type: "error", line: " 200" }, { type: "warning", line: "WARNING 1-322: Assuming the symbol ABC was misspelled as ABCB.", }, { type: "error", line: "ERROR 22-322: Syntax error, expecting one of the following: ;, (, DATA, DISTANCE, DISTANCEINT, DISTANCENOM, IMP, ", }, { type: "error", line: " IMPUTE, IMPUTEINT, IMPUTENOM, INSEED, INSTAT, MAXC, MAXCLUSTERS, MAXITER, NOC, NOPRINT, OUTITER, OUTSTAT, ", }, { type: "error", line: " SEED, STANDARDIZE, STOPCRITERION. " }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "source", line: "216 input sep: pet: ;" }, { type: "source", line: "217 ods output ABCStats=ABCStats1;" }, { type: "source", line: "218 run;" }, { type: "source", line: "219 ;*';*\\\";*/;run;quit;ods html5 close;" }, { type: "source", line: "220 %put --vscode-sas-extension-submit-end--;", }, ]; export const case7_8: LogLine[] = [ { type: "title", line: "14 The SAS System 15:30 Thursday, April 18, 2024", }, { type: "source", line: "221 /** LOG_START_INDICATOR **/" }, { type: "source", line: "222 title;footnote;ods _all_ close;" }, { type: "source", line: "223 ods graphics on;" }, { type: "source", line: "224 ods html5 style=Ignite options(bitmap_mode='inline' svg_mode='inline')", }, { type: "source", line: '224 ! body=\\"61e33882-6d9c-4cf9-89bc-6be999155016.htm\\";', }, { type: "note", line: "NOTE: Writing HTML5 Body file: 61e33882-6d9c-4cf9-89bc-6be999155016.htm", }, { type: "source", line: "225 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_7_8.sas));", }, { type: "source", line: "226 data a;" }, { type: "source", line: "227 drop theta pi;" }, { type: "source", line: "228 array c{4} c1-c4;" }, { type: "source", line: "229 array s{3} s1-s3;" }, { type: "source", line: "230 pi = arcos(-1);" }, { type: "source", line: "231 do Habitat=1 to 4;" }, { type: "source", line: "232 do Month=1 to 12;" }, { type: "source", line: "233 theta = pi * Month / 4;" }, { type: "source", line: "234 do i=1 to 4; c{i} = cos(i*theta); end;", }, { type: "source", line: "235 do i=1 to 3; s{i} = sin(i*theta); end;", }, { type: "source", line: "236 output;" }, { type: "source", line: "237 end;" }, { type: "source", line: "238 end;" }, { type: "source", line: "239 run;" }, { type: "note", line: "NOTE: The data set WORK.A has 48 observations and 10 variables.", }, { type: "note", line: "NOTE: DATA statement used (Total process time):" }, { type: "note", line: " real time 0.02 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "240 Data set a contains the 48 candidate points and includes the four cosine variables (c1, c2, c3, and c4)", }, { type: "error", line: " ___ __ __", }, { type: "error", line: "_ ", }, { type: "error", line: "____ ", }, { type: "error", line: " 56 22 22", }, { type: "error", line: "200 ", }, { type: "error", line: "22 ", }, { type: "error", line: " 200" }, { type: "error", line: "200 " }, { type: "error", line: "ERROR 56-185: SET is not allowed in the DATA statement when option DATASTMTCHK=COREKEYWORDS. Check for a missing ", }, { type: "error", line: " semicolon in the DATA statement, or use DATASTMTCHK=NONE.", }, { type: "error", line: "ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, /, ;, _DATA_, _LAST_, _NULL_. ", }, { type: "error", line: "ERROR 22-7: Invalid option name C1." }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "source", line: "240 ! Data set a contains the 48 candidate points and includes the four cosine variables (c1, c2, c3, and c4) or", }, { type: "source", line: "240 ! three sine variables (s1, s2, and s3). The following statements produce Output 13.1.1:", }, { type: "error", line: " __ _" }, { type: "error", line: " 22 22" }, { type: "error", line: "ERROR 22-7: Invalid option name S1." }, { type: "error", line: "ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, /, ;, _DATA_, _LAST_, _NULL_. ", }, { type: "source", line: "241 /* BLANK LINE*/" }, { type: "source", line: "242 proc optex seed=193030034 data=a;" }, { type: "title", line: "15 The SAS System 15:30 Thursday, April 18, 2024", }, { type: "error", line: " _" }, { type: "error", line: " 22" }, { type: "error", line: " 200" }, { type: "source", line: "243 class Habitat;" }, { type: "error", line: " _____" }, { type: "error", line: " 180" }, { type: "source", line: "244 model Habitat Month c1-c4 s1-s3 / noint;", }, { type: "error", line: " _____" }, { type: "error", line: " 180" }, { type: "source", line: "245 generate n=12;" }, { type: "error", line: " ________" }, { type: "error", line: " 180" }, { type: "error", line: "ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, /, ;, _DATA_, _LAST_, _NULL_. ", }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "error", line: "ERROR 180-322: Statement is not valid or it is used out of proper order.", }, { type: "source", line: "246 run;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: DATA statement used (Total process time):" }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "247 ;*';*\\\";*/;run;quit;ods html5 close;" }, { type: "source", line: "248 %put --vscode-sas-extension-submit-end--;", }, ]; export const case9: LogLine[] = [ { type: "source", line: "3 %put &=workDir;" }, { type: "normal", line: "WORKDIR=C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2", }, { type: "note", line: 'NOTE: The current working directory is now \\"C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2\\".', }, { type: "source", line: '4 %let rc = %sysfunc(dlgcdir(\\"&workDir\\"));', }, { type: "source", line: "5 run;" }, { type: "title", line: "2 The SAS System 16:36 Thursday, April 25, 2024", }, { type: "source", line: "6 /** LOG_START_INDICATOR **/" }, { type: "source", line: "7 title;footnote;ods _all_ close;" }, { type: "source", line: "8 ods graphics on;" }, { type: "source", line: '9 ods html5(id=vscode) path=\\"C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2\\"', }, { type: "source", line: "9 ! style=Ignite options(bitmap_mode='inline' svg_mode='inline') body=\\\"375c94f5-9bbe-4abf-9381-6db8a336303b.htm\\\";", }, { type: "note", line: "NOTE: Writing HTML5(VSCODE) Body file: 375c94f5-9bbe-4abf-9381-6db8a336303b.htm", }, { type: "source", line: "10 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_9.sas));", }, { type: "note", line: "NOTE: PROCEDURE MAPIMPORT used (Total process time):", }, { type: "note", line: " real time 0.00 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "warning", line: "WARNING: Physical file does not exist, C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary ", }, { type: "warning", line: " Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2\\\\~sasdemo\\\\data\\\\mapping\\\\states.shp.", }, { type: "error", line: "ERROR: Unable to open DATAFILE." }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "source", line: "11 PROC MAPIMPORT OUT=mystates" }, { type: "source", line: '12 DATAFILE=\\"~sasdemo/data/mapping/states.shp\\";', }, { type: "source", line: "13 SELECT STATE_FIPS STATE_NAME STATE_ABBR;", }, { type: "source", line: "14 RENAME STATE_FIPS=FIPS STATE_NAME=STATE STATE_ABBR=ABBREV;", }, { type: "source", line: "15 run;" }, { type: "source", line: "16 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;", }, { type: "source", line: "17 %put --vscode-sas-extension-submit-end--;", }, ]; export const case10: LogLine[] = [ { type: "title", line: "3 The SAS System 16:36 Thursday, April 25, 2024", }, { type: "source", line: "18 /** LOG_START_INDICATOR **/" }, { type: "source", line: "19 title;footnote;ods _all_ close;" }, { type: "source", line: "20 ods graphics on;" }, { type: "source", line: '21 ods html5(id=vscode) path=\\"C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2\\"', }, { type: "source", line: "21 ! style=Ignite options(bitmap_mode='inline' svg_mode='inline') body=\\\"c43d6fcb-bc82-48e8-8d73-253845af2055.htm\\\";", }, { type: "note", line: "NOTE: Writing HTML5(VSCODE) Body file: c43d6fcb-bc82-48e8-8d73-253845af2055.htm", }, { type: "source", line: "22 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_10.sas));", }, { type: "source", line: "23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2;", }, { type: "error", line: " _" }, { type: "error", line: " 22" }, { type: "error", line: " 200" }, { type: "warning", line: "WARNING: Apparent symbolic reference DVTTESTDATA1 not resolved.", }, { type: "source", line: "23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2;", }, { type: "error", line: " _", }, { type: "error", line: " 22", }, { type: "error", line: "ERROR 22-322: Expecting a name. " }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "source", line: "23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2;", }, { type: "error", line: " _", }, { type: "error", line: " 200", }, { type: "error", line: "ERROR 200-322: The symbol is not recognized and will be ignored.", }, { type: "error", line: "ERROR: File WORK.DVTTESTDATA1.DATA does not exist." }, { type: "warning", line: "WARNING: Apparent symbolic reference DVTTESTDATA2 not resolved.", }, { type: "error", line: "ERROR: File WORK.DVTTESTDATA2.DATA does not exist." }, { type: "source", line: "24 scatter x=x y=x2 / group=y3 attrid=myid1;", }, { type: "error", line: "ERROR: No data set open to look up variables." }, { type: "error", line: "ERROR: No data set open to look up variables." }, { type: "error", line: "ERROR: No data set open to look up variables." }, { type: "source", line: "25 run;" }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "note", line: "NOTE: PROCEDURE SGPLOT used (Total process time):" }, { type: "note", line: " real time 0.04 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "26 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;", }, { type: "source", line: "27 %put --vscode-sas-extension-submit-end--;", }, ]; export const case11: LogLine[] = [ { type: "title", line: "4 The SAS System 16:36 Thursday, April 25, 2024", }, { type: "source", line: "28 /** LOG_START_INDICATOR **/" }, { type: "source", line: "29 title;footnote;ods _all_ close;" }, { type: "source", line: "30 ods graphics on;" }, { type: "source", line: '31 ods html5(id=vscode) path=\\"C:\\\\Users\\\\scnjdl\\\\AppData\\\\Local\\\\Temp\\\\SAS Temporary Files\\\\_TD44188_SAS-3YR23T3_\\\\Prc2\\"', }, { type: "source", line: "31 ! style=Ignite options(bitmap_mode='inline' svg_mode='inline') body=\\\"71b79405-8be6-4a49-9d5a-c1107c6b4c1d.htm\\\";", }, { type: "note", line: "NOTE: Writing HTML5(VSCODE) Body file: 71b79405-8be6-4a49-9d5a-c1107c6b4c1d.htm", }, { type: "source", line: "32 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\\\SAS\\\\GIT\\\\GitHub\\\\TestData\\\\error_case_11.sas));", }, { type: "source", line: "33 data hernio;" }, { type: "source", line: "34 input patient age gender$ OKstatus leave los;", }, { type: "source", line: "35 datalines;" }, { type: "note", line: "NOTE: The data set WORK.HERNIO has 32 observations and 6 variables.", }, { type: "note", line: "NOTE: DATA statement used (Total process time):" }, { type: "note", line: " real time 0.04 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "68 ;" }, { type: "source", line: "69 /* BLANK LINE*/" }, { type: "source", line: "70 data hernio_uv;" }, { type: "source", line: "71 length dist $7;" }, { type: "source", line: "72 set hernio;" }, { type: "source", line: "73 response = (leave=1);" }, { type: "source", line: '74 dist = \\"Binary\\";' }, { type: "source", line: "75 output;" }, { type: "source", line: "76 response = los;" }, { type: "source", line: '77 dist = \\"Poisson\\";' }, { type: "source", line: "78 output;" }, { type: "source", line: "79 keep patient age OKstatus response dist;", }, { type: "source", line: "80 run;" }, { type: "note", line: "NOTE: There were 32 observations read from the data set WORK.HERNIO.", }, { type: "note", line: "NOTE: The data set WORK.HERNIO_UV has 64 observations and 5 variables.", }, { type: "note", line: "NOTE: DATA statement used (Total process time):" }, { type: "note", line: " real time 0.03 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "source", line: "81 /* BLANK LINE*/" }, { type: "source", line: '82 proc glimmix data=hernio_uv(where=(dist=\\"Binary));', }, { type: "source", line: "83 model response(event='1') = age OKStatus / s dist=binary;", }, { type: "note", line: "NOTE: PROCEDURE GLIMMIX used (Total process time):" }, { type: "note", line: " real time 0.13 seconds" }, { type: "note", line: " cpu time 0.00 seconds" }, { type: "note", line: " " }, { type: "error", line: "ERROR: Syntax error while parsing WHERE clause." }, { type: "note", line: "NOTE: The SAS System stopped processing this step because of errors.", }, { type: "source", line: "84 run;" }, { type: "source", line: "85 /* BLANK LINE*/" }, { type: "source", line: "86 /* BLANK LINE*/" }, { type: "source", line: "87 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;", }, { type: "error", line: " _" }, { type: "error", line: " 79" }, { type: "error", line: " 22" }, { type: "error", line: " 180" }, { type: "error", line: "ERROR 79-322: Expecting a )." }, { type: "title", line: "5 The SAS System 16:36 Thursday, April 25, 2024", }, { type: "error", line: "ERROR 22-322: Missing ')' parenthesis for data set option list", }, { type: "error", line: "ERROR 180-322: Statement is not valid or it is used out of proper order.", }, { type: "source", line: "88 %put --vscode-sas-extension-submit-end--;", }, ]; ================================================ FILE: client/test/components/logViewer/logParser.test.ts ================================================ // Copyright © 2023, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import assert from "assert"; import { parseLog } from "../../../src/components/logViewer/logParser"; import { case4, case5, case6, case7_8, case9, case10, case11, logWith3Problems, logWith7Problems, logWith13Problems, logWithLongSourceCode, logWithMultipleIndicatorInOneLine, multipleSameProblemIndexAtOneLine, replayedLogWith7Problems, } from "./log"; const firstCodeLine = "/** LOG_START_INDICATOR **/"; describe("parse log", () => { it("parse the log in which has 7 problems", () => { const [result] = parseLog(logWith7Problems, firstCodeLine); assert.equal(result.length, 7, "result should have 7 problems."); }); it("parse the log in which has 13 problems", () => { const [result] = parseLog(logWith13Problems, firstCodeLine); assert.equal(result.length, 13, "result should have 13 problems."); }); it("parse the log in which has 3 problems", () => { const [result] = parseLog(logWith3Problems, firstCodeLine); assert.equal(result.length, 3, "result should have 3 problems."); }); it("parse the replayed log in which has 13 problems", () => { const [result] = parseLog(replayedLogWith7Problems, firstCodeLine); assert.equal(result.length, 13, "result should have 13 problems."); }); /* this test case concerns the truncated source code lines: 18 proc casutil; ERROR: A connection to the Cloud Analytic Services session could not be made. ERROR: An error has occurred. 18 ! load data=SASHELP.BASEBALL outcaslib="CASUSER" casout="CASBALL"; run; ERROR: An error has occurred. */ it("parse the log in which has long source code and 3 problems", () => { const [result] = parseLog(logWithLongSourceCode, firstCodeLine); assert.equal(result.length, 3, "result should have 3 problems."); }); /* this test case concerns multiple location indicators in one line: case 1: 65 call call symputx('mac', quote(strip(emple))); ------- - 22 79 68 ---- 251 ERROR 22-322: Syntax error, expecting one of the following: (, ;. ERROR 79-322: Expecting a ). ERROR 68-185: The function SYMPUTX is unknown, or cannot be accessed. ERROR 251-185: The subroutine CALL is unknown, or cannot be accessed. Check your spelling. Either it was not found in the path(s) of executable images, or there was incorrect or missing subroutine descriptor information. */ it("parse the log in which has 8 problems, 6 errors and 2 warning", () => { const [result] = parseLog(logWithMultipleIndicatorInOneLine, firstCodeLine); assert.equal(result.length, 8, "result should have 8 problems."); const errors = result.filter((problem) => problem.type === "error").length; assert.equal(errors, 6, "result should have 6 error type problems."); const warnings = result.filter( (problem) => problem.type === "warning", ).length; assert.equal(warnings, 2, "result should have 2 warning type problems."); // problem location assert.deepEqual( result[1], { startColumn: 14, endColumn: 21, lineNumber: 49, type: "error", message: "ERROR 22-322: Syntax error, expecting one of the following: (, ;.", }, "location is incorrect.", ); }); /* this test case handle below log snippet. the point is the problem index 200 occurred multiple times in on source code, but there is only one log message to indicate what 200 problem index means. In such case, the generated problem count will more than problem count in log case 2: 67 connect to &dbms as mydb (&CONNOPT); _ _ 22 79 200 200 WARNING: Apparent symbolic reference DBMS not resolved. 4 The SAS System 09:25 Monday, March 25, 2024 WARNING: Apparent symbolic reference CONNOPT not resolved. ERROR 22-322: Expecting a name. ERROR 79-322: Expecting a ). ERROR 200-322: The symbol is not recognized and will be ignored. NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements. */ it("parse the log in which an problem message is shared", () => { const [result] = parseLog(multipleSameProblemIndexAtOneLine, firstCodeLine); assert.equal(result.length, 43, "result should have 43 problems."); }); /* 87 data CUSTOMERS (label="Customer data for geocoding"); 88 infile datalines dlm=#' dlm=#' dlm=#; _ _ 24 24 24 24 ERROR 24-322: Variable name is not valid. ERROR 24-2: Invalid value for the DLM option. 89 length address $ 24 city $ 24 state $ 2; */ it("parse the log in which same problem index occurs at different positions in different lines", () => { const [result] = parseLog(case4, firstCodeLine); assert.equal(result.length, 20, "result should have 20 problems."); }); /* 118 proc sgscatter data=sashelp.iris(=(species="Virginica")); _ _ 22 22 200 ERROR 22-7: Invalid option name =. ERROR 22-322: Syntax error, expecting one of the following: ;, BACKCOLOR, DATA, DATACOLORS, DATACONTRASTCOLORS, DATALINEPATTERNS, DATASYMBOLS, DATTRMAP, DESCRIPTION, NOOPAQUE, NOSUBPIXEL, OPAQUE, PAD, RATTRMAP, SGANNO, SUBPIXEL, TMPLOUT, WALLCOLOR. ERROR 200-322: The symbol is not recognized and will be ignored. 118 ! proc sgscatter data=sashelp.iris(=(species="Virginica")); */ it("parse the log in which same problem index have different problem message", () => { const [result] = parseLog(case5, firstCodeLine); assert.equal(result.length, 4, "result should have 4 problems."); }); /* NOTE: 由于出错,SAS 系统停止处理该步。 11 proc hpclus data=sampsio.dmairis maxclusters=9 12 NOC=ABCB=10 minclusters=2 align=PCA criterion=FIRSTPEAK); _____ 1 22 200 WARNING 1-322: 假定符号 ABC 被错拼为 ABCB。 ERROR 22-322: 语法错误,期望下列之一: ;, (, DATA, DISTANCE, DISTANCEINT, DISTANCENOM, IMP, IMPUTE, IMPUTEINT, IMPUTENOM, INSEED, INSTAT, MAXC, MAXCLUSTERS, MAXITER, NOC, NOPRINT, OUTITER, OUTSTAT, SEED, STANDARDIZE, STOPCRITERION. ERROR 200-322: 该符号不可识别,将被忽略。 */ it("parse the log in which there is 1 indicator but 2 problem indexes", () => { const [result] = parseLog(case6, firstCodeLine); assert.equal(result.length, 3, "result should have 3 problems."); }); /* 50 proc optex seed=193030034 data=a; - 22 200 51 class Habitat; ----- 180 52 model Habitat Month c1-c4 s1-s3 / noint; ----- 180 53 generate n=12; -------- 180 ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, /, ;, _DATA_, _LAST_, _NULL_. ERROR 200-322: The symbol is not recognized and will be ignored. ERROR 180-322: Statement is not valid or it is used out of proper order. */ it("parse the long log", () => { const [result] = parseLog(case7_8, firstCodeLine); assert.equal(result.length, 11, "result should have 11 problems."); }); /* problems occur before user's source code. */ it("parse the log with case9", () => { const [result] = parseLog(case9, firstCodeLine); assert.equal(result.length, 2, "result should have 2 problems."); }); /* handle below case: same source code line appear many times with error on it. 22 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\SAS\GIT\GitHub\TestData\error_case_10.sas)); 23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2; _ 22 200 WARNING: Apparent symbolic reference DVTTESTDATA1 not resolved. 23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2; _ 22 ERROR 22-322: Expecting a name. ERROR 200-322: The symbol is not recognized and will be ignored. 23 proc sgplot data=&dvttestdata1 dattrmap=&dvttestdata2; _ 200 ERROR 200-322: The symbol is not recognized and will be ignored. ERROR: File WORK.DVTTESTDATA1.DATA does not exist. WARNING: Apparent symbolic reference DVTTESTDATA2 not resolved. ERROR: File WORK.DVTTESTDATA2.DATA does not exist. 24 scatter x=x y=x2 / group=y3 attrid=myid1; */ it("parse the log with case10", () => { const [result] = parseLog(case10, firstCodeLine); assert.equal(result.length, 11, "result should have 11 problems."); }); /* problems occur after user's source code */ it("parse the log with case11", () => { const [result] = parseLog(case11, firstCodeLine); assert.equal(result.length, 4, "result should have 4 problems."); }); }); ================================================ FILE: client/test/components/notebook/exporter.test.ts ================================================ import * as vscode from "vscode"; import * as assert from "assert"; import * as sinon from "sinon"; import { getTestFixtureContent, getUri, openNotebookDoc } from "../../utils"; describe("export notebook", () => { let writeFileFn: sinon.SinonSpy; let showQuickPickStub: sinon.SinonStub; let showSaveDialogStub: sinon.SinonStub; beforeEach(async () => { writeFileFn = sinon.spy(); await openNotebookDoc(getUri("sasnb_export.sasnb")); showQuickPickStub = sinon.stub(vscode.window, "showQuickPick"); showSaveDialogStub = sinon.stub(vscode.window, "showSaveDialog"); sinon.stub(vscode.workspace, "fs").get(() => ({ writeFile: writeFileFn, })); }); afterEach(() => { sinon.restore(); }); it("exports the sasnb to sas file correctly", async () => { const uri = vscode.Uri.file("/test.sas"); showQuickPickStub.resolves({ label: "SAS Code", description: "Export as SAS program file", format: "sas", extension: "sas", }); showSaveDialogStub.resolves(uri); await vscode.commands.executeCommand("SAS.notebook.export"); assert.strictEqual(writeFileFn.calledOnce, true); assert.strictEqual(writeFileFn.firstCall.args[0], uri); const sasContent = new TextDecoder().decode(writeFileFn.firstCall.args[1]); const expectedContent = new TextDecoder().decode( getTestFixtureContent("sasnb_export.sas"), ); assert.strictEqual(sasContent, expectedContent); }); it("cancels export when no format is selected", async () => { showQuickPickStub.resolves(undefined); await vscode.commands.executeCommand("SAS.notebook.export"); assert.strictEqual(writeFileFn.called, false); }); it("cancels export when no save location is selected", async () => { showQuickPickStub.resolves({ label: "SAS Code", description: "Export as SAS program file", format: "sas", extension: "sas", }); showSaveDialogStub.resolves(undefined); await vscode.commands.executeCommand("SAS.notebook.export"); assert.strictEqual(writeFileFn.called, false); }); }); ================================================ FILE: client/test/components/notebook/serializer.test.ts ================================================ import * as vscode from "vscode"; import * as assert from "assert"; import { NotebookSerializer } from "../../../src/components/notebook/Serializer"; const testCell = new vscode.NotebookCellData( vscode.NotebookCellKind.Code, "test", "sas", ); testCell.outputs = [ new vscode.NotebookCellOutput([ vscode.NotebookCellOutputItem.text("test", "application/test"), vscode.NotebookCellOutputItem.text("test1", "application/test1"), ]), ]; const testData = new vscode.NotebookData([ new vscode.NotebookCellData( vscode.NotebookCellKind.Markup, "test", "markdown", ), testCell, ]); const decoder = new TextDecoder(); describe("notebook serializer", () => { it("serialize/deserialize the data correctly", async () => { const serializer = new NotebookSerializer(); const serializedData = await serializer.serializeNotebook(testData); const newData = await serializer.serializeNotebook( await serializer.deserializeNotebook(serializedData), ); assert.equal( decoder.decode(newData), decoder.decode(serializedData), "The data don't match after serialize/deserialize", ); }); }); ================================================ FILE: client/test/components/profile/profile.test.ts ================================================ import { ConfigurationTarget, workspace } from "vscode"; import { assert, expect } from "chai"; import { AuthType, COMProfile, ConnectionType, EXTENSION_CONFIG_KEY, EXTENSION_DEFINE_PROFILES_CONFIG_KEY, ProfileConfig, ProfilePromptType, SSHProfile, ViyaProfile, getProfilePrompt, } from "../../../src/components/profile"; let testProfileName: string; let testProfileNewName: string; let profileConfig: ProfileConfig; let testProfileClientId; let testOverloadedProfile; let testEmptyProfile; let testEmptyItemsProfile; let testSSHProfile; let testCOMProfile; let legacyProfile; async function initProfile(): Promise { profileConfig = new ProfileConfig(); } describe("Profiles", async function () { before(async () => { await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, undefined, ConfigurationTarget.Global, ); testProfileClientId = { activeProfile: "", profiles: { testProfile: { endpoint: "https://test-host.sas.com", clientId: "sas.test", clientSecret: "", context: "SAS Studio context", connectionType: "rest", }, }, }; testEmptyProfile = { activeProfile: "", profiles: { testProfile: {}, }, }; testEmptyItemsProfile = { activeProfile: "", profiles: { testProfile: { endpoint: "", context: "", clientId: "", clientSecret: "", }, }, }; testOverloadedProfile = { activeProfile: "", profiles: { testProfile: { endpoint: "https://test-host.sas.com", clientId: "sas.test", clientSecret: "", context: "SAS Studio context", username: "sastest", tokenFile: "path/to/token.txt", connectionType: "rest", }, }, }; testSSHProfile = { activeProfile: "", profiles: { testProfile: { host: "host", username: "username", port: 22, sasPath: "sasPath", sasOptions: ["-nonews"], connectionType: "ssh", privateKeyFilePath: "/private/key/file/path", }, }, }; testCOMProfile = { activeProfile: "", profiles: { testProfile: { host: "host", sasOptions: [], ConnectionType: "com", }, }, }; legacyProfile = { activeProfile: "", profiles: { testSSHProfile: { host: "host", username: "username", port: 22, sasPath: "sasPath", sasOptions: ["-nonews"], connectionType: "ssh", }, testViyaProfile: { endpoint: "https://test-host.sas.com/", clientId: "sas.test", clientSecret: "", context: "SAS Studio context", username: "sastest", tokenFile: "path/to/token.txt", }, testProfile: { endpoint: "", context: "", clientId: "", clientSecret: "", }, }, }; }); afterEach(async () => { if (testProfileName) { testProfileName = ""; } if (testProfileNewName) { testProfileNewName = ""; } }); describe("Legacy Profile", async function () { beforeEach(async () => { await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, legacyProfile, ConfigurationTarget.Global, ); }); this.afterEach(async () => { await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, undefined, ConfigurationTarget.Global, ); }); it("adds connectionType to legacy profiles", async () => { await profileConfig.migrateLegacyProfiles(); const profiles = profileConfig.getAllProfiles(); expect(Object.keys(profiles).length).to.be.greaterThan(0); for (const key in profiles) { const profile = profiles[key]; if (profile.connectionType === undefined) { assert.fail(`Found undefined connectionType in profile named ${key}`); } } }); it("removes trailing slash from endpoint on legacy profiles", async () => { await profileConfig.migrateLegacyProfiles(); const profiles = profileConfig.getAllProfiles(); expect(Object.keys(profiles).length).to.be.greaterThan(0); for (const key in profiles) { const profile = profiles[key]; if ( profile.connectionType === ConnectionType.Rest && /\/$/.test(profile.endpoint) ) { assert.fail( `Found trailing slash in endpoint of profile named ${key}`, ); } } }); it("fails to validate missing connectionType", async () => { // Arrange const profileByName = profileConfig.getProfileByName("testViyaProfile"); // Act const validateProfile = await profileConfig.validateProfile({ name: testProfileName, profile: profileByName, }); // Assert expect(validateProfile.data).to.equal(undefined); expect(validateProfile.type).to.equal( AuthType.Error, "legacy profile did not return correct AuthType", ); expect(validateProfile.error).to.equal( "Missing connectionType in active profile.", "should return messing connectionType error", ); }); }); describe("No Profile", async function () { beforeEach(async () => { testProfileNewName = "testProfile"; initProfile(); }); describe("CRUD Operations", async function () { it("validate initial state", async function () { // Arrange // Act const profileLen = profileConfig.length(); // Verify expect(profileLen).to.equal(0, "No profiles should exist"); }); it("add a new viya profile", async function () { // Arrange // Act await profileConfig.upsertProfile(testProfileNewName, { connectionType: ConnectionType.Rest, endpoint: "https://test-host.sas.com", context: "SAS Studio context", }); const profiles = await profileConfig.listProfile(); // Assert expect(profiles).to.have.length( 1, "A single profile should be in the list", ); expect(profiles).to.include( testProfileNewName, `Profile ${testProfileName} should exist`, ); }); }); }); describe("ClientId/Secret Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; testProfileNewName = "testProfile2"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testProfileClientId, ConfigurationTarget.Global, ); }); describe("CRUD Operations", async function () { it("add a new profile", async function () { // Arrange // Act await profileConfig.upsertProfile(testProfileNewName, { endpoint: "https://test-host.sas.com", context: "SAS Studio context", connectionType: ConnectionType.Rest, }); const profilesList = await profileConfig.listProfile(); // Assert expect(profilesList).to.have.length( 2, "A second profile should be in the list", ); expect(profilesList).to.include( testProfileNewName, `Profile ${testProfileNewName} should exist`, ); expect(profilesList).to.include( testProfileName, `Profile ${testProfileName} should exist`, ); }); it("delete a profile", async function () { // Arrange // Act await profileConfig.deleteProfile(testProfileName); // Assert const profiles = await profileConfig.listProfile(); expect(profiles).to.have.length(0); }); it("list the expected profiles", async function () { // Arrange // Act const profileList = profileConfig.listProfile(); // Assert expect(profileList).to.eql( [testProfileName], "Expected profile name does not exist", ); }); it("get profile by name", async function () { // Arrange // Act const testProfile: ViyaProfile = profileConfig.getProfileByName(testProfileName); // Assert expect(testProfile.endpoint).to.equal( "https://test-host.sas.com", "Host is not matching", ); expect(testProfile.clientId).to.equal( "sas.test", "Client ID is not matching", ); expect(testProfile.clientSecret).to.equal( "", "Client Secret is not matching", ); expect(testProfile.context).to.equal( "SAS Studio context", "Compute Context is not matching", ); }); it("update single element of the profile", async function () { // Arrange let testProfile: ViyaProfile = profileConfig.getProfileByName(testProfileName); // Act // update profile manually testProfile.endpoint = "https://test2-host.sas.com"; await profileConfig.upsertProfile(testProfileName, testProfile); testProfile = profileConfig.getProfileByName(testProfileName); // Assert // validate host has changed and clientId and token is still empty expect(testProfile.endpoint).to.equal("https://test2-host.sas.com"); expect(testProfile.clientId).to.equal("sas.test"); expect(testProfile).to.not.have.any.keys("tokenFile"); }); }); describe("Validate Profile", async function () { it("set active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); // Assert const testProfile = profileConfig.getActiveProfile(); expect(testProfileName).to.equal( testProfile, "Active profile not successfully set", ); }); it("get active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); const activeProfileName = profileConfig.getActiveProfile(); const activeProfile: ViyaProfile = profileConfig.getProfileByName(activeProfileName); // Assert expect(activeProfileName).to.equal( testProfileName, "Active profile has not been set", ); expect(activeProfile.endpoint).to.equal( "https://test-host.sas.com", "Active profile endpoint not expected", ); }); it("validate client id/secret profile", async function () { // Arrange const profileByName = profileConfig.getProfileByName(testProfileName); // Act const validateProfile = await profileConfig.validateProfile({ name: testProfileName, profile: profileByName, }); // Assert expect(validateProfile.data).to.equal(undefined); expect(validateProfile.type).to.equal( AuthType.AuthCode, "client id/secret profile did not return correct AuthType", ); expect(validateProfile.error).to.equal( "", "client id/secret profile should not return error", ); }); }); }); describe("Empty File Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; testProfileNewName = "testProfile2"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testEmptyProfile, ConfigurationTarget.Global, ); }); describe("CRUD Operations", async function () { it("add a new profile", async function () { const newProfile: ViyaProfile = { endpoint: "https://test-host.sas.com", context: "SAS Studio context", connectionType: ConnectionType.Rest, }; // Arrange // Act await profileConfig.upsertProfile(testProfileNewName, newProfile); const profiles = profileConfig.listProfile(); // Assert expect(profiles).to.have.length( 2, "A second profile should be in the list", ); expect(profiles).to.include( testProfileNewName, `Profile ${testProfileName} should exist`, ); }); it("delete a profile", async function () { // Arrange // Act await profileConfig.deleteProfile(testProfileName); // Assert const profiles = profileConfig.listProfile(); expect(profiles).to.have.length(0); }); it("get profile by name", async function () { // Arrange // Act const testProfile: ViyaProfile = profileConfig.getProfileByName(testProfileName); // Assert expect(testProfile.endpoint).to.equal( undefined, "Host is not matching", ); expect(testProfile.context).to.equal( undefined, "Compute Context is not matching", ); }); it("list the expected profiles", async function () { // Arrange // Act const profileList = profileConfig.listProfile(); // Assert expect(profileList).to.eql( [testProfileName], "Expected profile name does not exist", ); }); it("update single element of the profile", async function () { // Arrange let testProfile: ViyaProfile = profileConfig.getProfileByName(testProfileName); // Act // update profile manually const newProfileSetting = testEmptyProfile; newProfileSetting.profiles[testProfileName].endpoint = "https://test2-host.sas.com"; await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, newProfileSetting, ConfigurationTarget.Global, ); // get profile after settings update testProfile = profileConfig.getProfileByName(testProfileName); // Assert // validate that endpoint was added expect(testProfile.endpoint).to.equal("https://test2-host.sas.com"); }); }); describe("Validate Profiles", async function () { it("validate no active profile when only name sent in", async function () { // Arrange // Act const validateProfile = await profileConfig.validateProfile({ name: testProfileName, profile: undefined, }); // Assert expect(validateProfile.data).to.equal(undefined); expect(validateProfile.type).to.equal( AuthType.Error, "No active profile did not return correct AuthType", ); expect(validateProfile.error).to.equal( "No Active Profile", "No active profile did not return error", ); }); it("get active profile when no profile active", async function () { // Arrange // Act const activeProfileName = profileConfig.getActiveProfile(); const activeProfile = profileConfig.getProfileByName(activeProfileName); // Assert expect(activeProfile).to.be.equal( undefined, "No active profile should be found", ); }); }); }); describe("Overloaded Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testOverloadedProfile, ConfigurationTarget.Global, ); }); describe("Validate Profiles", async function () { it("set active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); const activeProfile = profileConfig.getActiveProfile(); // Assert expect(activeProfile).to.equal( testProfileName, "Active profile not successfully set", ); }); it("get active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); const activeProfileName = profileConfig.getActiveProfile(); const activeProfile: ViyaProfile = profileConfig.getProfileByName(activeProfileName); // Assert expect(activeProfileName).to.equal( testProfileName, "Active profile has not been set", ); expect(activeProfile.endpoint).to.equal( "https://test-host.sas.com", "Active profile endpoint not expected", ); }); it("validate overloaded file profile", async function () { // Arrange const profileByName = profileConfig.getProfileByName(testProfileName); // Act const validateProfile = await profileConfig.validateProfile({ name: testProfileName, profile: profileByName, }); // Assert // Overloaded file should take authcode as precedence expect(validateProfile.data).to.equal(undefined); expect(validateProfile.type).to.equal( AuthType.AuthCode, "validate overloaded file profile did not return correct AuthType", ); expect(validateProfile.error).to.equal( "", "validate overloaded file profile should not return error", ); }); }); }); describe("SSH Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; testProfileNewName = "testProfile2"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testSSHProfile, ConfigurationTarget.Global, ); }); describe("CRUD Operations", async function () { it("add a new profile", async function () { const requestSSHProfile: SSHProfile = { connectionType: ConnectionType.SSH, host: "ssh.host", port: 22, sasOptions: ["-nonews"], saspath: "/sas/path", username: "username", privateKeyFilePath: "/private/key/file/path", }; // Arrange // Act await profileConfig.upsertProfile( testProfileNewName, requestSSHProfile, ); const profilesList = profileConfig.listProfile(); // Assert expect(profilesList).to.have.length( 2, "A second profile should be in the list", ); expect(profilesList).to.include( testProfileNewName, `Profile ${testProfileNewName} should exist`, ); expect(profilesList).to.include( testProfileName, `Profile ${testProfileName} should exist`, ); const addedProfile: SSHProfile = profileConfig.getProfileByName(testProfileNewName); expect(addedProfile).to.eql( requestSSHProfile, `Profile ${testProfileNewName} should have expected contents after creation`, ); }); it("delete a profile", async function () { // Arrange // Act await profileConfig.deleteProfile(testProfileName); // Assert const profiles = await profileConfig.listProfile(); expect(profiles).to.have.length(0); }); it("list the expected profiles", async function () { // Arrange // Act const profileList = profileConfig.listProfile(); // Assert expect(profileList).to.eql( [testProfileName], "Expected ssh profile name does not exist", ); }); }); }); describe("COM Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; testProfileNewName = "testProfile2"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testCOMProfile, ConfigurationTarget.Global, ); }); describe("CRUD Operations", async function () { it("add a new profile", async function () { const requestCOMProfile: COMProfile = { connectionType: ConnectionType.COM, host: "com.host", sasOptions: ["-nonews"], }; // Arrange // Act await profileConfig.upsertProfile( testProfileNewName, requestCOMProfile, ); const profilesList = profileConfig.listProfile(); // Assert expect(profilesList).to.have.length( 2, "A second profile should be in the list", ); expect(profilesList).to.include( testProfileNewName, `Profile ${testProfileNewName} should exist`, ); expect(profilesList).to.include( testProfileName, `Profile ${testProfileName} should exist`, ); const addedProfile: COMProfile = profileConfig.getProfileByName(testProfileNewName); expect(addedProfile).to.eql( requestCOMProfile, `Profile ${testProfileNewName} should have expected contents after creation`, ); }); it("delete a profile", async function () { // Arrange // Act await profileConfig.deleteProfile(testProfileName); // Assert const profiles = await profileConfig.listProfile(); expect(profiles).to.have.length(0); }); it("list the expected profiles", async function () { // Arrange // Act const profileList = profileConfig.listProfile(); // Assert expect(profileList).to.eql( [testProfileName], "Expected com profile name does not exist", ); }); }); }); describe("Empty Item Profile", async function () { beforeEach(async () => { testProfileName = "testProfile"; await initProfile(); await workspace .getConfiguration(EXTENSION_CONFIG_KEY) .update( EXTENSION_DEFINE_PROFILES_CONFIG_KEY, testEmptyItemsProfile, ConfigurationTarget.Global, ); }); describe("Validate Profiles", async function () { it("set active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); const testProfile = profileConfig.getActiveProfile(); // Assert expect(testProfile).to.equal( testProfileName, "Active profile not successfully set", ); }); it("get active profile", async function () { // Arrange // Act await profileConfig.updateActiveProfileSetting(testProfileName); const activeProfileName = profileConfig.getActiveProfile(); const activeProfile: ViyaProfile = profileConfig.getProfileByName(activeProfileName); // Assert expect(activeProfileName).to.equal( testProfileName, "Active profile has not been set", ); expect(activeProfile.endpoint).to.equal( "", "Active profile endpoint not expected", ); }); }); }); describe("Viya Input Prompts", async function () { it("Valid Profile Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.Profile); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "Switch Current SAS Profile", "Profile title does not match expected", ); expect(result.placeholder).to.equal( "Select a SAS connection profile", "Profile placeholder does not match expected", ); }); it("Valid New Profile Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.NewProfile); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "New SAS Connection Profile Name", "NewProfile title does not match expected", ); expect(result.placeholder).to.equal( "Enter connection name", "NewProfile placeholder does not match expected", ); }); it("Valid Endpoint Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.Endpoint); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "SAS Viya Server", "Endpoint title does not match expected", ); expect(result.placeholder).to.equal( "Enter the URL", "Endpoint placeholder does not match expected", ); }); it("Valid Compute Context Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.ComputeContext); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "SAS Compute Context", "ComputeContext title does not match expected", ); expect(result.placeholder).to.equal( "Enter the SAS compute context", "ComputeContext placeholder does not match expected", ); }); it("Valid Client Id Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.ClientId); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "Client ID", "ClientId title does not match expected", ); expect(result.placeholder).to.equal( "Enter a client ID", "ClientId placeholder does not match expected", ); }); it("Valid Client Secret Input", function () { // Arrange // Act const result = getProfilePrompt(ProfilePromptType.ClientSecret); // Assert expect(result).to.not.equal(undefined); expect(result.title).to.equal( "Client Secret", "ClientSecret title does not match expected", ); expect(result.placeholder).to.equal( "Enter a client secret", "ClientSecret placeholder does not match expected", ); }); }); describe("SSH Input Prompts", async function () { interface testCase { name: string; prompt: ProfilePromptType; wantTitle: string; wantPlaceHolder: string; wantDescription: string; } const testCases: testCase[] = [ { name: "Host", prompt: ProfilePromptType.Host, wantTitle: "SAS 9 Server", wantDescription: "Enter the name of the SAS 9 server.", wantPlaceHolder: "Enter the server name", }, { name: "SAS Path", prompt: ProfilePromptType.SASPath, wantTitle: "Server Path", wantDescription: "Enter the server path of the SAS Executable.", wantPlaceHolder: "Enter the server path", }, { name: "Port", prompt: ProfilePromptType.Port, wantTitle: "Port Number", wantDescription: "Enter a port number.", wantPlaceHolder: "Enter a port number", }, { name: "Username", prompt: ProfilePromptType.Username, wantTitle: "SAS Server Username", wantDescription: "Enter your SAS server username.", wantPlaceHolder: "Enter your username", }, { name: "Private Key File Path", prompt: ProfilePromptType.PrivateKeyFilePath, wantTitle: "Private Key File Path (optional)", wantDescription: "To use the SSH Agent or a password, leave blank.", wantPlaceHolder: "Enter the local private key file path", }, ]; testCases.forEach((testCase) => { it(`Valid ${testCase.name} Input`, function () { const foundPrompt = getProfilePrompt(testCase.prompt); expect(foundPrompt).to.not.equal(undefined); expect(foundPrompt.title).to.equal( testCase.wantTitle, `${testCase.name} title does not match expected`, ); expect(foundPrompt.placeholder).to.equal( testCase.wantPlaceHolder, `${testCase.name} placeholder does not match expected`, ); expect(foundPrompt.description).to.equal( testCase.wantDescription, `${testCase.name} description does not match expected`, ); }); }); }); }); ================================================ FILE: client/test/components/util/SASCodeDocument.test.ts ================================================ // Copyright © 2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import assert from "assert"; import { SASCodeDocument, SASCodeDocumentParameters, } from "../../../src/components/utils/SASCodeDocument"; describe("sas code document", () => { it("wrap python code", () => { const parameters: SASCodeDocumentParameters = { languageId: "python", code: `python code selected python code`, selectedCode: "", htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; proc python; submit; python code selected python code endsubmit; run; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal(sasCodeDoc.getWrappedCode(), expected); }); it("wrap r code", () => { const parameters: SASCodeDocumentParameters = { languageId: "r", code: `for (x in 1:6) { print(x) } print("test")`, selectedCode: "", htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; proc r; submit; for (x in 1:6) { print(x) } print("test") endsubmit; run; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal(sasCodeDoc.getWrappedCode(), expected); }); it("wrap sql code", () => { const parameters: SASCodeDocumentParameters = { languageId: "sql", code: `SELECT * FROM issues WHERE issue.developer = 'scnjdl'`, selectedCode: "", htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; proc sql; SELECT * FROM issues WHERE issue.developer = 'scnjdl' ;quit; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal(sasCodeDoc.getWrappedCode(), expected); }); it("wrap sas code", () => { const parameters: SASCodeDocumentParameters = { languageId: "sas", code: `proc sgplot data=sashelp.class; histogram age; run;`, selectedCode: "", uri: "file:///c%3A/SAS/GIT/GitHub/TestData/run.sas", fileName: "c:\\SAS\\GIT\\GitHub\\TestData\\run.sas", htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\SAS\\GIT\\GitHub\\TestData\\run.sas)); proc sgplot data=sashelp.class; histogram age; run; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal(sasCodeDoc.getWrappedCode(), expected); }); it("wrap sas code with correct windows style file path to &_SASPROGRAMFILE", () => { const parameters: SASCodeDocumentParameters = { languageId: "sas", code: "%put &=_SASPROGRAMFILE;", selectedCode: "", uri: "file:///c%3A/SAS/GIT/GitHub/TestData/run.sas", fileName: `c:\\temp\\My Test\\R&D\\mean(95%CI)\\Parkinson's Disease example.sas`, htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\temp\\My Test\\R&D\\mean%(95%CI%)\\Parkinson%'s Disease example.sas)); %put &=_SASPROGRAMFILE; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal( sasCodeDoc.getWrappedCode(), expected, "assign_SASProgramFile returned unexpected string", ); }); it("wrap sas code with correct unix style file path to &_SASPROGRAMFILE", () => { const parameters: SASCodeDocumentParameters = { languageId: "sas", code: "%put &=_SASPROGRAMFILE;", selectedCode: "", uri: "file:///c%3A/SAS/GIT/GitHub/TestData/run.sas", fileName: `/tmp/My Test/R&D/mean(95%CI)/Parkinson's Disease example.sas`, htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close; ods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; %let _SASPROGRAMFILE = %nrquote(%nrstr(/tmp/My Test/R&D/mean%(95%CI%)/Parkinson%'s Disease example.sas)); %put &=_SASPROGRAMFILE; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal( sasCodeDoc.getWrappedCode(), expected, "assign_SASProgramFile returned unexpected string", ); }); it("includes blank lines", () => { const parameters: SASCodeDocumentParameters = { languageId: "sas", code: `cas; caslib _all_ assign; data casuser.cascars; set sashelp.cars; run; proc casutil; load data=SASHELP.BASEBALL outcaslib="CASUSER" casout="CASBALL";run;`, selectedCode: "", uri: "file:///c%3A/SAS/GIT/GitHub/TestData/run.sas", fileName: `/tmp/My Test/R&D/mean(95%CI)/Parkinson's Disease example.sas`, htmlStyle: "Illuminate", outputHtml: true, uuid: "519058ad-d33b-4b5c-9d23-4cc8d6ffb163", checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const expected = `/** LOG_START_INDICATOR **/ title;footnote;ods _all_ close;\nods graphics on; ods html5(id=vscode) style=Illuminate options(bitmap_mode='inline' svg_mode='inline') body="519058ad-d33b-4b5c-9d23-4cc8d6ffb163.htm"; %let _SASPROGRAMFILE = %nrquote(%nrstr(/tmp/My Test/R&D/mean%(95%CI%)/Parkinson%'s Disease example.sas)); cas; caslib _all_ assign; data casuser.cascars; set sashelp.cars; run; proc casutil; load data=SASHELP.BASEBALL outcaslib="CASUSER" casout="CASBALL";run; ;*';*";*/;run;quit;ods html5(id=vscode) close; `; assert.equal( sasCodeDoc.getWrappedCode(), expected, "returns unexpected string", ); }); it("getProblemLocationInRawCode", async () => { const parameters: SASCodeDocumentParameters = { languageId: "sas", code: "\r\n\r\n/* I am comment */\r\noptions ls=72;\r\n\r\ndata pf70 pm70 pf80 pm80;\r\n\tinput state $ pop_f70 pop_m70 pop_f80 pop_m80 @@;\r\n\tdrop pop_m70 pop_f70 pop_m80 pop_f80;\r\n\tdecade= 70;\r\n\tsex= 'Female'\r\n\tpop= pop_f70; output pf70;\r\n\tsex= 'Male';\r\n\tpop= pop_m70; output pm70;\r\n\r\n\tdecade= 80;\r\n\tpop= pop_m80; output pm80;\r\n\tsex= 'Female';\r\n\tpop= pop_f80; output pf80;\r\n\tdecade= 70;\r\n\tsex= 'Female'\r\n\tpop= pop_f70; output pf70;\r\n\tsex= 'Male';\r\n\tpop= pop_m70; output pm70;\r\n\tdecade= 80;\r\n\tpop= pop_m80; output pm80;\r\n\tsex= 'Female';\r\n\tpop= pop_f80; output pf80;\r\n\tcards;\r\nALA 1.78 1.66 2.02 1.87 ALASKA 0.14 0.16 0.19 0.21\r\nARIZ 0.90 0.87 1.38 1.34 ARK 0.99 0.93 1.18 1.10\r\nCALIF 10.14 9.82 12.00 11.67 COLO 1.12 1.09 1.46 1.43\r\nCONN 1.56 1.47 1.61 1.50 DEL 0.28 0.27 0.31 0.29\r\nFLA 3.51 3.28 5.07 4.68 GA 2.36 2.23 2.82 2.64\r\nHAW 0.37 0.40 0.47 0.49 IDAHO 0.36 0.36 0.47 0.47\r\nILL 5.72 5.39 5.89 5.54 IND 2.66 2.53 2.82 2.67\r\nIOWA 1.45 1.37 1.50 1.41 KAN 1.15 1.02 1.21 1.16\r\nKY 1.64 1.58 1.87 1.79 LA 1.87 1.77 2.17 2.04\r\nME 0.51 0.48 0.58 0.55 MD 2.01 1.92 2.17 2.04\r\n\r\nMASS 2.97 2.72 3.01 2.73 MICH 4.53 4.39 4.75 4.52\r\nMINN 1.94 1.86 2.08 2.00 MISS 1.14 1.07 1.31 1.21\r\nMO 2.42 2.26 2.55 2.37 MONT 0.35 0.35 0.39 0.39\r\nNEB 0.76 0.72 0.80 0.77 NEV 0.24 0.25 0.40 0.41\r\nNH 0.38 0.36 0.47 0.45 NJ 3.70 3.47 3.83 3.53\r\nNM 0.52 0.50 0.66 0.64 NY 9.52 8.72 9.22 8.34\r\nNC 2.59 2.49 3.03 2.86 ND 0.31 0.31 0.32 0.33\r\nOHIO 5.49 5.16 5.58 5.22 OKLA 1.31 1.25 1.55 1.48\r\nORE 1.07 1.02 1.34 1.30 PA 6.13 5.67 6.18 5.68\r\nRI 0.48 0.46 0.50 0.45 SC 1.32 1.27 1.60 1.52\r\nSD 0.34 0.33 0.35 0.34 TENN 2.03 1.90 2.37 2.22\r\nTEXAS 5.72 5.48 7.23 7.00 UTAH 0.54 0.52 0.74 0.72\r\nVT 0.23 0.22 0.26 0.25 VA 2.35 2.30 2.73 2.62\r\nWASH 1.72 1.69 2.08 2.05 W.VA 0.90 0.84 1.00 0.95\r\nWIS 2.25 2.17 2.40 2.31 WYO 0.16 0.17 0.23 0.24\r\nXX . . . . YY . . . .\r\n;\r\n\r\ndata popstate;\r\n\tset pf70 pm70 pf80 pm80;\r\n\tlabel pop= 'Census Population In Millions';\r\ntitle 'The SAS System';\r\n\r\nproc univariate data=popstate freq plot normal;\r\n\tvar2 pop;\r\n\tid state;\r\n\tby decade sex;\r\n\toutput out= univout mean= popnmean median= popn50\r\n\t\tpctlpre= pop_ pctlpts= 50, 95 to 100 by 2.5;\r\n\r\nproc print data= univout;\r\n\ttitle 'Output Dataset From PROC UNIVARIATE';\r\n\tformat popn50 pop_50 pop_95 pop_97_5 pop_100 best8.;\r\n", selectedCode: "", uri: "file:///c%3A/SAS/GIT/GitHub/TestData/error_init.sas", fileName: `c:\\SAS\\GIT\\GitHub\\TestData\\error_init.sas`, htmlStyle: "Ignite", outputHtml: true, uuid: "6128b4fc-7337-4a2c-94ab-bdc592fcdf44", selections: [ { start: { line: 0, character: 0 }, end: { line: 72, character: 0 } }, ], checkKeyword: async () => false, }; const sasCodeDoc = new SASCodeDocument(parameters); const problem = { lineNumber: 72, startColumn: 2, endColumn: 57, message: "WARNING: Data set WORK.UNIVOUT was not replaced because new file is incomplete.", type: "warning", }; const problemLocationInRawCode = await sasCodeDoc.getLocationInRawCode( problem, codeLinesInLog, ); assert.equal(problemLocationInRawCode.lineNumber, 66); }); }); const codeLinesInLog = [ "1 /** LOG_START_INDICATOR **/", "2 title;footnote;ods _all_ close;", "3 ods graphics on;", "4 ods html5(id=vscode) style=Ignite options(bitmap_mode='inline' svg_mode='inline');", "5 %let _SASPROGRAMFILE = %nrquote(%nrstr(c:\\SAS\\Workspace\\SAS-EXTENSION\\TestData\\samples\\temp.sas));", "6 ", "7 ", "8 /* I am comment */", "9 options ls=72;", "10 ", "11 data pf70 pm70 pf80 pm80;", "12 input state $ pop_f70 pop_m70 pop_f80 pop_m80 @@;", "13 drop pop_m70 pop_f70 pop_m80 pop_f80;", "14 decade= 70;", "15 sex= 'Female'", "16 pop= pop_f70; output pf70;", "17 sex= 'Male';", "18 pop= pop_m70; output pm70;", "19 ", "20 decade= 80;", "21 pop= pop_m80; output pm80;", "22 sex= 'Female';", "23 pop= pop_f80; output pf80;", "24 decade= 70;", "25 sex= 'Female'", "26 pop= pop_f70; output pf70;", "27 sex= 'Male';", "28 pop= pop_m70; output pm70;", "29 decade= 80;", "30 pop= pop_m80; output pm80;", "31 sex= 'Female';", "32 pop= pop_f80; output pf80;", "33 cards;", "61 ;", "62 ", "63 data popstate;", "64 set pf70 pm70 pf80 pm80;", "65 label pop= 'Census Population In Millions';", "66 title 'The SAS System';", "67 ", "68 proc univariate data=popstate freq plot normal;", "69 var2 pop;", "70 id state;", "71 by decade sex;", "72 output out= univout mean= popnmean median= popn50", "73 pctlpre= pop_ pctlpts= 50, 95 to 100 by 2.5;", "74 ", "75 proc print data= univout;", "76 title 'Output Dataset From PROC UNIVARIATE';", "77 format popn50 pop_50 pop_95 pop_97_5 pop_100 best8.;", "78 ", `79 ;*';*";*/;run;`, "80 ", ]; ================================================ FILE: client/test/components/util/SASCodeDocumentHelper.test.ts ================================================ import * as vscode from "vscode"; import { assert } from "chai"; import sinon from "sinon"; import { profileConfig } from "../../../src/commands/profile"; import { ConnectionType } from "../../../src/components/profile"; import { getCodeDocumentConstructionParameters } from "../../../src/components/utils/SASCodeDocumentHelper"; describe("sas code document helper", () => { describe("getCodeDocumentConstructionParameters", () => { let getConfigurationStub: sinon.SinonStub; let colorThemeStub: sinon.SinonStub; let htmlStyle = "(auto)"; const htmlCustomStyle = { dark: "MyCustomDarkStyle" }; beforeEach(() => { getConfigurationStub = sinon.stub(vscode.workspace, "getConfiguration"); getConfigurationStub.withArgs("SAS").returns({ get: (key: string) => { if (key === "results.html.style") { return htmlStyle; } if (key === "results.html.custom.style") { return htmlCustomStyle; } return undefined; }, }); colorThemeStub = sinon .stub(vscode.window, "activeColorTheme") .value({ kind: vscode.ColorThemeKind.Dark }); profileConfig.getActiveProfileDetail = () => ({ name: "mock", profile: { connectionType: ConnectionType.Rest, endpoint: "http://example.com", }, }); }); afterEach(() => { getConfigurationStub.restore(); colorThemeStub.restore(); }); const mockTextDocument = { languageId: "sas", getText: function () { return "data _null_; run;"; }, uri: vscode.Uri.file("/fake/path/test.sas"), fileName: "/fake/path/test.sas", lineCount: 1, lineAt: function (lineOrPos: number | vscode.Position = 0) { const lineNumber = typeof lineOrPos === "number" ? lineOrPos : lineOrPos.line; return { lineNumber, text: "data _null_; run;", range: new vscode.Range(lineNumber, 0, lineNumber, 16), rangeIncludingLineBreak: new vscode.Range( lineNumber, 0, lineNumber, 17, ), firstNonWhitespaceCharacterIndex: 0, isEmptyOrWhitespace: false, }; }, isUntitled: false, version: 1, isDirty: false, isClosed: false, save: async () => true, eol: 1, offsetAt: () => 0, positionAt: () => new vscode.Position(0, 0), validateRange: (range: vscode.Range) => range, validatePosition: (pos: vscode.Position) => pos, getWordRangeAtPosition: () => undefined, }; it("should construct parameters with default values", () => { const params = getCodeDocumentConstructionParameters(mockTextDocument); assert.equal(params.languageId, "sas"); assert.equal(params.code, "data _null_; run;"); assert.equal( params.uri, vscode.Uri.file("/fake/path/test.sas").toString(), ); assert.equal(params.fileName, "/fake/path/test.sas"); }); it("should use custom style from results.html.custom.style for dark theme", () => { const params = getCodeDocumentConstructionParameters(mockTextDocument); // the custom style should be applied assert.equal(params.htmlStyle, "MyCustomDarkStyle"); }); it("should not use custom style from results.html.custom.style for dark theme when not defined", () => { htmlCustomStyle.dark = undefined; const params = getCodeDocumentConstructionParameters(mockTextDocument); // the default Ignite style should be used assert.equal(params.htmlStyle, "Ignite"); }); it("should use no style when results.html.style is '(server default)'", () => { htmlStyle = "(server default)"; const params = getCodeDocumentConstructionParameters(mockTextDocument); // no style should be applied assert.equal(params.htmlStyle, ""); }); it("should use results.html.style when results.html.style is neither '(auto)' nor '(server default)'", () => { htmlStyle = "HTMLBlue"; const params = getCodeDocumentConstructionParameters(mockTextDocument); // the results.html.style should be applied assert.equal(params.htmlStyle, "HTMLBlue"); }); }); }); ================================================ FILE: client/test/connection/itc/Coderunner.test.ts ================================================ import { expect } from "chai"; import sinon from "sinon"; import * as connection from "../../../src/connection"; import { runCode } from "../../../src/connection/itc/CodeRunner"; import { Session } from "../../../src/connection/session"; export class MockSession extends Session { protected _logFn; private _runMap: Record | undefined; public sasSystemLine = "The Sas System"; public set onSessionLogFn(logFn) { this._logFn = logFn; } public set onExecutionLogFn(logFn) { this._logFn = logFn; } public constructor(runMap?: Record) { super(); this._runMap = runMap; } protected async establishConnection(): Promise { return; } protected async _run(codeString: string): Promise { if (this._runMap) { const [, result] = Object.entries(this._runMap).find(([code]) => codeString.includes(code), ); if (result) { this._logFn( result.split("\n").map((line) => ({ line, type: "normal" })), ); return; } } this._logFn( codeString.split("\n").map((line) => ({ line, type: "normal" })), ); return {}; } protected _close(): void | Promise {} public sessionId?(): string { return ""; } } describe("CodeRunner tests", () => { let sessionStub; before(() => { sessionStub = sinon.stub(connection, "getSession"); sessionStub.returns(new MockSession()); }); after(() => { sessionStub.restore(); }); it("parses output between start tag and end tag", async () => { const codeString = ` // prefixed sas code Test Code // postfixed sas code `; const results = await runCode(codeString, "", ""); expect(results).to.equal("Test Code"); }); it("returns all output when no tags are specifed", async () => { const codeString = ` // prefixed sas code Test Code // postfixed sas code `; const results = await runCode(codeString); expect(results).to.equal( codeString .split("\n") .map((l) => l.trim()) .join(""), ); }); }); ================================================ FILE: client/test/connection/itc/ItcLibraryAdapter.test.ts ================================================ import { expect } from "chai"; import proxyquire from "proxyquire"; import sinon from "sinon"; import { LibraryItem, TableData, } from "../../../src/components/LibraryNavigator/types"; import * as connection from "../../../src/connection"; import { MockSession } from "./Coderunner.test"; const mockOutput = () => ({ "SELECT COUNT(1)": `1234`, }); class DatasetMockSession extends MockSession { private outputs: Array; private calls = 0; public constructor(outputs: Array) { super(); this.outputs = outputs; } protected async execute(): Promise { const output = `${this.outputs[this.calls]}`; this.calls += 1; this._logFn(output.split("\n").map((line) => ({ line, type: "normal" }))); } } describe("ItcLibraryAdapter tests", () => { let now; let clock; let sessionStub; let ItcLibraryAdapter; beforeEach(() => { now = new Date(); clock = sinon.useFakeTimers(now.getTime()); sessionStub = sinon.stub(connection, "getSession"); sessionStub.returns(new MockSession(mockOutput())); const codeRunner = proxyquire("../../../src/connection/itc/CodeRunner", { uuid: { v4: () => "mocked-uuid", }, }); ItcLibraryAdapter = proxyquire( "../../../src/connection/itc/ItcLibraryAdapter", { "./CodeRunner": codeRunner, }, ).default; }); afterEach(() => { clock.restore(); sessionStub.restore(); }); it("fetches columns", async () => { const item: LibraryItem = { uid: "test", type: "table", id: "test", name: "test", readOnly: true, }; const libraryAdapter = new ItcLibraryAdapter(); const expectedColumns = [ { name: "first", type: "char", format: "$8.", index: 1, }, { name: "date", type: "date", format: "YYMMDD10.", index: 2, }, ]; const mockOutput = JSON.stringify([ { index: 1, name: "first", type: "char", format: "$8." }, { index: 2, name: "date", type: "num", format: "YYMMDD10." }, ]); sessionStub.returns(new DatasetMockSession([mockOutput])); const response = await libraryAdapter.getColumns(item); expect(response.items).to.eql(expectedColumns); expect(response.count).to.equal(-1); }); it("loads libraries", async () => { const expectedLibraries: LibraryItem[] = [ { uid: "test1", id: "test1", name: "test1", type: "library", readOnly: true, }, { uid: "test2", id: "test2", name: "test2", type: "library", readOnly: false, }, ]; const mockOutput = JSON.stringify({ libraries: [ ["test1", "yes"], ["test2", "no"], ], count: 2, }); sessionStub.returns(new DatasetMockSession([mockOutput])); const libraryAdapter = new ItcLibraryAdapter(); const response = await libraryAdapter.getLibraries(); expect(response.items).to.eql(expectedLibraries); expect(response.count).to.equal(-1); }); it("loads table data", async () => { const item: LibraryItem = { uid: "test", type: "table", id: "test", name: "TEST", readOnly: true, }; const mockOutput = JSON.stringify({ rows: [ ["Peter", "Parker"], ["Tony", "Stark"], ], count: 1234, }); sessionStub.returns(new DatasetMockSession([mockOutput])); const libraryAdapter = new ItcLibraryAdapter(); const expectedTableData: TableData = { rows: [ { cells: ["1", "Peter", "Parker"] }, { cells: ["2", "Tony", "Stark"] }, ], count: 1234, }; const tableData = await libraryAdapter.getRows(item, 0, 100, []); expect(tableData).to.eql(expectedTableData); }); it("loads table data for csv output", async () => { const item: LibraryItem = { uid: "test", type: "table", id: "test", name: "TEST", readOnly: true, }; const mockOutputColumn = JSON.stringify([ { index: 1, name: "first", type: "char", format: "$8." }, { index: 2, name: "last", type: "num", format: "YYMMDD10." }, ]); const mockOutputData = JSON.stringify({ rows: [ ["Peter", "Parker"], ["Tony", "Stark"], ], count: 1234, }); sessionStub.returns( new DatasetMockSession([mockOutputColumn, mockOutputData]), ); const libraryAdapter = new ItcLibraryAdapter(); const expectedTableData: TableData = { rows: [ { columns: ["INDEX", "first", "last"] }, { cells: ["1", "Peter", "Parker"] }, { cells: ["2", "Tony", "Stark"] }, ], count: -1, }; const tableData = await libraryAdapter.getRowsAsCSV(item, 0, 100); expect(tableData).to.eql(expectedTableData); }); it("gets table row count", async () => { const item: LibraryItem = { uid: "test", type: "table", id: "test", name: "TEST", readOnly: true, }; const libraryAdapter = new ItcLibraryAdapter(); const response = await libraryAdapter.getTableRowCount(item); expect(response.rowCount).to.equal(1234); }); it("loads a list of tables", async () => { const library: LibraryItem = { uid: "lib", id: "lib", name: "lib", type: "library", readOnly: true, }; const mockOutput = JSON.stringify({ tables: ["test1", "test2"], count: 2, }); sessionStub.returns(new DatasetMockSession([mockOutput])); const expectedTables: LibraryItem[] = [ { library: "lib", uid: "lib.test1", id: "test1", name: "test1", type: "table", readOnly: true, }, { library: "lib", uid: "lib.test2", id: "test2", name: "test2", type: "table", readOnly: true, }, ]; const libraryAdapter = new ItcLibraryAdapter(); const response = await libraryAdapter.getTables(library); expect(response.items).to.eql(expectedTables); expect(response.count).to.equal(-1); }); }); ================================================ FILE: client/test/connection/itc/index.test.ts ================================================ import * as vscode from "vscode"; import { expect } from "chai"; import proc from "child_process"; import { unlinkSync, writeFileSync } from "fs"; import { join } from "path"; import { SinonSandbox, SinonStub, createSandbox } from "sinon"; import { stubInterface } from "ts-sinon"; import { v4 } from "uuid"; import { setContext } from "../../../src/components/ExtensionContext"; import { getSession } from "../../../src/connection/itc"; import * as scripts from "../../../src/connection/itc/script"; import { LineCodes, Tags } from "../../../src/connection/itc/script/env.json"; import { ITCProtocol } from "../../../src/connection/itc/types"; import { Session } from "../../../src/connection/session"; import { extensionContext } from "../../../src/node/extension"; describe("ITC connection", () => { let sandbox: SinonSandbox; let spawnStub: SinonStub; let stdoutStub: SinonStub; let stdoutWriteStub: SinonStub; let stderrStub: SinonStub; let stdinStub: SinonStub; let killStub: SinonStub; let endStub: SinonStub; let session: Session; let onDataCallback; beforeEach(() => { sandbox = createSandbox({}); // For these tests, we don't particularly care about the script // contents, but rather care about how our ts code interacts with // the script. sandbox.stub(scripts, "getScript"); spawnStub = sandbox.stub(proc, "spawn"); stdoutStub = sandbox.stub(); stdoutWriteStub = sandbox.stub(); stderrStub = sandbox.stub(); stdinStub = sandbox.stub(); endStub = sandbox.stub(); killStub = sandbox.stub(); spawnStub.returns({ stdout: { on: stdoutStub, write: stdoutWriteStub }, stderr: { on: stderrStub }, stdin: { write: stdinStub, end: endStub }, on: sandbox.stub(), kill: killStub, }); stdoutStub.callsFake((event, callback) => { if (event === "data") { //save off the callback to simulate stdout events onDataCallback = callback; } }); const config = { sasOptions: ["-PAGESIZE=MAX"], host: "localhost", }; const secretStore = stubInterface(); const stubbedExtensionContext: vscode.ExtensionContext = { ...extensionContext, globalStorageUri: vscode.Uri.from({ scheme: "file", path: __dirname }), secrets: secretStore, }; setContext(stubbedExtensionContext); session = getSession(config, ITCProtocol.COM); session.onExecutionLogFn = () => { return; }; }); afterEach(() => { sandbox.restore(); }); describe("setup", () => { afterEach(async () => { await session.close(); }); it("creates a well-formed local session", async () => { const setupPromise = session.setup(); onDataCallback(Buffer.from(`${Tags.WorkDirStartTag}`)); onDataCallback(Buffer.from(`/work/dir`)); onDataCallback(Buffer.from(`${Tags.WorkDirEndTag}`)); await setupPromise; expect( spawnStub.calledWith( "chcp 65001 >NUL & powershell.exe -NonInteractive -NoProfile -Command -", ), ).to.be.true; //using args here allows use of deep equal, that generates a concise diff in the test output on failures expect(stdinStub.args[1][0]).to.deep.equal( "$runner = New-Object -TypeName SASRunner\n", ); expect(stdinStub.args[2][0]).to.deep.equal( `$profileHost = "localhost"\n`, ); expect(stdinStub.args[3][0]).to.deep.equal(`$port = 0\n`); expect(stdinStub.args[4][0]).to.deep.equal(`$protocol = 0\n`); expect(stdinStub.args[5][0]).to.deep.equal(`$username = ""\n`); expect(stdinStub.args[6][0]).to.deep.equal(`$password = ""\n`); expect(stdinStub.args[7][0]).to.deep.equal(`$serverName = "ITC Local"\n`); expect(stdinStub.args[8][0]).to.deep.equal(`$displayLang = "en"\n`); expect(stdinStub.args[9][0]).to.deep.equal( "$runner.Setup($profileHost,$username,$password,$port,$protocol,$serverName,$displayLang)\n", ); expect(stdinStub.args[10][0]).to.deep.equal( "$runner.ResolveSystemVars()\n", ); expect(stdinStub.args[11][0]).to.deep.equal( `$sasOpts=@("-PAGESIZE=MAX")\n`, ); expect(stdinStub.args[12][0]).to.deep.equal( `$runner.SetOptions($sasOpts)\n`, ); }); }); describe("run", () => { const html5 = '
'; const htmlLocation = v4(); const tempHtmlPath = join(__dirname, `${htmlLocation}.htm`); beforeEach(async () => { writeFileSync(tempHtmlPath, html5); const setupPromise = session.setup(); onDataCallback(Buffer.from(`${Tags.WorkDirStartTag}`)); onDataCallback(Buffer.from(`/work/dir`)); onDataCallback(Buffer.from(`${Tags.WorkDirEndTag}`)); await setupPromise; }); afterEach(() => { try { unlinkSync(tempHtmlPath); } catch (e) { // Intentionally blank } }); it("calls run function from script", async () => { const runPromise = session.run( `ods html5(id=vscode);\nproc print data=sashelp.cars;\nrun;`, ); //simulate log message for body file onDataCallback(Buffer.from(`ods html5 body="${htmlLocation}.htm"`)); //simulate end of submission onDataCallback(Buffer.from(LineCodes.RunEndCode)); onDataCallback(Buffer.from(LineCodes.ResultsFetchedCode)); const runResult = await runPromise; expect(runResult.html5).to.equal(html5); expect(runResult.title).to.equal("Result"); expect(stdinStub.args[13][0]).to.deep.equal( `$code= @' ods html5(id=vscode) path="/work/dir" ; '@+[environment]::NewLine+@' proc print data=sashelp.cars; '@+[environment]::NewLine+@' run; '@+[environment]::NewLine+@' %put --vscode-sas-extension-submit-end--; '@ `, ); expect(stdinStub.args[14][0]).to.deep.equal(`$runner.Run($code)\n`); expect(stdinStub.args[15][0]).to.contain(`$outputFile = "${tempHtmlPath}" $runner.FetchResultsFile($filePath, $outputFile) `); }); }); describe("close", () => { beforeEach(async () => { const setupPromise = session.setup(); onDataCallback(Buffer.from(`${Tags.WorkDirStartTag}`)); onDataCallback(Buffer.from(`/work/dir`)); onDataCallback(Buffer.from(`${Tags.WorkDirEndTag}`)); await setupPromise; }); it("closes session gracefully", async () => { const closePromise = session.close(); //we have a lifecycle issue here that currently prevents proper use of expects. //the close method sets the child process to undefined which resets the stub state. //as a result, the spy call history gets lost. For now just make sure we didnt reject. await closePromise; }); }); }); ================================================ FILE: client/test/connection/itc/util.test.ts ================================================ import { expect } from "chai"; import { escapePowershellString } from "../../../src/connection/itc/util"; describe("ITC util test", () => { it("escapePowershellString - escapes powershell special characters", () => { const input = "P@$${}[]()\"'%{}rd"; const expectedOutput = "P@`$`$`{`}`[`]`(`)`\"`'`%`{`}rd"; expect(escapePowershellString(input)).to.equal(expectedOutput); }); }); ================================================ FILE: client/test/connection/rest/index.test.ts ================================================ // Copyright © 2022-2024, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { expect } from "chai"; import { SinonSandbox, createSandbox } from "sinon"; // Test the baseDirectory argument handling logic in isolation // This mirrors the logic from RestSession._run without requiring VS Code APIs interface RunArgs { baseDirectory?: string; } function processRunArgs(args: unknown[]): Record { const variables: Record = {}; // If baseDirectory is passed in, use it as a sas variable const runArgs = (args[0] as RunArgs) || {}; const basePath = runArgs.baseDirectory || undefined; if (basePath) { variables._SASPROGRAMDIR = basePath; } return variables; } describe("REST Session _run", () => { let sandbox: SinonSandbox; beforeEach(() => { sandbox = createSandbox({}); }); afterEach(() => { sandbox.restore(); }); describe("baseDirectory argument handling", () => { it("should set _SASPROGRAMDIR variable when baseDirectory is provided", () => { const baseDirectory = "/home/user/projects/sas"; const variables = processRunArgs([{ baseDirectory }]); expect(variables).to.deep.equal({ _SASPROGRAMDIR: baseDirectory, }); }); it("should not set _SASPROGRAMDIR variable when baseDirectory is not provided", () => { const variables = processRunArgs([]); expect(variables).to.deep.equal({}); }); it("should not set _SASPROGRAMDIR variable when args object is empty", () => { const variables = processRunArgs([{}]); expect(variables).to.deep.equal({}); }); it("should not set _SASPROGRAMDIR variable when baseDirectory is undefined", () => { const variables = processRunArgs([{ baseDirectory: undefined }]); expect(variables).to.deep.equal({}); }); it("should not set _SASPROGRAMDIR variable when baseDirectory is empty string", () => { const variables = processRunArgs([{ baseDirectory: "" }]); expect(variables).to.deep.equal({}); }); it("should handle Windows-style paths for baseDirectory", () => { const baseDirectory = "C:\\Users\\user\\projects\\sas"; const variables = processRunArgs([{ baseDirectory }]); expect(variables).to.deep.equal({ _SASPROGRAMDIR: baseDirectory, }); }); it("should handle Unix-style paths for baseDirectory", () => { const baseDirectory = "/usr/local/sas/programs"; const variables = processRunArgs([{ baseDirectory }]); expect(variables).to.deep.equal({ _SASPROGRAMDIR: baseDirectory, }); }); }); }); ================================================ FILE: client/test/connection/session.test.ts ================================================ import { expect } from "chai"; import * as sinon from "sinon"; import { RunResult } from "../../src/connection"; import { Session } from "../../src/connection/session"; class MockSession extends Session { constructor(protected readonly connectionMock: () => void) { super(); } protected async establishConnection(): Promise { return new Promise((resolve) => { setTimeout(() => { this.connectionMock(); resolve(); }, 100); }); } protected _run(code: string, ...args: any[]): Promise { throw new Error("Method not implemented."); } protected _close(): Promise | void {} sessionId?(): string | undefined { return; } } describe("Session test", () => { it("triggers establish connection only once", async () => { const mockConnectionFn = sinon.mock(); const mockSession = new MockSession(mockConnectionFn); const setupPromises: Promise[] = Array(10) .fill(true) .map(() => mockSession.setup()); // Wait for everything to wrap up await Promise.all(setupPromises); // We called setup 10 times, but we expect to have only called establishConnection // once. expect(mockConnectionFn.callCount).to.equal(1); }); }); ================================================ FILE: client/test/connection/ssh/auth.test.ts ================================================ import { expect } from "chai"; import * as fs from "fs"; import { KeyboardInteractiveAuthMethod, ParsedKey } from "ssh2"; import sinon, { stubInterface } from "ts-sinon"; import { AuthHandler, AuthPresenter, KeyParser, } from "../../../src/connection/ssh/auth"; describe("ssh connection auth handler", () => { let authHandler: AuthHandler; describe("sshAgentAuth", () => { beforeEach(() => { process.env.SSH_AUTH_SOCK = "socketPath"; }); it("pass socket path to the callback", async () => { const username = "username"; const socketPath = "socketPath"; const presenter = stubInterface(); authHandler = new AuthHandler(presenter); const agentPayload = authHandler.sshAgentAuth(username); expect(agentPayload).to.deep.equal({ type: "agent", agent: socketPath, username: username, }); }); }); describe("privateKeyAuth", () => { let sandbox: sinon.SinonSandbox; beforeEach(() => { sandbox = sinon.createSandbox(); }); afterEach(() => { sandbox.restore(); }); it("should pass the key contents and passphrase to the callback for an encrypted key", async () => { const username = "username"; const passphrase = "passphrase"; const privateKeyFilePath = "privateKeyFilePath"; const presenter = stubInterface(); const keyParser = stubInterface(); const key = stubInterface(); keyParser.parseKey .withArgs(privateKeyFilePath) .returns( new Error( "Encrypted private OpenSSH key detected, but no passphrase given", ), ); keyParser.parseKey.withArgs(privateKeyFilePath, passphrase).returns(key); presenter.presentPassphrasePrompt.resolves(passphrase); authHandler = new AuthHandler(presenter, keyParser); const pkPayload = await authHandler.privateKeyAuth( privateKeyFilePath, username, ); expect(pkPayload).to.deep.equal({ type: "publickey", key: key, passphrase: passphrase, username: username, }); }); it("should pass the key contents to the callback for an unencrypted key", async () => { const username = "username"; const privateKeyFilePath = "privateKeyFilePath"; sandbox .stub(fs, "readFileSync") .callsFake(() => Buffer.from("keyContents")); const presenter = stubInterface(); const keyParser = stubInterface(); const key = stubInterface(); keyParser.parseKey.returns(key); authHandler = new AuthHandler(presenter, keyParser); const pkPayload = await authHandler.privateKeyAuth( privateKeyFilePath, username, ); expect(pkPayload).to.deep.equal({ type: "publickey", key: key, username: username, }); }); }); describe("passwordAuth", () => { it("should pass the password to the callback", async () => { const username = "username"; const pw = "password"; const presenter = stubInterface(); presenter.presentPasswordPrompt.resolves(pw); authHandler = new AuthHandler(presenter); const pwPayload = await authHandler.passwordAuth(username); expect(pwPayload).to.deep.equal({ type: "password", password: pw, username: username, }); }); }); describe("keyboardAuth", () => { it("should present input prompts and pass the answers to the callback", async () => { const promptCbStub = (answers: string[]) => { expect(answers).to.deep.equal(["answer1", "answer2"]); }; const cb = (auth: KeyboardInteractiveAuthMethod) => { expect(auth.type).to.equal("keyboard-interactive"); expect(auth.username).to.equal("username"); auth.prompt( "name", "instruction", "lang", [{ prompt: "question1" }, { prompt: "question2" }], promptCbStub, ); }; const answers = ["answer1", "answer2"]; const presenter = stubInterface(); presenter.presentMultiplePrompts.resolves(answers); authHandler = new AuthHandler(presenter); const kbPayload = await authHandler.keyboardInteractiveAuth("username"); cb(kbPayload); }); }); }); ================================================ FILE: client/test/connection/ssh/index.test.ts ================================================ import { assert, expect } from "chai"; import * as sinon from "sinon"; import { Client, ClientChannel } from "ssh2"; import { StubbedInstance, stubInterface } from "ts-sinon"; import { SSHSession, getSession } from "../../../src/connection/ssh"; import { assertThrowsAsync } from "../../utils"; describe("ssh connection", () => { const seconds = 1000; let sandbox: sinon.SinonSandbox; let session: SSHSession; let streamOnStub; beforeEach(() => { sandbox = sinon.createSandbox({ useFakeTimers: { shouldClearNativeTimers: true }, }); sandbox.clock; const config = { host: "host", username: "username", port: 22, saspath: "/path/to/sas_u8", sasOptions: [], agentSocket: "/agent/socket", }; session = new SSHSession(config); session.onExecutionLogFn = () => { return; }; }); afterEach(() => { sandbox.restore(); sandbox.clock.restore(); }); describe("setup", () => { it("calls connect with correct params", async () => { const config = { host: "host", username: "username", port: 22, saspath: "/path/to/sas_u8", sasOptions: [], }; sandbox.stub(Client.prototype, "connect").callsFake(function () { this.emit("ready"); return undefined; }); sandbox.stub(Client.prototype, "shell").callsArgWithAsync(0, null, { on: (streamOnStub = sandbox.stub()), write: sandbox.stub(), }); sandbox.stub(Client.prototype, "end"); const sshStreamCloseStub = sandbox.stub(); streamOnStub.withArgs("close").callsArgWithAsync(1).returns({ close: sshStreamCloseStub, }); session = new SSHSession(config); streamOnStub.callsFake((event, callback) => { if (event === "data") { //simulate a question mark to resolve the promise callback("?"); } }); await session.setup(); }); it("rejects on connection error", async () => { const config = { host: "host", username: "username", port: 22, saspath: "/path/to/sas_u8", sasOptions: [], agentSocket: "/agent/socket", }; sandbox.stub(Client.prototype, "connect").callsFake(function () { this.emit("error", new Error("SSH Connection Failed")); return undefined; }); session = new SSHSession(config); await assertThrowsAsync(async () => { await session.setup(); }, "SSH Connection Failed"); }); it("rejects on shell error", async () => { const config = { host: "host", username: "username", port: 22, saspath: "/path/to/sas_u8", sasOptions: [], agentSocket: "/agent/socket", }; sandbox.stub(Client.prototype, "connect").callsFake(function () { this.emit("ready"); return undefined; }); sandbox.stub(Client.prototype, "shell").callsFake((cb) => { cb(new Error("Shell Connection Failed"), null); return this; }); session = new SSHSession(config); await assertThrowsAsync(async () => { await session.setup(); }, "Shell Connection Failed"); }); }); describe("run", () => { let streamStub: StubbedInstance; let onDataListener; const config = { host: "host", username: "username", port: 22, saspath: "/path/to/sas_u8", sasOptions: [], agentSocket: "/agent/socket", }; const session = new SSHSession(config); session.onExecutionLogFn = () => { return; }; beforeEach(() => { streamStub = stubInterface(); sandbox.stub(Client.prototype, "connect").callsFake(function () { this.emit("ready"); return undefined; }); sandbox.stub(Client.prototype, "shell").callsFake((callback) => { callback(null, streamStub); return this; }); streamStub.on.callsFake((event, callback) => { if (event === "data") { onDataListener = callback; //need to pass a "?" to the callback to resolve the promise here onDataListener("?"); return this; } }); }); afterEach(() => { streamStub = undefined; onDataListener = undefined; }); it("writes code input to stream", async () => { let onDataListener; streamStub.on.callsFake((event, callback) => { if (event === "data") { onDataListener = callback; //need to pass a "?" to the callback to resolve the promise here onDataListener("?"); return this; } }); try { await session.setup(); } catch (err) { const error: Error = err; assert.fail(error.message); } streamStub.write.callsFake((chunk, cb) => { if (chunk === "%put --vscode-sas-extension-submit-end--;\n") { if (cb) { cb(null); } if (onDataListener) { // send back end code to finish running onDataListener("--vscode-sas-extension-submit-end--\n"); } } return true; }); await session.run("test code").catch((err) => assert.fail(err)); expect(streamStub.write.calledWith("test code\n")).to.be.true; expect( streamStub.write.calledWith( "%put --vscode-sas-extension-submit-end--;\n", ), ).to.be.true; }); it("runs long-running code to completion", async () => { let onDataListener; streamStub.on.callsFake((event, callback) => { if (event === "data") { onDataListener = callback; //need to pass a "?" to the callback to resolve the promise here onDataListener("?"); return this; } }); try { await session.setup(); } catch (err) { const error: Error = err; assert.fail(error.message); } streamStub.write.callsFake((chunk, cb) => { if (chunk === "%put --vscode-sas-extension-submit-end--;\n") { if (cb) { cb(null); } if (onDataListener) { //here we define long running as a value that exceeds the timeout values set in the provider sandbox.clock.tick(50 * seconds); // send back end code to finish running onDataListener("--vscode-sas-extension-submit-end--\n"); } } return true; }); await session.run("test code").catch((err) => assert.fail(err)); }); }); describe("close", () => { let streamStub: StubbedInstance; let onDataListener; beforeEach(() => { streamStub = stubInterface(); sandbox.stub(Client.prototype, "connect").callsFake(function () { this.emit("ready"); return undefined; }); sandbox.stub(Client.prototype, "shell").callsFake((callback) => { callback(null, streamStub); return this; }); streamStub.on.callsFake((event, callback) => { if (event === "data") { onDataListener = callback; //need to pass a "?" to the callback to resolve the promise here onDataListener("?"); return this; } }); }); afterEach(() => { streamStub = undefined; onDataListener = undefined; }); it("writes closing commands to ssh session", async () => { streamStub.write.callsFake((chunk, cb) => { if (chunk === "%put --vscode-sas-extension-submit-end--;\n") { if (cb) { cb(null); } if (onDataListener) { //need to pass a "?" to the callback to resolve the promise here onDataListener("?"); } } return true; }); try { await session.setup(); await session.close(); } catch (err) { assert.fail(err); } expect(streamStub.write.calledWith("endsas;\n")).to.be.true; expect(streamStub.close.calledOnce).to.be.true; }); }); describe("getSession", () => { let config; beforeEach(() => { process.env.SSH_AUTH_SOCK = "val"; config = { host: "host", username: "username", saspath: "saspath", sasOptions: ["-nonews"], port: 22, }; }); afterEach(() => { delete process.env.SSH_AUTH_SOCK; }); it("builds a well-formed ssh session instance", () => { const session = getSession(config); expect(session).to.not.equal(undefined); }); }); }); ================================================ FILE: client/test/extension.test.ts ================================================ import * as vscode from "vscode"; import * as assert from "assert"; import { getUri, openDoc } from "./utils"; let docUri; describe("lsp", () => { before(async () => { docUri = getUri("SampleCode.sas"); await openDoc(docUri); }); it("provides completion items", async () => { // Executing the command `vscode.executeCompletionItemProvider` to simulate triggering completion const actualCompletionList: vscode.CompletionList = await vscode.commands.executeCommand( "vscode.executeCompletionItemProvider", docUri, new vscode.Position(0, 0), ); assert.ok(actualCompletionList.items.length > 0); }); it("provides hover", async () => { // Executing the command `vscode.executeHoverProvider` to simulate mouse hovering const [actualHover]: vscode.Hover[] = await vscode.commands.executeCommand( "vscode.executeHoverProvider", docUri, new vscode.Position(0, 0), ); assert.ok(actualHover.contents[0]); }); it("provides signature help", async () => { // Executing the command `vscode.executeSignatureHelpProvider` to simulate signature help const docUri2 = getUri("SampleCode2.sas"); await openDoc(docUri2); const actualSignatureHelp: vscode.SignatureHelp = await vscode.commands.executeCommand( "vscode.executeSignatureHelpProvider", docUri2, new vscode.Position(1, 10), "(", ); assert.ok(actualSignatureHelp.signatures.length > 0); }); it("provides document symbol", async () => { // Executing the command `vscode.executeDocumentSymbolProvider` to simulate outline const actualDocumentSymbol: vscode.DocumentSymbol[] = await vscode.commands.executeCommand( "vscode.executeDocumentSymbolProvider", docUri, ); assert.ok(actualDocumentSymbol.length > 0); }); }); ================================================ FILE: client/test/index.ts ================================================ import { glob } from "glob"; import Mocha from "mocha"; import path from "path"; export function run(): Promise { // Create the mocha test const mocha = new Mocha({ ui: "bdd", color: true, }); mocha.timeout(100000); const testsRoot = __dirname; const testFile = process.env.testFile; const pattern = testFile ? path.join(...testFile.replace(/\.ts$/, ".js").split(path.sep).slice(2)) : "**/**.test.js"; return new Promise((resolve, reject) => { try { const files = glob.sync(pattern, { cwd: testsRoot }).sort(); // Add files to the test suite files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); try { // Run the mocha test mocha.run((failures) => { if (failures > 0) { reject(new Error(`${failures} tests failed.`)); } else { resolve(); } }); } catch (err) { console.error(err); reject(err); } } catch (err) { return reject(err); } }); } ================================================ FILE: client/test/languageServer/formatter.test.ts ================================================ import * as vscode from "vscode"; import * as assert from "assert"; import { getTestFixtureContent, getUri, openDoc } from "../utils"; const expected = getTestFixtureContent("formatter/expected.sas").toString(); // Re-enable this test after https://github.com/microsoft/vscode/issues/277352 is deployed. describe.skip("Formatter tests", () => { it("formats sas code well", async () => { const docUri = getUri("formatter/unformatted.sas"); await openDoc(docUri); // Executing the command `vscode.executeFormatDocumentProvider` to simulate triggering format const edits: vscode.TextEdit[] = await vscode.commands.executeCommand( "vscode.executeFormatDocumentProvider", docUri, {}, ); const edit = new vscode.WorkspaceEdit(); edit.set(docUri, edits); await vscode.workspace.applyEdit(edit); assert.strictEqual( vscode.window.activeTextEditor.document.getText().replace(/\r\n/g, "\n"), expected, ); }); }); ================================================ FILE: client/test/runTest.ts ================================================ import { runTests } from "@vscode/test-electron"; import * as path from "path"; async function main() { try { // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` const extensionDevelopmentPath = path.resolve(__dirname, "../../../"); // The path to test runner // Passed to --extensionTestsPath const extensionTestsPath = path.resolve(__dirname, "./index"); // Download VS Code, unzip it and run the integration test await runTests({ extensionDevelopmentPath, extensionTestsPath, launchArgs: ["--disable-extensions", "--locale en-US"], }); } catch (err) { console.error("Failed to run tests"); process.exit(1); } } main(); ================================================ FILE: client/test/store/log/actions.test.ts ================================================ import { expect } from "chai"; import { useLogStore } from "../../../src/store"; import { initialState } from "../../../src/store/log/initialState"; describe("log actions", () => { beforeEach(() => { useLogStore.setState(initialState); }); it("unsetProducedExecutionOutput", () => { useLogStore.getState().setProducedExecutionLogOutput(false); expect(useLogStore.getState().producedExecutionOutput).to.be.false; }); }); ================================================ FILE: client/test/store/run/actions.test.ts ================================================ import { expect } from "chai"; import { useRunStore } from "../../../src/store"; import { RunState, initialState } from "../../../src/store/run/initialState"; describe("run actions", () => { beforeEach(() => { useRunStore.setState(initialState); }); it("setIsExecutingCode", () => { const { setIsExecutingCode } = useRunStore.getState(); const expectedState: RunState = { isExecutingCode: true, isUserExecuting: true, }; setIsExecutingCode(true); expect(useRunStore.getState()).to.deep.include(expectedState); }); }); ================================================ FILE: client/test/utils.ts ================================================ import * as vscode from "vscode"; import { assert } from "chai"; import { readFileSync } from "fs"; import * as path from "path"; export function getUri(name: string): vscode.Uri { return vscode.Uri.file(path.resolve(__dirname, "../../testFixture", name)); } export async function openDoc(docUri: vscode.Uri): Promise { const doc = await vscode.workspace.openTextDocument(docUri); await vscode.window.showTextDocument(doc); await sleep(5000); // Wait for server activation } export async function openNotebookDoc(docUri: vscode.Uri): Promise { const doc = await vscode.workspace.openNotebookDocument(docUri); await vscode.window.showNotebookDocument(doc); } async function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } export function getTestFixtureContent(name: string): Buffer { return readFileSync(path.resolve(__dirname, "../../testFixture", name)); } export const assertThrowsAsync = async (fn, expectedMsg?: string) => { try { await fn(); } catch (err) { if (expectedMsg) { const typedError: Error = err; assert.include( typedError.message, expectedMsg, "Expected Message not found in returned error message", ); } return; } assert.fail("function was expected to throw, but did not"); }; ================================================ FILE: client/testFixture/SampleCode.sas ================================================ options ls=72; data pf70 pm70 pf80 pm80; input state $ pop_f70 pop_m70 pop_f80 pop_m80 @@; drop pop_m70 pop_f70 pop_m80 pop_f80; decade= 70; sex= 'Female'; pop= pop_f70; output pf70; sex= 'Male'; pop= pop_m70; output pm70; decade= 80; pop= pop_m80; output pm80; sex= 'Female'; pop= pop_f80; output pf80; cards; ALA 1.78 1.66 2.02 1.87 ALASKA 0.14 0.16 0.19 0.21 ARIZ 0.90 0.87 1.38 1.34 ARK 0.99 0.93 1.18 1.10 CALIF 10.14 9.82 12.00 11.67 COLO 1.12 1.09 1.46 1.43 CONN 1.56 1.47 1.61 1.50 DEL 0.28 0.27 0.31 0.29 FLA 3.51 3.28 5.07 4.68 GA 2.36 2.23 2.82 2.64 HAW 0.37 0.40 0.47 0.49 IDAHO 0.36 0.36 0.47 0.47 ILL 5.72 5.39 5.89 5.54 IND 2.66 2.53 2.82 2.67 IOWA 1.45 1.37 1.50 1.41 KAN 1.15 1.02 1.21 1.16 KY 1.64 1.58 1.87 1.79 LA 1.87 1.77 2.17 2.04 ME 0.51 0.48 0.58 0.55 MD 2.01 1.92 2.17 2.04 MASS 2.97 2.72 3.01 2.73 MICH 4.53 4.39 4.75 4.52 MINN 1.94 1.86 2.08 2.00 MISS 1.14 1.07 1.31 1.21 MO 2.42 2.26 2.55 2.37 MONT 0.35 0.35 0.39 0.39 NEB 0.76 0.72 0.80 0.77 NEV 0.24 0.25 0.40 0.41 NH 0.38 0.36 0.47 0.45 NJ 3.70 3.47 3.83 3.53 NM 0.52 0.50 0.66 0.64 NY 9.52 8.72 9.22 8.34 NC 2.59 2.49 3.03 2.86 ND 0.31 0.31 0.32 0.33 OHIO 5.49 5.16 5.58 5.22 OKLA 1.31 1.25 1.55 1.48 ORE 1.07 1.02 1.34 1.30 PA 6.13 5.67 6.18 5.68 RI 0.48 0.46 0.50 0.45 SC 1.32 1.27 1.60 1.52 SD 0.34 0.33 0.35 0.34 TENN 2.03 1.90 2.37 2.22 TEXAS 5.72 5.48 7.23 7.00 UTAH 0.54 0.52 0.74 0.72 VT 0.23 0.22 0.26 0.25 VA 2.35 2.30 2.73 2.62 WASH 1.72 1.69 2.08 2.05 W.VA 0.90 0.84 1.00 0.95 WIS 2.25 2.17 2.40 2.31 WYO 0.16 0.17 0.23 0.24 XX . . . . YY . . . . ; data popstate; set pf70 pm70 pf80 pm80; label pop= 'Census Population In Millions'; title 'The SAS System'; proc univariate data=popstate freq plot normal; var pop; id state; by decade sex; output out= univout mean= popnmean median= popn50 pctlpre= pop_ pctlpts= 50, 95 to 100 by 2.5; proc print data= univout; title 'Output Dataset From PROC UNIVARIATE'; format popn50 pop_50 pop_95 pop_97_5 pop_100 best8.; ================================================ FILE: client/testFixture/SampleCode2.sas ================================================ proc iml; FF = FINV(0.05/32,2,29); print FF; quit; ================================================ FILE: client/testFixture/TestFolder/SampleCode1.sas ================================================ proc print data=sashelp.air; ================================================ FILE: client/testFixture/TestFolder/TestSubFolder/SampleCode2.sas ================================================ proc print data=sashelp.aarfm; ================================================ FILE: client/testFixture/formatter/expected.sas ================================================ options ls=72; %let a=%nrquote(%nrstr(test%'s message;)); data _null_; input name=$ / 1-8 $10. @ @15 @@ @(b*3) @weekday #2 +5 4. ? ?? name=$ / 1-8 $10. @ @15 @@ @(b*3) @weekday #2 +5 4. ? ??; cards; 1 AA 2 3 BB 4 ; data a; cards4; 1 AA 2 3 BB 4 ;;;; datalines4; 1 AA 2 3 BB 4 ;;;; title 'a'; title 'a'; /* leading comment */ proc catalog; contents out=a; /* trailing comment */ run; copy out=a; run; quit; data new; date='06MAY98'; month=substr(date, 3, 3); year=substr(date, 6, 2); put month= year=; run; proc python terminate; submit; #Reference to variable defined in previous PROC PYTHON call print("x = " + x) def my_function(): print("Inside the proc step") endsubmit; run; proc r; submit; # Reference to variable defined in previous PROC R call print(paste("x =", x)) my_function <- function() { print("Inside the proc step") } endsubmit; run; proc lua; submit; local dsid = sas.open("sashelp.company") -- open for input -- Iterate over the variables in the data set for var in sas.vars(dsid) do vars[var.name:lower()] = var end sas.close(dsid) endsubmit; run; proc template; define statgraph barline; begingraph; entrytitle "Overlay of REFERENCELINE, BARCHARTPARM and SERIESPLOT"; layout overlay; referenceline y=25000000 / curvelabel="Target"; barchartparm category=year response=retail / dataskin=matte fillattrs=(transparency=0.5) fillpatternattrs=(pattern=R1 color=lightgray); seriesplot x=year y=profit / name="series"; discretelegend "series"; endlayout; endgraph; end; run; proc ds2 libs=work; data _null_; method init(); dcl varchar(16) str; str='Hello World!'; put str; end; enddata; run; quit; %macro reportit(request); %if %upcase(&request)=STAT %then %do; proc means; title "Summary of All Numeric Variables"; run; %end; %else %if %upcase(&request)=PRINTIT %then %do; proc print; title "Listing of Data"; run; %end; %else %put Incorrect report type. Please try again.; title; %mend reportit; *region; %macro; *region; data _null_; *region; /** a block comment * additional comment line */ do i=2 to 20 by 2 until((x/3)>y); mylabel: do x=1, 2, 3 while (x=2); a=0; end; end; *endregion; *endregion; %mend; *endregion; %test proc python; interactive; fruits = ["apple", "banana", "cherry"] for x in fruits: print(x) print('first statement after for loop') endinteractive; run; proc r; submit; fruits <- c("apple", "banana", "cherry") for (x in fruits) { print(x) } print('first statement after for loop') endsubmit; run; proc lua; submit; local rc local code = [[ data sample; set answer; where CCUID = @ccuid@; y = @subValue@; run; ]] rc = sas.submit(code, {ccuid="67", subValue=72}) endsubmit; run; proc lua; submit; if (sas.exists("work.homes")) then local t = sas.read_ds("work.homes") i=1 while(t[i] ~= nil) do print("Obs #" .. i) for k,v in pairs(t[i]) do print(k,v) end print("\n") i = i+1 end end endsubmit; run; proc python; /* comment */ i; print('hello') endinteractive; /* comment */ run; proc format library=library; /* region format-ignore */ invalue evaluation 'O'=4 'S'=3 'E'=2 'C'=1 'N'=0; /* endregion */ run; ================================================ FILE: client/testFixture/formatter/unformatted.sas ================================================ options ls=72; %let a= %nrquote(%nrstr(test%'s message;)); data _null_;input name= $ / 1-8 $10. @ @15 @@ @(b*3) @weekday #2 +5 4. ? ?? name= $ / 1-8 $10. @ @15 @@ @(b*3) @weekday #2 +5 4. ? ??; cards; 1 AA 2 3 BB 4 ; data a; cards4; 1 AA 2 3 BB 4 ;;;; datalines4; 1 AA 2 3 BB 4 ;;;; title 'a'; title 'a'; /* leading comment */ proc catalog; contents out=a; /* trailing comment */ run; copy out=a; run; quit; data new; date = '06MAY98'; month= substr(date, 3, 3); year =substr(date, 6, 2); put month= year=; run; proc python terminate; submit; #Reference to variable defined in previous PROC PYTHON call print("x = " + x) def my_function(): print("Inside the proc step") endsubmit; run; proc r; submit; # Reference to variable defined in previous PROC R call print(paste("x =", x)) my_function <- function() { print("Inside the proc step") } endsubmit; run; proc lua; submit; local dsid = sas.open("sashelp.company") -- open for input -- Iterate over the variables in the data set for var in sas.vars(dsid) do vars[var.name:lower()] = var end sas.close(dsid) endsubmit; run; proc template; define statgraph barline; begingraph; entrytitle "Overlay of REFERENCELINE, BARCHARTPARM and SERIESPLOT"; layout overlay; referenceline y=25000000 / curvelabel="Target"; barchartparm category=year response=retail / dataskin=matte fillattrs=(transparency=0.5) fillpatternattrs=(pattern=R1 color=lightgray); seriesplot x=year y=profit / name="series"; discretelegend "series"; endlayout; endgraph; end; run; proc ds2 libs=work; data _null_; method init(); dcl varchar(16) str; str = 'Hello World!'; put str; end; enddata; run; quit; %macro reportit(request); %if %upcase(&request)=STAT %then %do; proc means; title "Summary of All Numeric Variables"; run; %end; %else %if %upcase(&request)=PRINTIT %then %do; proc print; title "Listing of Data"; run; %end; %else %put Incorrect report type. Please try again.; title; %mend reportit; *region; %macro; *region; data _null_; *region; /** a block comment * additional comment line */ do i=2 to 20 by 2 until((x/3)>y); mylabel: do x=1, 2, 3 while (x=2); a=0; end; end; *endregion; *endregion; %mend; *endregion; %test proc python; interactive; fruits = ["apple", "banana", "cherry"] for x in fruits: print(x) print('first statement after for loop') endinteractive; run; proc r; submit; fruits <- c("apple", "banana", "cherry") for (x in fruits) { print(x) } print('first statement after for loop') endsubmit; run; proc lua; submit; local rc local code = [[ data sample; set answer; where CCUID = @ccuid@; y = @subValue@; run; ]] rc = sas.submit(code, {ccuid="67", subValue=72}) endsubmit; run; proc lua; submit; if (sas.exists("work.homes")) then local t = sas.read_ds("work.homes") i=1 while(t[i] ~= nil) do print("Obs #" .. i) for k,v in pairs(t[i]) do print(k,v) end print("\n") i = i+1 end end endsubmit; run; proc python; /* comment */ i; print('hello') endinteractive; /* comment */ run; proc format library=library; /* region format-ignore */ invalue evaluation 'O'=4 'S'=3 'E'=2 'C'=1 'N'=0; /* endregion */ run; ================================================ FILE: client/testFixture/keyContent.txt ================================================ -----BEGIN EC PRIVATE KEY----- MHcCAQEEICC/c7CdkJ77uAbVTbySFZoQAE06MMn/DnAMwn47IEj0oAoGCCqGSM49 AwEHoUQDQgAEMZhIWuZ1G0yl6ZBYjlhPz2KBV0QG/W4rtMiTimfflFh6v4QOmFqi 3V1bpb+aMETqJzZDNfuH66549cLzRw1rzw== -----END EC PRIVATE KEY----- ================================================ FILE: client/testFixture/sasnb_export.sas ================================================ /* # Notebook to SAS Test */ /* ## Python Code This is some Python code */ /* This is a separate note in **Markdown** format. */ proc python; submit; a, b = 4, 2 print("Result: ", a*10 + b) endsubmit; run; /* ## R Code This is some R code */ /* This is a separate note in **Markdown** format. */ proc r; submit; die <- 1:6 paste("Die Maths: ", die[3]*4 + die[6]) endsubmit; run; /* ## SAS Code */ data work.prdsale; set sashelp.PRDSALE; run; proc means data=work.prdsale; run; /* ## SQL Code */ proc sql; CREATE TABLE WORK.QUERY_PRDSALE AS SELECT (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10., (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL FROM WORK.PRDSALE t1 GROUP BY t1.COUNTRY; quit; /* A last comment in Markdown at the end of the document */ /* */ ================================================ FILE: client/testFixture/sasnb_export.sasnb ================================================ [{"kind":1,"language":"markdown","value":"# Notebook to SAS Test","outputs":[]},{"kind":1,"language":"markdown","value":"## Python Code\n\nThis is some Python code","outputs":[]},{"kind":1,"language":"markdown","value":"This is a separate note in **Markdown** format.","outputs":[]},{"kind":2,"language":"python","value":"a, b = 4, 2\nprint(\"Result: \", a*10 + b)","outputs":[{"items":[{"data":"[\n\t{\n\t\t\"line\": \"14 /** LOG_START_INDICATOR **/\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"15 title;footnote;ods _all_ close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"16 ods graphics on;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"17 ods html5(id=vscode) style=Ignite options(bitmap_mode='inline' svg_mode='inline');\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5(VSCODE) Body file: sashtml1.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"18 %let _SASPROGRAMFILE = %nrquote(%nrstr(/Users/elreid/personalGit/vscode-sas-extension/client/testFixture/sasnb_export.sasnb));\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"19 proc python;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"20 submit\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Python initialized.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"Python 3.11.10 (main, Nov 30 2025, 14:30:37) [GCC 11.5.0 20240719 (Red Hat 11.5.0-11)] on linux\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"Type \\\"help\\\", \\\"copyright\\\", \\\"credits\\\" or \\\"license\\\" for more information.\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>>\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>> \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"20 ! ;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"21 a, b = 4, 2\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"22 print(\\\"Result: \\\", a*10 + b)\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"23 endsubmit;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"24 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>>\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"Result: 42\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>> \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE PYTHON used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 1.99 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.08 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"25 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"26 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"## R Code\n\nThis is some R code","outputs":[]},{"kind":1,"language":"markdown","value":"This is a separate note in **Markdown** format.","outputs":[]},{"kind":2,"language":"r","value":"die <- 1:6\npaste(\"Die Maths: \", die[3]*4 + die[6])","outputs":[{"items":[{"data":"[\n\t{\n\t\t\"line\": \"1 /** LOG_START_INDICATOR **/\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"2 title;footnote;ods _all_ close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"3 ods graphics on;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"4 ods html5(id=vscode) style=Ignite options(bitmap_mode='inline' svg_mode='inline');\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5(VSCODE) Body file: sashtml.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"5 %let _SASPROGRAMFILE = %nrquote(%nrstr(/Users/elreid/personalGit/vscode-sas-extension/client/testFixture/sasnb_export.sasnb));\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"ERROR: UNABLE TO ACCESS MESSAGE 1187.7\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"6 proc r;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"7 submit\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] env R_LIBS_USER= /vol/bigdisk/lax/elreid/R/x86_64-pc-linux-gnu-library/4.3 \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] .libPaths= /opt/sas/viya/home/sas-pyconfig/R-4.3.3.1766327103/lib64/R/library \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] loaded SAS package\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] class(SAS)= classGeneratorFunction \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] invoking constructor on port 47961 \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] constructor returned\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[RLANG] sas assigned to global, exists= TRUE \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"7 ! ;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"8 die <- 1:6\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"9 paste(\\\"Die Maths: \\\", die[3]*4 + die[6])\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"10 endsubmit;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"11 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"[1] \\\"Die Maths: 18\\\"\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE R used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 3.60 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.07 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"2 The SAS System Tuesday, 23 December 2025 15:16:00\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"12 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"13 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"## SAS Code","outputs":[]},{"kind":2,"language":"sas","value":"data work.prdsale;\n\tset sashelp.PRDSALE;\nrun;\n\nproc means data=work.prdsale;\nrun;","outputs":[{"items":[{"data":"\n\n\n\n\nSAS Output\n\n\n\n
\n
\n

The MEANS Procedure

\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableLabelNMeanStd DevMinimumMaximum
\n
\n
ACTUAL
\n
PREDICT
\n
QUARTER
\n
YEAR
\n
MONTH
\n
\n
\n
\n
Actual Sales
\n
Predicted Sales
\n
Quarter
\n
Year
\n
Month
\n
\n
\n
\n
1440
\n
1440
\n
1440
\n
1440
\n
1440
\n
\n
\n
\n
507.1784722
\n
490.4826389
\n
2.5000000
\n
1993.50
\n
12403.00
\n
\n
\n
\n
287.0313065
\n
285.7667904
\n
1.1184224
\n
0.5001737
\n
210.6291578
\n
\n
\n
\n
3.0000000
\n
0
\n
1.0000000
\n
1993.00
\n
12054.00
\n
\n
\n
\n
1000.00
\n
1000.00
\n
4.0000000
\n
1994.00
\n
12753.00
\n
\n
\n
\n
\n\n\n","mime":"application/vnd.sas.ods.html5"},{"data":"[\n\t{\n\t\t\"line\": \"40 /** LOG_START_INDICATOR **/\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"3 The SAS System Friday, 5 December 2025 14:39:00\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"41 title;footnote;ods _all_ close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"42 ods graphics on;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"43 ods html5(id=vscode) style=Ignite options(bitmap_mode='inline' svg_mode='inline');\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5(VSCODE) Body file: sashtml3.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"44 %let _SASPROGRAMFILE = %nrquote(%nrstr(/Users/elreid/personalGit/vscode-sas-extension/client/testFixture/sasnb_export.sasnb));\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"45 data work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"46 \\tset sashelp.PRDSALE;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"47 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set SASHELP.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: The data set WORK.PRDSALE has 1440 observations and 10 variables.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: DATA statement used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.02 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"48 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"49 proc means data=work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"50 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set WORK.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE MEANS used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.05 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.05 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"51 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"52 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"## SQL Code","outputs":[]},{"kind":2,"language":"sql","value":"CREATE TABLE WORK.QUERY_PRDSALE AS\n SELECT\n (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\n (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\n FROM\n WORK.PRDSALE t1\n GROUP BY\n t1.COUNTRY","outputs":[{"items":[{"data":"[\n\t{\n\t\t\"line\": \"53 /** LOG_START_INDICATOR **/\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"54 title;footnote;ods _all_ close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"55 ods graphics on;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"56 ods html5(id=vscode) style=Ignite options(bitmap_mode='inline' svg_mode='inline');\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5(VSCODE) Body file: sashtml4.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"57 %let _SASPROGRAMFILE = %nrquote(%nrstr(/Users/elreid/personalGit/vscode-sas-extension/client/testFixture/sasnb_export.sasnb));\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"58 proc sql;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"59 CREATE TABLE WORK.QUERY_PRDSALE AS\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"60 SELECT\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"61 (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"62 (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"63 FROM\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"64 WORK.PRDSALE t1\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"65 GROUP BY\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"66 t1.COUNTRY\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"67 ;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Table WORK.QUERY_PRDSALE created, with 3 rows and 2 columns.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"67 ! quit;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE SQL used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.01 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.01 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"68 ;*';*\\\";*/;run;quit;ods html5(id=vscode) close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"69 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"A last comment in Markdown at the end of the document","outputs":[]},{"kind":1,"language":"markdown","value":"","outputs":[]}] ================================================ FILE: client/testFixture/test.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "id": "26fe0d41-b4da-4902-845a-98e5c0c8e72a", "metadata": {}, "source": [ "# Python test" ] }, { "cell_type": "code", "execution_count": null, "id": "78855cba-1ec7-4e26-be74-23665ca2f4ee", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "id": "7906e55d-829b-41da-8536-5dba90d2dddd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "483eda5c-6fb4-4193-99c1-7ea7ab9ad338", "metadata": {}, "outputs": [], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": null, "id": "3f652f5e-c531-4e9d-9349-9ae1f52773ad", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: client/testFixture/test_ipynb.flw ================================================ {"creationTimeStamp":"2023-08-29T13:15:46.334Z","modifiedTimeStamp":"2023-08-29T13:15:46.334Z","createdBy":"user@sas.com","modifiedBy":"user@sas.com","version":2,"id":null,"name":"test_ipynb_node.flw","description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[{"method":"GET","rel":"self","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","type":"application/vnd.sas.data.flow"},{"method":"GET","rel":"alternate","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","type":"application/vnd.sas.data.flow.summary"},{"method":"GET","rel":"up","href":"/dataFlows/dataFlows","uri":"/dataFlows/dataFlows","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","type":"application/vnd.sas.data.flow","responseType":"application/vnd.sas.data.flow"},{"method":"DELETE","rel":"delete","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e"},{"method":"GET","rel":"transferExport","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","uri":"/dataFlows/dataFlows/77047e43-d5eb-40c4-a58f-ed030dd9849e","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"nodes":{"884cafa1-864e-46b8-9dae-6315e08b28d4":{"nodeType":"step","version":1,"id":"884cafa1-864e-46b8-9dae-6315e08b28d4","name":"Python Program","note":{"version":1,"id":"5cd551f7-60d8-4095-93bb-3e778b5622ed","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":"ab59f8c4-af9a-4608-a5d5-a8365357bb99","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693314944715","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/ab59f8c4-af9a-4608-a5d5-a8365357bb99"},"arguments":{"codeOptions":{"code":"import pandas as pd\n\ndf = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})\ndf.head()","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}},"da186f9d-d1f1-4b5f-9f1c-6e16f979a296":{"nodeType":"step","version":1,"id":"da186f9d-d1f1-4b5f-9f1c-6e16f979a296","name":"Python Program","note":{"version":1,"id":"7ef2a8df-095a-48b2-916e-8a292c2d1e5a","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":1,"properties":{"UI_PROP_COLORGRP":"0","UI_PROP_IS_INPUT_EXPANDED":"false","UI_PROP_IS_OUTPUT_EXPANDED":"false","UI_PROP_NODE_DATA_ID":"ab59f8c4-af9a-4608-a5d5-a8365357bb99","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693314944715","UI_PROP_PORT_DESCRIPTION|inTables|0":"Input tables","UI_PROP_PORT_LABEL|inTables|0":"Input table 1","UI_PROP_XPOS":"300","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/ab59f8c4-af9a-4608-a5d5-a8365357bb99"},"arguments":{"codeOptions":{"code":"df.info()","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[{"sourcePort":{"node":"884cafa1-864e-46b8-9dae-6315e08b28d4","portName":"outTables","index":0},"targetPort":{"node":"da186f9d-d1f1-4b5f-9f1c-6e16f979a296","portName":"inTables","index":0}}],"extendedProperties":{},"stickyNotes":[]} ================================================ FILE: client/testFixture/test_multi.sasnb ================================================ [{"kind":1,"language":"markdown","value":"# Notebook to Flow Test","outputs":[]},{"kind":1,"language":"markdown","value":"## Python Code\n\nThis is some Python code","outputs":[]},{"kind":1,"language":"markdown","value":"This is a separate note in **Markdown** format.","outputs":[]},{"kind":2,"language":"python","value":"a, b = 4, 2\r\nprint(\"Result: \", a*10 + b)","outputs":[{"items":[{"data":"[\n\t{\n\t\t\"line\": \"44 ods html5;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5 Body file: sashtml4.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"45 proc python;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"46 submit\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Resuming Python state from previous PROC PYTHON invocation.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"46 ! ;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"47 a, b = 4, 2\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"48 print(\\\"Result: \\\", a*10 + b)\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"49 endsubmit;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"50 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>>\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"Result: 42\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \">>> \",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE PYTHON used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"51 ;run;quit;ods html5 close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"## SAS Code","outputs":[]},{"kind":2,"language":"sas","value":"data work.prdsale;\r\n\tset sashelp.PRDSALE;\r\nrun;\r\n\r\nproc means data=work.prdsale;\r\nrun;","outputs":[{"items":[{"data":"\n\n\n\n\nSAS Output\n\n\n\n
\n
\n

The SAS System

\n
\n
\n

The MEANS Procedure

\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableLabelNMeanStd DevMinimumMaximum
\n
\n
ACTUAL
\n
PREDICT
\n
QUARTER
\n
YEAR
\n
MONTH
\n
\n
\n
\n
Actual Sales
\n
Predicted Sales
\n
Quarter
\n
Year
\n
Month
\n
\n
\n
\n
1440
\n
1440
\n
1440
\n
1440
\n
1440
\n
\n
\n
\n
507.1784722
\n
490.4826389
\n
2.5000000
\n
1993.50
\n
12403.00
\n
\n
\n
\n
287.0313065
\n
285.7667904
\n
1.1184224
\n
0.5001737
\n
210.6291578
\n
\n
\n
\n
3.0000000
\n
0
\n
1.0000000
\n
1993.00
\n
12054.00
\n
\n
\n
\n
1000.00
\n
1000.00
\n
4.0000000
\n
1994.00
\n
12753.00
\n
\n
\n
\n
\n\n\n","mime":"application/vnd.sas.ods.html5"},{"data":"[\n\t{\n\t\t\"line\": \"16 ods html5;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5 Body file: sashtml1.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"17 data work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"18 \\tset sashelp.PRDSALE;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"19 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set SASHELP.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: The data set WORK.PRDSALE has 1440 observations and 10 variables.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: DATA statement used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.01 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"20 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"21 proc means data=work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"22 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set WORK.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: The PROCEDURE MEANS printed page 1.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE MEANS used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.04 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.05 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"23 ;run;quit;ods html5 close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"## SQL Code","outputs":[]},{"kind":2,"language":"sql","value":"CREATE TABLE WORK.QUERY_PRDSALE AS\r\n SELECT\r\n (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\r\n (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\r\n FROM\r\n WORK.PRDSALE t1\r\n GROUP BY\r\n t1.COUNTRY","outputs":[{"items":[{"data":"[\n\t{\n\t\t\"line\": \"24 ods html5;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5 Body file: sashtml2.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"25 proc sql;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"26 CREATE TABLE WORK.QUERY_PRDSALE AS\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"27 SELECT\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"28 (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"29 (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"30 FROM\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"31 WORK.PRDSALE t1\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"32 GROUP BY\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"33 t1.COUNTRY\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"34 ;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Table WORK.QUERY_PRDSALE created, with 3 rows and 2 columns.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"normal\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"34 ! quit;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE SQL used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"6 The SAS System Monday, August 21, 2023 02:56:00 PM\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"title\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"35 ;run;quit;ods html5 close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":1,"language":"markdown","value":"A last comment in Markdown at the end of the document","outputs":[]},{"kind":1,"language":"markdown","value":"","outputs":[]}] ================================================ FILE: client/testFixture/test_multi_node.flw ================================================ {"creationTimeStamp":"2023-09-01T08:52:52.609Z","modifiedTimeStamp":"2023-09-01T08:52:52.609Z","createdBy":"user","modifiedBy":"user","version":2,"id":null,"name":"test_multi_node.flw","description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[{"method":"GET","rel":"self","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","type":"application/vnd.sas.data.flow"},{"method":"GET","rel":"alternate","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","type":"application/vnd.sas.data.flow.summary"},{"method":"GET","rel":"up","href":"/dataFlows/dataFlows","uri":"/dataFlows/dataFlows","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","type":"application/vnd.sas.data.flow","responseType":"application/vnd.sas.data.flow"},{"method":"DELETE","rel":"delete","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc"},{"method":"GET","rel":"transferExport","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","uri":"/dataFlows/dataFlows/3fca587b-12db-4763-8948-3e25dc3613dc","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"nodes":{"568a8eab-2b78-4f14-8424-e61e92a547cf":{"nodeType":"step","version":1,"id":"568a8eab-2b78-4f14-8424-e61e92a547cf","name":"Python Program","note":{"version":1,"id":"9a863167-b652-4c12-852e-875f57cd4edd","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":"ab59f8c4-af9a-4608-a5d5-a8365357bb99","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558370677","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/ab59f8c4-af9a-4608-a5d5-a8365357bb99"},"arguments":{"codeOptions":{"code":"a, b = 4, 2\r\nprint(\"Result: \", a*10 + b)","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}},"b235f8c3-62d0-4127-bc0f-42a04d806273":{"nodeType":"step","version":1,"id":"b235f8c3-62d0-4127-bc0f-42a04d806273","name":"SAS Program","note":{"version":1,"id":"024c8d0f-dcc4-4ddb-9d68-7e8b4e0a229d","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":1,"properties":{"UI_PROP_COLORGRP":"0","UI_PROP_IS_INPUT_EXPANDED":"false","UI_PROP_IS_OUTPUT_EXPANDED":"false","UI_PROP_NODE_DATA_ID":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558370677","UI_PROP_PORT_DESCRIPTION|inTables|0":"Input tables","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|inTables|0":"Input table 1","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"300","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"data work.prdsale;\r\n\tset sashelp.PRDSALE;\r\nrun;\r\n\r\nproc means data=work.prdsale;\r\nrun;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}},"c686d9fb-eba1-40a5-a19b-18af43c5f44c":{"nodeType":"step","version":1,"id":"c686d9fb-eba1-40a5-a19b-18af43c5f44c","name":"SQL Program","note":{"version":1,"id":"806734cb-a48e-45ce-9106-24ab44b5b036","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":2,"properties":{"UI_PROP_COLORGRP":"0","UI_PROP_IS_INPUT_EXPANDED":"false","UI_PROP_IS_OUTPUT_EXPANDED":"false","UI_PROP_NODE_DATA_ID":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558370677","UI_PROP_PORT_DESCRIPTION|inTables|0":"Input tables","UI_PROP_PORT_LABEL|inTables|0":"Input table 1","UI_PROP_XPOS":"450","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"PROC SQL;\nCREATE TABLE WORK.QUERY_PRDSALE AS\r\n SELECT\r\n (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\r\n (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\r\n FROM\r\n WORK.PRDSALE t1\r\n GROUP BY\r\n t1.COUNTRY;\nQUIT;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[{"sourcePort":{"node":"568a8eab-2b78-4f14-8424-e61e92a547cf","portName":"outTables","index":0},"targetPort":{"node":"b235f8c3-62d0-4127-bc0f-42a04d806273","portName":"inTables","index":0}},{"sourcePort":{"node":"b235f8c3-62d0-4127-bc0f-42a04d806273","portName":"outTables","index":0},"targetPort":{"node":"c686d9fb-eba1-40a5-a19b-18af43c5f44c","portName":"inTables","index":0}}],"extendedProperties":{},"stickyNotes":[]} ================================================ FILE: client/testFixture/test_multi_swimlane.flw ================================================ {"creationTimeStamp":"2023-09-01T08:59:20.994Z","modifiedTimeStamp":"2023-09-01T08:59:20.994Z","createdBy":"user","modifiedBy":"user","version":2,"id":null,"name":"test_multi_swimlane.flw","description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"58e4d421-705d-448c-b397-cc8c9fab6c48","UI_PROP_DF_EXECUTION_ORDERED":"true"},"links":[{"method":"GET","rel":"self","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","type":"application/vnd.sas.data.flow"},{"method":"GET","rel":"alternate","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","type":"application/vnd.sas.data.flow.summary"},{"method":"GET","rel":"up","href":"/dataFlows/dataFlows","uri":"/dataFlows/dataFlows","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","type":"application/vnd.sas.data.flow","responseType":"application/vnd.sas.data.flow"},{"method":"DELETE","rel":"delete","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64"},{"method":"GET","rel":"transferExport","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","uri":"/dataFlows/dataFlows/3b6cd151-07a3-4ca0-8078-a15e8d7a5b64","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"nodes":{"17d988e0-3120-435b-bffa-ce06e3798668":{"nodeType":"dataFlow","version":1,"id":"17d988e0-3120-435b-bffa-ce06e3798668","name":"Notebook Cell 1","priority":1,"properties":{"UI_PROP_IS_EXPANDED":"true","UI_PROP_IS_SWIMLANE":"true"},"portMappings":[],"dataFlowAndBindings":{"dataFlow":{"creationTimeStamp":"2023-09-01T08:59:19.073Z","modifiedTimeStamp":"2023-09-01T08:59:19.073Z","createdBy":null,"modifiedBy":null,"version":2,"id":null,"name":null,"description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[],"nodes":{"41ea96e5-ae92-4fa9-b083-4a2d618753ac":{"nodeType":"step","version":1,"id":"41ea96e5-ae92-4fa9-b083-4a2d618753ac","name":"Python Program","note":{"version":1,"id":"7d87cc48-5fa6-4059-8cb3-f1bc037949a6","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":"ab59f8c4-af9a-4608-a5d5-a8365357bb99","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558759073","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/ab59f8c4-af9a-4608-a5d5-a8365357bb99"},"arguments":{"codeOptions":{"code":"a, b = 4, 2\r\nprint(\"Result: \", a*10 + b)","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]},"executionBindings":{"sessionId":null,"contextId":null,"environmentId":"compute","tempTablePrefix":null,"arguments":{"__NO_OPTIMIZE":{"argumentType":"string","version":1,"value":"true"}}}}},"3620ecf8-a5f9-416f-a328-b539531d1bc6":{"nodeType":"dataFlow","version":1,"id":"3620ecf8-a5f9-416f-a328-b539531d1bc6","name":"Notebook Cell 2","priority":2,"properties":{"UI_PROP_IS_EXPANDED":"true","UI_PROP_IS_SWIMLANE":"true"},"portMappings":[],"dataFlowAndBindings":{"dataFlow":{"creationTimeStamp":"2023-09-01T08:59:19.073Z","modifiedTimeStamp":"2023-09-01T08:59:19.073Z","createdBy":null,"modifiedBy":null,"version":2,"id":null,"name":null,"description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[],"nodes":{"b6bb812d-0297-4dfc-a2c3-44d7fc80b0df":{"nodeType":"step","version":1,"id":"b6bb812d-0297-4dfc-a2c3-44d7fc80b0df","name":"SAS Program","note":{"version":1,"id":"0719c2de-67b0-43ee-b589-2ae5b31a8252","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":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558759073","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"data work.prdsale;\r\n\tset sashelp.PRDSALE;\r\nrun;\r\n\r\nproc means data=work.prdsale;\r\nrun;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]},"executionBindings":{"sessionId":null,"contextId":null,"environmentId":"compute","tempTablePrefix":null,"arguments":{"__NO_OPTIMIZE":{"argumentType":"string","version":1,"value":"true"}}}}},"c0501d96-4b46-4b0f-b20c-708e03e1b737":{"nodeType":"dataFlow","version":1,"id":"c0501d96-4b46-4b0f-b20c-708e03e1b737","name":"Notebook Cell 3","priority":3,"properties":{"UI_PROP_IS_EXPANDED":"true","UI_PROP_IS_SWIMLANE":"true"},"portMappings":[],"dataFlowAndBindings":{"dataFlow":{"creationTimeStamp":"2023-09-01T08:59:19.073Z","modifiedTimeStamp":"2023-09-01T08:59:19.073Z","createdBy":null,"modifiedBy":null,"version":2,"id":null,"name":null,"description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[],"nodes":{"4287de33-f407-4511-8b6c-e08dd2c23151":{"nodeType":"step","version":1,"id":"4287de33-f407-4511-8b6c-e08dd2c23151","name":"SQL Program","note":{"version":1,"id":"f47277fa-e8f9-4c44-b9a7-ff3723ca04c4","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":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558759073","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"PROC SQL;\nCREATE TABLE WORK.QUERY_PRDSALE AS\r\n SELECT\r\n (t1.COUNTRY) LABEL='Country' FORMAT=$CHAR10.,\r\n (SUM(t1.ACTUAL)) FORMAT=DOLLAR12.2 LENGTH=8 AS SUM_ACTUAL\r\n FROM\r\n WORK.PRDSALE t1\r\n GROUP BY\r\n t1.COUNTRY;\nQUIT;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]},"executionBindings":{"sessionId":null,"contextId":null,"environmentId":"compute","tempTablePrefix":null,"arguments":{"__NO_OPTIMIZE":{"argumentType":"string","version":1,"value":"true"}}}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]} ================================================ FILE: client/testFixture/test_single.sasnb ================================================ [{"kind":2,"language":"sas","value":"data work.prdsale;\n\tset sashelp.PRDSALE;\nrun;\n\nproc means data=work.prdsale;\nrun;","outputs":[{"items":[{"data":"\n\n\n\n\nSAS Output\n\n\n\n
\n
\n

The SAS System

\n
\n
\n

The MEANS Procedure

\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VariableLabelNMeanStd DevMinimumMaximum
\n
\n
ACTUAL
\n
PREDICT
\n
QUARTER
\n
YEAR
\n
MONTH
\n
\n
\n
\n
Actual Sales
\n
Predicted Sales
\n
Quarter
\n
Year
\n
Month
\n
\n
\n
\n
1440
\n
1440
\n
1440
\n
1440
\n
1440
\n
\n
\n
\n
507.1784722
\n
490.4826389
\n
2.5000000
\n
1993.50
\n
12403.00
\n
\n
\n
\n
287.0313065
\n
285.7667904
\n
1.1184224
\n
0.5001737
\n
210.6291578
\n
\n
\n
\n
3.0000000
\n
0
\n
1.0000000
\n
1993.00
\n
12054.00
\n
\n
\n
\n
1000.00
\n
1000.00
\n
4.0000000
\n
1994.00
\n
12753.00
\n
\n
\n
\n
\n\n\n","mime":"application/vnd.sas.ods.html5"},{"data":"[\n\t{\n\t\t\"line\": \"1 ods html5;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: Writing HTML5 Body file: sashtml.htm\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"2 data work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"3 \\tset sashelp.PRDSALE;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"4 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set SASHELP.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: The data set WORK.PRDSALE has 1440 observations and 10 variables.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: DATA statement used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.00 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.01 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"5 \",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"6 proc means data=work.prdsale;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"7 run;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: There were 1440 observations read from the data set WORK.PRDSALE.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: The PROCEDURE MEANS printed page 1.\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"NOTE: PROCEDURE MEANS used (Total process time):\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" real time 0.04 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" cpu time 0.04 seconds\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \" \",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"\",\n\t\t\"type\": \"note\",\n\t\t\"version\": 1\n\t},\n\t{\n\t\t\"line\": \"8 ;run;quit;ods html5 close;\",\n\t\t\"type\": \"source\",\n\t\t\"version\": 1\n\t}\n]","mime":"application/vnd.sas.compute.log.lines"}]}]},{"kind":2,"language":"sas","value":"","outputs":[]},{"kind":1,"language":"markdown","value":"Just a markdown cell","outputs":[]},{"kind":1,"language":"markdown","value":"","outputs":[]}] ================================================ FILE: client/testFixture/test_single_node.flw ================================================ {"creationTimeStamp":"2023-09-01T08:53:10.159Z","modifiedTimeStamp":"2023-09-01T08:53:10.159Z","createdBy":"user","modifiedBy":"user","version":2,"id":null,"name":"test_single_node.flw","description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[{"method":"GET","rel":"self","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","type":"application/vnd.sas.data.flow"},{"method":"GET","rel":"alternate","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","type":"application/vnd.sas.data.flow.summary"},{"method":"GET","rel":"up","href":"/dataFlows/dataFlows","uri":"/dataFlows/dataFlows","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","type":"application/vnd.sas.data.flow","responseType":"application/vnd.sas.data.flow"},{"method":"DELETE","rel":"delete","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7"},{"method":"GET","rel":"transferExport","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","uri":"/dataFlows/dataFlows/4812de47-4c03-4fd0-8810-53e67ea0f6e7","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"nodes":{"ef3f95e1-be19-4fed-a759-9239ef50c062":{"nodeType":"step","version":1,"id":"ef3f95e1-be19-4fed-a759-9239ef50c062","name":"SAS Program","note":{"version":1,"id":"b38f236b-b86a-4203-a8aa-60ffbac52074","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":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693558388299","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"data work.prdsale;\n\tset sashelp.PRDSALE;\nrun;\n\nproc means data=work.prdsale;\nrun;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]} ================================================ FILE: client/testFixture/test_single_swimlane.flw ================================================ {"creationTimeStamp":"2023-08-29T17:37:10.606Z","modifiedTimeStamp":"2023-08-29T17:37:10.606Z","createdBy":"user","modifiedBy":"user","version":2,"id":null,"name":"test_one.flw","description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"58e4d421-705d-448c-b397-cc8c9fab6c48","UI_PROP_DF_EXECUTION_ORDERED":"true"},"links":[{"method":"GET","rel":"self","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","type":"application/vnd.sas.data.flow"},{"method":"GET","rel":"alternate","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","type":"application/vnd.sas.data.flow.summary"},{"method":"GET","rel":"up","href":"/dataFlows/dataFlows","uri":"/dataFlows/dataFlows","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","type":"application/vnd.sas.data.flow","responseType":"application/vnd.sas.data.flow"},{"method":"DELETE","rel":"delete","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c"},{"method":"GET","rel":"transferExport","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","uri":"/dataFlows/dataFlows/80f7b074-b7a2-42a0-ae54-79a9f173f49c","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"nodes":{"cc8b1a63-196c-42b4-b21b-27fcd3f1613a":{"nodeType":"dataFlow","version":1,"id":"cc8b1a63-196c-42b4-b21b-27fcd3f1613a","name":"Notebook Cell 1","priority":1,"properties":{"UI_PROP_IS_EXPANDED":"true","UI_PROP_IS_SWIMLANE":"true"},"portMappings":[],"dataFlowAndBindings":{"dataFlow":{"creationTimeStamp":"2023-08-29T17:37:09.472Z","modifiedTimeStamp":"2023-08-29T17:37:09.472Z","createdBy":null,"modifiedBy":null,"version":2,"id":null,"name":null,"description":null,"properties":{"UI_PROP_DF_OPTIMIZE":"false","UI_PROP_DF_ID":"120081fc-2d7f-4cfc-bcd3-47f9684e9763","UI_PROP_DF_EXECUTION_ORDERED":"false"},"links":[],"nodes":{"4157ee94-7caf-496e-9635-50ae8a675353":{"nodeType":"step","version":1,"id":"4157ee94-7caf-496e-9635-50ae8a675353","name":"SAS Program","note":{"version":1,"id":"e957dab4-3532-4d1b-a15d-b4ba5d7e9a5c","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":"a7190700-f59c-4a94-afe2-214ce639fcde","UI_PROP_NODE_DATA_MODIFIED_DATE":"1693330629472","UI_PROP_PORT_DESCRIPTION|outTables|0":"Output tables","UI_PROP_PORT_LABEL|outTables|0":"Output table 1","UI_PROP_XPOS":"150","UI_PROP_YPOS":"75"},"portMappings":[{"mappingType":"tableStructure","portName":"outTables","portIndex":0,"tableStructure":{"columnDefinitions":null}}],"stepReference":{"type":"uri","path":"/dataFlows/steps/a7190700-f59c-4a94-afe2-214ce639fcde"},"arguments":{"codeOptions":{"code":"data work.prdsale;\n\tset sashelp.PRDSALE;\nrun;\n\nproc means data=work.prdsale;\nrun;","contentType":"embedded","logHTML":"","resultsHTML":"","variables":[{"name":"_input1","value":{"portIndex":0,"portName":"inTables","referenceType":"inputPort"}},{"name":"_output1","value":{"arguments":{},"portIndex":0,"portName":"outTables","referenceType":"outputPort"}}]}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]},"executionBindings":{"sessionId":null,"contextId":null,"environmentId":"compute","tempTablePrefix":null,"arguments":{"__NO_OPTIMIZE":{"argumentType":"string","version":1,"value":"true"}}}}}},"parameters":{},"connections":[],"extendedProperties":{},"stickyNotes":[]} ================================================ FILE: client/tsconfig.json ================================================ { "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, "jsx": "react-jsx", "lib": ["ES2019", "DOM"], "module": "commonjs", "outDir": "out", "rootDir": ".", "sourceMap": true, "target": "es2019" }, "include": ["src", "test"], "exclude": ["node_modules", ".vscode-test"] } ================================================ FILE: doc/ag-grid-technical-details.md ================================================ # AG Grid implementation details This summarizes how ag grid functionality is being used in this code base. ## Column headers / context menus - This repository defines custom column headers using the `headerComponent` property from `ColDef`. See [useDataViewer.ts](../client/src/webview/useDataViewer.ts) for implementation details, and [column header documentation](https://www.ag-grid.com/javascript-data-grid/column-properties/#reference-header-headerComponent) from AG Grid. - Context menus are not supported in the community edition of AG Grid. To implement this functionality, we use custom html as part of the `headerComponent` and keep track of ui interactions with `keydown` listeners and various click events. - Context menu actions (sort, etc) make use of AG Grid column state to update the underlying table data. For AG grid data changes, our internal code calls [`applyColumnState`](https://www.ag-grid.com/javascript-data-grid/column-state/#reference-state-applyColumnState) - The html used for the context menu roughly matches what is found on the [AG Grid's example page](https://ag-grid.com/example/) ## Data filtering The SAS extension currently supports a where style filter for filtering table data. This sets a filter property and updates AG Grids datasource to fetch table data based on the filter value. The implementation can be found in the `refreshResults` callback in See [useDataViewer.ts](../client/src/webview/useDataViewer.ts). This makes use of AG Grid's [`setGridOption`](https://www.ag-grid.com/javascript-data-grid/grid-api/#reference-gridOptions-setGridOption) ================================================ FILE: doc/profileExamples/viya4.json ================================================ { "SAS.log.showOnExecutionFinish": true, "SAS.log.showOnExecutionStart": false, "SAS.connectionProfiles": { "activeProfile": "viyaServer", "profiles": { "viya4": { "endpoint": "https://example-endpoint.com", "connectionType": "rest", "sasOptions": ["NONEWS", "ECHOAUTO"], "autoExec": [ { "type": "line", "line": "ods graphics / imagemap;" }, { "type": "file", "filePath": "/my/local/autoexec.sas" } ] } } } } ================================================ FILE: doc/scripts/itc-connection-test.ps1 ================================================ <# Use this script to test itc connections. This imports our itc script and is runnable in Powershell in the following way (see optional parameters in "Script setup" region): `C:\\itc-connection-test.ps1 -HostName -Username -Password ` See a list of optional parameters below. Additionally, you can modify code in the "Code to execute" region to fit your testing needs. #> #region Script setup # NOTE: You shouldn't need to edit anything in this region. param ( [string] $HostName = "", [string] $Port = "8591", [string] $Protocol = "2", # IOMBridge [string] $Username = "", [string] $Password = "", [string] $DisplayLang = "EN_US", [string] $InteropLibraryPath = "" ) $global:interopLibraryFolderPath = $InteropLibraryPath Set-Location "$PSScriptRoot\..\..\client\src\connection\itc\script\" function GetInteropDirectory { # try to load from user specified path first if ("$($global:interopLibraryFolderPath)") { if (Test-Path -Path "$($global:interopLibraryFolderPath)\\SASInterop.dll") { return "$($global:interopLibraryFolderPath)" } } # try to load path from registry try { $pathFromRegistry = (Get-ItemProperty -ErrorAction Stop -Path "HKLM:\\SOFTWARE\\WOW6432Node\\SAS Institute Inc.\\Common Data\\Shared Files\\Integration Technologies").Path if (Test-Path -Path "$pathFromRegistry\\SASInterop.dll") { return $pathFromRegistry } } catch { } # try to load path from integration technologies $itcPath = "C:\\Program Files\\SASHome\\x86\\Integration Technologies" if (Test-Path -Path "$itcPath\\SASInterop.dll") { return $itcPath } return "" } try { $interopDir = GetInteropDirectory Add-Type -Path "$interopDir\\SASInterop.dll" Add-Type -Path "$interopDir\\SASOManInterop.dll" } catch { Write-Error "$($global:env.Tags.ErrorStartTag)LoadingInterop error: $_$($global:env.Tags.ErrorEndTag)" } . ".\itc.ps1" $runner = New-Object -TypeName SASRunner $runner.Setup($HostName, $Username, $Password, [int]$Port, [int]$Protocol, "ITC Connection Test", $DisplayLang) $runner.ResolveSystemVars() #endregion #region Code to execute # Uncomment the following line to set any options $runner.SetOptions("VALIDVARNAME=ANY") # Adjust the value of $code as needed $code = "proc options group=languagecontrol;" $runner.Run($code) do { $chunkSize = 32768 $log = $runner.FlushLog($chunkSize) Write-Host $log } while ($log.Length -gt 0) #endregion ================================================ FILE: eslint.config.mjs ================================================ import { fixupConfigRules, fixupPluginRules } from "@eslint/compat"; import { FlatCompat } from "@eslint/eslintrc"; import js from "@eslint/js"; import typescriptEslint from "@typescript-eslint/eslint-plugin"; import tsParser from "@typescript-eslint/parser"; import react from "eslint-plugin-react"; import reactHooks from "eslint-plugin-react-hooks"; import globals from "globals"; import path from "node:path"; import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ baseDirectory: __dirname, recommendedConfig: js.configs.recommended, allConfig: js.configs.all, }); export default [ ...fixupConfigRules( compat.extends( "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react/recommended", "plugin:react-hooks/recommended", "plugin:react/jsx-runtime", ), ), { plugins: { "@typescript-eslint": fixupPluginRules(typescriptEslint), react: fixupPluginRules(react), "react-hooks": fixupPluginRules(reactHooks), }, languageOptions: { globals: { ...globals.node, }, parser: tsParser, ecmaVersion: 2018, sourceType: "module", parserOptions: { ecmaFeatures: { jsx: true, }, project: [ "./tsconfig.json", "./client/tsconfig.json", "./server/tsconfig.json", ], }, }, settings: { react: { version: "detect", }, }, rules: { eqeqeq: "error", "prefer-const": "error", "@typescript-eslint/dot-notation": "error", "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/consistent-type-assertions": [ "error", { assertionStyle: "never", }, ], "@typescript-eslint/no-unused-expressions": "off", curly: "error", }, }, ]; ================================================ FILE: l10n/bundle.l10n.de.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Beim Laden von Tabellendaten ist ein Fehler aufgetreten. Dies geschieht normalerweise, wenn eine Tabelle zu groß ist oder die Daten nicht verarbeitet werden konnten. Siehe Konsole für weitere Details.", "Are you sure you want to delete the selected tables?": "Möchten Sie die ausgewählten Tabellen wirklich löschen?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Sind Sie sicher, dass Sie alle Elemente dauerhaft löschen möchten? Sie können diese Aktion nicht rückgängig machen.", "Are you sure you want to permanently delete the item \"{name}\"?": "Sind Sie sicher, das Sie \"{name}\" permanent löschen wollen?", "Ascending": "Aufsteigend", "Ascending (add to sorting)": "Aufsteigend (zu Sortierung hinzufügen)", "Bookmark Length": "Lesezeichenlänge", "Cancelling job...": "Abbruch des Jobs...", "Cannot call self on ComputeSession with no id": "Kann self nicht für ComputeSessions ohne ID aufrufen", "Cannot call self on object with no id": "Kann self für ein Object ohne ID nicht aufrufen", "Cannot connect to SAS Studio service": "Verbindung zum SAS Studio-Service ist nicht möglich", "Cannot find file: {file}": "{file} konnte nicht gefunden werden", "Character": "Alphanumerisch", "Character Encoding": "Zeichencodierung", "Choose output type to save": "Wählen Sie den Ausgabetyp zum Speichern aus", "Choose where to save your files.": "Wählen Sie wo die Dateien gespeichert werden sollen.", "Clear": "Löschen", "Client ID": "Client ID", "Client Secret": "Client Secret", "Close Session": "Session beenden", "Columns": "Spalten", "Columns ({count})": "Spalten ({count})", "Compression": "Komprimierung", "Compute Context not found: {name}": "Der Compute Context wurde nicht gefunden: {name}", "Connecting to SAS session...": "Verbinden mit einer SAS Session...", "Connection Type": "Verbindungstyp", "Converting SAS notebook to flow...": "Konvertiere SAS Notebook zu Flow...", "Could not connect to the SAS server.": "Keine Verbindung zum SAS Server möglich", "Created": "Erstellt", "Currency": "Währung", "Date": "Datum", "Datetime": "Datetime", "Delete": "Löschen", "Descending": "Absteigend", "Descending (add to sorting)": "Absteigend (zu Sortierung hinzufügen)", "Downloading files...": "Dateien herunterladen...", "Engine": "Engine", "Enter a client ID": "Geben Sie eine Client ID ein", "Enter a client secret": "Geben Sie ein Client Secret ein", "Enter a file name.": "Geben Sie einen Dateiname ein.", "Enter a folder name.": "Geben Sie einen Ordnernamen ein.", "Enter a name for the new .flw file": "Geben Sie einen Namen für die neue .flw Datei ein", "Enter a new name.": "Geben Sie einen neuen Namen ein.", "Enter a port number": "Geben Sie den Port ein", "Enter a port number.": "Geben Sie den Port ein", "Enter connection name": "Geben Sie einen Verbindungsprofilname ein", "Enter expression": "Ausdruck eingeben", "Enter secret for client ID. An example is myapp.secret.": "Geben Sie das Secret für die Client ID ein. Hier ein Beispiel myapp.secret.", "Enter the SAS compute context": "Geben Sie den SAS Compute Context ein", "Enter the SAS compute context.": "Geben Sie den SAS Compute Context ein.", "Enter the URL": "Geben Sie die URL ein", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Geben Sie die URL des SAS Viya Server ein. Hier ein Beispiel https://example.sas.com", "Enter the local private key file path": "Gib den Pfad des Private Keys ein", "Enter the name of the SAS 9 server.": "Geben Sie den Namen des SAS 9 Servers ein", "Enter the passphrase for the private key": "Gib die Passphrase für den Private Key ein", "Enter the password for user: {username}": "Passworteingabe für den Benutzer: {username}", "Enter the registered client ID. An example is myapp.client.": "Geben Sie die registrierte Client ID ein. Hier ein Beispiel myapp.client.", "Enter the server name": "Geben Sie den Servername ein", "Enter the server path": "Geben Sie den Serverpfad ein", "Enter the server path of the SAS Executable.": "Geben Sie den Serverpfad zur SAS exe ein", "Enter your SAS server username.": "Geben Sie Ihren SAS Server Benutzername ein.", "Enter your password": "Geben Sie Ihr Passwort ein", "Enter your password for this connection.": "Geben Sie Ihr Passwort für diese Verbindung ein.", "Enter your username": "Geben Sie Ihren Benutzername ein", "Error converting the notebook file to .flw format.": "Fehler bei der Konvertierung des Notebooks in das .flw-Format.", "Error getting server with ID {id} - {message}": "Fehler bei der Verbindung mit dem Server mit der ID {id} - {message}", "Error getting session with ID {id} - {message}": "Fehler beim Verbinden mit der Session {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Error reading private key file: {filePath}, error: {message}", "Export as HTML file": "Als HTML-Datei exportieren", "Export as SAS program file": "Als-SAS-Programmdatei exportieren", "Extended Type": "Erweiterter Typ", "Failed to export notebook: {0}": "Notebook exportieren fehlgeschlagen: {0}", "Failed to get state from Session {sessionId}": "Fehler beim Session-Statusabruf {sessionId}", "File added to my folder.": "Datei wurde Meinem Ordner hinzugefügt.", "Format": "Format", "General": "Allgemein", "General Information": "Allgemeine Informationen", "HTML": "HTML", "Ignore: all": "Ignorieren: Alles", "Ignore: current position": "Ignorieren: aktuelle Position", "Ignore: error": "Ignorieren: Fehler", "Ignore: warning": "Ignorieren: Warnung", "Informat": "Einleseformat", "Invalid connectionType. Check Profile settings.": "Nicht gültiger Verbindungstyp. Bitte die Profileinstellungen überprüfen.", "Invalid file name.": "Ungültiger Dateiname", "Job does not have '{linkName}' link": "Der Job hat keinen '{linkName}' Link", "Label": "Etikett", "Length": "Länge", "Library": "Bibliothek", "Logical Record Count": "Anzahl der logischen Datensätze", "Method not implemented.": "Die Methode ist nicht implementiert.", "Missing connectionType in active profile.": "Fehlender Verbindungstyp im aktiven Profil.", "Missing endpoint in active profile.": "Fehlender Endpunkt im aktiven Profil.", "Missing host in active profile.": "Fehlender Host im aktiven Profil.", "Missing port in active profile.": "Fehlender Port im aktiven Profil.", "Missing sas path in active profile.": "Fehlender SAS Pfad im aktiven Profil.", "Missing username in active profile.": "Fehlender Benutzername im aktiven Profil.", "Modified": "Geändert", "Move to Recycle Bin": "In Papierkorb verschieben", "Name": "Name", "New File": "Neue Datei", "New Folder": "Neuer Ordner", "New SAS Connection Profile Name": "Neuer SAS Verbindungsprofilname", "No Active Profile": "Kein aktives Profil", "No Profile": "Kein Profil", "No Profiles available to delete": "Es gibt keine Profile die gelöscht werden können", "No SAS Connection Profile": "Kein SAS Verbindungsprofil", "No authorization code": "Kein Authorisierungs Code", "No data matches the current filters.": "Keine Daten entsprechen den aktuellen Filtern.", "Not implemented": "Nicht implementiert", "Notebook exported to {0}": "Notebook exportiert nach {0}", "Number of Columns": "Anzahl der Spalten", "Number of Rows": "Anzahl der Zeilen", "Numeric": "Numerisch", "Options": "Optionen", "Passphrase Required": "Passpharse benötigt", "Password Required": "Passwort benötigt", "Paste authorization code here": "Fügen Sie hier Ihren Authorisierungscode ein", "Physical Record Count": "Anzahl der physischen Datensätze", "Port Number": "Port", "Private Key File Path (optional)": "Pfad zum Private Key (optional)", "Properties": "Eigenschaften", "Python Program": "Python Programm", "Record Length": "Datensatzlänge", "Remove all sorting": "Alle Sortierungen entfernen", "Remove sorting": "Sortierung entfernen", "Rename File": "Datei umbennen", "Rename Folder": "Ordner umbenennen", "Result": "Ergebnis", "Result: {result}": "Ergebniss: {result}", "Row number": "Zeilennummer", "SAS 9 Server": "SAS 9 Server", "SAS Code": "SAS-Code", "SAS Compute Context": "SAS Compute Context", "SAS Log": "SAS Log", "SAS Log: {name}": "SAS Log: {name}", "SAS Profile": "SAS Profile", "SAS Program": "SAS Programm", "SAS Server Username": "SAS Server Benutzername", "SAS Viya Server": "SAS Viya Server", "SAS code running...": "SAS Code wird ausgeführt...", "SQL Program": "SQL Programm", "Save": "Speichern", "Save Log": "Log speichern", "Save ODS HTML": "ODS HTML speichern", "Saved to {0}": "Gespeichert in {0}", "Saving {itemName}.": "SavSpeichere {itemName}.", "Search": "Suchen", "Select a Connection Type": "Wählen Sie einen Verbindungstyp", "Select a Connection Type.": "Wählen Sie einen Verbindungstyp.", "Select a SAS connection profile": "Wählen Sie ein SAS Verbindungsprofil", "Select export format": "Exportformat auswählen", "Server Path": "Serverpfad", "Server does not have createSession link": "Der Server hat keinen createSession Link", "Server does not have state link": "Der Server hat keinen Statuslink", "Session does not have '{linkName}' link": "Session hat keinen '{linkName}' Link", "Show results...": "Ergebnisse anzeigen...", "Size Information": "Größeninformationen", "Something went wrong": "Etwas ist schief gelaufen", "Sort": "Sortieren", "Sorted, Ascending": "Sortiert, Aufsteigend", "Sorted, Descending": "Sortiert, Absteigend", "Switch Current SAS Profile": "Aktuelles SAS Profil wechseln", "Table Properties": "Tabelleneigenschaften", "Table: {tableName}": "Tabelle: {tableName}", "Task is cancelled.": "Der Task wurde abgebrochen.", "Task is complete.": "Der Task ist erledigt.", "Technical Information": "Technische Informationen", "The SAS session has closed.": "Die SAS Session wurde beendet.", "The file type is unsupported.": "Der Dateityp wird nicht unterstützt", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "Auf die Dateien kann nicht über den in der Kontextdefinition für den SAS Compute Server angegebenen Pfad zugegriffen werden. Wenden Sie sich an Ihren SAS-Administrator.", "The files cannot be accessed from the specified path.": "Auf die Dateien kann vom angegebenen Pfad aus nicht zugegriffen werden", "The folder name cannot contain more than 100 characters or have invalid characters.": "Der Ordnername darf nicht mehr als 100 Zeichen enthalten oder ungültige Zeichen aufweisen.", "The item could not be added to My Favorites.": "Der Inhalt konnte nicht zu Meinen Favoriten hinzugefügt werden.", "The item could not be removed from My Favorites.": "Der Inhalt konnte nicht aus Meinen Favoriten entfernt werden.", "The notebook file does not contain any code to convert.": "Das Notebook enthält keinen zu konvertierenden Code.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "Das Notebook wurde erfolgreich in einen Flow konvertiert und im folgenden Ordner gespeichert: {folderName}. Sie können es nun in SAS Studio öffnen.", "The output file name must end with the .flw extension.": "Der Name der Ausgabedatei muss mit .flw enden.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "Das {selected} SAS Verbindungsprofil wurde aus der settings.json Datei gelöscht.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Bei der Ausführung des SAS-Programms ist ein Fehler aufgetreten. Siehe [console log](command:workbench.action.toggleDevTools) für weitere Details.", "This folder contains unsaved files, are you sure you want to delete?": "Dieser Ordner enthält nicht gespeicherte Dateien. Möchten Sie ihn wirklich löschen?", "This platform does not support this connection type.": "Diese Plattform unterstützt diesen Verbindungstyp nicht.", "To use the SSH Agent or a password, leave blank.": "To use the SSH Agent or a password, leave blank.", "Type": "Typ", "Unable to add file to my folder.": "Nicht imstande die Datei Meinem Ordner hinzu zufügen", "Unable to create file \"{name}\".": "Nicht imstande die Datei \"{name}\" zu erstellen.", "Unable to create folder \"{name}\".": "Nicht imstande den Ordner \"{name}\" zu erstellen.", "Unable to delete file.": "Nicht imstande die Datei zu löschen.", "Unable to delete folder.": "Nicht imstande den Ordner zu löschen", "Unable to delete table {tableName}.": "Nicht imstande die Tabelle {tableName} zu löschen.", "Unable to download files.": "Dateien konnten nicht heruntergeladen werden.", "Unable to drag files from my favorites.": "Nicht imstande Dateien aus den Favoriten zu verschieben.", "Unable to drag files from trash.": "Nicht imstande Dateien aus dem Papierkorb zu verschieben.", "Unable to drop item \"{name}\".": "Nicht imstande \"{name}\" einzufügen.", "Unable to empty the recycle bin.": "Nicht imstande den Papierkorb zu leeren.", "Unable to load required libraries.": "Erforderliche Bibliotheken können nicht geladen werden", "Unable to rename \"{oldName}\" to \"{newName}\".": "Nicht imstande \"{oldName}\" in \"{newName}\" umzubenennen.", "Unable to restore file.": "Nicht imstande die Datei wiederherzustellen", "Unable to restore folder.": "Nicht imstande den Ordner wiederherzustellen.", "Unable to upload files.": "Dateien können nicht hochgeladen werden.", "Uploading files...": "Dateoem hochladen...", "User {username} {prompt}": "Benutzer {username} {prompt}", "View SAS Table": "SAS Tabelle anzeigen", "You can also specify connection profile using the settings.json file.": "Sie können ein Verbindungsprofil auch über die settings.json Datei eingeben.", "You must save your file before you can rename it.": "Sie müssen die Datei zunächstspeichern, bevor Sie sie umbenennen können.", "output": "Ausgabe", "{basename}_Copy{number}{ext}": "{basename}_Kopie{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.es.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Se encontró un error al cargar los datos de la tabla. Esto suele ocurrir cuando una tabla es demasiado grande o los datos no se pueden procesar. Consulte la consola para obtener más detalles.", "Are you sure you want to delete the selected tables?": "¿Confirma que desea eliminar las tablas seleccionadas?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "¿Confirma que desea eliminar permanentemente todos los elementos? No puede deshacer esta acción.", "Are you sure you want to permanently delete the item \"{name}\"?": "¿Confirma que desea eliminar permanentemente el elemento \"{name}\"?", "Ascending": "Ascendente", "Ascending (add to sorting)": "Ascendente (añadir a clasificación)", "Bookmark Length": "Longitud del registro", "Cancelling job...": "Cancelando el trabajo…", "Cannot call self on ComputeSession with no id": "No se puede invocar automáticamente ComputeSession sin ningún ID", "Cannot call self on object with no id": "No se puede invocar automáticamente el objeto sin ningún ID", "Cannot connect to SAS Studio service": "No se puede conectar al servicio SAS Studio", "Cannot find file: {file}": "No se puede encontrar el archivo: {file}", "Character": "Alfanumérico", "Character Encoding": "Codificación de caracteres", "Choose output type to save": "Elegir el tipo de salida que se va a guardar", "Choose where to save your files.": "Elija donde guardar los archivos.", "Clear": "Borrar", "Client ID": "ID de cliente", "Client Secret": "Secreto de cliente", "Close Session": "Cerrar sesión", "Columns": "Columnas", "Columns ({count})": "Columnas ({count})", "Compression": "Compresión", "Compute Context not found: {name}": "No se ha encontrado el contexto de cálculo: {name}", "Connecting to SAS session...": "Conexión a la sesión SAS…", "Connection Type": "Tipo de conexión", "Converting SAS notebook to flow...": "Conversión del bloc de notas SAS en el flujo…", "Could not connect to the SAS server.": "Imposible conectarse al servidor SAS", "Created": "Creado", "Currency": "Monetario", "Date": "Fecha", "Datetime": "Fecha y hora", "Delete": "Eliminar", "Descending": "Descendente", "Descending (add to sorting)": "Descendente (añadir a clasificación)", "Downloading files...": "Descargando archivos…", "Engine": "Motor", "Enter a client ID": "Introducir un ID de cliente", "Enter a client secret": "Introducir un secreto de cliente", "Enter a file name.": "Introducir un nombre de archivo.", "Enter a folder name.": "Introducir un nombre de carpeta.", "Enter a name for the new .flw file": "Introducir un nombre para el nuevo archivo .flw", "Enter a new name.": "Introducir un nombre nuevo.", "Enter a port number": "Introducir un número de puerto", "Enter a port number.": "Introducir un número de puerto.", "Enter connection name": "Introducir nombre de conexión", "Enter expression": "Introducir expresión", "Enter secret for client ID. An example is myapp.secret.": "Introducir secreto para ID de cliente. Por ejemplo myapp.secret.", "Enter the SAS compute context": "Introducir el contexto de cálculo SAS", "Enter the SAS compute context.": "Introducir el contexto de cálculo SAS.", "Enter the URL": "Introducir la URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Introducir la URL para el servidor SAS Viya. Por ejemplo https://example.sas.com.", "Enter the local private key file path": "Introduzca la ruta del archivo de clave privada local", "Enter the name of the SAS 9 server.": "Introduzca el nombre del servidor SAS 9.", "Enter the passphrase for the private key": "Introduzca la frase de contraseña para la clave privada: {username}", "Enter the password for user: {username}": "Introduzca la contraseña para el usuario: {username}", "Enter the registered client ID. An example is myapp.client.": "Introducir el ID de cliente registrado. Por ejemplo myapp.client.", "Enter the server name": "Introducir el nombre del servidor", "Enter the server path": "Introducir la ruta del servidor", "Enter the server path of the SAS Executable.": "Introducir la ruta del servidor del ejecutable SAS.", "Enter your SAS server username.": "Introducir el nombre de usuario del servidor SAS.", "Enter your password": "Introduce tu contraseña", "Enter your password for this connection.": "Introduce tu contraseña para esta conexión", "Enter your username": "Introducir el nombre de usuario", "Error converting the notebook file to .flw format.": "Error al convertir el archivo de bloc de notas en formato .flw.", "Error getting server with ID {id} - {message}": "Error al obtener el servidor con ID {id} - {message}", "Error getting session with ID {id} - {message}": "Error al obtener la sesión con ID {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Error en la lectura del archivo de clave privada: {filePath}, error: {message}", "Export as HTML file": "Exportar como archivo HTML", "Export as SAS program file": "Exportar como archivo de programa SAS", "Extended Type": "Tipo ampliado", "Failed to export notebook: {0}": "No se ha podido exportar el bloc de notas: {0}", "Failed to get state from Session {sessionId}": "Fallos al obtener el estado desde la sesión {sessionId}", "File added to my folder.": "Archivo añadido a mi carpeta.", "Format": "Formato", "General": "General", "General Information": "Información general", "HTML": "HTML", "Ignore: all": "Ignorar: todo", "Ignore: current position": "Ignorar: posición actual", "Ignore: error": "Ignorar: error", "Ignore: warning": "Ignorar: aviso", "Informat": "Formato de lectura", "Invalid connectionType. Check Profile settings.": "Tipo de conexión no válido. Compruebe los ajustes del perfil.", "Invalid file name.": "Nombre de archivo no válido.", "Job does not have '{linkName}' link": "El trabajo no tiene un enlace '{linkName}'", "Label": "Etiqueta", "Length": "Longitud", "Library": "Librería", "Logical Record Count": "Conteo de registros lógicos", "Method not implemented.": "Método no implementado.", "Missing connectionType in active profile.": "Falta el tipo de conexión en el perfil activo.", "Missing endpoint in active profile.": "Falta el punto de conexión en el perfil activo.", "Missing host in active profile.": "Falta el host en el perfil activo.", "Missing port in active profile.": "Falta el puerto en el perfil activo.", "Missing sas path in active profile.": "Falta la ruta sas en el perfil activo.", "Missing username in active profile.": "Falta el nombre de usuario en el perfil activo.", "Modified": "Modificado", "Move to Recycle Bin": "Mover a la papelera de reciclaje", "Name": "Nombre", "New File": "Nuevo archivo", "New Folder": "Nueva carpeta", "New SAS Connection Profile Name": "Nuevo nombre del perfil de conexión SAS", "No Active Profile": "No hay ningún perfil activo", "No Profile": "No hay perfil", "No Profiles available to delete": "No hay ningún perfil disponible para eliminar", "No SAS Connection Profile": "No hay un perfil de conexión SAS", "No authorization code": "No hay ningún código de autorización", "No data matches the current filters.": "No hay datos que coincidan con los filtros actuales.", "Not implemented": "No implementado", "Notebook exported to {0}": "Bloc de notas exportado a {0>", "Number of Columns": "Número de columnas", "Number of Rows": "Número de filas", "Numeric": "Numérico", "Options": "Opciones", "Passphrase Required": "Frase de contraseña requerida", "Password Required": "Contraseña requerida", "Paste authorization code here": "Pegar aquí el código de autorización", "Physical Record Count": "Conteo de registros físicos", "Port Number": "Número de puerto", "Private Key File Path (optional)": "Ruta del archivo de clave privada (opcional)", "Properties": "Propiedades", "Python Program": "Programa Python", "Record Length": "Longitud del registro", "Remove all sorting": "Quitar toda la clasificación", "Remove sorting": "Quitar clasificación", "Rename File": "Renombrar archivo", "Rename Folder": "Renombrar carpeta", "Result": "Resultado", "Result: {result}": "Resultado: {result}", "Row number": "Número de fila", "SAS 9 Server": "Servidor SSH SAS 9", "SAS Code": "Código SAS", "SAS Compute Context": "Contexto de cálculo SAS", "SAS Log": "Log SAS", "SAS Log: {name}": "Log SAS: {nombre}", "SAS Profile": "Perfil SAS", "SAS Program": "Programa SAS", "SAS Server Username": "Nombre de usuario del servidor SAS", "SAS Viya Server": "Servidor SAS Viya", "SAS code running...": "Código SAS en ejecución...", "SQL Program": "Programa SQL", "Save": "Guardar", "Save Log": "Guardar log", "Save ODS HTML": "Guardar ODS HTML", "Saved to {0}": "Guardar en {0}", "Saving {itemName}.": "Guardando {itemName}.", "Search": "Búsqueda", "Select a Connection Type": "Seleccionar un tipo de conexión", "Select a Connection Type.": "Seleccionar un tipo de conexión.", "Select a SAS connection profile": "Seleccionar un perfil de conexión SAS", "Select export format": "Seleccionar formato de exportación", "Server Path": "Ruta del servidor", "Server does not have createSession link": "El servidor no tiene un enlace createSession", "Server does not have state link": "El servidor no tiene un enlace de estado", "Session does not have '{linkName}' link": "La sesión no tiene el enlace '{linkName}'", "Show results...": "Mostrar resultados...", "Size Information": "Información del tamaño", "Something went wrong": "Ha habido algún problema", "Sort": "Clasificar", "Sorted, Ascending": "Ordenado, ascendente", "Sorted, Descending": "Ordenado, descendente", "Switch Current SAS Profile": "Cambiar perfil SAS actual", "Table Properties": "Propiedades de la tabla", "Table: {tableName}": "Tabla: {tableName}", "Task is cancelled.": "La tarea está cancelada.", "Task is complete.": "La tarea está completada.", "Technical Information": "Información técnica", "The SAS session has closed.": "Se ha cerrado la sesión SAS.", "The file type is unsupported.": "El tipo de archivo no es compatible.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "No se puede acceder a los archivos desde la ruta especificada en la definición de contexto para SAS Compute Server. Póngase en contacto con el administrador SAS", "The files cannot be accessed from the specified path.": "No se puede acceder a los archivos desde la ruta especificada", "The folder name cannot contain more than 100 characters or have invalid characters.": "El nombre de la carpeta no puede contener más de 100 caracteres ni tener caracteres no válidos.", "The item could not be added to My Favorites.": "El elemento no se ha podido añadir a Mis favoritos.", "The item could not be removed from My Favorites.": "El elemento no se ha podido quitar de Mis favoritos.", "The notebook file does not contain any code to convert.": "El archivo de bloc de notas no contiene ningún código para convertir.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "El bloc de notas se ha convertido correctamente en un flujo y se ha guardado en la siguiente carpeta: {folderName}. Ya puede abrirlo en SAS Studio.", "The output file name must end with the .flw extension.": "El nombre del archivo de salida debe terminar con la extensión .flw.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "El perfil de conexión SAS {selected} se ha eliminado del archivo settings.json.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Se produjo un error en la ejecución del programa SAS. Para más detalles, consulte [console log](command:workbench.action.toggleDevTools).", "This folder contains unsaved files, are you sure you want to delete?": "Esta carpeta contiene archivos sin guardar. ¿Está seguro de que desea eliminarla?", "This platform does not support this connection type.": "La plataforma no admite este tipo de conexión.", "To use the SSH Agent or a password, leave blank.": "Para utilizar el agente SSH o una contraseña, deje el campo en blanco", "Type": "Tipo", "Unable to add file to my folder.": "No es posible añadir archivos a mi carpeta.", "Unable to create file \"{name}\".": "No es posible crear el archivo \"{name}\".", "Unable to create folder \"{name}\".": "No es posible crear la carpeta \"{name}\".", "Unable to delete file.": "No es posible eliminar el archivo.", "Unable to delete folder.": "No es posible eliminar la carpeta.", "Unable to delete table {tableName}.": "No es posible eliminar la tabla {tableName}.", "Unable to download files.": "No se pueden descargar archivos.", "Unable to drag files from my favorites.": "No es posible arrastrar archivos desde mis favoritos.", "Unable to drag files from trash.": "No es posible arrastrar archivos desde la papelera.", "Unable to drop item \"{name}\".": "No es posible arrastrar el elemento \"{name}\".", "Unable to empty the recycle bin.": "No es posible vaciar la papelera de reciclaje.", "Unable to load required libraries.": "No es posible cargar las librerías requeridas", "Unable to rename \"{oldName}\" to \"{newName}\".": "No es posible renombrar \"{oldName}\" to \"{newName}\".", "Unable to restore file.": "No es posible restaurar el archivo.", "Unable to restore folder.": "No es posible restaurar la carpeta.", "Unable to upload files.": "No es posible subir archivos.", "Uploading files...": "Subiendo archivos...", "User {username} {prompt}": "Usuario {username} {prompt}", "View SAS Table": "Ver tabla SAS", "You can also specify connection profile using the settings.json file.": "También puede especificar el perfil de conexión utilizando el archivo settings.json.", "You must save your file before you can rename it.": "Debe guardar el archivo para poder renombrarlo.", "output": "salida", "{basename}_Copy{number}{ext}": "{basename}_Copia{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.fr.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Une erreur est survenue lors du chargement des données de la table. Cela se produit généralement lorsqu'une table est trop volumineuse ou que les données n'ont pas pu être traitées. Consultez la console pour plus d'information.", "Are you sure you want to delete the selected tables?": "Êtes-vous sûr de vouloir supprimer les tables sélectionnées ?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Êtes-vous sûr de vouloir supprimer définitivement tous les éléments ? Cette action ne peut pas être annulée.", "Are you sure you want to permanently delete the item \"{name}\"?": "Êtes-vous sûr de vouloir supprimer définitivement l'élément \"{name}\"?", "Ascending": "Croissant", "Ascending (add to sorting)": "Croissant (ajouter au tri)", "Bookmark Length": "Longueur du signet", "Cancelling job...": "Annulation de la tâche...", "Cannot call self on ComputeSession with no id": "Impossible d'appeler une session Compute sans identifiant", "Cannot call self on object with no id": "Impossible d'appeler un objet sans identifiant", "Cannot connect to SAS Studio service": "Impossible de se connecter au service SAS Studio", "Cannot find file: {file}": "Impossible de trouver le fichier: {file}", "Character": "Caractère", "Character Encoding": "Codage de caractères", "Choose output type to save": "Choisir le type de sortie à enregistrer", "Choose where to save your files.": "Choisissez où enregistrer vos fichiers.", "Clear": "Effacer", "Client ID": "ID client", "Client Secret": "Clé secrète client", "Close Session": "Fermer la session", "Columns": "Colonnes", "Columns ({count})": "Colonnes ({count})", "Compression": "Compression", "Compute Context not found: {name}": "SAS Compute Context non trouvé: {name}", "Connecting to SAS session...": "Connexion à la session SAS...", "Connection Type": "Type de connexion", "Converting SAS notebook to flow...": "Conversion du notebook SAS en flux...", "Could not connect to the SAS server.": "Impossible de se connecter au serveur SAS.", "Created": "Créé", "Currency": "Devise", "Date": "Date", "Datetime": "Date-heure", "Delete": "Supprimer", "Descending": "Décroissant", "Descending (add to sorting)": "Décroissant (ajouter au tri)", "Downloading files...": "Téléchargement des fichiers...", "Engine": "Moteur", "Enter a client ID": "Entrez un ID client", "Enter a client secret": "Entrez une clé secrète client", "Enter a file name.": "Entrez un nom de fichier.", "Enter a folder name.": "Entrez un nom de dossier.", "Enter a name for the new .flw file": "Entrez un nom pour le nouveau fichier .flw", "Enter a new name.": "Entrez un nouveau nom.", "Enter a port number": "Entrez un numéro de port", "Enter a port number.": "Entrez un numéro de port.", "Enter connection name": "Entrez le nom de la connexion", "Enter expression": "Saisir l'expression", "Enter secret for client ID. An example is myapp.secret.": "Clé secrète pour l'ID client. Un exemple est myapp.secret.", "Enter the SAS compute context": "Entrez le SAS Compute Context", "Enter the SAS compute context.": "Entrez le SAS Compute Context.", "Enter the URL": "Entrez l'URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Entrez l'URL du serveur SAS Viya. Un exemple est https://example.sas.com.", "Enter the local private key file path": "Entrez le chemin local du fichier de clé privée", "Enter the name of the SAS 9 server.": "Veuillez entrer le nom du serveur SAS 9.", "Enter the passphrase for the private key": "Entrez la phrase secrète pour la clé privée", "Enter the password for user: {username}": "Entrez le mot de passe pour l'utilisateur : {username}", "Enter the registered client ID. An example is myapp.client.": "Entrez l'ID client enregistré. Un exemple est myapp.client.", "Enter the server name": "Entrez le nom du serveur", "Enter the server path": "Entrez le chemin du serveur", "Enter the server path of the SAS Executable.": "Entrez le chemin du serveur de l'exécutable SAS.", "Enter your SAS server username.": "Entrez votre nom d'utilisateur du serveur SAS.", "Enter your password": "Veuillez saisir votre de mot de passe", "Enter your password for this connection.": "Veuillez saisir votre de mot de passe pour cette connexion.", "Enter your username": "Entrez votre nom d'utilisateur", "Error converting the notebook file to .flw format.": "Erreur lors de la conversion du fichier de notebook au format .flw.", "Error getting server with ID {id} - {message}": "Erreur lors de l'obtention du serveur avec l'ID {id} - {message}", "Error getting session with ID {id} - {message}": "Erreur lors de l'obtention de la session avec l'ID {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Erreur lors de la lecture du fichier de clé privée : {filePath}, erreur : {message}", "Export as HTML file": "Exporter en tant que fichier HTML", "Export as SAS program file": "Exporter en tant que programme SAS", "Extended Type": "Type étendu", "Failed to export notebook: {0}": "Échec de l'exportation du bloc-notes : {0}", "Failed to get state from Session {sessionId}": "Échec de l'obtention de l'état de la session {sessionId}", "File added to my folder.": "Fichier ajouté à mon dossier.", "Format": "Format", "General": "Général", "General Information": "Informations générales", "HTML": "HTML", "Ignore: all": "Ignorer; tout", "Ignore: current position": "Ignorer: position actuelle", "Ignore: error": "Ignorer: erreur", "Ignore: warning": "Ignorer: avertissement", "Informat": "Informat", "Invalid connectionType. Check Profile settings.": "Type de connexion invalide. Vérifiez les paramètres du profil.", "Invalid file name.": "Nom de fichier non valide.", "Job does not have '{linkName}' link": "La tâche ne possède pas le lien '{linkName}'", "Label": "Libellé", "Length": "Longueur", "Library": "Bibliothèque", "Logical Record Count": "Nombre d'enregistrements logiques", "Method not implemented.": "Méthode non implémentée.", "Missing connectionType in active profile.": "Type de connexion manquant dans le profil actif.", "Missing endpoint in active profile.": "Point de terminaison manquant dans le profil actif.", "Missing host in active profile.": "Hôte manquant dans le profil actif.", "Missing port in active profile.": "Port manquant dans le profil actif.", "Missing sas path in active profile.": "Chemin SAS manquant dans le profil actif.", "Missing username in active profile.": "Nom d'utilisateur manquant dans le profil actif.", "Modified": "Modifié", "Move to Recycle Bin": "Déplacer vers la Corbeille", "Name": "Nom", "New File": "Nouveau fichier", "New Folder": "Nouveau dossier", "New SAS Connection Profile Name": "Nouveau nom de profil de connexion SAS", "No Active Profile": "Aucun profil actif", "No Profile": "Aucun profil", "No Profiles available to delete": "Aucun profil disponible à supprimer", "No SAS Connection Profile": "Aucun profil de connexion SAS", "No authorization code": "Aucun code d'autorisation", "No data matches the current filters.": "Aucune donnée ne correspond aux filtres en cours.", "Not implemented": "Non implémenté", "Notebook exported to {0}": "Bloc-notes exporté vers {0}", "Number of Columns": "Nombre de colonnes", "Number of Rows": "Nombre de lignes", "Numeric": "Numérique", "Options": "Options", "Passphrase Required": "Phrase secrète requise", "Password Required": "Mot de passe requis", "Paste authorization code here": "Collez le code d'autorisation ici", "Physical Record Count": "Nombre d'enregistrements physiques", "Port Number": "Numéro de port", "Private Key File Path (optional)": "Chemin du fichier de clé privée (optionnel)", "Properties": "Propriétés", "Python Program": "Programme Python", "Record Length": "Longueur d'enregistrement", "Remove all sorting": "Supprimer tout le tri", "Remove sorting": "Supprimer le tri", "Rename File": "Renommer le fichier", "Rename Folder": "Renommer le dossier", "Result": "Résultat", "Result: {result}": "Résultat: {result}", "Row number": "Numéro de ligne", "SAS 9 Server": "Serveur SAS 9", "SAS Code": "Code SAS", "SAS Compute Context": "SAS Compute Context", "SAS Log": "Journal SAS", "SAS Log: {name}": "SAS Log: {name}", "SAS Profile": "Profil SAS", "SAS Program": "Programme SAS", "SAS Server Username": "Nom d'utilisateur du serveur SAS", "SAS Viya Server": "Serveur SAS Viya", "SAS code running...": "Exécution du code SAS...", "SQL Program": "Programme SQL", "Save": "Enregistrer", "Save Log": "Enregistrer le journal", "Save ODS HTML": "Enregistrer ODS HTML", "Saved to {0}": "Enregistré dans {0}", "Saving {itemName}.": "Enregistrement de {itemName}.", "Search": "Recherche", "Select a Connection Type": "Sélectionnez un type de connexion", "Select a Connection Type.": "Sélectionnez un type de connexion.", "Select a SAS connection profile": "Sélectionnez un profil de connexion SAS", "Select export format": "Sélectionner le format d'exportation", "Server Path": "Chemin du serveur", "Server does not have createSession link": "Le serveur ne possède pas de lien createSession", "Server does not have state link": "Le serveur ne possède pas de lien d'état", "Session does not have '{linkName}' link": "La session ne possède pas le lien '{linkName}'", "Show results...": "Afficher les résultats...", "Size Information": "Informations sur la taille", "Something went wrong": "Un incident est survenu", "Sort": "Trier", "Sorted, Ascending": "Trié, Croissant", "Sorted, Descending": "Trié, Décroissant", "Switch Current SAS Profile": "Changer le profil SAS actuel", "Table Properties": "Propriétés de la table", "Table: {tableName}": "Table : {tableName}", "Task is cancelled.": "La tâche est annulée.", "Task is complete.": "La tâche est terminée.", "Technical Information": "Informations techniques", "The SAS session has closed.": "La session SAS s'est fermée.", "The file type is unsupported.": "Le type de fichier n'est pas pris en charge.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "Impossible d'accéder aux fichiers depuis le chemin spécifié dans la définition de contexte pour le SAS Compute Server. Contactez votre administrateur SAS.", "The files cannot be accessed from the specified path.": "Impossible d'accéder aux fichiers depuis le chemin spécifié.", "The folder name cannot contain more than 100 characters or have invalid characters.": "Le nom du dossier ne peut pas contenir plus de 100 caractères ni comporter de caractères invalides.", "The item could not be added to My Favorites.": "Impossible d'ajouter l'élément à Mes favoris.", "The item could not be removed from My Favorites.": "Impossible de supprimer l'élément de Mes favoris.", "The notebook file does not contain any code to convert.": "Le fichier de notebook ne contient aucun code à convertir.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "Le notebook a été converti avec succès en flux et enregistré dans le dossier suivant: {folderName}. Vous pouvez désormais ouvrir le flux dans SAS Studio.", "The output file name must end with the .flw extension.": "Le nom du fichier de sortie doit se terminer par l'extension .flw.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "Le profil de connexion SAS {selected} a été supprimé du fichier settings.json.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Erreur lors de l'exécution du Programme SAS. Veuilez consulter le [console log](command:workbench.action.toggleDevTools) pour plus d'informations.", "This folder contains unsaved files, are you sure you want to delete?": "Ce dossier contient des fichiers non enregistrés. Êtes-vous sûr de vouloir supprimer ?", "This platform does not support this connection type.": "Cette plateforme ne supporte pas ce type de connexion", "To use the SSH Agent or a password, leave blank.": "Pour utiliser l'agent SSH ou un mot de passe, laissez vide.", "Type": "Type", "Unable to add file to my folder.": "Impossible d'ajouter le fichier à mon dossier.", "Unable to create file \"{name}\".": "Impossible de créer le fichier \"{name}\".", "Unable to create folder \"{name}\".": "Impossible de créer le dossier \"{name}\".", "Unable to delete file.": "Impossible de supprimer le fichier.", "Unable to delete folder.": "Impossible de supprimer le dossier.", "Unable to delete table {tableName}.": "Impossible de supprimer la table {tableName}.", "Unable to download files.": "Impossible de télécharger les fichiers", "Unable to drag files from my favorites.": "Impossible de faire glisser les fichiers depuis Mes favoris.", "Unable to drag files from trash.": "Impossible de faire glisser les fichiers depuis la corbeille.", "Unable to drop item \"{name}\".": "Impossible de déposer l'élément \"{name}\".", "Unable to empty the recycle bin.": "Impossible de vider la corbeille.", "Unable to load required libraries.": "Impossible de charger les bibliothèques requises.", "Unable to rename \"{oldName}\" to \"{newName}\".": "Impossible de renommer \"{oldName}\" en \"{newName}\".", "Unable to restore file.": "Impossible de restaurer le fichier.", "Unable to restore folder.": "Impossible de restaurer le dossier.", "Unable to upload files.": "Impossible d'importer les fichiers.", "Uploading files...": "Import des fichiers...", "User {username} {prompt}": "Utilisateur {username} {prompt}", "View SAS Table": "Afficher la table SAS", "You can also specify connection profile using the settings.json file.": "Vous pouvez également spécifier le profil de connexion en utilisant le fichier settings.json.", "You must save your file before you can rename it.": "Vous devez enregistrer votre fichier avant de pouvoir le renommer.", "output": "sortie", "{basename}_Copy{number}{ext}": "{basename}_Copie{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.it.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Rilevato un errore caricando i dati della tabella. Generalmente succede quando una tabella è troppo grande o i dati non possono essere elaborati. Vedere la console per maggiori dettagli.", "Are you sure you want to delete the selected tables?": "Eliminare le tabelle selezionate?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Eliminare tutti gli elementi in modo permanente? Questa azione non può essere annullata.", "Are you sure you want to permanently delete the item \"{name}\"?": "Eliminare l'elemento \"{name}\" in modo permanente?", "Ascending": "Crescente", "Ascending (add to sorting)": "Crescente (aggiungere all'ordinamento)", "Bookmark Length": "Lunghezza del segnalibro", "Cancelling job...": "Annullamento del job...", "Cannot call self on ComputeSession with no id": "Impossibile chiamare self su ComputeSession senza ID ", "Cannot call self on object with no id": "Impossibile chiamare self su un oggetto senza ID", "Cannot connect to SAS Studio service": "Impossibile connettersi al servizio di SAS Studio", "Cannot find file: {file}": "Impossibile trovare il file: {file}", "Character": "Alfanumerico", "Character Encoding": "Codifica dei caratteri", "Choose output type to save": "Scegliere il tipo di output da salvare", "Choose where to save your files.": "Scegliere il percorso in cui salvare i file.", "Clear": "Cancella", "Client ID": "ID client", "Client Secret": "Client secret", "Close Session": "Chiudi sessione", "Columns": "Colonne", "Columns ({count})": "Colonne ({count})", "Compression": "Compressione", "Compute Context not found: {name}": "Contesto di calcolo non trovato: {name}", "Connecting to SAS session...": "Connessione alla sessione SAS...", "Connection Type": "Tipo di connessione", "Converting SAS notebook to flow...": "Conversione di SAS Notebook in un flusso...", "Could not connect to the SAS server.": "Impossibile connettersi al server SAS.", "Created": "Data di creazione", "Currency": "Valuta", "Date": "Data", "Datetime": "Data e ora", "Delete": "Elimina", "Descending": "Decrescente", "Descending (add to sorting)": "Decrescente (aggiungere all'ordinamento)", "Downloading files...": "Download dei file...", "Engine": "Engine", "Enter a client ID": "Immetti l'ID client", "Enter a client secret": "Immetti un client secret", "Enter a file name.": "Immettere un nome di file.", "Enter a folder name.": "Immettere un nome di cartella.", "Enter a name for the new .flw file": "Immetti un nome per il nuovo file .flw", "Enter a new name.": "Immettere un nuovo nome.", "Enter a port number": "Immetti un numero della porta", "Enter a port number.": "Immettere un numero della porta.", "Enter connection name": "Immetti il nome della connessione", "Enter expression": "Immettere l'espressione", "Enter secret for client ID. An example is myapp.secret.": "Immettere il secret per l'ID client. Esempio: miaapp.client", "Enter the SAS compute context": "Immetti il contesto di calcolo SAS", "Enter the SAS compute context.": "Immettere il contesto di calcolo SAS.", "Enter the URL": "Immetti l'URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Immettere l'URL del server SAS Viya. Esempio: https://esempio.sas.com", "Enter the local private key file path": "Immetti il percorso del file della chiave privata", "Enter the name of the SAS 9 server.": "Immettere il nome del server SAS 9", "Enter the passphrase for the private key": "Immetti la passphrase per la chiave privata", "Enter the password for user: {username}": "Immetti la password per l'utente: {username}", "Enter the registered client ID. An example is myapp.client.": "Immettere l'ID client registrato. Esempio: miaapp.client", "Enter the server name": "Immetti il nome del server", "Enter the server path": "Immetti il percorso del server", "Enter the server path of the SAS Executable.": "Immettere il percorso del server dell'eseguibile SAS.", "Enter your SAS server username.": "Immettere il nome utente del server SAS.", "Enter your password": "Immetti la password", "Enter your password for this connection.": "Immetti la password per questa connessione", "Enter your username": "Immetti il nome utente", "Error converting the notebook file to .flw format.": "Errore di conversione del file del notebook nel formato .flw.", "Error getting server with ID {id} - {message}": "Errore recuperando il server con ID {id} - {message}", "Error getting session with ID {id} - {message}": "Errore recuperando la sessione con ID {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Errore leggendo il file della chiave privata: {filePath}, errore: {message}", "Export as HTML file": "Esporta come file HTML", "Export as SAS program file": "Esporta come file di programma SAS", "Extended Type": "Tipo esteso", "Failed to export notebook: {0}": "Impossibile esportare il notebook: {0}", "Failed to get state from Session {sessionId}": "Impossibile ottenere lo stato dalla sessione {sessionId}", "File added to my folder.": "File aggiunto alla cartella personale.", "Format": "Formato", "General": "Generale", "General Information": "Informazioni generali", "HTML": "HTML", "Ignore: all": "Ignora: tutto", "Ignore: current position": "Ignora: posizione corrente", "Ignore: error": "Ignora: errore", "Ignore: warning": "Ignora: avvertimento", "Informat": "Formato di input", "Invalid connectionType. Check Profile settings.": "Tipo di connessione non valido. Controllare le impostazioni del profilo", "Invalid file name.": "Nome del file non valido.", "Job does not have '{linkName}' link": "Il job non ha il collegamento '{linkName}", "Label": "Etichetta", "Length": "Lunghezza", "Library": "Libreria", "Logical Record Count": "Conteggio dei record logici", "Method not implemented.": "Metodo non implementato", "Missing connectionType in active profile.": "Tipo di connessione mancante nel profilo attivo ", "Missing endpoint in active profile.": "Endpoint mancante nel profilo attivo.", "Missing host in active profile.": "Host mancante nel profilo attivo", "Missing port in active profile.": "Porta mancante nel profilo attivo", "Missing sas path in active profile.": "Percorso SAS mancante nel profilo attivo", "Missing username in active profile.": "Nome utente mancante nel profilo attivo", "Modified": "Data di modifica", "Move to Recycle Bin": "Sposta nel Cestino", "Name": "Nome", "New File": "Nuovo file", "New Folder": "Nuova cartella", "New SAS Connection Profile Name": "Nuovo profilo di connessione SAS", "No Active Profile": "Nessun profilo attivo", "No Profile": "Nessun profilo", "No Profiles available to delete": "Profili non disponibili per l'eliminazione", "No SAS Connection Profile": "Nessun profilo di connessione SAS", "No authorization code": "Nessun codice di autorizzazione", "No data matches the current filters.": "Nessun dato corrisponde ai filtri correnti.", "Not implemented": "Non implementato", "Notebook exported to {0}": "Notebook esportato in {0}", "Number of Columns": "Numero di colonne", "Number of Rows": "Numero di righe", "Numeric": "Numerico ", "Options": "Opzioni", "Passphrase Required": "Passphrase obbligatoria", "Password Required": "Password obbligatoria", "Paste authorization code here": "Incolla qui il codice di autorizzazione", "Physical Record Count": "Conteggio dei record fisici", "Port Number": "Numero della porta", "Private Key File Path (optional)": "Percorso del file della chiave privata (facoltativo)", "Properties": "Proprietà", "Python Program": "Programma Python", "Record Length": "Lunghezza del record", "Remove all sorting": "Rimuovi tutto l'ordinamento", "Remove sorting": "Rimuovi l'ordinamento", "Rename File": "Rinomina il file", "Rename Folder": "Rinomina la cartella", "Result": "Risultato", "Result: {result}": "Risultato: {result}", "Row number": "Numero di riga", "SAS 9 Server": "Server SAS 9", "SAS Code": "Codice SAS", "SAS Compute Context": "Contesto di calcolo SAS", "SAS Log": "Log SAS", "SAS Log: {name}": "Log SAS: {name}", "SAS Profile": "Profilo SAS", "SAS Program": "Programma SAS", "SAS Server Username": "Nome utente del server SAS", "SAS Viya Server": "Server SAS Viya", "SAS code running...": "Codice SAS in esecuzione...", "SQL Program": "Programma SQL", "Save": "Salva", "Save Log": "Salva il log", "Save ODS HTML": "Salva ODS HTML", "Saved to {0}": "Salvato in {0}", "Saving {itemName}.": "Salvataggio di {itemName}.", "Search": "Ricerca", "Select a Connection Type": "Seleziona un tipo di connessione", "Select a Connection Type.": "Selezionare un tipo di connessione.", "Select a SAS connection profile": "Seleziona un profilo di connessione SAS", "Select export format": "Selezionare il formato di esportazione", "Server Path": "Percorso del server", "Server does not have createSession link": "Il server non ha il collegamento createSession ", "Server does not have state link": "Il server non ha il collegamento di stato ", "Session does not have '{linkName}' link": "La sessione non ha il collegamento '{linkName}", "Show results...": "Mostra i risultati...", "Size Information": "Informazioni sulle dimensioni", "Something went wrong": "Rilevato un errore", "Sort": "Ordina", "Sorted, Ascending": "Ordinato, in sequenza crescente", "Sorted, Descending": "Ordinato, in sequenza decrescente", "Switch Current SAS Profile": "Passa al profilo corrente", "Table Properties": "Proprietà della tabella", "Table: {tableName}": "Tabella: {tableName}", "Task is cancelled.": "Il task è annullato.", "Task is complete.": "Il task è completo.", "Technical Information": "Informazioni tecniche", "The SAS session has closed.": "La sessione SAS è stata chiusa.", "The file type is unsupported.": "Il tipo di file non è supportato.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "Impossibile accedere ai file dal percorso specificato nella definizione del contesto per il SAS Compute Server. Contattare l'amministratore SAS.", "The files cannot be accessed from the specified path.": "Impossibile accedere ai file dal percorso specificato.", "The folder name cannot contain more than 100 characters or have invalid characters.": "Il nome della cartella non può avere una lunghezza superiore a 100 caratteri o contenere caratteri non validi.", "The item could not be added to My Favorites.": "Impossibile aggiungere l'elemento ai Preferiti.", "The item could not be removed from My Favorites.": "Impossibile rimuovere l'elemento dai Preferiti.", "The notebook file does not contain any code to convert.": "Il file del notebook non contiene codice da convertire.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "Il notebook è stato convertito correttamente in un flusso e salvato nella seguente cartella: {folderName}. È ora possibile aprirlo in SAS Studio. ", "The output file name must end with the .flw extension.": "Il nome del file di output deve terminare con l'estensione .flw.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "Il profilo di connessione SAS {selected} è stato eliminato dal file settings.json.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Rilevato un errore eseguendo il programma SAS. Consultare [console log](command:workbench.action.toggleDevTools) per maggiori dettagli.", "This folder contains unsaved files, are you sure you want to delete?": "Questa cartella contiene file non salvati; eliminarli?", "This platform does not support this connection type.": "Questa piattaforma non supporta questo tipo di connessione.", "To use the SSH Agent or a password, leave blank.": "Per usare l'agente SSH o una password, lasciare il campo vuoto.", "Type": "Tipo", "Unable to add file to my folder.": "Impossibile aggiungere il file alla cartella personale.", "Unable to create file \"{name}\".": "Impossibile creare il file \"{name}\".", "Unable to create folder \"{name}\".": "Impossibile creare la cartella \"{name}\".", "Unable to delete file.": "Impossibile eliminare il file.", "Unable to delete folder.": "Impossibile eliminare la cartella.", "Unable to delete table {tableName}.": "Impossibile eliminare la tabella {tableName}.", "Unable to download files.": "Impossibile effettuare il download dei file.", "Unable to drag files from my favorites.": "Impossibile trascinare i file da Preferiti.", "Unable to drag files from trash.": "Impossibile trascinare i file dal Cestino.", "Unable to drop item \"{name}\".": "Impossibile rilasciare l'elemento \"{name}\".", "Unable to empty the recycle bin.": "Impossibile svuotare il Cestino.", "Unable to load required libraries.": "Impossibile caricare le librerie obbligatorie.", "Unable to rename \"{oldName}\" to \"{newName}\".": "Impossibile rinominare \"{oldName}\" in \"{newName}\".", "Unable to restore file.": "Impossibile ripristinare il file.", "Unable to restore folder.": "Impossibile ripristinare la cartella.", "Unable to upload files.": "Impossibile eseguire l'upload dei file.", "Uploading files...": "Upload dei file...", "User {username} {prompt}": "Utente {username} {prompt}", "View SAS Table": "Visualizza la tabella SAS", "You can also specify connection profile using the settings.json file.": "È possibile specificare il profilo di connessione anche utilizzando il file settings.json.", "You must save your file before you can rename it.": "Occorre salvare il file prima di poterlo rinominare.", "output": "output", "{basename}_Copy{number}{ext}": "{basename}_Copia{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.ja.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "テーブルデータのロード中にエラーが発生しました。これは通常、テーブルが大きすぎるか、データを処理できなかった場合に発生します。詳細については、コンソールを参照してください。", "Are you sure you want to delete the selected tables?": "選択したテーブルを削除しますか?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "すべてのアイテムを完全に削除しますか? このアクションは元に戻せません。", "Are you sure you want to permanently delete the item \"{name}\"?": "アイテム \"{name}\" を完全に削除しますか?", "Ascending": "昇順", "Ascending (add to sorting)": "昇順 (並べ替えに追加)", "Bookmark Length": "ブックマーク長", "Cancelling job...": "ジョブをキャンセルしています...", "Cannot call self on ComputeSession with no id": "ID なしで ComputeSession で self を呼び出すことはできません", "Cannot call self on object with no id": "ID なしでオブジェクトで self を呼び出すことはできません", "Cannot connect to SAS Studio service": "SAS Studio サービスに接続できません", "Cannot find file: {file}": "ファイルが見つかりません: {file}", "Character": "文字", "Character Encoding": "文字エンコーディング", "Choose output type to save": "保存する出力の種類を選択", "Choose where to save your files.": "ファイルを保存する場所を選択します。", "Clear": "クリア", "Client ID": "クライアント ID", "Client Secret": "クライアントシークレット", "Close Session": "セッションを閉じる", "Columns": "列", "Columns ({count})": "列 ({count})", "Compression": "圧縮", "Compute Context not found: {name}": "計算コンテキストが見つかりません: {name}", "Connecting to SAS session...": "SAS Server に接続しています...", "Connection Type": "接続の種類", "Converting SAS notebook to flow...": "SAS ノートブックをフローに変換しています...", "Could not connect to the SAS server.": "SAS サーバーに接続できませんでした。", "Created": "作成", "Currency": "通貨", "Date": "日付", "Datetime": "日時", "Delete": "削除", "Descending": "降順", "Descending (add to sorting)": "降順 (並べ替えに追加)", "Downloading files...": "ファイルをダウンロードしています...", "Engine": "エンジン", "Enter a client ID": "クライアント ID を入力してください", "Enter a client secret": "クライアントシークレットを入力してください", "Enter a file name.": "ファイル名を入力します。", "Enter a folder name.": "フォルダー名を入力します。", "Enter a name for the new .flw file": "新しい .flw ファイルの名前を入力します。", "Enter a new name.": "新しい名前を入力します。", "Enter a port number": "ポート番号を入力してください", "Enter a port number.": "ポート番号を入力します。", "Enter connection name": "接続名を入力してください", "Enter expression": "式の入力", "Enter secret for client ID. An example is myapp.secret.": "クライアント ID のシークレットを入力します。例: myapp.secret", "Enter the SAS compute context": "SAS 計算コンテキストを入力してください", "Enter the SAS compute context.": "SAS 計算コンテキストを入力します。", "Enter the URL": "URL を入力してください", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "SAS Viya サーバーの URL を入力します。例: https://example.sas.com", "Enter the local private key file path": "ローカル秘密キーのファイルパスを入力", "Enter the name of the SAS 9 server.": "SAS 9 Server の名前を入力します。", "Enter the passphrase for the private key": "秘密キーファイルのパスフレーズを入力", "Enter the password for user: {username}": "ユーザーのパスワードを入力: {username}", "Enter the registered client ID. An example is myapp.client.": "登録されているクライアント ID を入力します。例: myapp.client", "Enter the server name": "サーバー名を入力してください", "Enter the server path": "サーバーパスを入力してください", "Enter the server path of the SAS Executable.": "SAS 実行可能ファイルのサーバーパスを入力します。", "Enter your SAS server username.": "SAS Server のユーザー名を入力します。", "Enter your password": "パスワードの入力", "Enter your password for this connection.": "この接続のパスワードを入力してください。", "Enter your username": "ユーザー名を入力して下さい", "Error converting the notebook file to .flw format.": "ノートブックファイルを .flw 形式に変換する際にエラーが発生しました。", "Error getting server with ID {id} - {message}": "ID {id} のサーバーの取得エラー - {message}", "Error getting session with ID {id} - {message}": "ID {id} のセッションの取得中にエラーが発生しました - {message}", "Error reading private key file: {filePath}, error: {message}": "秘密キーファイルの読み取りエラー: {filePath}、エラー: {message}", "Export as HTML file": "HTML ファイル形式でエクスポート", "Export as SAS program file": "SAS プログラムファイル形式でエクスポート", "Extended Type": "拡張タイプ", "Failed to export notebook: {0}": "ノートブックのエクスポートに失敗しました: {0}", "Failed to get state from Session {sessionId}": "セッション {sessionId} から状態を取得できませんでした", "File added to my folder.": "ファイルがマイフォルダーに追加されました。", "Format": "出力形式", "General": "一般", "General Information": "一般情報", "HTML": "HTML", "Ignore: all": "Ignore: すべて", "Ignore: current position": "Ignore: 現在の位置", "Ignore: error": "Ignore: エラー", "Ignore: warning": "Ignore: 警告", "Informat": "入力形式", "Invalid connectionType. Check Profile settings.": "無効な接続タイプです。プロファイル設定を確認してください。", "Invalid file name.": "無効なファイル名です。", "Job does not have '{linkName}' link": "ジョブには '{linkName}' リンクがありません", "Label": "ラベル", "Length": "長さ", "Library": "ライブラリ", "Logical Record Count": "論理レコード数", "Method not implemented.": "メソッドは実装されていません。", "Missing connectionType in active profile.": "アクティブなプロファイルに connectionType がありません。", "Missing endpoint in active profile.": "アクティブなプロファイルに endpoint がありません。", "Missing host in active profile.": "アクティブなプロファイルに host がありません。", "Missing port in active profile.": "アクティブなプロファイルに port がありません。", "Missing sas path in active profile.": "アクティブなプロファイルに sas path がありません。", "Missing username in active profile.": "アクティブなプロファイルに username がありません。", "Modified": "変更", "Move to Recycle Bin": "ごみ箱に移動", "Name": "名前", "New File": "ファイルの新規作成", "New Folder": "フォルダーの新規作成", "New SAS Connection Profile Name": "新しい SAS 接続プロファイル名", "No Active Profile": "アクティブなプロファイルがありません", "No Profile": "プロファイルがありません", "No Profiles available to delete": "削除するプロファイルがありません", "No SAS Connection Profile": "SAS 接続プロファイルがありません", "No authorization code": "認証コードがありません", "No data matches the current filters.": "現在のフィルターに一致するデータはありません。", "Not implemented": "実装されていません", "Notebook exported to {0}": "ノートブックが {0} にエクスポートされました", "Number of Columns": "列数", "Number of Rows": "行数", "Numeric": "数値", "Options": "オプション", "Passphrase Required": "パスフレーズが必要です", "Password Required": "パスワードが必要です", "Paste authorization code here": "ここに認証コードを貼り付けます", "Physical Record Count": "物理レコード数", "Port Number": "ポート番号", "Private Key File Path (optional)": "秘密キーファイルパス(オプション)", "Properties": "プロパティ", "Python Program": "Pythonプログラム", "Record Length": "レコード長", "Remove all sorting": "並べ替えをすべて削除", "Remove sorting": "並べ替えを削除", "Rename File": "ファイル名の変更", "Rename Folder": "フォルダー名の変更", "Result": "結果", "Result: {result}": "結果: {result}", "Row number": "行番号", "SAS 9 Server": "SAS 9 Server", "SAS Code": "SAS コード", "SAS Compute Context": "SAS 計算コンテキスト", "SAS Log": "SAS ログ", "SAS Log: {name}": "SAS ログ: {name}", "SAS Profile": "SAS プロファイル", "SAS Program": "SAS プログラム", "SAS Server Username": "SAS Server ユーザー名", "SAS Viya Server": "SAS Viya Server", "SAS code running...": "SAS コードを実行しています...", "SQL Program": "SQL プログラム", "Save": "保存", "Save Log": "ログの保存", "Save ODS HTML": "ODS HTML の保存", "Saved to {0}": "{0} に保存", "Saving {itemName}.": "{itemName} を保存しています...", "Search": "検索", "Select a Connection Type": "接続の種類を選択してください", "Select a Connection Type.": "接続の種類を選択します", "Select a SAS connection profile": "SAS 接続プロファイルを選択する", "Select export format": "エクスポート形式の選択", "Server Path": "サーバーパス", "Server does not have createSession link": "サーバーには createSession リンクがありません", "Server does not have state link": "サーバーには状態リンクがありません", "Session does not have '{linkName}' link": "セッションには '{linkName}' リンクがありません", "Show results...": "結果を表示...", "Size Information": "サイズ情報", "Something went wrong": "問題が発生しました", "Sort": "並べ替え", "Sorted, Ascending": "並べ替え (昇順)", "Sorted, Descending": "並べ替え (降順)", "Switch Current SAS Profile": "現在の SAS プロファイルを切り替える", "Table Properties": "テーブルプロパティ", "Table: {tableName}": "テーブル: {tableName}", "Task is cancelled.": "タスクがキャンセルされました。", "Task is complete.": "タスクは完了しました。", "Technical Information": "技術情報", "The SAS session has closed.": "SAS セッションが終了しました。", "The file type is unsupported.": "ファイルの種類はサポートされていません。", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "SAS Compute Server のコンテキスト定義で指定されたパスからファイルにアクセスできません。SAS 管理者に問い合わせてください。", "The files cannot be accessed from the specified path.": "指定されたパスからファイルにアクセスできません。", "The folder name cannot contain more than 100 characters or have invalid characters.": "フォルダー名には 100 文字を超える文字や無効な文字を含めることはできません。", "The item could not be added to My Favorites.": "アイテムをお気に入りに追加できませんでした。", "The item could not be removed from My Favorites.": "アイテムをお気に入りから削除できませんでした。", "The notebook file does not contain any code to convert.": "ノートブックファイルには、変換するコードが含まれていません。", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "ノートブックは正常にフローに変換され、フォルダー: {folderName} に保存されました。SAS Studioで開くことができます。", "The output file name must end with the .flw extension.": "出力ファイル名は .flw 拡張子で終わる必要があります。", "The {selected} SAS connection profile has been deleted from the settings.json file.": "{selected} SAS 接続プロファイルが settings.json ファイルから削除されました。", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "SAS プログラムの実行中にエラーが発生しました。詳細については、[コンソールログ](command:workbench.action.toggleDevTools) を参照してください。", "This folder contains unsaved files, are you sure you want to delete?": "このフォルダーには未保存のファイルが含まれています。削除しますか?", "This platform does not support this connection type.": "このプラットフォームはこの接続タイプをサポートしていません。", "To use the SSH Agent or a password, leave blank.": "SSH エージェントまたはパスワードを使用する場合は、空白のままにします。", "Type": "タイプ", "Unable to add file to my folder.": "ファイルをマイフォルダーに追加できません。", "Unable to create file \"{name}\".": "ファイル \"{name}\" を作成できません。", "Unable to create folder \"{name}\".": "フォルダー \"{name}\" を作成できません。", "Unable to delete file.": "ファイルを削除できません。", "Unable to delete folder.": "フォルダーを削除できません。", "Unable to delete table {tableName}.": "テーブル {tableName} を削除できません。", "Unable to download files.": "ファイルをダウンロードできません。", "Unable to drag files from my favorites.": "お気に入りからファイルをドラッグできません。", "Unable to drag files from trash.": "ゴミ箱からファイルをドラッグできません。", "Unable to drop item \"{name}\".": "アイテム \"{name}\" をドロップできません。", "Unable to empty the recycle bin.": "ごみ箱を空にできません。", "Unable to load required libraries.": "必要なライブラリをロードできません。", "Unable to rename \"{oldName}\" to \"{newName}\".": "\"{oldName}\" の名前を \"{newName}\" に変更できません。", "Unable to restore file.": "ファイルを復元できません。", "Unable to restore folder.": "フォルダーを復元できません。", "Unable to upload files.": "ファイルをアップロードできません。", "Uploading files...": "ファイルをアップロードしています...", "User {username} {prompt}": "ユーザー {username} {prompt}", "View SAS Table": "SAS テーブルの表示", "You can also specify connection profile using the settings.json file.": "settings.json ファイルを使用して接続プロファイルを指定することもできます。", "You must save your file before you can rename it.": "ファイル名を変更する前に、ファイルを保存する必要があります。", "output": "出力", "{basename}_Copy{number}{ext}": "{basename}_Copy{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.ko.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "테이블 데이터를 로드하는 중에 오류가 발생했습니다. 이는 일반적으로 테이블이 너무 크거나 데이터를 처리할 수 없는 경우에 발생합니다. 자세한 내용은 콘솔을 참조하세요.", "Are you sure you want to delete the selected tables?": "선택한 테이블을 삭제하시겠습니까?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "모든 항목을 영구적으로 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", "Are you sure you want to permanently delete the item \"{name}\"?": "항목 \"{name}\"을(를) 영구적으로 삭제하시겠습니까?", "Ascending": "오름차순", "Ascending (add to sorting)": "오름차순(정렬에 추가)", "Bookmark Length": "북마크 길이", "Cancelling job...": "작업 취소 중...", "Cannot call self on ComputeSession with no id": "id가 없는 ComputeSession에서 self를 호출할 수 없습니다", "Cannot call self on object with no id": "id가 없는 개체에서 self를 호출할 수 없습니다", "Cannot connect to SAS Studio service": "SAS Studio 서비스에 연결할 수 없습니다", "Cannot find file: {file}": "파일을 찾을 수 없습니다: {file}", "Character": "문자", "Character Encoding": "문자 인코딩", "Choose output type to save": "저장할 출력 유형 선택", "Choose where to save your files.": "파일을 저장할 위치 선택.", "Clear": "지우기", "Client ID": "클라이언트 ID", "Client Secret": "클라이언트 비밀번호", "Close Session": "세션 닫기", "Columns": "칼럼", "Columns ({count})": "칼럼 ({count})", "Compression": "압축", "Compute Context not found: {name}": "컴퓨팅 컨텍스트를 찾을 수 없음: {name}", "Connecting to SAS session...": "SAS 세션에 연결 중...", "Connection Type": "연결 유형", "Converting SAS notebook to flow...": "SAS 노트북을 플로우로 변환하는 중...", "Could not connect to the SAS server.": "SAS 서버에 연결할 수 없습니다.", "Created": "생성일", "Currency": "통화", "Date": "날짜", "Datetime": "날짜시간", "Delete": "삭제", "Descending": "내림차순", "Descending (add to sorting)": "내림차순(정렬에 추가)", "Downloading files...": "파일 다운로드 중...", "Engine": "엔진", "Enter a client ID": "클라이언트 ID를 입력하세요", "Enter a client secret": "클라이언트 비밀번호를 입력하세요", "Enter a file name.": "파일 이름을 입력하세요.", "Enter a folder name.": "폴더 이름을 입력하세요.", "Enter a name for the new .flw file": "새 .flw 파일의 이름을 입력하세요", "Enter a new name.": "새 이름을 입력하세요.", "Enter a port number": "포트 번호를 입력하세요", "Enter a port number.": "포트 번호를 입력하세요.", "Enter connection name": "연결 이름을 입력하세요", "Enter expression": "표현식 입력", "Enter secret for client ID. An example is myapp.secret.": "클라이언트 ID의 비밀번호를 입력하세요. 예시: myapp.secret.", "Enter the SAS compute context": "SAS 컴퓨팅 컨텍스트를 입력하세요", "Enter the SAS compute context.": "SAS 컴퓨팅 컨텍스트를 입력하세요.", "Enter the URL": "URL을 입력하세요", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "SAS Viya 서버의 URL을 입력하세요. 예시: https://example.sas.com", "Enter the local private key file path": "로컬 개인 키 파일 경로를 입력하십시오.", "Enter the name of the SAS 9 server.": "SAS 9 서버의 이름을 입력하십시오.", "Enter the passphrase for the private key": "개인 키의 패스프레이즈를 입력하십시오.", "Enter the password for user: {username}": "사용자 {username}의 비밀번호를 입력하십시오.", "Enter the registered client ID. An example is myapp.client.": "등록된 클라이언트 ID를 입력하세요. 예시: myapp.client.", "Enter the server name": "서버 이름을 입력하세요", "Enter the server path": "서버 경로를 입력하세요", "Enter the server path of the SAS Executable.": "SAS 실행 파일의 서버 경로를 입력하세요.", "Enter your SAS server username.": "SAS 서버 사용자 이름을 입력하세요.", "Enter your password": "비밀번호를 입력하세요", "Enter your password for this connection.": "이 연결에 대한 비밀번호를 입력하세요.", "Enter your username": "사용자 이름을 입력하세요", "Error converting the notebook file to .flw format.": "노트북 파일을 .flw 형식으로 변환하는 중 오류가 발생했습니다.", "Error getting server with ID {id} - {message}": "ID {id} - {message} 서버를 가져오는 중 오류 발생", "Error getting session with ID {id} - {message}": "ID {id} - {message} 세션을 가져오는 중 오류 발생", "Error reading private key file: {filePath}, error: {message}": "개인 키 파일 읽기 오류: {filePath}, 오류: {message}", "Export as HTML file": "HTML 파일로 내보내기", "Export as SAS program file": "SAS 프로그램 파일로 내보내기", "Extended Type": "확장된 유형", "Failed to export notebook: {0}": "노트북으로 내보내지 못함: {0}", "Failed to get state from Session {sessionId}": "{sessionId} 세션에서 상태를 가져오지 못했습니다", "File added to my folder.": "파일이 내 폴더에 추가되었습니다.", "Format": "출력형식", "General": "일반", "General Information": "일반 속성", "HTML": "HTML", "Ignore: all": "무시: 전체", "Ignore: current position": "무시: 현재 위치", "Ignore: error": "무시: 오류", "Ignore: warning": "무시: 경고", "Informat": "입력형식", "Invalid connectionType. Check Profile settings.": "유효하지 않은 연결 유형입니다. 프로필 설정을 확인하세요.", "Invalid file name.": "유효하지 않은 파일 이름입니다.", "Job does not have '{linkName}' link": "작업에 '{linkName}' 링크가 없습니다", "Label": "레이블", "Length": "길이", "Library": "라이브러리", "Logical Record Count": "논리적 레코드 수", "Method not implemented.": "메서드가 구현되지 않았습니다.", "Missing connectionType in active profile.": "활성 프로필에 연결 유형이 누락되었습니다.", "Missing endpoint in active profile.": "활성 프로필에 엔드포인트가 누락되었습니다.", "Missing host in active profile.": "활성 프로필에 호스트가 누락되었습니다.", "Missing port in active profile.": "활성 프로필에 포트가 누락되었습니다.", "Missing sas path in active profile.": "활성 프로필에 SAS 경로가 누락되었습니다.", "Missing username in active profile.": "활성 프로필에 사용자 이름이 누락되었습니다.", "Modified": "수정일", "Move to Recycle Bin": "휴지통으로 이동", "Name": "이름", "New File": "새 파일", "New Folder": "새 폴더", "New SAS Connection Profile Name": "새 SAS 연결 프로필 이름", "No Active Profile": "활성 프로필 없음", "No Profile": "프로필 없음", "No Profiles available to delete": "삭제할 수 있는 프로필이 없습니다", "No SAS Connection Profile": "SAS 연결 프로필 없음", "No authorization code": "인증 코드 없음", "No data matches the current filters.": "현재 필터와 일치하는 데이터가 없습니다.", "Not implemented": "구현되지 않음", "Notebook exported to {0}": "{0}(으)로 내보낸 노트북", "Number of Columns": "칼럼 수", "Number of Rows": "행 수", "Numeric": "숫자", "Options": "옵션", "Passphrase Required": "패스프레이즈 필요", "Password Required": "비밀번호 필요", "Paste authorization code here": "여기에 인증 코드 붙여넣기", "Physical Record Count": "물리적 레코드 수", "Port Number": "포트 번호", "Private Key File Path (optional)": "개인 키 파일 경로 (선택 사항)", "Properties": "속성", "Python Program": "Python 프로그램", "Record Length": "레코드 길이", "Remove all sorting": "모든 장렬 제거", "Remove sorting": "정렬 제거", "Rename File": "파일 이름 변경", "Rename Folder": "폴더 이름 변경", "Result": "결과", "Result: {result}": "결과: {result}", "Row number": "행 번호", "SAS 9 Server": "SAS 9 서버", "SAS Code": "SAS 코드", "SAS Compute Context": "SAS 컴퓨팅 컨텍스트", "SAS Log": "SAS 로그", "SAS Log: {name}": "SAS 로그: {name}", "SAS Profile": "SAS 프로필", "SAS Program": "SAS 프로그램", "SAS Server Username": "SAS 서버 사용자 이름", "SAS Viya Server": "SAS Viya 서버", "SAS code running...": "SAS 코드 실행 중...", "SQL Program": "SQL 프로그램", "Save": "저장", "Save Log": "로그 저장", "Save ODS HTML": "ODS HTML 저장", "Saved to {0}": "{0}에 저장", "Saving {itemName}.": "{itemName} 저장 중...", "Search": "검색", "Select a Connection Type": "연결 유형 선택", "Select a Connection Type.": "연결 유형을 선택하십시오.", "Select a SAS connection profile": "SAS 연결 프로필 선택", "Select export format": "내보내기 출력형시 선택", "Server Path": "서버 경로", "Server does not have createSession link": "서버에 createSession 링크가 없습니다", "Server does not have state link": "서버에 상태 링크가 없습니다", "Session does not have '{linkName}' link": "세션에 '{linkName}' 링크가 없습니다", "Show results...": "결과 표시 중...", "Size Information": "크기 정보", "Something went wrong": "문제가 발생했습니다", "Sort": "정렬", "Sorted, Ascending": "정렬됨, 오름차순", "Sorted, Descending": "정렬됨, 내림차순", "Switch Current SAS Profile": "현재 SAS 프로필 전환", "Table Properties": "테이블 속성", "Table: {tableName}": "테이블: {tableName}", "Task is cancelled.": "작업이 취소되었습니다.", "Task is complete.": "작업이 완료되었습니다.", "Technical Information": "기술 정보", "The SAS session has closed.": "SAS 세션이 종료되었습니다.", "The file type is unsupported.": "지원되지 않는 파일 형식입니다.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "SAS Compute Server에 대한 컨텍스트 정의에 지정된 경로에서 파일에 액세스할 수 없습니다. SAS 관리자에게 문의하십시오.", "The files cannot be accessed from the specified path.": "지정된 경로에서 파일에 액세스할 수 없습니다.", "The folder name cannot contain more than 100 characters or have invalid characters.": "폴더 이름은 100자를 초과하거나 잘못된 문자를 포함할 수 없습니다.", "The item could not be added to My Favorites.": "항목을 즐겨찾기에 추가할 수 없습니다.", "The item could not be removed from My Favorites.": "항목을 즐겨찾기에서 제거할 수 없습니다.", "The notebook file does not contain any code to convert.": "노트북 파일에 변환할 코드가 포함되어 있지 않습니다.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "노트북이 성공적으로 플로우로 변환되어 다음 폴더에 저장되었습니다: {folderName}. 이제 SAS Studio에서 열 수 있습니다.", "The output file name must end with the .flw extension.": "출력 파일 이름은 .flw 확장자로 끝나야 합니다.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "{selected} SAS 연결 프로필이 settings.json 파일에서 삭제되었습니다.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "SAS 프로그램을 실행하는 동안 오류가 발생했습니다. 자세한 내용은 [콘솔 로그](command:workbench.action.toggleDevTools)를 참조하십시오.", "This folder contains unsaved files, are you sure you want to delete?": "이 폴더에 저장되지 않은 파일이 있습니다. 삭제하시겠습니까?", "This platform does not support this connection type.": "이 플랫폼은 이 연결 유형을 지원하지 않습니다.", "To use the SSH Agent or a password, leave blank.": "SSH 에이전트나 비밀번호를 사용하려면 비워 두십시오.", "Type": "유형", "Unable to add file to my folder.": "파일을 내 폴더에 추가할 수 없습니다.", "Unable to create file \"{name}\".": "\"{name}\" 파일을 생성할 수 없습니다.", "Unable to create folder \"{name}\".": "\"{name}\" 폴더를 생성할 수 없습니다.", "Unable to delete file.": "파일을 삭제할 수 없습니다.", "Unable to delete folder.": "폴더를 삭제할 수 없습니다.", "Unable to delete table {tableName}.": "{tableName} 테이블을 삭제할 수 없습니다.", "Unable to download files.": "파일을 다운로드할 수 없습니다.", "Unable to drag files from my favorites.": "즐겨찾기에서 파일을 드래그할 수 없습니다.", "Unable to drag files from trash.": "휴지통에서 파일을 드래그할 수 없습니다.", "Unable to drop item \"{name}\".": "\"{name}\" 항목을 놓을 수 없습니다.", "Unable to empty the recycle bin.": "휴지통을 비울 수 없습니다", "Unable to load required libraries.": "필요한 라이브러리를 로드할 수 없습니다.", "Unable to rename \"{oldName}\" to \"{newName}\".": "\"{oldName}\"을(를) \"{newName}\" 이름으로 바꿀 수 없습니다.", "Unable to restore file.": "파일을 복원할 수 없습니다.", "Unable to restore folder.": "폴더를 복원할 수 없습니다.", "Unable to upload files.": "파일을 업로드할 수 없습니다.", "Uploading files...": "파일 업로드 중...", "User {username} {prompt}": "사용자 {username} {prompt}", "View SAS Table": "SAS 테이블 보기", "You can also specify connection profile using the settings.json file.": "settings.json 파일을 사용하여 연결 프로필을 지정할 수도 있습니다.", "You must save your file before you can rename it.": "파일 이름을 바꾸기 전에 파일을 저장해야 합니다.", "output": "출력", "{basename}_Copy{number}{ext}": "{basename}_Copy{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.pl.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Podczas ładowania tabeli danych wystąpił błąd. Zdarza się to zwykle gdy tabela jest zbyt duża lub gdy nie można przetworzyć danych. Szczegółowe informacje znajdziesz w konsoli", "Are you sure you want to delete the selected tables?": "Czy na pewno chcesz usunąć wybrane tabele?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Czy na pewno chcesz trwale usunąć te wszystkie elementy? Jest to działanie nieodwracalne.", "Are you sure you want to permanently delete the item \"{name}\"?": "Czy na pewno chcesz trwale usunąć element o nazwie \"{name}\"?", "Ascending": "Rosnąco", "Ascending (add to sorting)": "Rosnąco (dodaj do sortowania)", "Bookmark Length": "Długość zakładki", "Cancelling job...": "Anulowanie procesu...", "Cannot call self on ComputeSession with no id": "Nie można się wywołać na sesji obliczeniowej bez identyfikatora", "Cannot call self on object with no id": "Nie można się wywołać na obiekcie bez identyfikatora", "Cannot connect to SAS Studio service": "Nie można połączyć się z usługą SAS Studio", "Cannot find file: {file}": "Nie znaleziono pliku", "Character": "Znakowe", "Character Encoding": "Kodowanie znaków", "Choose output type to save": "Wybierz typ zapisywanych wyników", "Choose where to save your files.": "Wybierz gdzie chcesz zapisać pliki.", "Clear": "Wyczyść", "Client ID": "Identyfikator klienta", "Client Secret": "Klucz tajny klienta", "Close Session": "Zamknij sesję", "Columns": "Kolumny", "Columns ({count})": "Kolumny ({count})", "Compression": "Kompresja", "Compute Context not found: {name}": "Nie znaleziono kontekstu obliczeniowego: {name}", "Connecting to SAS session...": "Łączenie z sesją SAS-a…", "Connection Type": "Typ połączenia", "Converting SAS notebook to flow...": "Konwersja notatnika SAS-owego na przepływ...", "Could not connect to the SAS server.": "Nie można połączyć się z serwerem SAS-a", "Created": "Utworzono", "Currency": "Waluta", "Date": "Data", "Datetime": "Data-czas", "Delete": "Usuń", "Descending": "Malejąco", "Descending (add to sorting)": "Malejąco (dodaj do sortowania)", "Downloading files...": "Pobieranie plików...", "Engine": "Mechanizm", "Enter a client ID": "Wprowadź identyfikator klienta", "Enter a client secret": "Wprowadź klucz tajny klienta", "Enter a file name.": "Wprowadź nazwę pliku.", "Enter a folder name.": "Wprowadź nazwę folderu.", "Enter a name for the new .flw file": "Wprowadź nazwę nowego pliku .flw", "Enter a new name.": "Wprowadź nową nazwę.", "Enter a port number": "Wprowadź numer portu", "Enter a port number.": "Wprowadź numer portu.", "Enter connection name": "Wprowadź nazwę połączenia", "Enter expression": "Wpisz wyrażenie", "Enter secret for client ID. An example is myapp.secret.": "Wprowadź klucz tajny klienta. Przykład to myapp.secret.", "Enter the SAS compute context": "Wprowadź kontekst obliczeniowy SAS-a", "Enter the SAS compute context.": "Wprowadź kontekst obliczeniowy SAS-a", "Enter the URL": "Wprowadź adres URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Wprowadź adres URL dla serwera SAS Viya", "Enter the local private key file path": "Wprowadź ścieżkę do pliku lokalnego klucza prywatnego", "Enter the name of the SAS 9 server.": "Wprowadź nazwę serwera SAS-a 9.", "Enter the passphrase for the private key": "Wpisz kod dla klucza prywatnego", "Enter the password for user: {username}": "Wprowadź hasło użytkownika: {username}", "Enter the registered client ID. An example is myapp.client.": "Wprowadź zarejestrowany identyfikator klienta. Przykład to myapp.client", "Enter the server name": "Wprowadź nazwę serwera", "Enter the server path": "Wprowadź ścieżkę do serwera", "Enter the server path of the SAS Executable.": "Wprowadź ścieżkę do serwera dla SAS Executable.", "Enter your SAS server username.": "Wprowadź swoją nazwę użytkownika serwera SAS-a.", "Enter your password": "Wprowadź hasło", "Enter your password for this connection.": "Wprowadź hasło dla tego połączenia", "Enter your username": "Wprowadź swoją nazwę użytkownika", "Error converting the notebook file to .flw format.": "Błąd konwersji pliku notatnika do formatu .flw.", "Error getting server with ID {id} - {message}": "Błąd pobierania serwera o identyfikatorze {id} - {message}", "Error getting session with ID {id} - {message}": "Błąd pobierania sesji o identyfikatorze {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Error reading private key file: {filePath}, error: {message}", "Export as HTML file": "Eksportuj jako plik HTML", "Export as SAS program file": "Eksportuj jako plik programu SAS-owego", "Extended Type": "Typ rozszerzony", "Failed to export notebook: {0}": "Nie wyeksortowano notatnika: {0}", "Failed to get state from Session {sessionId}": "Nie pobrano statusu sesji {sessionId}", "File added to my folder.": "Plik dodano do mojego folderu.", "Format": "Format", "General": "Ogólne", "General Information": "Informacje ogólne", "HTML": "HTML", "Ignore: all": "Zignoruj: wszystko", "Ignore: current position": "Zignoruj: bieżącą pozycję", "Ignore: error": "Zignoruj: błąd", "Ignore: warning": "Zignoruj: ostrzeżenie", "Informat": "Informat", "Invalid connectionType. Check Profile settings.": "Nieprawidłowy typ połączenia. Sprawdź ustawienia profilu.", "Invalid file name.": "Nieprawidłowa nazwa pliku.", "Job does not have '{linkName}' link": "Proces nie ma łącza '{linkName}'", "Label": "Etykieta", "Length": "Długość", "Library": "Biblioteka", "Logical Record Count": "Liczba rekordów logicznych", "Method not implemented.": "Nie zastosowano metody.", "Missing connectionType in active profile.": "W aktywnym profilu brak typu połączenia", "Missing endpoint in active profile.": "W aktywnym profilu brak punktu końcowego", "Missing host in active profile.": "W aktywnym profilu brak hosta", "Missing port in active profile.": "W aktywnym profilu brak portu", "Missing sas path in active profile.": "W aktywnym profilu brak ścieżki SAS-owej", "Missing username in active profile.": "W aktywnym profilu brak nazwy użytkownika", "Modified": "Zmodyfikowano", "Move to Recycle Bin": "Przenieś do Kosza", "Name": "Nazwa", "New File": "Nowy plik", "New Folder": "Nowy folder", "New SAS Connection Profile Name": "Nowa nazwa profilu połączenia SAS-owego", "No Active Profile": "Brak aktywnego profilu", "No Profile": "Brak profilu", "No Profiles available to delete": "Brak dostępnych profilów do usunięcia", "No SAS Connection Profile": "Brak profilu połączenia SAS-owego", "No authorization code": "Brak kodu autoryzacji", "No data matches the current filters.": "Brak dopasowań danych dla bieżących filtrów.", "Not implemented": "Nie wdrożono", "Notebook exported to {0}": "Notatnik wyeksportowany do {0}", "Number of Columns": "Liczba kolumn", "Number of Rows": "Liczba wierszy", "Numeric": "Numeryczne", "Options": "Opcje", "Passphrase Required": "Kod wymagany", "Password Required": "Hasło wymagane", "Paste authorization code here": "Tu wklej kod autoryzacji", "Physical Record Count": "Liczba rekordów fizycznych", "Port Number": "Numer portu", "Private Key File Path (optional)": "Ścieżka do pliku klucza prywatnego (opcjonalna)", "Properties": "Właściwości", "Python Program": "Program Pythona", "Record Length": "Długość rekordu", "Remove all sorting": "Usuń wszystkie sortowania", "Remove sorting": "Usuń sortowanie", "Rename File": "Zmień nazwę pliku", "Rename Folder": "Zmień nazwę folderu", "Result": "Rezultat", "Result: {result}": "Rezultat: {result}", "Row number": "Numer wiersza", "SAS 9 Server": "Serwer SAS-a 9", "SAS Code": "Kod SAS-owy", "SAS Compute Context": "Kontekst obliczeniowy SAS-a", "SAS Log": "Log SAS-owy", "SAS Log: {name}": "Log SAS-owy: {name}", "SAS Profile": "Profil SAS-owy", "SAS Program": "Program SAS-a", "SAS Server Username": "Nazwa użytkownika serwera SAS-a", "SAS Viya Server": "Serwer SAS Viya", "SAS code running...": "Kod SAS-owy uruchomiony...", "SQL Program": "Program SQL-a", "Save": "Zapisz", "Save Log": "Zapisz log", "Save ODS HTML": "Zapisz ODS HTML", "Saved to {0}": "Zapisano w {0}", "Saving {itemName}.": "Zapisywanie elementu {itemName}.", "Search": "Wyszukaj", "Select a Connection Type": "Wybierz typ połączenia", "Select a Connection Type.": "Wybierz typ połączenia.", "Select a SAS connection profile": "Wybierz profil połączenia SAS-owego", "Select export format": "Wybierz format eksportu", "Server Path": "Ścieżka do serwera", "Server does not have createSession link": "Serwer nie ma łącza createSession", "Server does not have state link": "Serwer nie ma łącza statusu", "Session does not have '{linkName}' link": "Sesja nie ma łącza '{linkName}'", "Show results...": "Pokaż rezultaty...", "Size Information": "Wielkość informacji", "Something went wrong": "Coś poszło nie tak", "Sort": "Sortuj", "Sorted, Ascending": "Posortowane, Rosnąco", "Sorted, Descending": "Posortowane, Malejąco", "Switch Current SAS Profile": "Przełącz bieżący profil SAS-owy", "Table Properties": "Table Properties", "Table: {tableName}": "Tabela: {tableName}", "Task is cancelled.": "Zadanie anulowane.", "Task is complete.": "Zadanie ukończone", "Technical Information": "Informacje techniczne", "The SAS session has closed.": "Sesja SAS-owa została zamknięta.", "The file type is unsupported.": "Ten typ pliku nie jest obsługiwany.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "Nie można uzyskać dostępu do plików za pomocą ścieżki podanej w definicji kontekstu serwera obliczeniowego SAS-a. Zwróć się do administratora SAS-a.", "The files cannot be accessed from the specified path.": "Z podanej ścieżki nie można uzyskać dostępu do plików.", "The folder name cannot contain more than 100 characters or have invalid characters.": "Nazwa folderu nie może zawierać więcej niż 100 znaków ani nie może zawierać nieprawidłowych znaków.", "The item could not be added to My Favorites.": "Elementu nie można dodać do Moich ulubionych.", "The item could not be removed from My Favorites.": "Tego elementu nie można usunąć z Moich ulubionych.", "The notebook file does not contain any code to convert.": "Plik notatnika nie zawiera żadnego kodu który można skonwertować.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "Notatnik został przekonwertowany na przepływ i zapisany w folderze: {folderName}. Można go teraz otworzyć w SAS Studio.", "The output file name must end with the .flw extension.": "Nazwa pliku wynikowego musi mieć rozszerzenie .flw.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "Profil połączenia SAS-wego {selected} został usunięty z pliku settings.json.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Podczas wykonywania programu SAS-owego wystąpił błąd. Dalsze informacje znajdziesz w [console log](command:workbench.action.toggleDevTools)", "This folder contains unsaved files, are you sure you want to delete?": "Ten folder zawiera niezapisane piki; czy na pewno chcesz je usunąć?", "This platform does not support this connection type.": "Ta platforma nie obsługuje tego typu połączenia", "To use the SSH Agent or a password, leave blank.": "To use the SSH Agent or a password, leave blank.", "Type": "Typ", "Unable to add file to my folder.": "Nie można dodać pliku do mojego folderu.", "Unable to create file \"{name}\".": "Nie można utworzyć pliku \"{name}\".", "Unable to create folder \"{name}\".": "Nie można utworzyć folderu \"{name}\".", "Unable to delete file.": "Nie można usunąć pliku.", "Unable to delete folder.": "Nie można usunąć folderu.", "Unable to delete table {tableName}.": "Nie można usunąć tabeli {tableName}.", "Unable to download files.": "Nie można pobrać plików.", "Unable to drag files from my favorites.": "Nie można przeciągnąć plików z Moich ulubionych.", "Unable to drag files from trash.": "Nie można przywrócić plików z Kosza.", "Unable to drop item \"{name}\".": "Nie można upuścić elementu \"{name}\".", "Unable to empty the recycle bin.": "Nie można opróżnić Kosza.", "Unable to load required libraries.": "Nie można załadować żądanych bibliotek", "Unable to rename \"{oldName}\" to \"{newName}\".": "Nie można zmienić nazwy z \"{oldName}\" na \"{newName}\".", "Unable to restore file.": "Nie można przywrócić pliku.", "Unable to restore folder.": "Nie można przywrócić folderu.", "Unable to upload files.": "Nie można załadować plików.", "Uploading files...": "Załadowywanie plików...", "User {username} {prompt}": "Użytkownik {username} {prompt}", "View SAS Table": "Wyświetl tabelę SAS-ową", "You can also specify connection profile using the settings.json file.": "Można także określić profil połączenia za pomocą pliku settings.json", "You must save your file before you can rename it.": "Przed zmianą nazwy pliku należy go zapisać.", "output": "wyniki", "{basename}_Copy{number}{ext}": "{basename}_kopia{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.pt-br.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "Foi encontrado um erro ao carregar a tabela. Geralmente, isso acontece quando a tabela é grande demais ou os dados não podem ser processados. Consulte o console para obter mais informacões.", "Are you sure you want to delete the selected tables?": "Você tem certeza que quer deletar as tabelas selecionadas?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "Tem certeza que deseja excluir todos estes itens permanentemente? Não é possível desfazer esta ação.", "Are you sure you want to permanently delete the item \"{name}\"?": "Tem certeza que desejas excluir este iten permanentemente \"{name}\"?", "Ascending": "Crescente", "Ascending (add to sorting)": "Crescente (adicionar a ordenação)", "Bookmark Length": "Tamanho do marcador", "Cancelling job...": "Cancellando esta tarefa...", "Cannot call self on ComputeSession with no id": "Uma Compute Session sem identificação (ID) não pode chamar a si mesmo", "Cannot call self on object with no id": "Um objeto sem ID não pode chamar a si mesmo", "Cannot connect to SAS Studio service": "Não é possível conectar ao serviço SAS Studio", "Cannot find file: {file}": "Não é possível localizar o arquivo: {file}", "Character": "Caractere", "Character Encoding": "Codificação de caractere", "Choose output type to save": "Escolha o tipo de saída para salvar", "Choose where to save your files.": "Seleciona o local onde queres salvar os seus arquivos.", "Clear": "Limpar", "Client ID": "ID do Cliente", "Client Secret": "Segredo do Cliente", "Close Session": "Fecha a Sessão", "Columns": "Colunas", "Columns ({count})": "Colunas ({count})", "Compression": "Compressão", "Compute Context not found: {name}": "Contexto Computacional não encontrado: {name}", "Connecting to SAS session...": "Conectando à sessão de SAS...", "Connection Type": "Tipo de ligação", "Converting SAS notebook to flow...": "Convertendo o notebook SAS ao um Flow...", "Could not connect to the SAS server.": "Foi impossível conectar ao servidor SAS.", "Created": "Criado", "Currency": "Moeda", "Date": "Data", "Datetime": "Data/Hora", "Delete": "Exclui", "Descending": "Descrescente", "Descending (add to sorting)": "Decrescente (adicionar a ordenação)", "Downloading files...": "Descarregando arquivos...", "Engine": "Máquina", "Enter a client ID": "Insere o ID do cliente", "Enter a client secret": "Insere o segredo do cliente", "Enter a file name.": "Token.", "Enter a folder name.": "Insere o nome de uma pasta.", "Enter a name for the new .flw file": "Insira o nome do novo arquivo .flw", "Enter a new name.": "Insere o nome novo.", "Enter a port number": "Insira o número da porta", "Enter a port number.": "Insira o número da porta.", "Enter connection name": "Insere o nome do conexão", "Enter expression": "Insira a expressão", "Enter secret for client ID. An example is myapp.secret.": "Insere o segredo do ID do cliente. Por exemplo: myapp.secret.", "Enter the SAS compute context": "Insere o contexto computacional de SAS", "Enter the SAS compute context.": "Insere o contexto computacional de SAS.", "Enter the URL": "Insere o URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "Insere o URL do servidor SAS Viya. Por exemplo: https://example.sas.com.", "Enter the local private key file path": "Digite o caminnho ao arquivo da chave privada local", "Enter the name of the SAS 9 server.": "Digite o nome do servidor SAS 9", "Enter the passphrase for the private key": "Digite a frase-senha da chave privada", "Enter the password for user: {username}": "Digite a senha do usuário: {username}", "Enter the registered client ID. An example is myapp.client.": "Insira o ID registrado do cliente. Por exemplo: myapp.client.", "Enter the server name": "Insere o nome do servidor", "Enter the server path": "Insere o caminho ao servidor", "Enter the server path of the SAS Executable.": "Insira o caminho no servidor ao arquivo executável de SAS.", "Enter your SAS server username.": "Insira seu nome de usuário para o servidor de SAS.", "Enter your password": "Digite sua senha", "Enter your password for this connection.": "Digite sua senha para esta conexão.", "Enter your username": "Insira seu nome de usuário", "Error converting the notebook file to .flw format.": "Erro convertendo o arquivo notebook para o formato .flw.", "Error getting server with ID {id} - {message}": "Erro obtendo servidor com o ID {id} - {message}", "Error getting session with ID {id} - {message}": "Erro obtendo uma sessão com o ID {id} - {message}", "Error reading private key file: {filePath}, error: {message}": "Erro encontrado lendo o arquivo de chave privada: {filePath}, erro: {message}", "Export as HTML file": "Exportar como arquivo HTML", "Export as SAS program file": "Exportar como arquivo de programação SAS", "Extended Type": "Tipo extensível", "Failed to export notebook: {0}": "Falha ao exportar o notebook: {0}", "Failed to get state from Session {sessionId}": "Falhou obtendo o estado da Sessão {sessionId}", "File added to my folder.": "Arquivo adicionado na minha pasta.", "Format": "Formato", "General": "Geral", "General Information": "Informação Geral", "HTML": "HTML", "Ignore: all": "Ignore: tudo", "Ignore: current position": "Ignore: posição atual", "Ignore: error": "Ignore: erro", "Ignore: warning": "Ignore: aviso", "Informat": "Formato de entrada", "Invalid connectionType. Check Profile settings.": "Tipo de conexão (connectionType) inválido. Verifique as configurações do perfil.", "Invalid file name.": "Nome do arquivo é inválido.", "Job does not have '{linkName}' link": "A tarefa não possui o link chamado '{linkName}'", "Label": "Rótulo", "Length": "Tamanho", "Library": "Biblioteca", "Logical Record Count": "Contagem de registros lógicos", "Method not implemented.": "Método não é implementado.", "Missing connectionType in active profile.": "Tipo de conexão (connectionType) ausente no perfil ativo.", "Missing endpoint in active profile.": "Ponto final (endpoint) ausente no perfil ativo.", "Missing host in active profile.": "Host ausente no perfil ativo.", "Missing port in active profile.": "Porta ausente no perfil ativo.", "Missing sas path in active profile.": "Caminho ao arquivo executável de SAS ausente no perfil ativo.", "Missing username in active profile.": "Nome de usuário ausente no perfil ativo.", "Modified": "Modificado", "Move to Recycle Bin": "Mover para a Lixeira", "Name": "Nome", "New File": "Arquivo novo", "New Folder": "Pasta nova", "New SAS Connection Profile Name": "Nome nova do perfil de conexão a SAS", "No Active Profile": "Não ha Perfil Ativo", "No Profile": "Não ha Perfil", "No Profiles available to delete": "Nenhum perfil disponível para exclusão", "No SAS Connection Profile": "Não ha perfil de conexão a SAS", "No authorization code": "Não ha código de autorização", "No data matches the current filters.": "Nenhum dado corresponde aos filtros atuais.", "Not implemented": "Não é implementado", "Notebook exported to {0}": "Notebook exportado para {0}", "Number of Columns": "Número de colunas", "Number of Rows": "Número de linhas", "Numeric": "Numérico", "Options": "Opções", "Passphrase Required": "Frase-senha requerido", "Password Required": "Senha requerido", "Paste authorization code here": "Cole aqui o código de autorização", "Physical Record Count": "Contagem de registros físicos", "Port Number": "Número da Porta", "Private Key File Path (optional)": "Caminho ao arquivo da chave privada ", "Properties": "Propriedades", "Python Program": "Programa Python", "Record Length": "Tamanho do registro", "Remove all sorting": "Remover todas as ordenações", "Remove sorting": "Remover ordenação", "Rename File": "Renomear um arquivo", "Rename Folder": "Renomear uma pasta", "Result": "Resultado", "Result: {result}": "Resultado: {result}", "Row number": "Número da linha", "SAS 9 Server": "Servidor SAS 9", "SAS Code": "Código SAS", "SAS Compute Context": "Contexto de computação SAS", "SAS Log": "Registro de SAS", "SAS Log: {name}": "Registro de SAS: {name}", "SAS Profile": "Perfil SAS", "SAS Program": "Programa SAS", "SAS Server Username": "Nome de usuário para o servidor de SAS", "SAS Viya Server": "Servidor de SAS Viya", "SAS code running...": "Executando o programa de SAS...", "SQL Program": "Programa SQL", "Save": "Salve", "Save Log": "Salvar Log", "Save ODS HTML": "Salvar HTML ODS", "Saved to {0}": "Salvo em {0}", "Saving {itemName}.": "Salvando {itemName}.", "Search": "Pesquisa", "Select a Connection Type": "Escolha o tipo de conexão", "Select a Connection Type.": "Escolha o tipo de conexão.", "Select a SAS connection profile": "Escolha o perfil do conexão a SAS", "Select export format": "Selecione o formato de exportação", "Server Path": "Caminho ao servidor", "Server does not have createSession link": "O servidor não tem o link createSession", "Server does not have state link": "O servidor não tem o link de status", "Session does not have '{linkName}' link": "O sessão não tem o link '{linkName}'", "Show results...": "Mostra os resultados...", "Size Information": "Informação de tamanho", "Something went wrong": "Algo deu errado", "Sort": "Ordenar", "Sorted, Ascending": "Ordenado, Crescente", "Sorted, Descending": "Ordenado, Decrescente", "Switch Current SAS Profile": "Mudar o perfil atual de SAS", "Table Properties": "Tabela de propriedades", "Table: {tableName}": "Tabela: {tableName}", "Task is cancelled.": "Tarefa cancelado.", "Task is complete.": "Tarefa completado.", "Technical Information": "Informação técnica", "The SAS session has closed.": "A sessão de SAS foi encerrada.", "The file type is unsupported.": "Este tipo de arquivo não é compatível.", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "Os arquivos não podem ser acessados a partir da seleção do caminho de contexto do seu SAS Compute Server. Entre em contato com o administrador SAS.", "The files cannot be accessed from the specified path.": "Os arquivos não podem ser acessados a partir do caminho especificado.", "The folder name cannot contain more than 100 characters or have invalid characters.": "O nome da pasta não pode incluir mais de 100 caracteres ou qualquer caracteres inválidos.", "The item could not be added to My Favorites.": "Não foi possível adicionar o iten a My Favorites.", "The item could not be removed from My Favorites.": "Não foi possível excluir o iten do My Favorites.", "The notebook file does not contain any code to convert.": "O arquivo notebook não contém nenhum código para converter.", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "O notebook foi convertido ao um Flow e salvado na pasta: {folderName}. Pode agora abri-lo em SAS Studio.", "The output file name must end with the .flw extension.": "Precisas terminar o nome do arquivo de saída com a extensão .flw.", "The {selected} SAS connection profile has been deleted from the settings.json file.": "O perfil de conexão a SAS {selected} foi excluído do arquivo settings.json.", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "Ocorreu um erro durante a execução do programa SAS. Veja [console log](command:workbench.action.toggleDevTools) para os detalhes.", "This folder contains unsaved files, are you sure you want to delete?": "Esta pasta contém arquivos não salvos. Tem certeza de que deseja excluí-los?", "This platform does not support this connection type.": "Esta plataforma não suporta este tipo de conexão.", "To use the SSH Agent or a password, leave blank.": "Para usar o Agente SSH ou uma senha, deixe em branco.", "Type": "Tipo", "Unable to add file to my folder.": "Não foi possível adicionar o arquivo a my folder.", "Unable to create file \"{name}\".": "Não foi possível criar o arquivo \"{name}\".", "Unable to create folder \"{name}\".": "Não foi possível criar a pasta \"{name}\".", "Unable to delete file.": "Não foi possível excluir o arquivo.", "Unable to delete folder.": "Não foi possível excluir a pasta.", "Unable to delete table {tableName}.": "Não foi possível excluir a tabela {tableName}.", "Unable to download files.": "É impossível baixar os arquivos.", "Unable to drag files from my favorites.": "Não foi possível arrastar arquivos de my favorites.", "Unable to drag files from trash.": "Não foi possível arrastar arquivos do lixo.", "Unable to drop item \"{name}\".": "Não foi possível descartar o iten \"{name}\".", "Unable to empty the recycle bin.": "Não foi possível esvaziar a lixeira.", "Unable to load required libraries.": "Não é possível carregar as bibliotecas necessárias.", "Unable to rename \"{oldName}\" to \"{newName}\".": "Não foi possível renomear \"{oldName}\" a \"{newName}\".", "Unable to restore file.": "Não foi possível recuperar o arquivo.", "Unable to restore folder.": "Não foi possível recuperar a pasta.", "Unable to upload files.": "Não é possível fazer upload dos arquivos.", "Uploading files...": "Fazendo upload dos arquivos...", "User {username} {prompt}": "Usuário {username} {prompt}", "View SAS Table": "Veja a tabela de SAS", "You can also specify connection profile using the settings.json file.": "Também pode especificar o perfil de conexão no arquivo settings.json.", "You must save your file before you can rename it.": "Precisas salvar o arquivo antes de renomeá-lo.", "output": "resultado", "{basename}_Copy{number}{ext}": "{basename}_Cópia{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.zh-cn.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "加载表数据时遇到错误。 当表太大或无法处理数据时,通常会发生这种情况。 请参阅控制台了解更多详细信息。", "Are you sure you want to delete the selected tables?": "确实要删除选定的表吗?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "您确定要永久删除所有项目吗?您无法撤消此操作。", "Are you sure you want to permanently delete the item \"{name}\"?": "您确定要永久删除项目\"{name}\"吗?", "Ascending": "升序", "Ascending (add to sorting)": "升序(添加至排序)", "Bookmark Length": "书签长度", "Cancelling job...": "正在取消作业...", "Cannot call self on ComputeSession with no id": "无法在没有id的ComputeSession上调用self", "Cannot call self on object with no id": "无法在没有id的对象上调用self", "Cannot connect to SAS Studio service": "无法连接到 SAS Studio 服务", "Cannot find file: {file}": "无法找到文件: {file}", "Character": "字符", "Character Encoding": "字符编码", "Choose output type to save": "选择要保存的输出类型", "Choose where to save your files.": "选择保存文件的位置。", "Clear": "清除", "Client ID": "客户端ID", "Client Secret": "客户端密钥", "Close Session": "关闭会话", "Columns": "列", "Columns ({count})": "列({count})", "Compression": "压缩", "Compute Context not found: {name}": "未找到计算上下文:{name}", "Connecting to SAS session...": "正在连接到SAS会话...", "Connection Type": "连接类型", "Converting SAS notebook to flow...": "将 SAS 笔记本转换为流...", "Could not connect to the SAS server.": "无法连接到 SAS 服务器。", "Created": "创建时间", "Currency": "货币", "Date": "日期", "Datetime": "日期时间", "Delete": "删除", "Descending": "降序", "Descending (add to sorting)": "降序(添加至排序)", "Downloading files...": "正在下载文件...", "Engine": "引擎", "Enter a client ID": "输入客户端ID", "Enter a client secret": "输入客户端密钥", "Enter a file name.": "输入文件名。", "Enter a folder name.": "请输入文件夹名称。", "Enter a name for the new .flw file": "输入新 .flw 文件的名称", "Enter a new name.": "输入新名称。", "Enter a port number": "输入端口号", "Enter a port number.": "输入端口号。", "Enter connection name": "输入连接名称", "Enter expression": "输入表达式", "Enter secret for client ID. An example is myapp.secret.": "输入客户端ID的密钥。示例是 myapp.secret。", "Enter the SAS compute context": "输入SAS计算上下文", "Enter the SAS compute context.": "输入SAS计算上下文。", "Enter the URL": "输入网址", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "输入SAS Viya服务器的URL。示例为 https://example.sas.com", "Enter the local private key file path": "输入本地私钥文件路径", "Enter the name of the SAS 9 server.": "输入SAS 9 服务器的名称。", "Enter the passphrase for the private key": "输入私钥的密码", "Enter the password for user: {username}": "输入用户 {username} 的密码", "Enter the registered client ID. An example is myapp.client.": "输入注册的客户端ID。示例是 myapp.client。", "Enter the server name": "输入服务器名称", "Enter the server path": "输入服务器路径", "Enter the server path of the SAS Executable.": "输入SAS可执行文件的服务器路径。", "Enter your SAS server username.": "输入您的SAS服务器用户名。", "Enter your password": "输入您的密码", "Enter your password for this connection.": "输入此连接的密码。", "Enter your username": "输入您的用户名", "Error converting the notebook file to .flw format.": "将笔记本文件转换为 .flw 格式时出错。", "Error getting server with ID {id} - {message}": "获取ID为{id} - {message}的服务器时出错", "Error getting session with ID {id} - {message}": "获取ID为{id} - {message}的会话时出错", "Error reading private key file: {filePath}, error: {message}": "读取私钥文件 {filePath} 时出错,错误:{message}", "Export as HTML file": "导出为 HTML 文件", "Export as SAS program file": "导出为 SAS 程序文件", "Extended Type": "扩展类型", "Failed to export notebook: {0}": "未能导出笔记本: {0}", "Failed to get state from Session {sessionId}": "从会话{sessionId}获取状态失败", "File added to my folder.": "文件已添加到我的文件夹。", "Format": "输出格式", "General": "常规", "General Information": "常规信息", "HTML": "HTML", "Ignore: all": "忽略: 全部", "Ignore: current position": "忽略: 当前位置", "Ignore: error": "忽略: 错误", "Ignore: warning": "忽略: 警告", "Informat": "输入格式", "Invalid connectionType. Check Profile settings.": "无效的连接类型。请检查配置文件设置。", "Invalid file name.": "无效的文件名。", "Job does not have '{linkName}' link": "作业没有'{linkName}'链接", "Label": "标签", "Length": "长度", "Library": "逻辑库", "Logical Record Count": "逻辑记录计数", "Method not implemented.": "方法未实现。", "Missing connectionType in active profile.": "活动配置文件中缺少连接类型。", "Missing endpoint in active profile.": "活动配置文件中缺少端点。", "Missing host in active profile.": "活动配置文件中缺少主机。", "Missing port in active profile.": "活动配置文件中缺少端口。", "Missing sas path in active profile.": "活动配置文件中缺少sas路径。", "Missing username in active profile.": "活动配置文件中缺少用户名", "Modified": "修改时间", "Move to Recycle Bin": "移至回收站", "Name": "名称", "New File": "新文件", "New Folder": "新文件夹", "New SAS Connection Profile Name": "新SAS连接配置文件名称", "No Active Profile": "无活动配置文件", "No Profile": "无配置文件", "No Profiles available to delete": "没有可删除的配置文件", "No SAS Connection Profile": "无SAS连接配置文件", "No authorization code": "无授权码", "No data matches the current filters.": "没有匹配当前过滤器的数据。", "Not implemented": "未实现", "Notebook exported to {0}": "笔记本导出至{0}", "Number of Columns": "列数", "Number of Rows": "行数", "Numeric": "数值型", "Options": "选项", "Passphrase Required": "需要密码短语", "Password Required": "需要密码", "Paste authorization code here": "在此处粘贴授权码", "Physical Record Count": "物理记录计数", "Port Number": "端口号", "Private Key File Path (optional)": "私钥文件路径(可选)", "Properties": "属性", "Python Program": "Python 程序", "Record Length": "记录长度", "Remove all sorting": "移除全部排序", "Remove sorting": "移除排序", "Rename File": "重命名文件", "Rename Folder": "重命名文件夹", "Result": "结果", "Result: {result}": "结果: {result}", "Row number": "行号", "SAS 9 Server": "SAS 9 服务器", "SAS Code": "SAS 代码", "SAS Compute Context": "SAS计算上下文", "SAS Log": "SAS 日志", "SAS Log: {name}": "SAS 日志: {name}", "SAS Profile": "SAS 连接配置文件", "SAS Program": "SAS 程序", "SAS Server Username": "SAS服务器用户名", "SAS Viya Server": "SAS Viya服务器", "SAS code running...": "SAS代码正在运行...", "SQL Program": "SQL 程序", "Save": "保存", "Save Log": "保存日志", "Save ODS HTML": "保存 ODS HTML", "Saved to {0}": "已保存至 {0}", "Saving {itemName}.": "保存 {itemName}.", "Search": "搜索", "Select a Connection Type": "选择连接类型", "Select a Connection Type.": "选择连接类型。", "Select a SAS connection profile": "选择SAS连接配置文件", "Select export format": "选择导出格式", "Server Path": "服务器路径", "Server does not have createSession link": "服务器没有createSession链接", "Server does not have state link": "服务器没有状态链接", "Session does not have '{linkName}' link": "会话没有'{linkName}'链接", "Show results...": "显示结果...", "Size Information": "大小信息", "Something went wrong": "出了点问题", "Sort": "排序", "Sorted, Ascending": "已排序,升序", "Sorted, Descending": "已排序,降序", "Switch Current SAS Profile": "切换当前SAS配置文件", "Table Properties": "表属性", "Table: {tableName}": "表: {tableName}", "Task is cancelled.": "任务中止。", "Task is complete.": "任务完成。", "Technical Information": "技术信息", "The SAS session has closed.": "SAS会话已关闭。", "The file type is unsupported.": "不支持该文件类型。", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "无法从 SAS 计算服务器上下文定义中指定的路径访问这些文件。请联系您的 SAS 管理员。", "The files cannot be accessed from the specified path.": "无法从指定路径访问文件。", "The folder name cannot contain more than 100 characters or have invalid characters.": "文件夹名称不能超过 100 个字符或包含无效字符。", "The item could not be added to My Favorites.": "该项目无法添加到我的收藏夹。", "The item could not be removed from My Favorites.": "无法从我的收藏夹中删除该项目。", "The notebook file does not contain any code to convert.": "笔记本文件不包含任何要转换的代码。", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "笔记本已成功转换为流并保存到以下文件夹中:{folderName}。 您现在可以在 SAS Studio 中打开它。", "The output file name must end with the .flw extension.": "输出文件名必须以 .flw 扩展名结尾。", "The {selected} SAS connection profile has been deleted from the settings.json file.": "已从settings.json文件中删除{selected} SAS连接配置文件。", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "SAS程序执行出错。请参见[开发控制台日志](command:workbench.action.toggleDevTools)获取更多信息。", "This folder contains unsaved files, are you sure you want to delete?": "此文件夹包含未保存的文件,您确定要删除吗?", "This platform does not support this connection type.": "该平台不支持该连接类型。", "To use the SSH Agent or a password, leave blank.": "要使用 SSH 代理或密码,请留空。", "Type": "类型", "Unable to add file to my folder.": "无法将文件添加到我的文件夹。", "Unable to create file \"{name}\".": "无法创建文件\"{name}\"。", "Unable to create folder \"{name}\".": "无法创建文件夹\"{name}\"。", "Unable to delete file.": "无法删除文件。", "Unable to delete folder.": "无法删除文件夹。", "Unable to delete table {tableName}.": "无法删除表 {tableName}。", "Unable to download files.": "无法下载文件。", "Unable to drag files from my favorites.": "无法从我的收藏夹中拖动文件。", "Unable to drag files from trash.": "无法从垃圾箱中拖动文件。", "Unable to drop item \"{name}\".": "无法投放项目\"{name}\"。", "Unable to empty the recycle bin.": "无法清空回收站。", "Unable to load required libraries.": "无法加载所需的库。", "Unable to rename \"{oldName}\" to \"{newName}\".": "无法将\"{oldName}\"重命名为\"{newName}\"。", "Unable to restore file.": "无法恢复文件。", "Unable to restore folder.": "无法恢复文件夹。", "Unable to upload files.": "无法上传文件。", "Uploading files...": "正在上传文件...", "User {username} {prompt}": "用户 {username} {prompt}", "View SAS Table": "查看 SAS 表", "You can also specify connection profile using the settings.json file.": "您还可以使用settings.json文件指定连接配置文件。", "You must save your file before you can rename it.": "您必须先保存文件,然后才能重命名它。", "output": "输出", "{basename}_Copy{number}{ext}": "{basename}_副本{number}{ext}" } ================================================ FILE: l10n/bundle.l10n.zh-tw.json ================================================ { "#": "#", "An error was encountered when loading table data. This usually happens when a table is too large or the data couldn't be processed. See console for more details.": "載入表格資料時發生錯誤。這通常發生在表格太大或資料無法處理時。如需詳細資訊,請參閱主控台。", "Are you sure you want to delete the selected tables?": "是否確定要刪除選取的表格?", "Are you sure you want to permanently delete all the items? You cannot undo this action.": "是否確定要永久刪除所有項目? 您無法還原此動作。", "Are you sure you want to permanently delete the item \"{name}\"?": "確定要永久刪除項目 \"{name}\" 嗎?", "Ascending": "遞增", "Ascending (add to sorting)": "遞增 (增加至排序)", "Bookmark Length": "書籤長度", "Cancelling job...": "正在取消工作…", "Cannot call self on ComputeSession with no id": "無法在沒有 ID 的 ComputeSession 上呼叫自我", "Cannot call self on object with no id": "無法在沒有 ID 的物件上呼叫自我", "Cannot connect to SAS Studio service": "無法連線至 SAS Studio 服務", "Cannot find file: {file}": "找不到檔案: {file}", "Character": "字元", "Character Encoding": "字元編碼", "Choose output type to save": "選擇要儲存的輸出類型", "Choose where to save your files.": "選擇儲存檔案的位置。", "Clear": "清除", "Client ID": "用戶端 ID", "Client Secret": "用戶端密碼", "Close Session": "關閉工作階段", "Columns": "欄", "Columns ({count})": "欄 ({count})", "Compression": "壓縮", "Compute Context not found: {name}": "找不到計算環境: {name}", "Connecting to SAS session...": "正在連線至 SAS 工作階段…", "Connection Type": "連線類型", "Converting SAS notebook to flow...": "正在將 SAS 筆記本轉換為流程…", "Could not connect to the SAS server.": "無法連線到 SAS 伺服器。", "Created": "建立", "Currency": "貨幣", "Date": "日期", "Datetime": "日期時間", "Delete": "刪除", "Descending": "遞減", "Descending (add to sorting)": "遞減 (增加至排序)", "Downloading files...": "正在下載檔案…", "Engine": "引擎", "Enter a client ID": "輸入用戶端 ID", "Enter a client secret": "輸入用戶端密碼", "Enter a file name.": "輸入檔案名稱。", "Enter a folder name.": "輸入資料夾名稱。", "Enter a name for the new .flw file": "輸入新的 .flw 檔案的名稱", "Enter a new name.": "輸入新的名稱。", "Enter a port number": "輸入連接埠號碼", "Enter a port number.": "輸入連接埠號碼。", "Enter connection name": "輸入連線名稱", "Enter expression": "輸入運算式", "Enter secret for client ID. An example is myapp.secret.": "輸入用戶端 ID 的密碼。例如 myapp.secret。", "Enter the SAS compute context": "輸入 SAS 計算環境", "Enter the SAS compute context.": "輸入 SAS 計算環境。", "Enter the URL": "輸入 URL", "Enter the URL for the SAS Viya server. An example is https://example.sas.com.": "輸入 SAS Viya 伺服器的 URL。例如 https://example.sas.com。", "Enter the local private key file path": "輸入本機私密金鑰檔案路徑", "Enter the name of the SAS 9 server.": "輸入 SAS 9 伺服器的名稱。", "Enter the passphrase for the private key": "輸入私密金鑰的複雜密碼", "Enter the password for user: {username}": "輸入使用者的密碼: {username}", "Enter the registered client ID. An example is myapp.client.": "輸入已註冊的用戶端 ID。例如 myapp.client。", "Enter the server name": "輸入伺服器名稱", "Enter the server path": "輸入伺服器路徑", "Enter the server path of the SAS Executable.": "輸入 SAS Executable 的伺服器路徑。", "Enter your SAS server username.": "輸入您的 SAS 伺服器使用者名稱。", "Enter your password": "輸入您的密碼", "Enter your password for this connection.": "輸入此連線的密碼。", "Enter your username": "輸入您的使用者名稱", "Error converting the notebook file to .flw format.": "將筆記本檔案轉換為 .flw 格式時發生錯誤。", "Error getting server with ID {id} - {message}": "取得 ID 為 {id} 的伺服器時發生錯誤 - {message}", "Error getting session with ID {id} - {message}": "取得 ID 為 {id} 的工作階段時發生錯誤 - {message}", "Error reading private key file: {filePath}, error: {message}": "讀取私密金鑰檔案時發生錯誤: {filePath},錯誤: {message}", "Export as HTML file": "匯出 HTML 檔案", "Export as SAS program file": "匯出為 SAS 程式檔案", "Extended Type": "擴充類型", "Failed to export notebook: {0}": "無法匯出筆記本: {0}", "Failed to get state from Session {sessionId}": "無法從工作階段 {sessionId} 取得狀態", "File added to my folder.": "檔案已增加到我的資料夾。", "Format": "輸出格式", "General": "一般", "General Information": "一般資訊", "HTML": "HTML", "Ignore: all": "忽略: 全部", "Ignore: current position": "忽略: 目前位置", "Ignore: error": "忽略: 錯誤", "Ignore: warning": "忽略: 警告", "Informat": "輸入格式", "Invalid connectionType. Check Profile settings.": "無效的 connectionType。檢查設定檔設定。", "Invalid file name.": "無效的檔案名稱。", "Job does not have '{linkName}' link": "工作沒有 '{linkName}' 連結", "Label": "標籤", "Length": "長度", "Library": "資料館", "Logical Record Count": "邏輯記錄計數", "Method not implemented.": "未實作方法。", "Missing connectionType in active profile.": "使用中設定檔中缺少 connectionType。", "Missing endpoint in active profile.": "使用中設定檔中缺少端點。", "Missing host in active profile.": "使用中設定檔中缺少主機。", "Missing port in active profile.": "使用中設定檔中缺少連接埠。", "Missing sas path in active profile.": "使用中設定檔中缺少 sas 路徑。", "Missing username in active profile.": "使用中設定檔中缺少使用者名稱。", "Modified": "修改", "Move to Recycle Bin": "移至資源回收筒", "Name": "名稱", "New File": "新增檔案", "New Folder": "新增資料夾", "New SAS Connection Profile Name": "新增 SAS 連線設定檔名稱", "No Active Profile": "沒有使用中的設定檔", "No Profile": "沒有設定檔", "No Profiles available to delete": "沒有可刪除的設定檔", "No SAS Connection Profile": "沒有 SAS 連線設定檔", "No authorization code": "沒有授權碼", "No data matches the current filters.": "沒有資料符合目前的篩選。", "Not implemented": "未實作", "Notebook exported to {0}": "筆記本已匯出至 {0}", "Number of Columns": "欄數", "Number of Rows": "列數", "Numeric": "數值", "Options": "選項", "Passphrase Required": "需要複雜密碼", "Password Required": "需要密碼", "Paste authorization code here": "在此處貼上授權碼", "Physical Record Count": "實體記錄計數", "Port Number": "連接埠號碼", "Private Key File Path (optional)": "私密金鑰檔案路徑 (選用)", "Properties": "屬性", "Python Program": "Python 程式", "Record Length": "記錄長度", "Remove all sorting": "移除所有排序", "Remove sorting": "移除排序", "Rename File": "重新命名檔案", "Rename Folder": "重新命名資料夾", "Result": "結果", "Result: {result}": "結果: {result}", "Row number": "列號", "SAS 9 Server": "SAS 9 伺服器", "SAS Code": "SAS 程式碼", "SAS Compute Context": "SAS 計算環境", "SAS Log": "SAS 日誌", "SAS Log: {name}": "SAS 日誌: {name}", "SAS Profile": "SAS 設定檔", "SAS Program": "SAS 程式", "SAS Server Username": "SAS 伺服器使用者名稱", "SAS Viya Server": "SAS Viya 伺服器", "SAS code running...": "SAS 程式碼執行中…", "SQL Program": "SQL 程式", "Save": "儲存", "Save Log": "儲存日誌", "Save ODS HTML": "儲存 ODS HTML", "Saved to {0}": "已儲存到 {0}", "Saving {itemName}.": "正在儲存 {itemName}。", "Search": "搜尋", "Select a Connection Type": "選取連線類型", "Select a Connection Type.": "選取連線類型。", "Select a SAS connection profile": "選取 SAS 連線設定檔", "Select export format": "選取匯出格式", "Server Path": "伺服器路徑", "Server does not have createSession link": "伺服器沒有 createSession 連結", "Server does not have state link": "伺服器沒有狀態連結", "Session does not have '{linkName}' link": "工作階段沒有 '{linkName}' 連結", "Show results...": "顯示結果…", "Size Information": "大小資訊", "Something went wrong": "發生問題", "Sort": "排序", "Sorted, Ascending": "已排序,遞增", "Sorted, Descending": "已排序,遞減", "Switch Current SAS Profile": "切換目前的 SAS 設定檔", "Table Properties": "表格屬性", "Table: {tableName}": "表格: {tableName}", "Task is cancelled.": "任務已取消。", "Task is complete.": "任務完成。", "Technical Information": "技術資訊", "The SAS session has closed.": "已結束 SAS 工作階段。", "The file type is unsupported.": "檔案類型不受支援。", "The files cannot be accessed from the path specified in the context definition for the SAS Compute Server. Contact your SAS administrator.": "無法從 SAS Compute Server 的內容定義中指定的路徑存取檔案。請聯絡您的 SAS 管理員。", "The files cannot be accessed from the specified path.": "無法從指定的路徑存取檔案。", "The folder name cannot contain more than 100 characters or have invalid characters.": "資料夾名稱不能包含超過 100 個字元或包含無效字元。", "The item could not be added to My Favorites.": "無法將項目增加到我的最愛。", "The item could not be removed from My Favorites.": "無法將項目從我的最愛移除。", "The notebook file does not contain any code to convert.": "筆記本檔案未包含任何要轉換的程式碼。", "The notebook has been successfully converted to a flow and saved into the following folder: {folderName}. You can now open it in SAS Studio.": "已成功將筆記本轉換為流程並儲存至下列資料夾: {folderName}。您現在可以在 SAS Studio 中將其開啟。", "The output file name must end with the .flw extension.": "輸出檔案名稱必須以 .flw 副檔名結尾。", "The {selected} SAS connection profile has been deleted from the settings.json file.": "{selected} SAS 連線設定檔已從 settings.json 檔案中刪除。", "There was an error executing the SAS Program. See [console log](command:workbench.action.toggleDevTools) for more details.": "執行 SAS 程式時發生錯誤。如需詳細資料,請參閱 [console log](command:workbench.action.toggleDevTools)。", "This folder contains unsaved files, are you sure you want to delete?": "此資料夾包含未儲存的檔案,是否確定要刪除?", "This platform does not support this connection type.": "此平台不支援此連線類型。", "To use the SSH Agent or a password, leave blank.": "若要使用 SSH 代理程式或密碼,請留空白。", "Type": "類型", "Unable to add file to my folder.": "無法將檔案增加到我的資料夾。", "Unable to create file \"{name}\".": "無法建立檔案 \"{name}\"。", "Unable to create folder \"{name}\".": "無法建立資料夾 \"{name}\"。", "Unable to delete file.": "無法刪除檔案。", "Unable to delete folder.": "無法刪除資料夾。", "Unable to delete table {tableName}.": "無法刪除表格 {tableName}。", "Unable to download files.": "無法下載檔案。", "Unable to drag files from my favorites.": "無法從我的最愛拖曳檔案。", "Unable to drag files from trash.": "無法從垃圾桶拖曳檔案。", "Unable to drop item \"{name}\".": "無法捨棄項目 \"{name}\"。", "Unable to empty the recycle bin.": "無法清空資源回收筒。", "Unable to load required libraries.": "無法載入必要的資料館。", "Unable to rename \"{oldName}\" to \"{newName}\".": "無法將 \"{oldName}\" 重新命名為 \"{newName}\"。", "Unable to restore file.": "無法還原檔案。", "Unable to restore folder.": "無法還原資料夾。", "Unable to upload files.": "無法上傳檔案。", "Uploading files...": "正在上傳檔案…", "User {username} {prompt}": "使用者 {username} {prompt}", "View SAS Table": "檢視 SAS 表格", "You can also specify connection profile using the settings.json file.": "您也可以使用 settings.json 檔案來指定連線設定檔。", "You must save your file before you can rename it.": "您必須先儲存檔案,才能重新命名。", "output": "輸出", "{basename}_Copy{number}{ext}": "{basename}_Copy{number}{ext}" } ================================================ FILE: language-configuration.json ================================================ { "comments": { "blockComment": ["/*", "*/"] }, "brackets": [ ["{", "}"], ["[", "]"], ["(", ")"] ], "autoClosingPairs": [ { "open": "{", "close": "}" }, { "open": "[", "close": "]" }, { "open": "(", "close": ")" }, { "open": "'", "close": "'", "notIn": ["string", "comment"] }, { "open": "\"", "close": "\"", "notIn": ["string"] }, { "open": "/**", "close": " */", "notIn": ["string"] } ], "autoCloseBefore": ";:.,=}])> \n\t", "surroundingPairs": [ ["{", "}"], ["[", "]"], ["(", ")"], ["'", "'"], ["\"", "\""] ], "indentationRules": { "increaseIndentPattern": { "pattern": "(data|proc|%macro)\\b[^;]*;(\\s|/\\*.*\\*/|\\*[^;]*;)*$", "flags": "i" }, "decreaseIndentPattern": { "pattern": "(;|^\\s*)(\\s|/\\*.*\\*/|\\*[^;]*;)*(run|quit|%mend)(\\s|/\\*.*\\*/|\\*[^;]*;)*;$", "flags": "i" } }, "wordPattern": "(-?\\d*\\.\\d\\w*)|(\\%?[^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)" } ================================================ FILE: package.json ================================================ { "name": "sas-lsp", "displayName": "SAS", "description": "Official SAS Language Extension for VS Code", "version": "1.19.1", "categories": [ "Programming Languages", "Data Science", "Machine Learning", "Notebooks" ], "publisher": "SAS", "license": "Apache-2.0", "icon": "icons/sas.png", "engines": { "vscode": "^1.89.0" }, "activationEvents": [ "onWebviewPanel:SASResultPanel", "onLanguage:sas", "onNotebook:sas-notebook" ], "main": "./client/dist/node/extension", "browser": "./client/dist/browser/extension", "l10n": "./l10n", "capabilities": { "untrustedWorkspaces": { "supported": true }, "virtualWorkspaces": true }, "contributes": { "authentication": [ { "id": "SAS", "label": "SAS" } ], "taskDefinitions": [ { "type": "sas", "when": "!SAS.hideRunMenuItem", "required": [ "task" ], "properties": { "task": { "type": "string", "description": "Task name" }, "file": { "type": "string", "description": "The name of sas file to run" }, "preamble": { "type": "string", "description": "Specify the preamble SAS code that you want automatically inserted before running code. " }, "postamble": { "type": "string", "description": "Specify the postamble SAS code that you want automatically inserted after running code. " } } } ], "semanticTokenTypes": [ { "id": "date", "superType": "numeric", "description": "Date" }, { "id": "time", "superType": "numeric", "description": "Time" }, { "id": "dt", "superType": "numeric", "description": "DateTime" }, { "id": "format", "superType": "decorator", "description": "Format" }, { "id": "namelit", "superType": "string", "description": "Name literal" }, { "id": "numeric", "superType": "number", "description": "Numeric" }, { "id": "bitmask", "superType": "string", "description": "Bit mask" }, { "id": "hex", "superType": "number", "description": "Hexadecimal notation" }, { "id": "sep", "superType": "operator", "description": "Separator" }, { "id": "macro-sec-keyword", "superType": "macro", "description": "SAS Macro Section Keyword" }, { "id": "macro-ref", "superType": "variable", "description": "SAS Macro Reference" }, { "id": "macro-keyword", "superType": "keyword", "description": "SAS Macro Keyword" }, { "id": "macro-comment", "superType": "comment", "description": "SAS Macro Comment" }, { "id": "macro-keyword-param", "superType": "parameter", "description": "SAS Macro Keyword Parameter" }, { "id": "sec-keyword", "superType": "function", "description": "SAS Section keyword" }, { "id": "proc-name", "superType": "function", "description": "Name of the proc" }, { "id": "cards-data", "superType": "parameter", "description": "Card data" } ], "configuration": [ { "properties": { "SAS.connectionProfiles": { "order": 0, "type": "object", "description": "%configuration.SAS.connectionProfiles%", "properties": { "activeProfile": { "order": 0, "type": "string", "description": "%configuration.SAS.connectionProfiles.activeProfile%", "default": "" }, "profiles": { "order": 1, "type": "object", "description": "%configuration.SAS.connectionProfiles.profiles%", "additionalProperties": { "type": "object", "description": "%configuration.SAS.connectionProfiles.profiles.name%", "required": [ "connectionType" ], "properties": { "connectionType": { "type": "string", "default": "rest", "description": "%configuration.SAS.connectionProfiles.profiles.connectionType%", "enum": [ "rest", "ssh", "com", "iom" ] }, "sasOptions": { "type": "array", "default": [], "description": "%configuration.SAS.connectionProfiles.profiles.sasOptions%", "items": { "type": "string" } }, "autoExec": { "type": "array", "default": [], "description": "%configuration.SAS.connectionProfiles.profiles.autoExec%", "items": { "type": "object", "properties": { "type": { "type": "string", "default": "line", "description": "%configuration.SAS.connectionProfiles.profiles.autoExec.type%", "enum": [ "line", "file" ] } }, "allOf": [ { "if": { "properties": { "type": { "const": "line" } } }, "then": { "required": [ "line" ], "properties": { "line": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.autoExec.line%" } } } }, { "if": { "properties": { "type": { "const": "file" } } }, "then": { "required": [ "filePath" ], "properties": { "filePath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.autoExec.filePath%" } } } } ] } } }, "allOf": [ { "if": { "properties": { "connectionType": { "const": "rest" } } }, "then": { "required": [ "endpoint" ], "properties": { "endpoint": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.endpoint%" }, "context": { "type": "string", "default": "SAS Job Execution compute context", "description": "%configuration.SAS.connectionProfiles.profiles.context%" }, "clientId": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.clientId%" }, "clientSecret": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.clientSecret%" }, "fileNavigationCustomRootPath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath%" }, "fileNavigationRoot": { "type": "string", "default": "USER", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationRoot%", "enum": [ "CUSTOM", "USER", "SYSTEM" ] } } } }, { "if": { "properties": { "connectionType": { "const": "ssh" } } }, "then": { "required": [ "host", "saspath", "username", "port" ], "properties": { "host": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.ssh.host%" }, "saspath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.ssh.saspath%" }, "username": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.ssh.username%" }, "port": { "type": "number", "default": 22, "description": "%configuration.SAS.connectionProfiles.profiles.ssh.port%", "exclusiveMinimum": 1, "exclusiveMaximum": 65535 }, "privateKeyFilePath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath%" } } } }, { "if": { "properties": { "connectionType": { "const": "iom" } } }, "then": { "required": [ "host", "username", "port" ], "properties": { "host": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.iom.host%" }, "username": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.iom.username%" }, "port": { "type": "number", "default": 8591, "description": "%configuration.SAS.connectionProfiles.profiles.iom.port%", "exclusiveMinimum": 1, "exclusiveMaximum": 65535 }, "interopLibraryFolderPath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath%" }, "fileNavigationCustomRootPath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath%" }, "fileNavigationRoot": { "type": "string", "default": "USER", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationRoot%", "enum": [ "CUSTOM", "USER", "SYSTEM" ] } } } }, { "if": { "properties": { "connectionType": { "const": "com" } } }, "then": { "required": [ "host" ], "properties": { "host": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.com.host%" }, "interopLibraryFolderPath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath%" }, "fileNavigationCustomRootPath": { "type": "string", "default": "", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath%" }, "fileNavigationRoot": { "type": "string", "default": "USER", "description": "%configuration.SAS.connectionProfiles.profiles.fileNavigationRoot%", "enum": [ "CUSTOM", "USER", "SYSTEM" ] } } } } ] } } } }, "SAS.userProvidedCertificates": { "order": 1, "type": "array", "description": "%configuration.SAS.userProvidedCertificates%", "items": { "type": "string" } }, "SAS.results.sideBySide": { "order": 2, "type": "boolean", "default": true, "description": "%configuration.SAS.results.sideBySide%" }, "SAS.results.singlePanel": { "order": 3, "type": "boolean", "default": false, "description": "%configuration.SAS.results.singlePanel%" }, "SAS.results.html.enabled": { "order": 4, "type": "boolean", "default": true, "description": "%configuration.SAS.results.html.enabled%" }, "SAS.results.html.style": { "order": 5, "type": "string", "default": "(auto)", "enum": [ "(auto)", "(server default)", "Aqua", "Daisy", "Dove", "HighContrast", "HighContrastLarge", "HTMLBlue", "HTMLEncore", "Ignite", "Illuminate", "Journal", "Journal2", "Journal3", "Marine", "Midnight", "Moonflower", "Opal", "Pearl", "Sapphire" ], "enumDescriptions": [ "%configuration.SAS.results.html.style.(auto)%", "%configuration.SAS.results.html.style.(server default)%" ], "description": "%configuration.SAS.results.html.style%" }, "SAS.results.html.custom.style": { "type": "object", "default": {}, "markdownDescription": "%configuration.SAS.results.html.custom.style%", "properties": { "light": { "type": "string", "description": "%configuration.SAS.results.html.custom.style.light%" }, "dark": { "type": "string", "description": "%configuration.SAS.results.html.custom.style.dark%" }, "highContrast": { "type": "string", "description": "%configuration.SAS.results.html.custom.style.highContrast%" }, "highContrastLight": { "type": "string", "description": "%configuration.SAS.results.html.custom.style.highContrastLight%" } } }, "SAS.problems.log.enabled": { "type": "boolean", "default": true, "description": "%configuration.SAS.problems.log.enabled%" }, "SAS.flowConversionMode": { "order": 6, "type": "string", "default": "Swimlane", "enum": [ "Swimlane", "Node" ], "description": "%configuration.SAS.flowConversionMode%", "enumDescriptions": [ "%configuration.SAS.flowConversionModeSwimlane%", "%configuration.SAS.flowConversionModeNode%" ] }, "SAS.log.showOnExecutionStart": { "order": 7, "type": "boolean", "default": true, "description": "%configuration.SAS.log.showOnExecutionStart%" }, "SAS.log.showOnExecutionFinish": { "order": 8, "type": "boolean", "default": true, "description": "%configuration.SAS.log.showOnExecutionFinish%" }, "SAS.log.clearOnExecutionStart": { "order": 9, "type": "boolean", "default": true, "description": "%configuration.SAS.log.clearOnExecutionStart%" }, "SAS.notebook.export.includeLog": { "order": 10, "type": "boolean", "default": false, "description": "%configuration.SAS.notebook.export.includeLog%" } } } ], "configurationDefaults": { "[sas]": { "editor.formatOnType": true, "editor.formatOnPaste": true, "editor.defaultFormatter": "SAS.sas-lsp" } }, "commands": [ { "command": "SAS.run", "title": "%commands.SAS.run%", "icon": { "light": "icons/light/submitSASCode.svg", "dark": "icons/dark/submitSASCode.svg" }, "enablement": "!SAS.running", "category": "SAS" }, { "command": "SAS.runSelected", "title": "%commands.SAS.runSelected%", "icon": { "light": "icons/light/submitSASCode.svg", "dark": "icons/dark/submitSASCode.svg" }, "enablement": "!SAS.running", "category": "SAS" }, { "command": "SAS.runRegion", "title": "%commands.SAS.runRegion%", "icon": { "light": "icons/light/submitSASCode.svg", "dark": "icons/dark/submitSASCode.svg" }, "enablement": "!SAS.running", "category": "SAS" }, { "command": "SAS.close", "title": "%commands.SAS.close%", "icon": { "light": "icons/light/connectorNodeIndicator.svg", "dark": "icons/dark/connectorNodeIndicator.svg" }, "category": "SAS" }, { "command": "SAS.switchProfile", "title": "%commands.SAS.switchProfile%", "category": "SAS" }, { "command": "SAS.addProfile", "title": "%commands.SAS.addProfile%", "category": "SAS" }, { "command": "SAS.deleteProfile", "title": "%commands.SAS.deleteProfile%", "category": "SAS" }, { "command": "SAS.updateProfile", "title": "%commands.SAS.updateProfile%", "category": "SAS" }, { "command": "SAS.authorize", "title": "%commands.SAS.authorize%", "category": "SAS" }, { "command": "SAS.content.copyPath", "title": "%commands.SAS.copyPath%", "category": "SAS" }, { "command": "SAS.content.deleteResource", "title": "%commands.SAS.deleteResource%", "category": "SAS" }, { "command": "SAS.content.addFileResource", "title": "%commands.SAS.addFileResource%", "category": "SAS" }, { "command": "SAS.content.addFolderResource", "title": "%commands.SAS.addFolderResource%", "category": "SAS" }, { "command": "SAS.content.renameResource", "title": "%commands.SAS.renameResource%", "category": "SAS" }, { "command": "SAS.content.restoreResource", "title": "%commands.SAS.restoreResource%", "category": "SAS" }, { "command": "SAS.content.emptyRecycleBin", "title": "%commands.SAS.emptyRecycleBin%", "category": "SAS" }, { "command": "SAS.content.addToFavorites", "title": "%commands.SAS.addToFavorites%", "category": "SAS" }, { "command": "SAS.content.convertNotebookToFlow", "title": "%commands.SAS.convertNotebookToFlow%", "category": "SAS" }, { "command": "SAS.content.removeFromFavorites", "title": "%commands.SAS.removeFromFavorites%", "category": "SAS" }, { "command": "SAS.content.refreshContent", "title": "%commands.SAS.refresh%", "category": "SAS", "icon": "$(refresh)" }, { "command": "SAS.content.collapseAllContent", "title": "%commands.SAS.collapseAll%", "category": "SAS", "icon": "$(collapse-all)" }, { "command": "SAS.content.downloadResource", "title": "%commands.SAS.download%", "category": "SAS" }, { "command": "SAS.content.uploadResource", "title": "%commands.SAS.upload%", "category": "SAS" }, { "command": "SAS.content.uploadFileResource", "title": "%commands.SAS.uploadFiles%", "category": "SAS" }, { "command": "SAS.content.uploadFolderResource", "title": "%commands.SAS.uploadFolders%", "category": "SAS" }, { "command": "SAS.server.copyPath", "title": "%commands.SAS.copyPath%", "category": "SAS" }, { "command": "SAS.server.deleteResource", "title": "%commands.SAS.deleteResource%", "category": "SAS" }, { "command": "SAS.server.addFileResource", "title": "%commands.SAS.addFileResource%", "category": "SAS" }, { "command": "SAS.server.addFolderResource", "title": "%commands.SAS.addFolderResource%", "category": "SAS" }, { "command": "SAS.server.renameResource", "title": "%commands.SAS.renameResource%", "category": "SAS" }, { "command": "SAS.server.restoreResource", "title": "%commands.SAS.restoreResource%", "category": "SAS" }, { "command": "SAS.server.emptyRecycleBin", "title": "%commands.SAS.emptyRecycleBin%", "category": "SAS" }, { "command": "SAS.server.addToFavorites", "title": "%commands.SAS.addToFavorites%", "category": "SAS" }, { "command": "SAS.server.convertNotebookToFlow", "title": "%commands.SAS.convertNotebookToFlow%", "category": "SAS" }, { "command": "SAS.server.removeFromFavorites", "title": "%commands.SAS.removeFromFavorites%", "category": "SAS" }, { "command": "SAS.server.refreshContent", "title": "%commands.SAS.refresh%", "category": "SAS", "icon": "$(refresh)" }, { "command": "SAS.server.collapseAllContent", "title": "%commands.SAS.collapseAll%", "category": "SAS", "icon": "$(collapse-all)" }, { "command": "SAS.server.downloadResource", "title": "%commands.SAS.download%", "category": "SAS" }, { "command": "SAS.server.uploadResource", "title": "%commands.SAS.upload%", "category": "SAS" }, { "command": "SAS.server.uploadFileResource", "title": "%commands.SAS.uploadFiles%", "category": "SAS" }, { "command": "SAS.server.uploadFolderResource", "title": "%commands.SAS.uploadFolders%", "category": "SAS" }, { "command": "SAS.refreshLibraries", "title": "%commands.SAS.refresh%", "category": "SAS", "icon": "$(refresh)" }, { "command": "SAS.collapseAllLibraries", "title": "%commands.SAS.collapseAll%", "category": "SAS", "icon": "$(collapse-all)" }, { "command": "SAS.deleteTable", "title": "%commands.SAS.deleteTable%", "category": "SAS" }, { "command": "SAS.downloadTable", "title": "%commands.SAS.download%", "category": "SAS" }, { "command": "SAS.showTableProperties", "title": "%commands.SAS.showTableProperties%", "category": "SAS" }, { "command": "SAS.notebook.new", "shortTitle": "%commands.SAS.notebook.new.short%", "title": "%commands.SAS.notebook.new%", "category": "SAS Notebook" }, { "command": "SAS.notebook.export", "title": "%commands.SAS.notebook.export%", "category": "SAS Notebook" }, { "command": "SAS.notebook.saveOutput", "title": "%commands.SAS.notebook.saveOutput%", "category": "SAS Notebook" }, { "command": "SAS.file.new", "shortTitle": "%commands.SAS.file.new.short%", "title": "%commands.SAS.file.new%", "category": "SAS" }, { "command": "SAS.saveHTML", "title": "%commands.SAS.download%", "category": "SAS" }, { "command": "SAS.toggleLineComment", "title": "%commands.SAS.toggleLineComment%", "category": "SAS" } ], "keybindings": [ { "when": "editorFocus && (editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.run", "key": "f8" }, { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runSelected", "key": "f3" }, { "key": "ctrl+/", "mac": "cmd+/", "command": "SAS.toggleLineComment", "when": "editorTextFocus && editorLangId == 'sas'" }, { "when": "focusedView == contentdataprovider", "command": "SAS.content.deleteResource", "key": "delete" }, { "when": "focusedView == serverdataprovider", "command": "SAS.server.deleteResource", "key": "delete" } ], "menus": { "webview/context": [ { "command": "SAS.saveHTML", "when": "webviewId =~ /SASResultPanel/" } ], "view/title": [ { "command": "SAS.content.refreshContent", "when": "view == contentdataprovider", "group": "navigation@0" }, { "command": "SAS.content.collapseAllContent", "when": "view == contentdataprovider", "group": "navigation@1" }, { "command": "SAS.server.refreshContent", "when": "view == serverdataprovider", "group": "navigation@0" }, { "command": "SAS.server.collapseAllContent", "when": "view == serverdataprovider", "group": "navigation@1" }, { "command": "SAS.refreshLibraries", "when": "view == librarydataprovider", "group": "navigation@0" }, { "command": "SAS.collapseAllLibraries", "when": "view == librarydataprovider", "group": "navigation@1" } ], "explorer/context": [ { "command": "SAS.content.convertNotebookToFlow", "when": "resourceExtname == .sasnb && SAS.connectionType == rest && !SAS.connection.direct", "group": "actionsgroup@0" } ], "view/item/context": [ { "command": "SAS.deleteTable", "when": "viewItem =~ /table-actionable/ && view == librarydataprovider", "group": "delete@0" }, { "command": "SAS.downloadTable", "when": "viewItem =~ /table-/ && view == librarydataprovider", "group": "download@0" }, { "command": "SAS.showTableProperties", "when": "viewItem =~ /table-/ && view == librarydataprovider", "group": "properties@0" }, { "command": "SAS.content.addFolderResource", "when": "viewItem =~ /createChild/ && view == contentdataprovider && !listMultiSelection", "group": "addgroup@0" }, { "command": "SAS.content.addFileResource", "when": "viewItem =~ /createChild/ && view == contentdataprovider && !listMultiSelection", "group": "addgroup@1" }, { "command": "SAS.content.addToFavorites", "when": "viewItem =~ /addToFavorites/ && view == contentdataprovider", "group": "favoritesgroup@0" }, { "command": "SAS.content.removeFromFavorites", "when": "viewItem =~ /removeFromFavorites/ && view == contentdataprovider", "group": "favoritesgroup@1" }, { "command": "SAS.content.copyPath", "when": "viewItem =~ /copyPath/ && view == contentdataprovider && !listMultiSelection", "group": "copypathgroup@0" }, { "command": "SAS.content.renameResource", "when": "viewItem =~ /update/ && view == contentdataprovider && !listMultiSelection", "group": "delrenamegroup@0" }, { "command": "SAS.content.deleteResource", "when": "viewItem =~ /delete/ && view == contentdataprovider", "group": "delrenamegroup@1" }, { "command": "SAS.content.convertNotebookToFlow", "when": "viewItem =~ /convertNotebookToFlow/ && view == contentdataprovider && !listMultiSelection", "group": "actionsgroup@0" }, { "command": "SAS.content.restoreResource", "when": "viewItem =~ /restore/ && view == contentdataprovider", "group": "restoregroup@0" }, { "command": "SAS.content.emptyRecycleBin", "when": "viewItem =~ /empty/ && view == contentdataprovider", "group": "emptygroup@0" }, { "command": "SAS.content.downloadResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == contentdataprovider", "group": "uploaddownloadgroup@0" }, { "command": "SAS.content.uploadResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == contentdataprovider && !listMultiSelection && workspacePlatform == mac", "group": "uploaddownloadgroup@1" }, { "command": "SAS.content.uploadFileResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == contentdataprovider && !listMultiSelection && workspacePlatform != mac", "group": "uploaddownloadgroup@1" }, { "command": "SAS.content.uploadFolderResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == contentdataprovider && !listMultiSelection && workspacePlatform != mac", "group": "uploaddownloadgroup@1" }, { "command": "SAS.server.addFolderResource", "when": "viewItem =~ /createChild/ && view == serverdataprovider", "group": "addgroup@0" }, { "command": "SAS.server.addFileResource", "when": "viewItem =~ /createChild/ && view == serverdataprovider", "group": "addgroup@1" }, { "command": "SAS.server.addToFavorites", "when": "viewItem =~ /addToFavorites/ && view == serverdataprovider", "group": "favoritesgroup@0" }, { "command": "SAS.server.removeFromFavorites", "when": "viewItem =~ /removeFromFavorites/ && view == serverdataprovider", "group": "favoritesgroup@1" }, { "command": "SAS.server.copyPath", "when": "viewItem =~ /copyPath/ && view == serverdataprovider", "group": "copypathgroup@0" }, { "command": "SAS.server.renameResource", "when": "viewItem =~ /update/ && view == serverdataprovider && !listMultiSelection", "group": "delrenamegroup@0" }, { "command": "SAS.server.deleteResource", "when": "viewItem =~ /delete/ && view == serverdataprovider", "group": "delrenamegroup@1" }, { "command": "SAS.server.convertNotebookToFlow", "when": "viewItem =~ /convertNotebookToFlow/ && view == serverdataprovider && SAS.connectionType != iom && SAS.connectionType != com ", "group": "actionsgroup@0" }, { "command": "SAS.server.restoreResource", "when": "viewItem =~ /restore/ && view == serverdataprovider", "group": "restoregroup@0" }, { "command": "SAS.server.emptyRecycleBin", "when": "viewItem =~ /empty/ && view == serverdataprovider", "group": "emptygroup@0" }, { "command": "SAS.server.downloadResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == serverdataprovider", "group": "uploaddownloadgroup@0" }, { "command": "SAS.server.uploadResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == serverdataprovider && !listMultiSelection && workspacePlatform == mac", "group": "uploaddownloadgroup@1" }, { "command": "SAS.server.uploadFileResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == serverdataprovider && !listMultiSelection && workspacePlatform != mac", "group": "uploaddownloadgroup@1" }, { "command": "SAS.server.uploadFolderResource", "when": "(viewItem =~ /update/ || viewItem =~ /createChild/) && view == serverdataprovider && !listMultiSelection && workspacePlatform != mac", "group": "uploaddownloadgroup@1" } ], "editor/title/run": [ { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runSelected" } ], "editor/context": [ { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.run", "group": "navigation@2" }, { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runSelected", "group": "navigation@1" }, { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runRegion", "group": "navigation@3" } ], "notebook/toolbar": [ { "when": "notebookType == 'sas-notebook'", "command": "SAS.notebook.export" } ], "notebook/cell/title": [ { "command": "SAS.notebook.saveOutput", "when": "notebookType == 'sas-notebook' && notebookCellHasOutputs" } ], "commandPalette": [ { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.run" }, { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runSelected" }, { "when": "(editorLangId == sas || (editorLangId =~ /^(python|r|sql)$/ && resourceScheme =~ /^sas(Content|Server).*/)) && !SAS.hideRunMenuItem", "command": "SAS.runRegion" }, { "command": "SAS.authorize", "when": "(!SAS.authorized && SAS.connectionType == rest) && !SAS.connection.direct" }, { "when": "false", "command": "SAS.collapseAllLibraries" }, { "when": "false", "command": "SAS.content.addFileResource" }, { "when": "false", "command": "SAS.content.addFolderResource" }, { "when": "false", "command": "SAS.content.addToFavorites" }, { "when": "false", "command": "SAS.content.collapseAllContent" }, { "when": "false", "command": "SAS.content.convertNotebookToFlow" }, { "when": "false", "command": "SAS.content.copyPath" }, { "when": "false", "command": "SAS.content.deleteResource" }, { "when": "false", "command": "SAS.content.downloadResource" }, { "when": "false", "command": "SAS.content.emptyRecycleBin" }, { "when": "false", "command": "SAS.content.refreshContent" }, { "when": "false", "command": "SAS.content.removeFromFavorites" }, { "when": "false", "command": "SAS.content.renameResource" }, { "when": "false", "command": "SAS.content.restoreResource" }, { "when": "false", "command": "SAS.content.uploadFileResource" }, { "when": "false", "command": "SAS.content.uploadFolderResource" }, { "when": "false", "command": "SAS.content.uploadResource" }, { "when": "false", "command": "SAS.deleteTable" }, { "when": "false", "command": "SAS.downloadTable" }, { "when": "false", "command": "SAS.notebook.export" }, { "when": "false", "command": "SAS.notebook.saveOutput" }, { "when": "false", "command": "SAS.refreshLibraries" }, { "when": "false", "command": "SAS.saveHTML" }, { "when": "false", "command": "SAS.server.addFileResource" }, { "when": "false", "command": "SAS.server.addFolderResource" }, { "when": "false", "command": "SAS.server.addToFavorites" }, { "when": "false", "command": "SAS.server.collapseAllContent" }, { "when": "false", "command": "SAS.server.convertNotebookToFlow" }, { "when": "false", "command": "SAS.server.copyPath" }, { "when": "false", "command": "SAS.server.deleteResource" }, { "when": "false", "command": "SAS.server.downloadResource" }, { "when": "false", "command": "SAS.server.emptyRecycleBin" }, { "when": "false", "command": "SAS.server.refreshContent" }, { "when": "false", "command": "SAS.server.removeFromFavorites" }, { "when": "false", "command": "SAS.server.renameResource" }, { "when": "false", "command": "SAS.server.restoreResource" }, { "when": "false", "command": "SAS.server.uploadFileResource" }, { "when": "false", "command": "SAS.server.uploadFolderResource" }, { "when": "false", "command": "SAS.server.uploadResource" }, { "when": "false", "command": "SAS.showTableProperties" } ], "file/newFile": [ { "command": "SAS.notebook.new", "group": "notebook" }, { "command": "SAS.file.new", "group": "file" } ] }, "languages": [ { "id": "sas", "aliases": [ "SAS" ], "extensions": [ ".sas" ], "icon": { "dark": "icons/dark/sasProgramFileDark.svg", "light": "icons/light/sasProgramFileLight.svg" }, "configuration": "./language-configuration.json" }, { "id": "sas-log" } ], "grammars": [ { "scopeName": "source.sassql", "path": "./syntaxes/sassql.tmLanguage.json", "injectTo": [ "source.sas" ] }, { "language": "sas", "scopeName": "source.sas", "path": "./syntaxes/sas.tmLanguage.json", "embeddedLanguages": { "source.python": "python", "source.lua": "lua", "source.sql": "sql", "source.r": "r" } } ], "themes": [ { "label": "%themes.SAS.light%", "uiTheme": "vs", "path": "./themes/sas-light-color-theme.json" }, { "label": "%themes.SAS.dark%", "uiTheme": "vs-dark", "path": "./themes/sas-dark-color-theme.json" }, { "label": "%themes.SAS.highContrast%", "uiTheme": "hc-black", "path": "./themes/sas-highcontrast-color-theme.json" } ], "snippets": [ { "language": "sas", "path": "./snippets/proc-snippets.json" } ], "viewsContainers": { "activitybar": [ { "id": "sas-view-container", "title": "SAS", "icon": "icons/dark/sasIndicatorDark.svg" } ] }, "views": { "sas-view-container": [ { "id": "contentdataprovider", "name": "%views.SAS.explorer%", "when": "SAS.authorized && SAS.connectionType == rest" }, { "id": "serverdataprovider", "name": "%views.SAS.serverExplorer%", "when": "(SAS.authorized || SAS.serverDisplayed) && SAS.serverEnabled" }, { "id": "librarydataprovider", "name": "%views.SAS.libraries%", "when": "((SAS.authorized || SAS.librariesDisplayed) && SAS.librariesEnabled) || SAS.connection.direct" }, { "id": "sas-content-get-started", "name": "%views.SAS.signIn%", "when": "(!(SAS.authorized || SAS.librariesDisplayed || SAS.serverDisplayed) && SAS.canSignIn) && !SAS.connection.direct" }, { "id": "sas-content-invalid-connection", "name": "%views.SAS.signIn%", "when": "!SAS.authorized && !SAS.canSignIn" } ] }, "viewsWelcome": [ { "view": "sas-content-get-started", "contents": "%views.SAS.welcome%", "enablement": "!SAS.authorizing" }, { "view": "sas-content-invalid-connection", "contents": "%views.SAS.unsupportedConnection%" } ], "notebooks": [ { "type": "sas-notebook", "displayName": "%notebooks.SAS.sasNotebook%", "selector": [ { "filenamePattern": "*.sasnb" } ] } ], "notebookRenderer": [ { "id": "sas-log-renderer", "displayName": "%notebooks.SAS.logRenderer%", "entrypoint": "./client/dist/notebook/LogRenderer.js", "mimeTypes": [ "application/vnd.sas.compute.log.lines" ] }, { "id": "sas-html-renderer", "displayName": "%notebooks.SAS.htmlRenderer%", "entrypoint": "./client/dist/notebook/HTMLRenderer.js", "mimeTypes": [ "application/vnd.sas.ods.html5" ] } ] }, "repository": { "type": "git", "url": "https://github.com/sassoftware/vscode-sas-extension" }, "bugs": { "url": "https://github.com/sassoftware/vscode-sas-extension/issues" }, "homepage": "https://www.sas.com", "qna": "https://marketplace.visualstudio.com/items?itemName=SAS.sas-lsp&ssr=false#qna", "scripts": { "vscode:prepublish": "npm run lint && npm run compile && npm run compile-browser", "lint": "node node_modules/eslint/bin/eslint.js \"./client/src/**/*.ts\" \"./client/src/**/*.tsx\" \"./server/src/**/*.ts\"", "compile": "node ./tools/build.mjs", "watch": "node ./tools/build.mjs dev", "compile-browser": "webpack --mode production", "watch-browser": "webpack --watch", "format:check": "prettier --check .", "format": "prettier --write .", "pretest": "npm run compile && tsc -p ./client", "test-client": "node ./client/out/test/runTest.js", "test-server": "cross-env TS_NODE_PROJECT=./server/tsconfig.json mocha -r ts-node/register ./server/test/**/*.test.ts", "test": "npm run test-server && npm run test-client", "pseudoLocalize": "npx @vscode/l10n-dev export -o ./l10n ./client/src && npx @vscode/l10n-dev generate-pseudo -o ./l10n/ ./l10n/bundle.l10n.json ./package.nls.json", "postinstall": "cd client && npm install && cd ../server && npm install && cd ..", "copyright:check": "node ./tools/check-copyright.mjs", "locale": "npx @vscode/l10n-dev export -o ./l10n ./client/src && node ./tools/locale.mjs" }, "devDependencies": { "@eslint/compat": "2.0.5", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/chai": "^4.3.11", "@types/mocha": "^10.0.10", "@types/node": "^25.0.10", "@types/sinon": "^21.0.1", "@typescript-eslint/eslint-plugin": "^8.53.1", "@typescript-eslint/parser": "^8.32.1", "@vscode/l10n-dev": "^0.0.35", "buffer": "6.0.3", "chai": "^4.4.1", "concurrently": "^9.2.1", "cross-env": "^10.1.0", "esbuild": "^0.28.0", "eslint": "^9.39.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "glob": "^13.0.3", "mocha": "^11.7.5", "papaparse": "^5.5.3", "path-browserify": "^1.0.1", "prettier": "^3.8.3", "proxyquire": "^2.1.3", "sinon": "^21.0.3", "ts-loader": "^9.5.4", "ts-node": "^10.9.2", "ts-sinon": "^2.0.2", "typescript": "^5.5.3", "webpack": "^5.106.2", "webpack-cli": "^7.0.2" } } ================================================ FILE: package.nls.de.json ================================================ { "commands.SAS.addFileResource": "Neue Datei...", "commands.SAS.addFolderResource": "Neuer Ordner...", "commands.SAS.addProfile": "Neues Verbindungsprofil hinzufügen", "commands.SAS.addToFavorites": "Zu Meine Favoriten hinzufügen", "commands.SAS.authorize": "Anmelden", "commands.SAS.close": "Schließen der aktuellen Verbindung", "commands.SAS.collapseAll": "Alles einklappen", "commands.SAS.convertNotebookToFlow": "In Flow umwandeln...", "commands.SAS.copyPath": "Pfad kopieren", "commands.SAS.deleteProfile": "Verbindungsprofil löschen", "commands.SAS.deleteResource": "Löschen", "commands.SAS.deleteTable": "Löschen", "commands.SAS.download": "Download", "commands.SAS.emptyRecycleBin": "Papierkorb leeren", "commands.SAS.file.new": "Neue SAS Datei", "commands.SAS.file.new.short": "SAS Datei", "commands.SAS.notebook.export": "Exportieren", "commands.SAS.notebook.new": "Neues SAS Notebook", "commands.SAS.notebook.new.short": "SAS Notebook", "commands.SAS.notebook.saveOutput": "Ausgabe speichern", "commands.SAS.refresh": "Aktualisieren", "commands.SAS.removeFromFavorites": "Von Meine Faviorten entfernen", "commands.SAS.renameResource": "Umbenennen...", "commands.SAS.restoreResource": "Wiederherstellen", "commands.SAS.run": "Allen SAS Code ausführen", "commands.SAS.runRegion": "Auswahl ausführen", "commands.SAS.runSelected": "Auswahl oder Allen SAS Code ausführen", "commands.SAS.showTableProperties": "Eigenschaften", "commands.SAS.switchProfile": "Aktuelles Verbindungsprofil wechseln", "commands.SAS.toggleLineComment": "SAS-Code-Kommentare zeilenweise ein-/ausblenden", "commands.SAS.updateProfile": "Verbindungsprofil aktualisieren", "commands.SAS.upload": "Hochladen", "commands.SAS.uploadFiles": "Dateien hochladen", "commands.SAS.uploadFolders": "Ordner hochladen", "configuration.SAS.connectionProfiles": "Definieren Sie das Verbindungsprofil für die Verbindung zum SAS-Server. Wenn Sie mehr als ein Profil definieren, können Sie zwischen ihnen wechseln.", "configuration.SAS.connectionProfiles.activeProfile": "Aktives SAS Verbindungs Profil", "configuration.SAS.connectionProfiles.profiles": "SAS Verbindungs Profile", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS Verbindungs AutoExec", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS Verbindungs AutoExec Dateipfad", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS Verbindungs AutoExec Zeile", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS Verbindungs AutoExec Typ", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya Client ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya Client Secret", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM Verbindungshost", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Pfad für SAS COM Interop-Bibliothek", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS Verbindungsprofiltyp", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya Kontext", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya Verbindungsprofil Endpunkt", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Benutzerdefinierter Stammverzeichnispfad des SAS-Servers", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Stammverzeichnis des SAS-Servers", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM Server", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Pfad für SAS IOM Interop-Bibliothek", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM Serverport", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM Verbindungsbenutzername", "configuration.SAS.connectionProfiles.profiles.name": "SAS Verbindungsprofilname", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS Verbindungs SAS Optionen", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH Verbindungs SSH-Host", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH Verbindungsport", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH Private Key Dateipfad", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Ausführbarer Pfad für die SAS SSH-Verbindung", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH Verbindungsbenutzername", "configuration.SAS.flowConversionMode": "Wählen Sie den Konvertierungsmodus für Notebooks", "configuration.SAS.flowConversionModeNode": "Jede Notebook-Zelle in einen Knoten umwandeln", "configuration.SAS.flowConversionModeSwimlane": "Jede Notebook-Zelle in eine Swimlane umwandeln", "configuration.SAS.log.clearOnExecutionStart": "SAS Log zurück setzen bevor der Code ausgeführt wird", "configuration.SAS.log.showOnExecutionFinish": "SAS Log anzeigen wenn die Codeausführung beendet ist", "configuration.SAS.log.showOnExecutionStart": "SAS Log anzeigen mit Beginn der Codeausführung", "configuration.SAS.notebook.export.includeLog": "SAS-Log in exportiertes Notebook einschließen", "configuration.SAS.problems.log.enabled": "Probleme aus dem SAS-Protokoll anzeigen", "configuration.SAS.results.html.custom.style": "Legt fest, welcher SAS-Stil für die Schemata Light, Dark, HighContrast oder HighContrastLight verwendet werden soll. Diese Option wird wirksam, wenn `#SAS.results.html.style#` auf `(auto)` gesetzt ist.", "configuration.SAS.results.html.custom.style.dark": "Zu verwendender Stil für Schema Dark", "configuration.SAS.results.html.custom.style.highContrast": "Zu verwendender Stil für Schema High Contrast", "configuration.SAS.results.html.custom.style.highContrastLight": "Zu verwendender Stil für Schema High Contrast Light", "configuration.SAS.results.html.custom.style.light": "Zu verwendender Stil für Schema Light", "configuration.SAS.results.html.enabled": "Aktiveren/deaktiveren der ODS HTML5 Ausgabe", "configuration.SAS.results.html.style": "Lege den Style für ODS HTML5 Ergebnisse fest.", "configuration.SAS.results.html.style.(auto)": "Lassen Sie die Erweiterung einen Stil auswählen, der dem Farbschema am ehesten entspricht.", "configuration.SAS.results.html.style.(server default)": "Nutze den auf dem SAS Server konfigurierten Standardstyle.", "configuration.SAS.results.sideBySide": "Ergebnisse neben dem Code anzeigen", "configuration.SAS.results.singlePanel": "Ein Panel zur Anzeige der Ergebnisse wiederverwenden", "configuration.SAS.userProvidedCertificates": "Bereitstellung von vertrauenswürdigen CA-Zertifikatsdateien", "notebooks.SAS.htmlRenderer": "SAS HTML Renderer", "notebooks.SAS.logRenderer": "SAS Log Renderer", "notebooks.SAS.sasNotebook": "SAS Notebook", "themes.SAS.dark": "SAS Dunkel", "themes.SAS.highContrast": "SAS Hoher Kontrast", "themes.SAS.light": "SAS Hell", "views.SAS.explorer": "SAS Content", "views.SAS.libraries": "Bibliotheken", "views.SAS.serverExplorer": "SAS Server", "views.SAS.signIn": "Anmelden", "views.SAS.unsupportedConnection": "Ihre Verbindung unterstützt nicht die Navigation in SAS-Inhalten innerhalb der SAS Extension for Visual Studio Code. Sie können nur über die Explorer-Ansicht auf Dateien zugreifen.", "views.SAS.welcome": "Um die SAS-Erweiterung für Visual Studio Code zu nutzen, müssen Sie sich bei SAS anmelden.\n[Anmelden](command:SAS.authorize)" } ================================================ FILE: package.nls.es.json ================================================ { "commands.SAS.addFileResource": "Nuevo archivo...", "commands.SAS.addFolderResource": "Nueva carpeta...", "commands.SAS.addProfile": "Añadir nuevo perfil de conexión", "commands.SAS.addToFavorites": "Añadir a Mis favoritos", "commands.SAS.authorize": "Conexión", "commands.SAS.close": "Cerrar sesión actual", "commands.SAS.collapseAll": "Contraer todo", "commands.SAS.convertNotebookToFlow": "Convertir en flujo...", "commands.SAS.copyPath": "Copiar ruta", "commands.SAS.deleteProfile": "Eliminar perfil de conexión", "commands.SAS.deleteResource": "Eliminar", "commands.SAS.deleteTable": "Eliminar", "commands.SAS.download": "Descargar", "commands.SAS.emptyRecycleBin": "Vaciar papelera de reciclaje", "commands.SAS.file.new": "Nuevo archivo SAS", "commands.SAS.file.new.short": "Archivo SAS", "commands.SAS.notebook.export": "Exportar", "commands.SAS.notebook.new": "Nuevo bloc de notas SAS", "commands.SAS.notebook.new.short": "Bloc de notas SAS", "commands.SAS.notebook.saveOutput": "Guardar salida", "commands.SAS.refresh": "Actualizar", "commands.SAS.removeFromFavorites": "Quitar de Mis favoritos", "commands.SAS.renameResource": "Renombrar...", "commands.SAS.restoreResource": "Restaurar", "commands.SAS.run": "Ejecutar todo el código SAS", "commands.SAS.runRegion": "Ejecutar región", "commands.SAS.runSelected": "Ejecutar seleccionado o todo el código SAS", "commands.SAS.showTableProperties": "Propiedades", "commands.SAS.switchProfile": "Cambiar perfil de conexión actual", "commands.SAS.toggleLineComment": "Activar o desactivar comentarios de código SAS por línea", "commands.SAS.updateProfile": "Actualizar perfil de conexión", "commands.SAS.upload": "Subir", "commands.SAS.uploadFiles": "Subir archivos", "commands.SAS.uploadFolders": "Subir carpetas", "configuration.SAS.connectionProfiles": "Defina los perfiles de conexión para conectarse a servidores SAS. Si define más de un perfil, puede cambiarlos.", "configuration.SAS.connectionProfiles.activeProfile": "Activar perfil de conexión", "configuration.SAS.connectionProfiles.profiles": "Perfiles de conexión SAS", "configuration.SAS.connectionProfiles.profiles.autoExec": "Autoexec de conexión SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Ruta del archivo autoexec de conexión SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Línea de autoexec de conexión SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Tipo de autoexec de conexión SAS", "configuration.SAS.connectionProfiles.profiles.clientId": "ID de cliente SAS Viya", "configuration.SAS.connectionProfiles.profiles.clientSecret": "Secreto de cliente SAS Viya", "configuration.SAS.connectionProfiles.profiles.com.host": "Host de conexión SAS COM", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Ruta de la librería SAS COM interop", "configuration.SAS.connectionProfiles.profiles.connectionType": "Tipo de conexión del perfil SAS", "configuration.SAS.connectionProfiles.profiles.context": "Contexto SAS Viya", "configuration.SAS.connectionProfiles.profiles.endpoint": "Punto de conexión del perfil de conexión SAS Viya", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Ruta raíz personalizada del servidor SAS", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Raíz del servidor SAS", "configuration.SAS.connectionProfiles.profiles.iom.host": "Host de conexión SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Ruta de la librería SAS IOM interop", "configuration.SAS.connectionProfiles.profiles.iom.port": "Puerto de conexión SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.username": "Nombre de usuario de la conexión SAS IOM", "configuration.SAS.connectionProfiles.profiles.name": "Nombre del perfil de conexión SAS", "configuration.SAS.connectionProfiles.profiles.sasOptions": "Opciones SAS de conexión SAS", "configuration.SAS.connectionProfiles.profiles.ssh.host": "Host SSH de conexión SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.port": "Puerto de conexión SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "Ruta del archivo de clave privada de la conexión SAS SSH", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Ruta ejecutable de conexión SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nombre de usuario de conexión SSH SAS", "configuration.SAS.flowConversionMode": "Elegir el modo de conversión para blocs de notas", "configuration.SAS.flowConversionModeNode": "Convertir cada celda del bloc de notas en un nodo", "configuration.SAS.flowConversionModeSwimlane": "Convertir cada celda del bloc de notas en un canal", "configuration.SAS.log.clearOnExecutionStart": "Borrar Log SAS al iniciar la ejecución del código", "configuration.SAS.log.showOnExecutionFinish": "Mostrar log de SAS al finalizar la ejecución del código", "configuration.SAS.log.showOnExecutionStart": "Mostrar log de SAS al iniciar la ejecución del código", "configuration.SAS.notebook.export.includeLog": "Incluir log SAS en el bloc de notas exportado", "configuration.SAS.problems.log.enabled": "Mostrar problemas desde la log de SAS", "configuration.SAS.results.html.custom.style": "Especifica el estilo SAS que se va a utilizar para los temas light, dark, highContrast o highContrastLight. Esta opción se aplica cuando `#SAS.results.html.style#` se establece en `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Estilo que se va a utilizar para el tema dark", "configuration.SAS.results.html.custom.style.highContrast": "Estilo que se va a utilizar para el tema high contrast", "configuration.SAS.results.html.custom.style.highContrastLight": "Estilo que se va a utilizar para el tema high contrast light", "configuration.SAS.results.html.custom.style.light": "Estilo que se va a utilizar para el tema light", "configuration.SAS.results.html.enabled": "Habilitar/desabilitar la salida ODS HTML5", "configuration.SAS.results.html.style": "Especifica el estilo para resultados ODS HTML5.", "configuration.SAS.results.html.style.(auto)": "Permitir que la extensión seleccione un estilo que más se aproxime al tema de color.", "configuration.SAS.results.html.style.(server default)": "Utilizar el estilo predeterminado configurado en el servidor SAS.", "configuration.SAS.results.sideBySide": "Mostrar resultados en la parte del código", "configuration.SAS.results.singlePanel": "Reutilizar un solo panel para mostrar resultados", "configuration.SAS.userProvidedCertificates": "Proporcionar archivos de certificado SAS de confianza", "notebooks.SAS.htmlRenderer": "Renderización HTML SAS", "notebooks.SAS.logRenderer": "Renderización Log SAS", "notebooks.SAS.sasNotebook": "Bloc de notas SAS", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "Contenido SAS", "views.SAS.libraries": "Librerías", "views.SAS.serverExplorer": "Servidor SAS", "views.SAS.signIn": "Conexión", "views.SAS.unsupportedConnection": "La conexión no permite la navegación de contenido SAS dentro de SAS Extension for Visual Studio Code. Sólo puede acceder a los archivos utilizando la vista del explorador.", "views.SAS.welcome": "Para utilizar SAS Extension for Visual Studio Code, debe estar conectado a SAS.\n[Conexión](command:SAS.authorize)" } ================================================ FILE: package.nls.fr.json ================================================ { "commands.SAS.addFileResource": "Nouveau fichier…", "commands.SAS.addFolderResource": "Nouveau dossier…", "commands.SAS.addProfile": "Ajouter un nouveau profil de connexion", "commands.SAS.addToFavorites": "Ajouter aux favoris", "commands.SAS.authorize": "Se connecter", "commands.SAS.close": "Se déconnecter", "commands.SAS.collapseAll": "Réduire tout", "commands.SAS.convertNotebookToFlow": "Convertir en flux…", "commands.SAS.copyPath": "Copier le chemin", "commands.SAS.deleteProfile": "Supprimer le profil de connexion", "commands.SAS.deleteResource": "Supprimer", "commands.SAS.deleteTable": "Supprimer la table", "commands.SAS.download": "Télécharger", "commands.SAS.emptyRecycleBin": "Vider la corbeille", "commands.SAS.file.new": "Nouveau programme SAS", "commands.SAS.file.new.short": "Programme SAS", "commands.SAS.notebook.export": "Exporter", "commands.SAS.notebook.new": "Nouveau Notebook SAS", "commands.SAS.notebook.new.short": "Notebook SAS", "commands.SAS.notebook.saveOutput": "Enregistrer la sortie", "commands.SAS.refresh": "Actualiser", "commands.SAS.removeFromFavorites": "Retirer des favoris", "commands.SAS.renameResource": "Renommer...", "commands.SAS.restoreResource": "Restaurer", "commands.SAS.run": "Exécuter tout le code SAS", "commands.SAS.runRegion": "Exécuter la sélection", "commands.SAS.runSelected": "Exécuter la sélection ou tout le code SAS", "commands.SAS.showTableProperties": "Propriétés", "commands.SAS.switchProfile": "Changer le profil de connexion actuel", "commands.SAS.toggleLineComment": "Activer/Désactiver les commentaires du code SAS par ligne", "commands.SAS.updateProfile": "Mettre à jour le profil de connexion", "commands.SAS.upload": "Télécharger vers le serveur", "commands.SAS.uploadFiles": "Télécharger des fichiers vers le serveur", "commands.SAS.uploadFolders": "Télécharger des dossiers vers le serveur", "configuration.SAS.connectionProfiles": "Définir le profil de connexion pour se connecter au serveur SAS. Si vous définissez plus d'un profil vous pouvez basculer entre eux.", "configuration.SAS.connectionProfiles.activeProfile": "Profil de connexion SAS actif", "configuration.SAS.connectionProfiles.profiles": "Profils de connexion SAS", "configuration.SAS.connectionProfiles.profiles.autoExec": "Fichier AutoExec de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Chemin du fichier AutoExec de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Ligne dans le fichier AutoExec de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Type du fichier AutoExec de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.clientId": "ID du client SAS Viya", "configuration.SAS.connectionProfiles.profiles.clientSecret": "Clé secrète client SAS Viya", "configuration.SAS.connectionProfiles.profiles.com.host": "Hôte de connexion SAS COM", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Chemin de la bibliothèque SAS COM interop", "configuration.SAS.connectionProfiles.profiles.connectionType": "Type de connexion du profil SAS", "configuration.SAS.connectionProfiles.profiles.context": "Contexte SAS Viya", "configuration.SAS.connectionProfiles.profiles.endpoint": "Point de terminaison du profil de connexion SAS Viya", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Chemin racine personnalisé du SAS Server", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Chemin racine du SAS Server", "configuration.SAS.connectionProfiles.profiles.iom.host": "Hôte de connexion SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Chemin de la bibliothèque SAS IOM interop", "configuration.SAS.connectionProfiles.profiles.iom.port": "Port de la connexion SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.username": "Nom d'utilisateur de la connexion SAS IOM", "configuration.SAS.connectionProfiles.profiles.name": "Nom du profil de connexion SAS", "configuration.SAS.connectionProfiles.profiles.sasOptions": "Options pour la connexion SAS", "configuration.SAS.connectionProfiles.profiles.ssh.host": "Hôte SSH de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.ssh.port": "Port SSH de la connexion SAS", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "Chemin du fichier de clé privée pour la connexion SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Chemin exécutable de la connexion SAS SSH", "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nom d'utilisateur de la connexion SAS SSH", "configuration.SAS.flowConversionMode": "Choisissez le mode de conversion pour les notebooks SAS", "configuration.SAS.flowConversionModeNode": "Convertir chaque cellule du notebook en noeud", "configuration.SAS.flowConversionModeSwimlane": "Convertir chaque cellule du notebook en swimlane", "configuration.SAS.log.clearOnExecutionStart": "Purger le Journal (SAS Log) au démarrage de l'exécution", "configuration.SAS.log.showOnExecutionFinish": "Afficher le journal SAS quand l'exécution est terminée", "configuration.SAS.log.showOnExecutionStart": "Afficher le journal SAS au démarrage de l'exécution", "configuration.SAS.notebook.export.includeLog": "Inclure le journal SAS dans le bloc-notes exporté", "configuration.SAS.problems.log.enabled": "Afficher les erreurs dans le Journal (SAS Log)", "configuration.SAS.results.html.custom.style": "Spécifie quel style SAS utiliser pour les thèmes Light, Dark, HighContrast ou HighContrastLight. Cette option prend effet lorsque `#SAS.results.html.style#` est défini à `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Style à utiliser pour le thème Dark", "configuration.SAS.results.html.custom.style.highContrast": "Style à utiliser pour le thème High Contrast", "configuration.SAS.results.html.custom.style.highContrastLight": "Style à utiliser pour le thème High Contrast Light", "configuration.SAS.results.html.custom.style.light": "Style à utiliser pour le thème Light", "configuration.SAS.results.html.enabled": "Activer/désactiver la sortie ODS HTML5", "configuration.SAS.results.html.style": "Définir le style des résultats ODS HTML5", "configuration.SAS.results.html.style.(auto)": "Laisser l'extension choisir le style qui correspond le mieux au thème de couleurs", "configuration.SAS.results.html.style.(server default)": "Utiliser le style par défaut configuré sur le serveur SAS", "configuration.SAS.results.sideBySide": "Afficher les résultats à côté du code", "configuration.SAS.results.singlePanel": "Afficher les résultats dans une fenêtre indépendante", "configuration.SAS.userProvidedCertificates": "Fournir des fichiers de certificats d'autorité de certification (CA) fiables", "notebooks.SAS.htmlRenderer": "Rendu HTML SAS", "notebooks.SAS.logRenderer": "SAS Log Renderer", "notebooks.SAS.sasNotebook": "Notebook SAS", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "SAS Content", "views.SAS.libraries": "Bibliothèques", "views.SAS.serverExplorer": "Explorateur", "views.SAS.signIn": "Se connecter", "views.SAS.unsupportedConnection": "Cette connexion ne prend pas en charge la navigation dans le contenu SAS via l'extension Visual Studio Code. Vous ne pouvez accéder aux fichiers qu'à travers l'Explorateur.", "views.SAS.welcome": "Pour utiliser SAS Extension for Visual Studio Code, vous devez vous connecter à SAS.\n[Se connecter](command:SAS.authorize)" } ================================================ FILE: package.nls.it.json ================================================ { "commands.SAS.addFileResource": "Nuovo file...", "commands.SAS.addFolderResource": "Nuova cartella...", "commands.SAS.addProfile": "Aggiungi nuovo profilo di connessione", "commands.SAS.addToFavorites": "Aggiungi a Preferiti", "commands.SAS.authorize": "Accedi", "commands.SAS.close": "Chiudi sessione corrente", "commands.SAS.collapseAll": "Comprimi tutto", "commands.SAS.convertNotebookToFlow": "Converti in flusso...", "commands.SAS.copyPath": "Copia percorso", "commands.SAS.deleteProfile": "Elimina profilo di connessione", "commands.SAS.deleteResource": "Elimina", "commands.SAS.deleteTable": "Elimina", "commands.SAS.download": "Esegui download", "commands.SAS.emptyRecycleBin": "Svuota Cestino", "commands.SAS.file.new": "Nuovo file SAS", "commands.SAS.file.new.short": "File SAS", "commands.SAS.notebook.export": "Esporta", "commands.SAS.notebook.new": "Nuovo SAS Notebook", "commands.SAS.notebook.new.short": "SAS Notebook", "commands.SAS.notebook.saveOutput": "Salva l'output", "commands.SAS.refresh": "Aggiorna", "commands.SAS.removeFromFavorites": "Rimuovi da Preferiti", "commands.SAS.renameResource": "Rinomina...", "commands.SAS.restoreResource": "Ripristina", "commands.SAS.run": "Esegui tutto il codice SAS", "commands.SAS.runRegion": "Esegui la sezione", "commands.SAS.runSelected": "Esegui codice SAS selezionato o tutto", "commands.SAS.showTableProperties": "Proprietà", "commands.SAS.switchProfile": "Passa al profilo di connessione corrente", "commands.SAS.toggleLineComment": "Attiva/Disattiva i commenti di SAS Code per riga", "commands.SAS.updateProfile": "Aggiorna profilo di connessione", "commands.SAS.upload": "Esegui upload", "commands.SAS.uploadFiles": "Esegui upload dei file", "commands.SAS.uploadFolders": "Esegui upload delle cartelle", "configuration.SAS.connectionProfiles": "Definire i profili di connessione per connettersi ai server SAS. Se si definisce più di un profilo, è possibile passare da uno all'altro.", "configuration.SAS.connectionProfiles.activeProfile": "Profilo di connessione SAS attivo", "configuration.SAS.connectionProfiles.profiles": "Profili di connessione SAS", "configuration.SAS.connectionProfiles.profiles.autoExec": "AutoExec della connessione SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Percorso del file di autoExec della connessione SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Riga di autoExec della connessione SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Tipo di autoExec della connessione SAS", "configuration.SAS.connectionProfiles.profiles.clientId": "ID Client SAS Viya", "configuration.SAS.connectionProfiles.profiles.clientSecret": "Client secret SAS Viya", "configuration.SAS.connectionProfiles.profiles.com.host": "Host della connessione SAS COM", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Percorso della libreria SAS COM Interop", "configuration.SAS.connectionProfiles.profiles.connectionType": "Tipo di connessione del profilo SAS", "configuration.SAS.connectionProfiles.profiles.context": "Contesto di SAS Viya", "configuration.SAS.connectionProfiles.profiles.endpoint": "Endpoint del profilo di connessione SAS Viya", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Percorso principale personalizzato del server SAS", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Percorso principale del server SAS", "configuration.SAS.connectionProfiles.profiles.iom.host": "Host di Connessione SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Percorso della libreria SAS IOM Interop", "configuration.SAS.connectionProfiles.profiles.iom.port": "Porta di Connessione SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.username": "Nome utente per connessione SAS IOM", "configuration.SAS.connectionProfiles.profiles.name": "Nome del profilo di connessione SAS", "configuration.SAS.connectionProfiles.profiles.sasOptions": "Opzioni della connessione SAS", "configuration.SAS.connectionProfiles.profiles.ssh.host": "Host della connessione SAS SSH", "configuration.SAS.connectionProfiles.profiles.ssh.port": "Porta della connessione SAS SSH", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "Percorso del file della chiave privata della connessione SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Percorso dell'eseguibile della connessione SAS SSH", "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nome utente della connessione SAS SSH", "configuration.SAS.flowConversionMode": "Scegli la modalità di conversione per i notebook", "configuration.SAS.flowConversionModeNode": "Converti ogni cella del notebook in un nodo", "configuration.SAS.flowConversionModeSwimlane": "Converti ogni cella del notebook in una swimlane", "configuration.SAS.log.clearOnExecutionStart": "Cancella il log SAS all'avvio dell'esecuzione", "configuration.SAS.log.showOnExecutionFinish": "Mostra il log SAS quando l'esecuzione termina", "configuration.SAS.log.showOnExecutionStart": "Mostra il log SAS quando l'esecuzione inizia", "configuration.SAS.notebook.export.includeLog": "Includi log SAS nel notebook esportato", "configuration.SAS.problems.log.enabled": "Mostra problemi evidenziati nel log SAS", "configuration.SAS.results.html.custom.style": "Specifica quale stile SAS usare per i temi Light, Dark, HighContrast o HighContrastLight. Questa opzione ha effetto quando `#SAS.results.html.style#` è impostato a `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Stile da usare per il tema Dark", "configuration.SAS.results.html.custom.style.highContrast": "Stile da usare per il tema High Contrast", "configuration.SAS.results.html.custom.style.highContrastLight": "Stile da usare per il tema High Contrast Light", "configuration.SAS.results.html.custom.style.light": "Stile da usare per il tema Light", "configuration.SAS.results.html.enabled": "Abilita/Disabilita output ODS HTML5", "configuration.SAS.results.html.style": "Specifica lo stile per i risultati ODS HTML5.", "configuration.SAS.results.html.style.(auto)": "Permetti all'estensione di scegliere uno stile che si avvicina maggiormente al tema del colore.", "configuration.SAS.results.html.style.(server default)": "Impostare come default lo stile configurato sul server SAS.", "configuration.SAS.results.sideBySide": "Mostra i risultati accanto al codice", "configuration.SAS.results.singlePanel": "Riutilizza un singolo riquadro per mostrare i risultati", "configuration.SAS.userProvidedCertificates": "Fornisci file dei certificati CA affidabili", "notebooks.SAS.htmlRenderer": "SAS HTML Renderer", "notebooks.SAS.logRenderer": "SAS Log Renderer", "notebooks.SAS.sasNotebook": "SAS Notebook", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "Contenuto SAS", "views.SAS.libraries": "Librerie", "views.SAS.serverExplorer": "Server SAS", "views.SAS.signIn": "Accedi", "views.SAS.unsupportedConnection": "La connessione non supporta la navigazione nel contenuto SAS all'interno di SAS Extension for Visual Studio Code. È possibile accedere ai file solo utilizzando la visualizzazione Explorer.", "views.SAS.welcome": "Per utilizzare SAS Extension for Visual Studio Code, occorre accedere a SAS.\n[Accedi](command:SAS.authorize)" } ================================================ FILE: package.nls.ja.json ================================================ { "commands.SAS.addFileResource": "ファイルの新規作成...", "commands.SAS.addFolderResource": "フォルダーの新規作成...", "commands.SAS.addProfile": "新しい接続プロファイルを追加する", "commands.SAS.addToFavorites": "お気に入りに追加する", "commands.SAS.authorize": "サインイン", "commands.SAS.close": "現在のセッションを閉じる", "commands.SAS.collapseAll": "すべて折りたたむ", "commands.SAS.convertNotebookToFlow": "フローに変換...", "commands.SAS.copyPath": "パスのコピー", "commands.SAS.deleteProfile": "接続プロファイルを削除する", "commands.SAS.deleteResource": "削除", "commands.SAS.deleteTable": "削除", "commands.SAS.download": "ダウンロード", "commands.SAS.emptyRecycleBin": "ごみ箱を空にする", "commands.SAS.file.new": "SAS ファイルの新規作成", "commands.SAS.file.new.short": "SAS ファイル", "commands.SAS.notebook.export": "エクスポート", "commands.SAS.notebook.new": "新しい SAS ノートブック", "commands.SAS.notebook.new.short": "SAS ノートブック", "commands.SAS.notebook.saveOutput": "出力の保存", "commands.SAS.refresh": "更新", "commands.SAS.removeFromFavorites": "お気に入りから削除する", "commands.SAS.renameResource": "名前の変更...", "commands.SAS.restoreResource": "復元", "commands.SAS.run": "すべて SAS コードを実行する", "commands.SAS.runRegion": "領域の実行", "commands.SAS.runSelected": "選択済みまたはすべての SAS コードを実行", "commands.SAS.showTableProperties": "プロパティ", "commands.SAS.switchProfile": "現在の接続プロファイルを切り替える", "commands.SAS.toggleLineComment": "SAS コードのコメントを行単位で切り替える", "commands.SAS.updateProfile": "接続プロファイルの更新", "commands.SAS.upload": "アップロード", "commands.SAS.uploadFiles": "ファイルのアップロード", "commands.SAS.uploadFolders": "フォルダーのアップロード", "configuration.SAS.connectionProfiles": "SAS Server に接続するための接続プロファイルを定義します。複数のプロファイルを定義する場合は、それらを切り替えることができます。", "configuration.SAS.connectionProfiles.activeProfile": "アクティブな SAS 接続プロファイル", "configuration.SAS.connectionProfiles.profiles": "SAS 接続プロファイル", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS 接続 AutoExec", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS 接続 AutoExec ファイルパス", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS 接続 AutoExec 行", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS 接続 AutoExec 種類", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya クライアント ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya クライアントシークレット", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM 接続ホスト", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "SAS COM interop ライブラリパス", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS プロファイル接続タイプ", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya コンテキスト", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya 接続プロファイルエンドポイント", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "SAS サーバーのカスタムルートパス", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "SAS サーバーのルート", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM 接続ホスト", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "SAS IOM interop ライブラリパス", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM 接続ポート", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM 接続ユーザー名", "configuration.SAS.connectionProfiles.profiles.name": "SAS 接続プロファイル名", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS 接続 SAS オプション", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH 接続 SSH ホスト", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH 接続ポート", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH 接続の秘密キーファイルパス", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH 接続の実行可能パス", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH 接続ユーザー名", "configuration.SAS.flowConversionMode": "ノートブックの変換モードを選択する", "configuration.SAS.flowConversionModeNode": "各ノートブックのセルをノードに変換する", "configuration.SAS.flowConversionModeSwimlane": "各ノートブックのセルをスイムレーンに変換する", "configuration.SAS.log.clearOnExecutionStart": "コードの実行開始時に SAS ログをクリア", "configuration.SAS.log.showOnExecutionFinish": "コードの実行終了時に SAS ログを表示する", "configuration.SAS.log.showOnExecutionStart": "コードの実行開始時に SAS ログを表示する", "configuration.SAS.notebook.export.includeLog": "エクスポートするノートブックに SAS ログを含める", "configuration.SAS.problems.log.enabled": "SAS ログから問題を表示する", "configuration.SAS.results.html.custom.style": "light、dark、highContrast、highContrastLight の各テーマに使用する SAS スタイルを指定します。このオプションは、`#SAS.results.html.style#` が `(auto)` に設定されている場合に有効になります。", "configuration.SAS.results.html.custom.style.dark": "dark テーマに使用するスタイル", "configuration.SAS.results.html.custom.style.highContrast": "high contrast テーマに使用するスタイル", "configuration.SAS.results.html.custom.style.highContrastLight": "high contrast light テーマに使用するスタイル", "configuration.SAS.results.html.custom.style.light": "light テーマに使用するスタイル", "configuration.SAS.results.html.enabled": "ODS HTML5 出力の有効化/無効化を設定する", "configuration.SAS.results.html.style": "ODS HTML5 結果のスタイルを指定する", "configuration.SAS.results.html.style.(auto)": "カラーテーマに最も近いスタイルを拡張機能に選択させます。", "configuration.SAS.results.html.style.(server default)": "デフォルトは、SAS Server で構成されたスタイルです。", "configuration.SAS.results.sideBySide": "結果をコードの横に表示する", "configuration.SAS.results.singlePanel": "単一パネルを再利用して結果を表示する", "configuration.SAS.userProvidedCertificates": "信頼された証明機関 (CA) 証明書ファイルを指定する", "notebooks.SAS.htmlRenderer": "SAS HTML レンダラー", "notebooks.SAS.logRenderer": "SAS ログレンダラー", "notebooks.SAS.sasNotebook": "SAS ノートブック", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "SAS コンテンツ", "views.SAS.libraries": "ライブラリ", "views.SAS.serverExplorer": "SAS サーバー", "views.SAS.signIn": "サインイン", "views.SAS.unsupportedConnection": "この接続では、SAS Extension for Visual Studio Code 内の SAS コンテンツナビゲーションがサポートされていません。ファイルにアクセスできるのは、エクスプローラービューのみです。", "views.SAS.welcome": "SAS Extension for Visual Studio Code を使用するには、SAS にサインインする必要があります。\n [Sign In](command:SAS.authorize)" } ================================================ FILE: package.nls.json ================================================ { "commands.SAS.addFileResource": "New File...", "commands.SAS.addFolderResource": "New Folder...", "commands.SAS.addProfile": "Add New Connection Profile", "commands.SAS.addToFavorites": "Add to My Favorites", "commands.SAS.authorize": "Sign in", "commands.SAS.close": "Close Current Session", "commands.SAS.collapseAll": "Collapse All", "commands.SAS.convertNotebookToFlow": "Convert to Flow...", "commands.SAS.copyPath": "Copy Path", "commands.SAS.deleteProfile": "Delete Connection Profile", "commands.SAS.deleteResource": "Delete", "commands.SAS.deleteTable": "Delete", "commands.SAS.download": "Download", "commands.SAS.emptyRecycleBin": "Empty Recycle Bin", "commands.SAS.file.new": "New SAS File", "commands.SAS.file.new.short": "SAS File", "commands.SAS.notebook.export": "Export", "commands.SAS.notebook.new": "New SAS Notebook", "commands.SAS.notebook.new.short": "SAS Notebook", "commands.SAS.notebook.saveOutput": "Save Output", "commands.SAS.refresh": "Refresh", "commands.SAS.removeFromFavorites": "Remove from My Favorites", "commands.SAS.renameResource": "Rename...", "commands.SAS.restoreResource": "Restore", "commands.SAS.run": "Run All SAS Code", "commands.SAS.runRegion": "Run Region", "commands.SAS.runSelected": "Run Selected or All SAS Code", "commands.SAS.showTableProperties": "Properties", "commands.SAS.switchProfile": "Switch Current Connection Profile", "commands.SAS.toggleLineComment": "Toggle SAS Code Comments by Line", "commands.SAS.updateProfile": "Update Connection Profile", "commands.SAS.upload": "Upload", "commands.SAS.uploadFiles": "Upload Files", "commands.SAS.uploadFolders": "Upload Folders", "configuration.SAS.connectionProfiles": "Define the connection profiles to connect to SAS servers. If you define more than one profile, you can switch between them.", "configuration.SAS.connectionProfiles.activeProfile": "Active SAS Connection Profile", "configuration.SAS.connectionProfiles.profiles": "SAS Connection Profiles", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS Connection AutoExec", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS Connection AutoExec File path", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS Connection AutoExec Line", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS Connection AutoExec type", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya Client ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya Client Secret", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM Connection Host", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "SAS COM interop library path", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS Profile Connection Type", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya Context", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya Connection Profile Endpoint", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "SAS Server custom root path", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "SAS Server root", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM Connection Host", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "SAS IOM interop library path", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM Connection port", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM Connection username", "configuration.SAS.connectionProfiles.profiles.name": "SAS Connection Profile Name", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS Connection SAS options", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH Connection SSH Host", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH Connection port", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH Connection private key file path", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH Connection executable path", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH Connection username", "configuration.SAS.flowConversionMode": "Choose the conversion mode for notebooks", "configuration.SAS.flowConversionModeNode": "Convert each notebook cell to a node", "configuration.SAS.flowConversionModeSwimlane": "Convert each notebook cell to a swimlane", "configuration.SAS.log.clearOnExecutionStart": "Clear SAS Log when code execution starts", "configuration.SAS.log.showOnExecutionFinish": "Show SAS Log when code execution is finished", "configuration.SAS.log.showOnExecutionStart": "Show SAS Log when code execution starts", "configuration.SAS.notebook.export.includeLog": "Include SAS log in exported notebook", "configuration.SAS.problems.log.enabled": "Show problems from SAS log", "configuration.SAS.results.html.custom.style": "Specifies which SAS style to use for the light, dark, highContrast, or highContrastLight themes. This option takes effect when `#SAS.results.html.style#` is set to `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Style to use for dark theme", "configuration.SAS.results.html.custom.style.highContrast": "Style to use for high contrast theme", "configuration.SAS.results.html.custom.style.highContrastLight": "Style to use for high contrast light theme", "configuration.SAS.results.html.custom.style.light": "Style to use for light theme", "configuration.SAS.results.html.enabled": "Enable/disable ODS HTML5 output", "configuration.SAS.results.html.style": "Specifies the style for ODS HTML5 results.", "configuration.SAS.results.html.style.(auto)": "Let the extension pick a style that most closely matches the color theme.", "configuration.SAS.results.html.style.(server default)": "Default to the style configured on the SAS server.", "configuration.SAS.results.sideBySide": "Display results to the side of the code", "configuration.SAS.results.singlePanel": "Reuse single panel to display results", "configuration.SAS.userProvidedCertificates": "Provide trusted CA certificate files", "notebooks.SAS.htmlRenderer": "SAS HTML Renderer", "notebooks.SAS.logRenderer": "SAS Log Renderer", "notebooks.SAS.sasNotebook": "SAS Notebook", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "SAS Content", "views.SAS.libraries": "Libraries", "views.SAS.serverExplorer": "SAS Server", "views.SAS.signIn": "Sign In", "views.SAS.unsupportedConnection": "Your connection does not support SAS content navigation within the SAS Extension for Visual Studio Code. You can access files only using the Explorer view.", "views.SAS.welcome": "To use the SAS Extension for Visual Studio Code, you must sign in to SAS.\n[Sign In](command:SAS.authorize)" } ================================================ FILE: package.nls.ko.json ================================================ { "commands.SAS.addFileResource": "새 파일...", "commands.SAS.addFolderResource": "새 폴더...", "commands.SAS.addProfile": "새로운 연결 프로필 추가", "commands.SAS.addToFavorites": "내 즐겨찾기에 추가", "commands.SAS.authorize": "로그인", "commands.SAS.close": "현재 세션 닫기", "commands.SAS.collapseAll": "모두 축소", "commands.SAS.convertNotebookToFlow": "플로우로 변환...", "commands.SAS.copyPath": "복사 경로", "commands.SAS.deleteProfile": "연결 프로필 삭제", "commands.SAS.deleteResource": "삭제", "commands.SAS.deleteTable": "삭제", "commands.SAS.download": "다운로드", "commands.SAS.emptyRecycleBin": "휴지통 비우기", "commands.SAS.file.new": "새 SAS 파일", "commands.SAS.file.new.short": "SAS 파일", "commands.SAS.notebook.export": "내보내기", "commands.SAS.notebook.new": "새로운 SAS 노트북", "commands.SAS.notebook.new.short": "SAS 노트북", "commands.SAS.notebook.saveOutput": "출력 저장", "commands.SAS.refresh": "새로고침", "commands.SAS.removeFromFavorites": "내 즐겨찾기에서 제거", "commands.SAS.renameResource": "이름 변경...", "commands.SAS.restoreResource": "복원", "commands.SAS.run": "모든 SAS 코드 실행", "commands.SAS.runRegion": "영역 실행", "commands.SAS.runSelected": "선택한 코드 또는 모든 SAS 코드 실행", "commands.SAS.showTableProperties": "속성", "commands.SAS.switchProfile": "현재 연결 프로필 전환", "commands.SAS.toggleLineComment": "행별 SAS 코드 주석 켜기/끄기", "commands.SAS.updateProfile": "연결 프로필 업데이트", "commands.SAS.upload": "업로드", "commands.SAS.uploadFiles": "파일 업로드", "commands.SAS.uploadFolders": "폴더 업로드", "configuration.SAS.connectionProfiles": "SAS 서버에 연결하기 위한 연결 프로필을 정의합니다. 두 개 이상의 프로필을 정의하는 경우 서로 전환할 수 있습니다.", "configuration.SAS.connectionProfiles.activeProfile": "활성 SAS 연결 프로필", "configuration.SAS.connectionProfiles.profiles": "SAS 연결 프로필", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS 연결 자동 실행", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS 연결 자동 실행 파일 경로", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS 연결 자동 실행 라인", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS 연결 자동 실행 유형", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya 클라이언트 ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya 클라이언트 비밀번호", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM 연결 호스트", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "SAS COM interop 라이브러리 경로", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS 프로필 연결 유형", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya 컨텍스트", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya 연결 프로필 엔드포인트", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "SAS Server 사용자 정의 루트 경로", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "SAS Server 루트", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM 연결 호스트", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "SAS IOM interop 라이브러리 경로", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM 연결 포트", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM 연결 사용자 이름", "configuration.SAS.connectionProfiles.profiles.name": "SAS 연결 프로필 이름", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS 연결 SAS 옵션", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH 연결 SSH 호스트", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH 연결 포트", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH 연결 개인 키 파일 경로", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH 연결 실행 파일 경로", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH 연결 사용자 이름", "configuration.SAS.flowConversionMode": "노트북의 변환 모드 선택", "configuration.SAS.flowConversionModeNode": "각 노트북 셀을 노드로 변환", "configuration.SAS.flowConversionModeSwimlane": "각 노트북 셀을 스윔레인으로 변환", "configuration.SAS.log.clearOnExecutionStart": "코드 실행 시작 시 SAS 로그 지우기", "configuration.SAS.log.showOnExecutionFinish": "코드 실행이 완료되면 SAS 로그 표시", "configuration.SAS.log.showOnExecutionStart": "코드 실행이 시작되면 SAS 로그 표시", "configuration.SAS.notebook.export.includeLog": "내보낸 노트북에 SAS 로그 포함", "configuration.SAS.problems.log.enabled": "SAS 로그에서 문제 표시", "configuration.SAS.results.html.custom.style": "Light, Dark, highContrast 또는 highContrastLight 테마에 사용할 SAS 스타일을 지정합니다. 이 옵션은 `#SAS.results.html.style#`이 `(auto)`로 설정될 때 적용됩니다.", "configuration.SAS.results.html.custom.style.dark": "Dark 테마에 사용할 스타일", "configuration.SAS.results.html.custom.style.highContrast": "High Contrast 테마에 사용할 스타일", "configuration.SAS.results.html.custom.style.highContrastLight": "High Contrast Light 테마에 사용할 스타일", "configuration.SAS.results.html.custom.style.light": "Light 테마에 사용할 스타일", "configuration.SAS.results.html.enabled": "ODS HTML5 출력 활성화/비활성화", "configuration.SAS.results.html.style": "ODS HTML5 결과에 대한 스타일 지정", "configuration.SAS.results.html.style.(auto)": "확장 기능이 색상 테마와 가장 일치하는 스타일을 선택하도록 합니다.", "configuration.SAS.results.html.style.(server default)": "SAS 서버에서 구성한 스타일을 기본값으로 설정합니다.", "configuration.SAS.results.sideBySide": "코드 옆에 결과 표시", "configuration.SAS.results.singlePanel": "결과 표시에 단일 패널 재사용", "configuration.SAS.userProvidedCertificates": "신뢰할 수 있는 CA 인증서 파일 제공", "notebooks.SAS.htmlRenderer": "SAS HTML 렌더러", "notebooks.SAS.logRenderer": "SAS 로그 렌더러", "notebooks.SAS.sasNotebook": "SAS 노트북", "themes.SAS.dark": "SAS 다크", "themes.SAS.highContrast": "SAS 고대비", "themes.SAS.light": "SAS 라이트", "views.SAS.explorer": "SAS 콘텐츠", "views.SAS.libraries": "라이브러리", "views.SAS.serverExplorer": "SAS 서버", "views.SAS.signIn": "로그인", "views.SAS.unsupportedConnection": "귀하의 연결은 SAS Extension for Visual Studio Code 내에서 SAS 콘텐츠 탐색을 지원하지 않습니다. 탐색기 뷰를 사용하여야 파일을 방문할 수 있습니다.", "views.SAS.welcome": "SAS Extension for Visual Studio Code를 사용하려면 SAS에 로그인해야 합니다.\n[로그인](command:SAS.authorize)" } ================================================ FILE: package.nls.pl.json ================================================ { "commands.SAS.addFileResource": "Nowy plik…", "commands.SAS.addFolderResource": "Nowy folder…", "commands.SAS.addProfile": "Dodaj nowy profil połączenia", "commands.SAS.addToFavorites": "Dodaj do Moich ulubionych ", "commands.SAS.authorize": "Zaloguj się", "commands.SAS.close": "Zamknij bieżącą serię", "commands.SAS.collapseAll": "Zwiń wszystko", "commands.SAS.convertNotebookToFlow": "Konwertuj na potok…", "commands.SAS.copyPath": "Kopiuj ścieżkę", "commands.SAS.deleteProfile": "Usuń profil połączenia", "commands.SAS.deleteResource": "Usuń", "commands.SAS.deleteTable": "Usuń", "commands.SAS.download": "Pobierz", "commands.SAS.emptyRecycleBin": "Opróżnij kosz", "commands.SAS.file.new": "Nowy plik SAS-owy", "commands.SAS.file.new.short": "Plik SAS-owy", "commands.SAS.notebook.export": "Eksportuj", "commands.SAS.notebook.new": "Nowy notatnik SAS-owy", "commands.SAS.notebook.new.short": "Notatnik SAS-owy", "commands.SAS.notebook.saveOutput": "Zapisz wyniki", "commands.SAS.refresh": "Odśwież", "commands.SAS.removeFromFavorites": "Usuń z Moich ulubionych", "commands.SAS.renameResource": "Zmień nazwę…", "commands.SAS.restoreResource": "Przywróć", "commands.SAS.run": "Uruchom cały kod SAS-owy", "commands.SAS.runRegion": "Uruchom region", "commands.SAS.runSelected": "Uruchom wybrane lub cały kod SAS-owy", "commands.SAS.showTableProperties": "Właściwości", "commands.SAS.switchProfile": "Przełącz bieżący profil SAS-owy", "commands.SAS.toggleLineComment": "Przełącz komentarze do kodu SAS-owego wg wiersza", "commands.SAS.updateProfile": "Zaktualizuj profil połączenia", "commands.SAS.upload": "Załaduj", "commands.SAS.uploadFiles": "Załaduj pliki", "commands.SAS.uploadFolders": "Załaduj foldery", "configuration.SAS.connectionProfiles": "add translation here", "configuration.SAS.connectionProfiles.activeProfile": "Aktywny profil połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles": "Profile połączeń SAS-owych", "configuration.SAS.connectionProfiles.profiles.autoExec": "Plik autoexec połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Ścieżka pliku autoexec połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Wiersz autoexec połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Typ pliku autoexec połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.clientId": "Id. klienta SAS Viya", "configuration.SAS.connectionProfiles.profiles.clientSecret": "Klucz tajny klienta SAS Viya", "configuration.SAS.connectionProfiles.profiles.com.host": "Host połączenia SAS COM", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Ścieżka do biblioteki interop SAS COM", "configuration.SAS.connectionProfiles.profiles.connectionType": "Typ profilu SAS-owego", "configuration.SAS.connectionProfiles.profiles.context": "Kontekst SAS Viya", "configuration.SAS.connectionProfiles.profiles.endpoint": "Punkt końcowy profilu połączenia SAS Viya", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Niestandardowa ścieżka główna serwera SAS-owego", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Ścieżka główna serwera SAS-owego", "configuration.SAS.connectionProfiles.profiles.iom.host": "Host połączenia SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Ścieżka do biblioteki interop SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.port": "Port połączenia SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.username": "Nazwa użytkownika połączenia SAS IOM", "configuration.SAS.connectionProfiles.profiles.name": "Nazwa profilu połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.sasOptions": "Opcje SAS-owe połączenia SAS-owego", "configuration.SAS.connectionProfiles.profiles.ssh.host": "Host SSH połączenia SAS-owego SSH", "configuration.SAS.connectionProfiles.profiles.ssh.port": "Port połączenia SAS-owego SSH", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "Ścieżka do pliku klucza prywatnego dla połączenia SAS-owego SSH", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Ścieżka wykonywalna do połączenia SAS-owego SSH", "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nazwa użytkownika połączenia SAS-owego SSH", "configuration.SAS.flowConversionMode": "Wybierz metodę konwersji dla notatników", "configuration.SAS.flowConversionModeNode": "Konwertuj każdą komórkę notatnika na węzeł", "configuration.SAS.flowConversionModeSwimlane": "Konweruj każdą komórkę notatnika na tor", "configuration.SAS.log.clearOnExecutionStart": "Wyczyść log SAS-owy po rozpoczęciu uruchamiania kodu", "configuration.SAS.log.showOnExecutionFinish": "Wyświetl log SAS-owy po zakończeniu uruchamiania kodu", "configuration.SAS.log.showOnExecutionStart": "Wyświetl log SAS-owy po rozpoczęciu uruchamiania kodu", "configuration.SAS.notebook.export.includeLog": "Dołącz log SAS-owy do eksportowanego notatnika", "configuration.SAS.problems.log.enabled": "Wyświetl problemy z logu SAS-owego", "configuration.SAS.results.html.custom.style": "Określa, którego stylu SAS-owego należy użyć do motywu Light, Dark, High Contrast lub High Contrast Light. Opcja ta daje efekty, gdy `#SAS.results.html.style#` jest ustawione jako `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Styl używany do motywu Dark", "configuration.SAS.results.html.custom.style.highContrast": "Styl używany do motywu High Contrast", "configuration.SAS.results.html.custom.style.highContrastLight": "Styl używany do motywu High Contrast Light", "configuration.SAS.results.html.custom.style.light": "Styl używany do motywu Light", "configuration.SAS.results.html.enabled": "Włącz/wyłącz wyniki ODS HTML5", "configuration.SAS.results.html.style": "Określa styl rezultatów ODS HTML5", "configuration.SAS.results.html.style.(auto)": "Rozszerzenie wybiera styl najbardziej odpowiadający schematowi kolorystycznemu", "configuration.SAS.results.html.style.(server default)": "Domyślnie użyj stylu skonfigurowanego na serwerze SAS-owym", "configuration.SAS.results.sideBySide": "Wyświetl rezultaty z boku kodu", "configuration.SAS.results.singlePanel": "Ponownie użyj panelu aby wyświelić rezultaty", "configuration.SAS.userProvidedCertificates": "Podaj pliki zaufane certyfikatu CA", "notebooks.SAS.htmlRenderer": "Renderer SAS-owego kodu HTML", "notebooks.SAS.logRenderer": "Renderer logu SAS-owego", "notebooks.SAS.sasNotebook": "Notatnik SAS-owy", "themes.SAS.dark": "SAS-owy ciemny", "themes.SAS.highContrast": "SAS-owy wysoki kontrast", "themes.SAS.light": "SAS-owy jasny", "views.SAS.explorer": "Zawartość SAS-owa", "views.SAS.libraries": "Biblioteki", "views.SAS.serverExplorer": "Serwer SAS-owy", "views.SAS.signIn": "Zaloguj się", "views.SAS.unsupportedConnection": "Połączenie nie obsługuje nawigacji po zawartości SAS-owej w obrębie SAS Extension for Visual Studio Code.", "views.SAS.welcome": "Aby użyć SAS Extension for Visual Studio Code należy zalogować się do SAS-a. [Sign In](command:SAS.authorize)" } ================================================ FILE: package.nls.pt-br.json ================================================ { "commands.SAS.addFileResource": "Arquivo novo...", "commands.SAS.addFolderResource": "Pasta nova...", "commands.SAS.addProfile": "Adicionar um Perfil de Conexão novo", "commands.SAS.addToFavorites": "Adiciona ao My Favorites", "commands.SAS.authorize": "Conecte-se", "commands.SAS.close": "Fecha a sessão atual", "commands.SAS.collapseAll": "Recolher todos", "commands.SAS.convertNotebookToFlow": "Converta a Flow...", "commands.SAS.copyPath": "Copiar caminho", "commands.SAS.deleteProfile": "Exclui Perfil de Conexão", "commands.SAS.deleteResource": "Exclui recurso", "commands.SAS.deleteTable": "Exclui tabela", "commands.SAS.download": "Download", "commands.SAS.emptyRecycleBin": "Esvazia a lixeira", "commands.SAS.file.new": "Novo arquivo SAS", "commands.SAS.file.new.short": "Arquivo SAS", "commands.SAS.notebook.export": "Exporte", "commands.SAS.notebook.new": "Novo Notebook SAS", "commands.SAS.notebook.new.short": "Notebook SAS", "commands.SAS.notebook.saveOutput": "Salvar resultado", "commands.SAS.refresh": "Refrescar", "commands.SAS.removeFromFavorites": "Exclui iten de My Favorites", "commands.SAS.renameResource": "Renomeia...", "commands.SAS.restoreResource": "Restabelece", "commands.SAS.run": "Execute o inteiro programa SAS", "commands.SAS.runRegion": "Execute o código da região", "commands.SAS.runSelected": "Execute o selecão ou o programa SAS inteiro", "commands.SAS.showTableProperties": "Propriedades", "commands.SAS.switchProfile": "Troca o perfil de conexão atual", "commands.SAS.toggleLineComment": "Alternar comentários de código SAS por linha", "commands.SAS.updateProfile": "Atualiza o perfil de conexão", "commands.SAS.upload": "Faz upload", "commands.SAS.uploadFiles": "Faz upload dos arquivos", "commands.SAS.uploadFolders": "Faz upload da pasta", "configuration.SAS.connectionProfiles": "Define os perfis de conexão para conectar-se aos servidores SAS. Se defines mais de um perfil, poderá alternar entre eles.", "configuration.SAS.connectionProfiles.activeProfile": "Ativa Perfil de Conexão SAS", "configuration.SAS.connectionProfiles.profiles": "Perfils de Conexão SAS", "configuration.SAS.connectionProfiles.profiles.autoExec": "Arquivo AutoExec da Conexão SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "Caminho do Arquivo AutoExec da Conexão SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "Linha no Arquivo AutoExec da Conexão SAS", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "Tipo do Arquivo AutoExec da Conexão SAS", "configuration.SAS.connectionProfiles.profiles.clientId": "ID do Cliente do SAS Viya", "configuration.SAS.connectionProfiles.profiles.clientSecret": "Segredo do Cliente do SAS Viya ", "configuration.SAS.connectionProfiles.profiles.com.host": "Host de conexão SAS COM", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "Caminho da biblioteca interop SAS COM", "configuration.SAS.connectionProfiles.profiles.connectionType": "Tipo de Conexão do Perfil SAS", "configuration.SAS.connectionProfiles.profiles.context": "Contexto SAS Viya", "configuration.SAS.connectionProfiles.profiles.endpoint": "Ponto final do perfil de conexão SAS Viya", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "Caminho raiz personalizado do arquivo no servidor SAS", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "Caminho raiz do arquivo no servidor SAS", "configuration.SAS.connectionProfiles.profiles.iom.host": "Conexão do Host SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "Caminho da biblioteca interop SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.port": "Porta do Host SAS IOM", "configuration.SAS.connectionProfiles.profiles.iom.username": "Nome de usuário para o conexão SAS IOM", "configuration.SAS.connectionProfiles.profiles.name": "Nome do Perfil de Conexão SAS", "configuration.SAS.connectionProfiles.profiles.sasOptions": "Opções SAS da conexão SAS", "configuration.SAS.connectionProfiles.profiles.ssh.host": "Host SSH da Conexão SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.port": "Porta da Conexão SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "Caminho ao arquivo da chave privada da conexão SSH do SAS", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "Caminho executável da Conexão SSH SAS", "configuration.SAS.connectionProfiles.profiles.ssh.username": "Nome de Usuário do Conexão SAS", "configuration.SAS.flowConversionMode": "Escolha o modo de conversão para os notebooks", "configuration.SAS.flowConversionModeNode": "Converta cada célula do notebook a um nó", "configuration.SAS.flowConversionModeSwimlane": "Converta cada célula do notebook em uma raia (swimlane)", "configuration.SAS.log.clearOnExecutionStart": "Limpa o SAS ao início da execução do código", "configuration.SAS.log.showOnExecutionFinish": "Mostrar log SAS quando a execução for concluída", "configuration.SAS.log.showOnExecutionStart": "Mostrar log SAS quando a execução começa", "configuration.SAS.notebook.export.includeLog": "Incluir o log SAS no notebook exportado", "configuration.SAS.problems.log.enabled": "Mostre os problemas do log do SAS", "configuration.SAS.results.html.custom.style": "Especifica qual estilo SAS usar para os temas claro, escuro, alto contraste ou alto contraste claro. Esta opção é aplicada quando `#SAS.results.html.style#` está definido como `(auto)`.", "configuration.SAS.results.html.custom.style.dark": "Estilo a ser usado para o tema escuro", "configuration.SAS.results.html.custom.style.highContrast": "Estilo a ser usado para o tema alto contraste", "configuration.SAS.results.html.custom.style.highContrastLight": "Estilo a ser usado para o tema alto contraste claro", "configuration.SAS.results.html.custom.style.light": "Estilo a ser usado para o tema claro", "configuration.SAS.results.html.enabled": "Habilitar/desabilitar resultados HTML5 do ODS", "configuration.SAS.results.html.style": "Especifica o estilo dos resultados HTML5 do ODS.", "configuration.SAS.results.html.style.(auto)": "Deixa que a extensão escolha o estilo que corresponda melhor ao tema de cores.", "configuration.SAS.results.html.style.(server default)": "Use o estilo padrão configurado no servidor SAS.", "configuration.SAS.results.sideBySide": "Exibir resultados ao lado do código", "configuration.SAS.results.singlePanel": "Exibe os resultados em um painel único e reutilizado", "configuration.SAS.userProvidedCertificates": "Forneça os arquivos de certifiçao CA confiáveis.", "notebooks.SAS.htmlRenderer": "Renderizador SAS de HTML", "notebooks.SAS.logRenderer": "SAS Log Renderer", "notebooks.SAS.sasNotebook": "Notebook SAS", "themes.SAS.dark": "SAS Escuro", "themes.SAS.highContrast": "SAS Alta Contrasto", "themes.SAS.light": "SAS Clara", "views.SAS.explorer": "Conteúdo SAS", "views.SAS.libraries": "Bibliotecas", "views.SAS.serverExplorer": "Servidor SAS", "views.SAS.signIn": "Sign In", "views.SAS.unsupportedConnection": "Este conexão não suporte a navegação de conteúdo SAS na extensão Visual Studio Code SAS. Somente pode acessar arquivos usando o Explorador.", "views.SAS.welcome": "Para usar a extensão SAS no Visual Studio Code, precisas fazer login ao SAS.\n[Sign In](command:SAS.authorize)" } ================================================ FILE: package.nls.zh-cn.json ================================================ { "commands.SAS.addFileResource": "新文件...", "commands.SAS.addFolderResource": "新文件夹...", "commands.SAS.addProfile": "添加新的连接配置文件", "commands.SAS.addToFavorites": "添加到我的收藏夹", "commands.SAS.authorize": "登录", "commands.SAS.close": "关闭当前会话", "commands.SAS.collapseAll": "全部折叠", "commands.SAS.convertNotebookToFlow": "转换为流...", "commands.SAS.copyPath": "复制路径", "commands.SAS.deleteProfile": "删除连接配置文件", "commands.SAS.deleteResource": "删除", "commands.SAS.deleteTable": "删除", "commands.SAS.download": "下载", "commands.SAS.emptyRecycleBin": "清空回收站", "commands.SAS.file.new": "新 SAS 文件", "commands.SAS.file.new.short": "SAS 文件", "commands.SAS.notebook.export": "导出", "commands.SAS.notebook.new": "新 SAS 笔记本", "commands.SAS.notebook.new.short": "SAS 笔记本", "commands.SAS.notebook.saveOutput": "保存输出", "commands.SAS.refresh": "刷新", "commands.SAS.removeFromFavorites": "从我的收藏夹中删除", "commands.SAS.renameResource": "重命名...", "commands.SAS.restoreResource": "恢复", "commands.SAS.run": "运行所有 SAS 代码", "commands.SAS.runRegion": "运行区域", "commands.SAS.runSelected": "运行选定或所有 SAS 代码", "commands.SAS.showTableProperties": "属性", "commands.SAS.switchProfile": "切换当前连接配置文件", "commands.SAS.toggleLineComment": "按行切换 SAS 代码注释", "commands.SAS.updateProfile": "更新连接配置文件", "commands.SAS.upload": "上传", "commands.SAS.uploadFiles": "上传文件", "commands.SAS.uploadFolders": "上传文件夹", "configuration.SAS.connectionProfiles": "定义连接配置文件以连接到 SAS 服务器。如果定义多个配置文件,您可以在它们之间进行切换。", "configuration.SAS.connectionProfiles.activeProfile": "活动 SAS 连接配置文件", "configuration.SAS.connectionProfiles.profiles": "SAS 连接配置文件", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS 连接 AutoExec", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS 连接 AutoExec 文件路径", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS 连接 AutoExec 行", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS 连接 AutoExec 类型", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya 客户端 ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya 客户端密钥", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM 连接主机", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "SAS COM 互操作库路径", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS 配置文件连接类型", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya 上下文", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya 连接配置文件端点", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "SAS 服务器自定义根路径", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "SAS 服务器根目录", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM 连接主机", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "SAS IOM 互操作库路径", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM 连接端口", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM 连接用户名", "configuration.SAS.connectionProfiles.profiles.name": "SAS 连接配置文件名称", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS 连接 SAS 选项", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH 连接 SSH 主机", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH 连接端口", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH 连接私钥文件路径", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH 连接可执行路径", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH 连接用户名", "configuration.SAS.flowConversionMode": "选择笔记本的转换模式", "configuration.SAS.flowConversionModeNode": "将每个笔记本单元转换为一个节点", "configuration.SAS.flowConversionModeSwimlane": "将每个笔记本单元转换为泳道", "configuration.SAS.log.clearOnExecutionStart": "代码执行开始时清空 SAS 日志", "configuration.SAS.log.showOnExecutionFinish": "代码执行完成时显示 SAS 日志", "configuration.SAS.log.showOnExecutionStart": "代码执行开始时显示 SAS 日志", "configuration.SAS.notebook.export.includeLog": "在导出的笔记本中包含 SAS 日志", "configuration.SAS.problems.log.enabled": "显示SAS日志中报告的问题", "configuration.SAS.results.html.custom.style": "指定浅色、深色、高对比度或高对比度浅色主题使用的 SAS 样式。当`#SAS.results.html.style#`设置为`(auto)`时,此选项生效。", "configuration.SAS.results.html.custom.style.dark": "用于深色主题的样式", "configuration.SAS.results.html.custom.style.highContrast": "用于高对比度主题的样式", "configuration.SAS.results.html.custom.style.highContrastLight": "用于高对比度浅色主题的样式", "configuration.SAS.results.html.custom.style.light": "用于浅色主题的样式", "configuration.SAS.results.html.enabled": "启用/禁用 ODS HTML5 输出", "configuration.SAS.results.html.style": "指定 ODS HTML5 结果的样式。", "configuration.SAS.results.html.style.(auto)": "让扩展程序选择与颜色主题最匹配的样式。", "configuration.SAS.results.html.style.(server default)": "默认为 SAS 服务器上配置的样式。", "configuration.SAS.results.sideBySide": "将结果显示在代码旁边", "configuration.SAS.results.singlePanel": "重复使用单个面板来显示结果", "configuration.SAS.userProvidedCertificates": "提供受信任的 CA 证书文件", "notebooks.SAS.htmlRenderer": "SAS HTML 渲染器", "notebooks.SAS.logRenderer": "SAS 日志渲染器", "notebooks.SAS.sasNotebook": "SAS 笔记本", "themes.SAS.dark": "SAS 深色", "themes.SAS.highContrast": "SAS 高对比度", "themes.SAS.light": "SAS 浅色", "views.SAS.explorer": "SAS 内容", "views.SAS.libraries": "库", "views.SAS.serverExplorer": "SAS 服务器", "views.SAS.signIn": "登录", "views.SAS.unsupportedConnection": "您的连接不支持 SAS Extension for Visual Studio Code 中的 SAS 内容导航。您只能使用资源管理器视图访问文件。", "views.SAS.welcome": "要使用 SAS Extension for Visual Studio Code,您必须登录 SAS。\n[登录](command:SAS.authorize)" } ================================================ FILE: package.nls.zh-tw.json ================================================ { "commands.SAS.addFileResource": "新增檔案…", "commands.SAS.addFolderResource": "新增資料夾…", "commands.SAS.addProfile": "增加新的連線設定檔", "commands.SAS.addToFavorites": "增加到我的最愛", "commands.SAS.authorize": "登入", "commands.SAS.close": "關閉目前工作階段", "commands.SAS.collapseAll": "全部摺疊", "commands.SAS.convertNotebookToFlow": "轉換為流程…", "commands.SAS.copyPath": "複製路徑", "commands.SAS.deleteProfile": "刪除連線設定檔", "commands.SAS.deleteResource": "刪除", "commands.SAS.deleteTable": "刪除", "commands.SAS.download": "下載", "commands.SAS.emptyRecycleBin": "清空資源回收筒", "commands.SAS.file.new": "新增 SAS 檔案", "commands.SAS.file.new.short": "SAS 檔案", "commands.SAS.notebook.export": "匯出", "commands.SAS.notebook.new": "新增 SAS 筆記本", "commands.SAS.notebook.new.short": "SAS 筆記本", "commands.SAS.notebook.saveOutput": "儲存輸出", "commands.SAS.refresh": "重新整理", "commands.SAS.removeFromFavorites": "從我的最愛移除", "commands.SAS.renameResource": "重新命名…", "commands.SAS.restoreResource": "還原", "commands.SAS.run": "執行所有 SAS 程式碼", "commands.SAS.runRegion": "執行區域", "commands.SAS.runSelected": "執行選取的或所有的 SAS 程式碼", "commands.SAS.showTableProperties": "屬性", "commands.SAS.switchProfile": "切換目前連線設定檔", "commands.SAS.toggleLineComment": "依行切換 SAS 程式碼註解", "commands.SAS.updateProfile": "更新連線設定檔", "commands.SAS.upload": "上傳", "commands.SAS.uploadFiles": "上傳檔案", "commands.SAS.uploadFolders": "上傳資料夾", "configuration.SAS.connectionProfiles": "定義連線設定檔以連線至 SAS 伺服器。如果您定義多個設定檔,則可以在設定檔之間進行切換。", "configuration.SAS.connectionProfiles.activeProfile": "使用中的 SAS 連線設定檔", "configuration.SAS.connectionProfiles.profiles": "SAS 連線設定檔", "configuration.SAS.connectionProfiles.profiles.autoExec": "SAS 連線 AutoExec", "configuration.SAS.connectionProfiles.profiles.autoExec.filePath": "SAS 連線 AutoExec 檔案路徑", "configuration.SAS.connectionProfiles.profiles.autoExec.line": "SAS 連線 AutoExec 行", "configuration.SAS.connectionProfiles.profiles.autoExec.type": "SAS 連線 AutoExec 類型", "configuration.SAS.connectionProfiles.profiles.clientId": "SAS Viya 用戶端 ID", "configuration.SAS.connectionProfiles.profiles.clientSecret": "SAS Viya 用戶端密碼", "configuration.SAS.connectionProfiles.profiles.com.host": "SAS COM 連線主機", "configuration.SAS.connectionProfiles.profiles.com.interopLibraryFolderPath": "SAS COM Interop 程式庫路徑", "configuration.SAS.connectionProfiles.profiles.connectionType": "SAS 設定檔連線類型", "configuration.SAS.connectionProfiles.profiles.context": "SAS Viya 環境", "configuration.SAS.connectionProfiles.profiles.endpoint": "SAS Viya 連線設定檔端點", "configuration.SAS.connectionProfiles.profiles.fileNavigationCustomRootPath": "SAS 伺服器自訂根路徑", "configuration.SAS.connectionProfiles.profiles.fileNavigationRoot": "SAS 伺服器根", "configuration.SAS.connectionProfiles.profiles.iom.host": "SAS IOM 連線主機", "configuration.SAS.connectionProfiles.profiles.iom.interopLibraryFolderPath": "SAS IOM Interop 程式庫路徑", "configuration.SAS.connectionProfiles.profiles.iom.port": "SAS IOM 連線連接埠", "configuration.SAS.connectionProfiles.profiles.iom.username": "SAS IOM 連線使用者名稱", "configuration.SAS.connectionProfiles.profiles.name": "SAS 連線設定檔名稱", "configuration.SAS.connectionProfiles.profiles.sasOptions": "SAS 連線 SAS 選項", "configuration.SAS.connectionProfiles.profiles.ssh.host": "SAS SSH 連線 SSH 主機", "configuration.SAS.connectionProfiles.profiles.ssh.port": "SAS SSH 連線連接埠", "configuration.SAS.connectionProfiles.profiles.ssh.privateKeyFilePath": "SAS SSH 連線私密金鑰檔案路徑", "configuration.SAS.connectionProfiles.profiles.ssh.saspath": "SAS SSH 連線可執行檔路徑", "configuration.SAS.connectionProfiles.profiles.ssh.username": "SAS SSH 連線使用者名稱", "configuration.SAS.flowConversionMode": "選擇筆記本的轉換模式", "configuration.SAS.flowConversionModeNode": "將每個筆記本儲存格轉換為節點", "configuration.SAS.flowConversionModeSwimlane": "將每個筆記本儲存格轉換為區隔線", "configuration.SAS.log.clearOnExecutionStart": "在程式碼開始執行時清除 SAS 日誌", "configuration.SAS.log.showOnExecutionFinish": "在程式碼完成執行時顯示 SAS 日誌", "configuration.SAS.log.showOnExecutionStart": "在程式碼開始執行時顯示 SAS 日誌", "configuration.SAS.notebook.export.includeLog": "在匯出的筆記本中包含 SAS 日誌", "configuration.SAS.problems.log.enabled": "顯示 SAS 日誌中的問題", "configuration.SAS.results.html.custom.style": "指定要使用哪個主題的 SAS 樣式──light、dark、highContrast 或 highContrastLight 主題。此選項會在 `#SAS.results.html.style#` 設定為 `(auto)` 時生效。", "configuration.SAS.results.html.custom.style.dark": "Dark 主題樣式", "configuration.SAS.results.html.custom.style.highContrast": "High Contrast 主題樣式", "configuration.SAS.results.html.custom.style.highContrastLight": "High Contrast Light 主題樣式", "configuration.SAS.results.html.custom.style.light": "Light 主題樣式", "configuration.SAS.results.html.enabled": "啟用/停用 ODS HTML5 輸出", "configuration.SAS.results.html.style": "指定 ODS HTML5 結果的樣式。", "configuration.SAS.results.html.style.(auto)": "讓擴充模組選擇最符合顏色主題的樣式。", "configuration.SAS.results.html.style.(server default)": "預設為 SAS 伺服器上設定的樣式。", "configuration.SAS.results.sideBySide": "在程式碼旁邊顯示結果", "configuration.SAS.results.singlePanel": "重複使用單一面板來顯示結果", "configuration.SAS.userProvidedCertificates": "提供信任的 CA 憑證檔案", "notebooks.SAS.htmlRenderer": "SAS HTML 轉譯器", "notebooks.SAS.logRenderer": "SAS 日誌轉譯器", "notebooks.SAS.sasNotebook": "SAS 筆記本", "themes.SAS.dark": "SAS Dark", "themes.SAS.highContrast": "SAS High Contrast", "themes.SAS.light": "SAS Light", "views.SAS.explorer": "SAS 內容", "views.SAS.libraries": "資料館", "views.SAS.serverExplorer": "SAS 伺服器", "views.SAS.signIn": "登入", "views.SAS.unsupportedConnection": "您的連線不支援 SAS Extension for Visual Studio Code 內的 SAS 內容瀏覽。您只能使用檔案總管檢視來存取檔案。", "views.SAS.welcome": "若要使用 SAS Extension for Visual Studio Code,您必須登入 SAS.\r\n[Sign In](command:SAS.authorize)" } ================================================ FILE: prettier.config.js ================================================ module.exports = { plugins: ["@trivago/prettier-plugin-sort-imports"], importOrder: [ "^vscode(.*)$", "^react(.*)$", "^@(.*)$", "", "^[./].*(? 0, \nthe DIGAMMA function is the derivative of the LGAMMA function."}},{"Name":"EXP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the e constant raised to a specified power. \n \nReturn value data type: DOUBLE \n\nSyntax: EXP (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails:\nThe EXP function raises the constant e, which is approximately given by 2.71828, \nto the power that is supplied by the argument. The result is limited by the maximum \nvalue of a double decimal value on the computer."}},{"Name":"FLOOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest integer less than or equal to a numeric value expression. \n \nReturn value data type: DOUBLE \n\nSyntax: FLOOR (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails:\nIf expression is within 1E-12 of an integer, the function returns that integer. If the \nresult is a number that does not fit into the range of a DOUBLE, the FLOOR function fails.\n\nComparisons: \nThe FLOOR function fuzzes the results so that if the results are within 1E-12 of an integer, \nthe FLOOR function returns that integer. The FLOORZ function uses zero fuzzing. Therefore, \nwith the FLOORZ function you might get unexpected results."}},{"Name":"FLOORZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest integer that is less than or equal to the argument, using zero fuzzing. \n \nReturn value data type: DOUBLE \n\nSyntax: FLOORZ (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nComparisons: \nUnlike the FLOOR function, the FLOORZ function uses zero fuzzing. If the argument is within \n1E-12 of an integer, the FLOOR function fuzzes the result to be equal to that integer. The \nFLOORZ function does not fuzz the result. Therefore, with the FLOORZ function you might get \nunexpected results."}},{"Name":"FUZZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nearest integer if the argument is within 1E-12 of that integer. \n \nReturn value data type: DOUBLE \n\nSyntax: FUZZ(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe FUZZ function returns the nearest integer value if the expression is within 1E-12 of the \ninteger (that is, if the absolute difference between the integer and argument is less than \n1E-12). Otherwise, the expression is returned."}},{"Name":"GAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the gamma function. \n \nReturn value data type: DOUBLE \n\nSyntax: GAMMA(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Restriction: Nonpositive integers are invalid. \n Valid data types: DOUBLE \n \nDetails:\nThe GAMMA function returns the integral, which is given by\n\nGAMMA(x)=\u222bt^(x-1) \u03f5^(-t) dt\n\nFor positive integers, GAMMA(x) is (x - 1)!. This function is commonly denoted by \u0393(x).\n\n"}},{"Name":"GCD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the greatest common divisor for a set of integers. \n \nReturn value data type: DOUBLE \n\nSyntax: GCD (expression-1, expression-2 [, ... expression-n ] ) \n\nArguments:\nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirements: At least two arguments are required. \n Valid data types: DOUBLE \n \nDetails:\nThe GCD (greatest common divisor) function returns the greatest common divisor of one \nor more integers. For example, the greatest common divisor for 30 and 42 is 6. The \ngreatest common divisor is also called the highest common factor."}},{"Name":"GEOMEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geometric mean. \n \nReturn value data type: DOUBLE \n\nSyntax: GEOMEAN(expression [, ....expression ] ) \n\nArguments: \nexpression \n is any valid expression that evaluates to a non-negative numeric value.\n\n Valid data types: DOUBLE \n \nDetails:\nIf any argument is negative, then the result is a null or missing value. A message \nappears in the log that the negative argument is invalid. If any argument is zero, \nthen the geometric mean is zero. If all the arguments are null or missing values, \nthen the result is a null or missing value. Otherwise, the result is the geometric \nmean of the non-null or non-missing values."}},{"Name":"GEOMEANZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geometric mean, using zero fuzzing. \n \nReturn value data type: DOUBLE \n\nSyntax: GEOMEANZ(expression [, ... expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a non-negative numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nIf any argument is negative, then the result is a null or missing value. A message \nappears in the log that the negative argument is invalid. If any argument is zero, \nthen the geometric mean is zero. If all the arguments are null or missing values, \nthen the result is a null or missing value. Otherwise, the result is the geometric \nmean of the non-null or non-missing values."}},{"Name":"HARMEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the harmonic mean. \n \nReturn value data type: DOUBLE \n\nSyntax: HARMEAN(expression [, ...expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a non-negative numeric value.\n\n Valid data types: DOUBLE \n \nDetails:\nIf any argument is negative, then the result is a null or missing value. A message \nappears in the log that the negative argument is invalid. If all the arguments are \nnull or missing values, then the result is a null or missing value. Otherwise, the \nresult is the harmonic mean of the non-null or non-missing values. \n\nIf any argument is zero, then the harmonic mean is zero. Otherwise, the harmonic \nmean is the reciprocal of the arithmetic mean of the reciprocals of the values."}},{"Name":"HARMEANZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the harmonic mean, using zero fuzzing. \n \nReturn value data type: DOUBLE \n\nSyntax: HARMEANZ(expression [, ...expression ] ) \n\nArguments: \n expression \n specifies any valid expression that evaluates to a non-negative numeric value.\n\n Valid data types: DOUBLE \n \nDetails:\nIf any argument is negative, then the result is a null or value. A message appears \nin the log that the negative argument is invalid. If all the arguments are null or \nvalues, then the result is a null or value. Otherwise, the result is the harmonic \nmean of the non-null or non-missing values. \n\nIf any argument is zero, then the harmonic mean is zero. Otherwise, the harmonic \nmean is the reciprocal of the arithmetic mean of the reciprocals of the values."}},{"Name":"HMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS time value from hour, minute, and second values. \n \nReturn value data type: DOUBLE \n\nSyntax: HMS (hour, minute, second) \n\nArguments: \nhour \n specifies a numeric expression that represents an integer from 1 through 12.\n\n Valid data types: DOUBLE \n \nminute \n specifies a numeric expression that represents an integer from 1 through 59. \n\n Valid data types: DOUBLE \n\nsecond \n specifies a numeric expression that represents an integer from 1 through 59.\n\n Valid data types: DOUBLE \n \nDetails:\nThe HMS function returns a numeric value that represents a SAS time value. A SAS time \nvalue is a number that represents the number of seconds since midnight of the current day."}},{"Name":"HOUR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hour from a SAS time or datetime value. \n \nReturn value data type: DOUBLE \n\nSyntax: HOUR( [time | datetime ] ) \n\nArguments: \ntime \n specifies any valid expression that represents a SAS time value.\n\n Valid data types: DOUBLE \n\ndatetime\n specifies any valid expression that represents a SAS datetime value.\n\n Valid data types: DOUBLE \n \nDetails:\nThe HOUR function returns a numeric value that represents the hour from a SAS time \nor datetime value. Numeric values can range from 0 through 23. HOUR always returns \na positive number."}},{"Name":"INDEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for a string of characters, and returns the \nposition of the string's first character for the first occurrence of the string. \n\nReturn value data type: DOUBLE \n\nSyntax: INDEX(target-expression, search-expression) \n\nArguments: \ntarget-expression \n specifies any valid expression that evaluates to a character string.\n\n Valid data types: NCHAR \n \nsearch-expression \n specifies any valid expression that evaluates to a character string to search for in target-expression.\n\n Valid data types: NCHAR \n Tip: Enclose a literal string of characters in single quotation marks. \n \nDetails:\nThe INDEX function searches target-expression, from left to right, for the first \noccurrence of the string specified in search-expression, and returns the position \nin target-expression of the string's first character. If the string is not found \nin target-expression, INDEX returns a value of 0. If there are multiple occurrences \nof the string, INDEX returns only the position of the first occurrence. \n \nComparisons:\nThe VERIFY function returns the position of the first character in target-expression \nthat does not contain search-expression where the INDEX function returns the position \nof the first occurrence of search-expression that is present in target-expression."}},{"Name":"INDEXC","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for specified characters and returns the position \nof the first occurrence of any of the characters. \n\nReturn value data type: DOUBLE \n\nSyntax: INDEXC(target-expression, search-expression [, ...search-expression ] ) \n\nArguments: \ntarget-expression \n specifies any valid expression that evaluates to a character string that is searched.\n\n Valid data types: NCHAR \n\nsearch-expression \n specifies the characters to search for in target-expression.\n\n Valid data types: NCHAR \n Tip: Enclose a literal string of characters in single quotation marks. \n \nDetails:\nThe INDEXC function searches target-expression, from left to right, for the first \noccurrence of any character present in the search expressions and returns the position \nin target-expression of that character. If none of the characters in the search \nexpressions are found in target-expression, INDEXC returns a value of 0.\n \nComparisons:\nThe INDEXC function searches for the first occurrence of any individual character that \nis present within the search expression, whereas the INDEX function searches for the \nfirst occurrence of the search expression as a pattern."}},{"Name":"INDEXW","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for a string that is specified as a word, and \nreturns the position of the first character in the word. \n\nReturn value data type: DOUBLE \nSyntax: INDEXW(target-expression, search-expression [, delimiter] ) \n\nArguments:\ntarget-expression \n specifies any valid expression that evaluates to a character string that is searched. \n Valid data types: NCHAR \n \nsearch-expression \n specifies any valid expression that evaluates to a character string and that is searched \n for in target-expression. SAS removes the leading and trailing delimiters from search-expression.\n Valid data types: NCHAR \n Tip: INDEXW has the following behavior when search-expression contains blank spaces or \n has a length of 0: \n If both target-expression and search-expression contain only blank spaces or have a length \n of 0, then INDEXW returns a value of 1. \n\n If search-expression contains only blank spaces or has a length of 0, and target-expression \n contains character or numeric data, then INDEXW returns a value of 0. \n\ndelimiter \n specifies a character expression that you want INDEXW to use as a word separator in the \n character strings. The default delimiter is the blank character. \n Tip: If the blank character is a delimiter, order it so that it is not the last character \n in delimiter. Trailing blanks are ignored because delimiter is trimmed of trailing blanks. \n Valid data types: NCHAR \n \nDetails:\nThe INDEXW function searches target-expression, from left to right, for the first occurrence \nof search-expression and returns the position in target-expression of the substring's first \ncharacter. If the substring is not found in target-expression, then INDEXW returns a value \nof 0. If there are multiple occurrences of the string, then INDEXW returns only the position \nof the first occurrence.\n\nThe substring pattern must begin and end on a word boundary. For INDEXW, word boundaries are \ndelimiters, the beginning of target-expression, and the end of target-expression.\n \nComparisons: \nThe INDEXW function searches for strings that are words, whereas the INDEX function searches \nfor patterns as separate words or as parts of other words. INDEXC searches for any characters \nthat are present in the excerpts."}},{"Name":"INT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the integer value, fuzzed to avoid unexpected floating-point results. \n \nReturn value data type: DOUBLE \n\nSyntax: INT(expression) \n\nArguments: \nexpression \n specifies any expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n \nDetails: \nThe INT function returns the integer portion of the argument (truncates the decimal portion). \nIf the argument's value is within 1E-12 of an integer, the function results in that integer. \nIf the value of expression is positive, the INT function has the same result as the FLOOR \nfunction. If the value of expression is negative, the INT function has the same result as \nthe CEILING function. \n \nComparisons:\nUnlike the INTZ function, the INT function fuzzes the result. If the argument is within \n1E-12 of an integer, the INT function fuzzes the result to be equal to that integer. The \nINTZ function does not fuzz the result. Therefore, with the INTZ function you might get \nunexpected results."}},{"Name":"INTZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the integer portion of the argument, using zero fuzzing. \n \nReturn value data type: DOUBLE \n\nSyntax: INTZ (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe following rules apply: \n\n o If the value of the argument is an exact integer, INTZ returns that integer.\n\n o If the argument is positive and not an integer, INTZ returns the largest integer that is less than the argument. \n\n o If the argument is negative and not an integer, INTZ returns the smallest integer that is greater than the argument.\n \nComparisons: \nUnlike the INT function, the INTZ function uses zero fuzzing. If the argument is within 1E-12 \nof an integer, the INT function fuzzes the result to be equal to that integer. The INTZ function \ndoes not fuzz the result. Therefore, with the INTZ function you might get unexpected results."}},{"Name":"IQR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the interquartile range. \n \nReturn value data type: DOUBLE \n\nSyntax: IQR(expression [, ...expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nIf all arguments have null or missing values, the result is a null or missing value \ndepending on whether you are in ANSI mode or SAS mode.\n\nOtherwise, the result is the interquartile range of the non-null or non-missing values. \nThe formula for the interquartile range is the same as the one that is used in the\nBase SAS UNIVARIATE procedure."}},{"Name":"JULDATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the Julian date from a SAS date value. \n \nReturn value data type: DOUBLE \nSyntax: JULDATE(date) \n\nArguments: \ndate \n specifies any valid expression that represents a SAS date value. \n Valid data types: DOUBLE \n \nDetails:\nA SAS date value is a number that represents the number of days from January 1, 1960 \nto a specific date. The JULDATE function converts a SAS date value to a Julian date. \nIf date falls within the 100-year span defined by the system option YEARCUTOFF=, the \nresult has three, four or five digits: In a five digit result, the first two digits \nrepresent the year, and the next three digits represent the day of the year (1 to 365, \nor 1 to 366 for leap years). As leading zeros are dropped from the result, the year \nportion of a Julian date can be omitted (for years ending in 00) or it can have only \none digit (for years ending 01 - 09). Otherwise, the result has seven digits: the \nfirst four digits represent the year, and the next three digits represent the day \nof the year.\n\nFor years that end between 00 - 09, you can format the five digit Julian date by \nusing the Z5. format. \n\nComparisons: \nThe function JULDATE7 is similar to JULDATE except that JULDATE7 always returns a \nfour digit year. Thus JULDATE7 is year 2000 compliant because it eliminates the need \nto consider the implications of a two digit year."}},{"Name":"JULDATE7","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a seven-digit Julian date from a SAS date value. \n \nReturn value data type: DOUBLE \n\nSyntax: JULDATE7(date) \n\nArguments: \ndate \n specifies any valid expression that represents a SAS date value. \n Valid data types: DOUBLE \n \nDetails:\nA SAS date value is a number that represents the number of days from January 1, 1960 \nto a specific date. The JULDATE7 function returns a seven digit Julian date from a SAS \ndate value. The first four digits represent the year, and the next three digits represent \nthe day of the year. \n\nComparisons: \nThe function JULDATE7 is similar to JULDATE except that JULDATE7 always returns a four \ndigit year. Thus JULDATE7 is year 2000 compliant because it eliminates the need to consider \nthe implications of a two digit year."}},{"Name":"KURTOSIS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kurtosis. \n \nReturn value data type: DOUBLE \n\nSyntax \nKURTOSIS(expression-1, expression-2, expression-3, expression-4 [ ,...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirement: At least four non-null or non-missing arguments are required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE \n \nDetails: \nKurtosis is primarily a measure of the heaviness of the tails of a distribution. Large \nkurtosis values indicate that the distribution has heavy tails. \n\nNull values and missing values are ignored and are not included in the computation.\n\nIf all non-null or non-missing arguments have equal values, the kurtosis is mathematically \nundefined and the KURTOSIS function returns a null or missing value."}},{"Name":"LARGEST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kth largest non-null or non-missing value. \n \nReturn value data type: DOUBLE \nSyntax: LARGEST (k, expression [, ...expression] ) \n\nArguments: \nk \n specifies any valid expression that evaluates to a numeric value that represents \n the largest value to return. For example, if k is 2, the LARGEST function returns \n the second largest value from the list of expressions.\n\n Valid data types: DOUBLE \n See: TSPL Expressions \n\nexpression \n specifies any valid expression that evaluates to a numeric value and that is to be searched. \n Valid data types: DOUBLE \n See: TSPL Expressions \n \nDetails:\nIf k is null or missing, less than zero, or greater than the number of values, the result \nis a null or missing value. Otherwise, if k is greater than the number of non-null or \nnon-missing values, the result is a null or missing value."}},{"Name":"LCM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the least common multiple for a set of integers. \n \nReturn value data type: DOUBLE \n\nSyntax \nLCM (expression-1, expression-2 [ ,...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to an integer.\n\n Requirements: At least two arguments are required. \n Valid data types: DOUBLE \n \nDetails: \nThe least common multiple is the smallest number that two or more numbers will \ndivide into evenly."}},{"Name":"LEFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Left aligns a character expression. \n \nReturn value data type: VARCHAR, NVARCHAR \n\nSyntax: LEFT(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: CHAR, NCHAR \n \nDetails: \nLEFT returns a character string with leading blanks moved to the end of the value."}},{"Name":"LENGTH|LENGTHN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a character string, excluding trailing blanks, and returns a 0 \nfor a blank character string. \n\nReturn value data type: DOUBLE \n\nSyntax: LENGTH(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: CHAR, NCHAR \n \nDetails:\nThe LENGTH function returns an integer that represents the position of the rightmost \nnon-blank character or number in expression. If the value of expression is a blank \ncharacter, LENGTH returns a value of 0. If expression is a numeric expression, LENGTH \nconverts and processes the expression as a character expression. \n\nComparisons: \nThe LENGTH function returns the length of a character string, excluding trailing blanks, \nwhereas the LENGTHC function returns the length of a character string, including trailing blanks.\n\nThe LENGTH function returns the length of a character string, excluding trailing blanks,\nwhereas the LENGTHM function returns the amount of memory in bytes that is allocated for \na character string."}},{"Name":"LENGTHC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a character string, including trailing blanks. \n \nReturn value data type: DOUBLE \nSyntax: LENGTHC(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \n \nDetails:\nThe LENGTHC function returns an integer that represents the position of the rightmost \nblank or non-blank character in expression. For fixed-length variables, LENGTHC returns \nthe declared length of the variable. If the value of expression is missing and contains \nblanks, LENGTHC returns the number of blanks in expression. If expression is a numeric \nexpression, LENGTHC converts and processes the numeric expression as a character expression. \n\nComparisons: \n o The LENGTHC function returns the length of a character string, including trailing blanks, \n whereas the LENGTH function returns the length of a character string, excluding trailing \n blanks. LENGTHC always returns a value that is greater than or equal to the value returned \n by LENGTH.\n\n o The LENGTHC function returns the length of a character string, including trailing blanks, \n whereas the LENGTHM function returns the amount of memory in bytes that is allocated for \n a character string. For fixed-length character strings, LENGTHC and LENGTHM always return \n the same value. For varying-length character strings, LENGTHC always returns a value that \n is less than or equal to the value returned by LENGTHM."}},{"Name":"LENGTHM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the amount of memory, in characters, that is allocated for a character string. \n \nReturn value data type: DOUBLE \nSyntax: LENGTHM(character-expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \n \nDetails: \nThe LENGTHM function returns an integer that represents the amount of memory in bytes \nthat is allocated for the expression. If expression is a numeric expression (either \ninitialized or uninitialized), SAS automatically converts the numeric value to a right-\njustified character string by using the BEST12. format. In this case, LENGTHM returns \na value of 12 and writes a note in the SAS log stating that the numeric values have \nbeen converted to character values.\n \nComparisons: \nThe LENGTHM function returns the amount of memory in characters that is allocated for \na character string, whereas the LENGTH and LENGTHC functions return the length of a \ncharacter string. LENGTHM always returns a value that is greater than or equal to the \nvalues returned by LENGTH and LENGTHC."}},{"Name":"LGAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the natural logarithm of the Gamma function. \n \nReturn value data type: DOUBLE \n\nSyntax: LGAMMA(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirement: Must be a positive number. \n Valid data types: DOUBLE"}},{"Name":"LOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the natural logarithm (base e) of a numeric value expression. \n \nReturn value data type: DOUBLE \n \nSyntax: LOG (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE"}},{"Name":"LOG10","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the base-10 logarithm of a numeric value expression. \n \nReturn value data type: DOUBLE \n\nSyntax: LOG10 (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirement: Must be a positive number. \n Valid data types: DOUBLE"}},{"Name":"LOG2","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the base 2 logarithm of a numeric value expression. \n \nReturn value data type: DOUBLE \n\nSyntax: LOG2 (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirement: Must be a positive number. \n Valid data types: DOUBLE"}},{"Name":"LOWCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in a character expression to lowercase. \n \nReturn value data type: VARCHAR, NVARCHAR \nSyntax: LOWCASE(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Requirement: Literal character expressions must be enclosed in single quotation marks. \n Valid data types: CHAR, NCHAR \n \nDetails: \nThe LOWCASE function copies a character expression, converts all uppercase letters to \nlowercase letters, and returns the altered value as a result.\n \nComparisons: \nThe UPCASE function converts all letters in an argument to uppercase letters. The LOWCASE \nfunction converts all letters in an argument to lowercase letters."}},{"Name":"MAX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest value from a list of arguments. \n \nReturn value data type: BIGINT if all argument data types are BIGINT, otherwise, DOUBLE \nSyntax: MAX(expression-1, expression-2 [ ,...expression-n ] ) \n\nArguments: \nexpression \n is any valid expression that evaluates to a numeric value. \n Requirement: At least two arguments are required. \n Valid data types: DOUBLE, BIGINT \n \nComparisons: \nThe MAX function returns the largest value from a list of arguments. The MAX operator (<>) \nreturns the largest of two operands. \n\nThe MAX function returns a null or missing value only if all arguments are null or missing. \nThe MAX operator (<>) returns a null or missing value only if both operands are null or \nmissing. In this case, it returns the value of the operand that is higher in the sort order \nfor null or missing values."}},{"Name":"MDY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS date value from month, day, and year values. \n \nReturn value data type: DOUBLE \n\nSyntax: MDY(month, day, year) \n\nArguments: \nmonth \n specifies a numeric expression that represents an integer from 1 through 12. \n Valid data types: DOUBLE \n\nday \n specifies a numeric expression that represents an integer from 1 through 31. \n Valid data types: DOUBLE \n \nyear \n specifies a numeric expression that represents a two-digit or four-digit year. \n The YEARCUTOFF= system option defines the year value for two-digit dates. \n Valid data types: DOUBLE"}},{"Name":"MEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arithmetic mean (average) of the non-null or non-missing arguments. \n \nReturn value data type: DOUBLE \n\nSyntax: MEAN(expression [, ...expression] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirement: At least one non-null or non-missing argument is required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE \n \nComparisons:\nThe GEOMEAN function returns the geometric mean, the HARMEAN function returns the harmonic \nmean, and the MEDIAN function returns the median of the non-null or non-missing values, \nwhereas the MEAN function returns the arithmetic mean (average)."}},{"Name":"MIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the smallest value. \n \nReturn value data type: BIGINT if all argument data types are BIGINT, otherwise, DOUBLE \n\nSyntax: MIN(expression-1, expression-2 [, ...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n Requirement: At least two arguments are required. \n Valid data types: DOUBLE, BIGINT \n \nComparisons: \nThe MIN function returns the smallest value from a list of values. The MIN operator (><) \nreturns the smallest value of two operands. \n\nThe MIN function returns a null or missing value only if all arguments are null or missing. \nThe MIN operator returns a null or missing value only if either operand is null or missing. \nIn this case, it returns the value of the operand that is lower in the sort order for null \nor missing values."}},{"Name":"MINUTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the minute from a SAS time or datetime value. \n \nReturn value data type: DOUBLE \n\nSyntax: MINUTE(time | datetime) \n\nArguments: \ntime \n specifies any valid expression that represents a SAS time value.\n Valid data types: DOUBLE \n\ndatetime \n specifies any valid expression that represents a SAS datetime value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe MINUTE function returns an integer that represents a specific minute of the hour. \nMINUTE always returns a positive number in the range of 0 through 59. Null or missing \nvalues are ignored."}},{"Name":"MISSING","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a number that indicates whether the argument contains a missing value. \n \nReturn value data type INTEGER \n\nnumeric-expression \n specifies any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\ncharacter-expression \n specifies any valid expression that evaluates to a character value. \n Valid data types: CHAR, NCHAR \n \nDetails:\nThe MISSING function checks a numeric or character expression for a null or missing value, \nand returns a numeric result. If the argument does not contain a null or missing value, SAS \nreturns a value of 0. If the argument contains a null or missing value, SAS returns a value of 1. \n\ncharacter-expression is defined as having a missing value if the result of the expression \ncontains all blank spaces.\n\nnumeric-expression is defined as having a missing value if the result of the expression is\nnull or missing ( . ), or if the expression contains special missing values that you used \nto differentiate among missing values. The special missing values are the letters A through \nZ and the underscore, preceded by a period.\n \nComparisons: \nThe MISSING function can have only one argument. The NMISS function requires numeric arguments \nand returns the number of missing values in the list of arguments."}},{"Name":"MOD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the remainder from the division of the first argument by the second argument, \nfuzzed to avoid most unexpected floating-point results. \n\nReturn value data type: DOUBLE \nSyntax: MOD (dividend-expression, divisor-expression) \n\nArguments: \ndividend-expression \n specifies a dividend that is any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\ndivisor-expression \n specifies a divisor that is any valid expression that evaluates to a numeric value. \n Restriction: divisor-expression cannot be 0 \n Valid data types: DOUBLE \n See: TSPL Expressions \n \nDetails: \nThe MOD function returns the remainder from the division of dividend-expression by divisor-expression. \nWhen the result is non-zero, the result has the same sign as the first argument. The sign of the second \nargument is ignored.\n\nThe computation that is performed by the MOD function is exact if both of the following conditions are true: \n o Both arguments are exact integers. \n o All integers that are less than either argument have exact 8-byte floating-point representations.\n\nIf either of the above conditions is not true, a small amount of numerical error can occur in the \nfloating-point computation. In this case \n o MOD returns zero if the remainder is very close to zero or very close to the value of the second argument. \n o MOD returns a null or missing value if the remainder cannot be computed to a precision of approximately \n three digits or more. In this case, SAS also writes an error message to the log."}},{"Name":"MODZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the remainder from the division of the first argument by the second argument, \nusing zero fuzzing.\n\nReturn value data type: DOUBLE \nSyntax: MODZ (dividend-expression, divisor-expression) \n\nArguments: \ndividend-expression \n specifies a dividend that is any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\ndivisor-expression \n specifies a divisor that is any valid expression that evaluates to a numeric value. \n Restriction: divisor-expression cannot be 0 \n \nDetails: \nThe MODZ function returns the remainder from the division of dividend-expression by \ndivisor-expression. When the result is non-zero, the result has the same sign as the \nfirst argument. The sign of the second argument is ignored.\n\nThe computation that is performed by the MODZ function is exact if both of the following \nconditions are true: \n o Both arguments are exact integers. \n o All integers that are less than either argument have exact 8-byte floating-point representation. \n\nIf either of the above conditions is not true, a small amount of numerical error can occur in the \nfloating-point computation. For example, when you use exact arithmetic and the result is zero, \nMODZ might return a very small positive value or a value slightly less than the second argument."}},{"Name":"MONTH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a number that represents the month from a SAS date value. \n \nReturn value data type: DOUBLE \n\nSyntax: MONTH(date) \n\nArguments:\ndate \n specifies any valid expression that represents a SAS date value.\n\n Range: 1 - 12 \n Valid data types: DOUBLE"}},{"Name":"N","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of non-null or non-missing numeric values. \n \nReturn value data type: DOUBLE \n\nSyntax: N(expression [, ...expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirements: At least one argument is required. \n Valid data types: DOUBLE \n \nDetails:\nNull values are converted to missing values and are counted as missing values.\n\nComparisons: \nThe N function counts non-null and non-missing values, whereas the NMISS function \ncounts missing values. The N function requires numeric arguments."}},{"Name":"NMISS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of null and SAS missing numeric values. \n \nReturn value data type: INTEGER \n\nSyntax: NMISS(expression [, ...expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirements: At least one argument is required. \n Valid data types: DOUBLE \n \nDetails: \nNull values are converted to SAS missing values and are counted as missing values.\n \nComparisons: \nThe NMISS function returns the number of null or SAS missing values, whereas the N \nfunction returns the number of non-null and non-missing values. NMISS requires numeric \nvalues and works with multiple numeric values, whereas MISSING works with only one value \nthat can be either numeric or character."}},{"Name":"NULL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a 1 if the argument is null and a 0 if the argument is not null. \n \nReturn value data type: DOUBLE \n\nSyntax: NULL (expression) \n\nArguments: \nexpression \n specifies any valid expression.\n\n Valid data types: CHAR, DOUBLE. \n \nDetails:\nThe NULL function returns a 1 only for a null value. It returns a 0 for a SAS missing value."}},{"Name":"ORDINAL","Type":"SAS_FUNCTION","Help":{"#cdata":"Orders a list of values, and returns a value that is based on a position in the list. \n \nReturn value data type: DOUBLE \n\nSyntax: ORDINAL(position, expression-1, expression-2 [ , ...expression-n ] ) \n\nArguments: \n position \n specifies an integer that is less than or equal to the number of elements in the list of arguments. \n Requirements: position must be a positive number. \n Valid data types: DOUBLE \n\nexpression\n specifies any valid expression that evaluates to a numeric value. \n Requirements: At least two arguments are required. \n Valid data types: DOUBLE \n \nDetails: \nThe ORDINAL function sorts the list and returns the argument in the list that is specified \nby position. Missing values are sorted low and are placed before any numeric values.\n \nComparisons: \nThe ORDINAL function counts both null, missing, non-null, and non-missing values, whereas \nthe SMALLEST function counts only non-null and non-missing values."}},{"Name":"PCTL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the percentile that corresponds to the percentage. \n \nReturn value data type: DOUBLE \nSyntax: PCTL[ n ](percentage, expression[, ...expression ] ) \n\nArguments: \nn \n is a digit from 1 to 5 which specifies the definition of the percentile to be computed. \n Default: definition 5 \n Valid data types: DOUBLE \n\npercentage \n specifies the percentile to be computed. \n Requirement: is numeric where, 0 percentage 100. \n Valid data types: DOUBLE \n\nexpression \n specifies any valid expression that evaluates to a numeric value, whose value is computed \n in the percentile calculation.\n\n Valid data types: DOUBLE \n \nDetails: \nThe PCTL function returns the percentile of the non-null or non-missing values corresponding \nto the percentage. If percentage is null or missing, less than zero, or greater than 100, the \nPCTL function generates an error message."}},{"Name":"POWER","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a numeric value expression raised to a specified power. \n \nReturn value data type: DOUBLE \n\nSyntax: POWER (numeric-expression, integer-expression) \n\nArguments: \nnumeric-expression \n specifies any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\ninteger-expression \n specifies any valid expression that evaluates to an integer value. \n Valid data types: INTEGER, DOUBLE \n \nDetails: \nIf numeric_expression is null, then the POWER function returns null. If the result \nis a number that does not fit into the range of the argument's data type, the POWER \nfunction fails."}},{"Name":"PUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value using a specified format. \n \nReturn value data type: NVARCHAR \nSyntax: PUT(expression, format.) \n\nArguments:\nexpression \n specifies any valid expression. \n Valid data types: DOUBLE, DATE, TIME, TIMESTAMP, CHAR, NCHAR \n\nformat. \n specifies either a TSPL format or a user-defined format that you want applied to expression. \n To override the default alignment, you can add an alignment specification to a format: \n\n -L left aligns the value \n -C centers the value \n -R right aligns the value\n \nDetails: \nIf a value is not specified for the format width or decimal specification, TSPL uses the default \nvalues for that format.\n\nIf expression is not a valid data type for the format type (either numeric or character), TSPL \nconverts expression to a valid data type for format., with these exceptions:\n\n o date and time expressions are converted to a SAS date, time, or datetime DOUBLE value for \n numeric formats, and converted to NCHAR for character string formats \n o when the format is a binary character format such as $BINARY, $HEX or $OCTAL, expressions \n with a data type of DOUBLE are converted to NCHAR \n o an error is issued when an expression with a data type of VARBINARY is used with a numeric \n format that does not produce a data type of VARBINARY\n\nWhen TSPL converts an expression's data type in an assignment statement, the result is left-aligned. \nYou can use the PUT function to convert a numeric value to a character value and to convert a date, \ntime, or timestamp value to a SAS date/time value."}},{"Name":"QTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the quarter of the year from a SAS date value. \n \nReturn value data type: DOUBLE \n\nSyntax: QTR(date) \n\nArguments: \ndate \n specifies any valid expression that represents a SAS date value.\n\n Valid data types: DOUBLE \n See: TSPL Expressions \n \nDetails: \nThe QTR function returns a value of 1, 2, 3, or 4 from a SAS date value to indicate \nthe quarter of the year in which a date value falls."}},{"Name":"QUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Adds double quotation marks to a character value. \n \nReturn value data type: NCHAR \nSyntax: QUOTE(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \n \nDetails: \nThe QUOTE function adds double quotation marks, the default character, to a character value. If \ndouble quotation marks are found within the argument, they are doubled in the output.\n\nThe length of the receiving variable must be long enough to contain the argument (including \ntrailing blanks), leading and trailing quotation marks, and any embedded quotation marks that \nare doubled. For example, if the argument is ABC followed by three trailing blanks, then the \nreceiving variable must have a length of at least eight to hold \"ABC###\". (The character # \nrepresents a blank space.) If the receiving field is not long enough, the QUOTE function \nreturns a blank string, and writes an invalid argument note to the SAS log.\n\nA string of characters enclosed in double quotation marks is a TSPL identifier and not a \ncharacter constant. The double quotation marks become part of the identifier. Quoted \nidentifiers cannot be used to create column names in an output table."}},{"Name":"RANGE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the difference between the largest and the smallest values. \n \nReturn value data type: DOUBLE \n\nSyntax: RANGE(expression [, ...expression ) ] \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirements: At least one non-null or non-missing argument is required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE \n \nDetails: \nThe RANGE function returns the difference between the largest and the smallest of the \nnon-null or non-missing arguments."}},{"Name":"RANK","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position of a character in the ASCII or EBCDIC collating sequence. \n \nReturn value data type: DOUBLE \n\nSyntax: RANK(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \n \nDetails: \nThe RANK function returns an integer that represents the position of the first character \nin the character expression."}},{"Name":"REPEAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Repeats a character expression. \n \nReturn value data type: VARCHAR, NVARCHAR \n\nSyntax: REPEAT(expression, n) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string.\n Valid data types: CHAR, NCHAR \n\nn \n specifies the number of times to repeat expression.\n Restriction: n must be greater than or equal to 0. \n Valid data types: INTEGER \n \nDetails: \nThe REPEAT function returns a character value consisting of the first argument repeated \nn times. Thus, the first argument appears n+1 times in the result."}},{"Name":"REVERSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Reverses a character expression. \n \nReturn value data type: NCHAR \n\nSyntax: REVERSE(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string.\n\n Valid data types: NCHAR \n See: TSPL Expressions \n \nDetails: \nThe REVERSE function returns a character value with the last character in the expression \nis the first character in the result, the next-to-last character in the expression is the \nsecond character in the result, and so on. \n\nNote: Trailing blanks in the expression become leading blanks in the result."}},{"Name":"RIGHT","Type":"SAS_FUNCTION","Help":{"#cdata":"Right aligns a character expression. \n \nReturn value data type: NCHAR \n\nSyntax: RIGHT(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string.\n\n Valid data types: NCHAR \n\nDetails: \nThe RIGHT function returns an argument with trailing blanks moved to the start of the \nvalue. The argument's length does not change."}},{"Name":"RMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the root mean square. \n \nReturn value data type: DOUBLE \n\nSyntax: RMS(expression [, ...expression ) ] \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe root mean square is the square root of the arithmetic mean of the squares of \nthe values. If all the arguments are null or missing values, then the result is \na null or missing value. Otherwise, the result is the root mean square of the \nnon-null or non-missing values."}},{"Name":"ROUND","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, or to \nthe nearest integer when the second argument is omitted. \n\nReturn value data type: DOUBLE \n\nSyntax: ROUND (expression [, rounding-unit ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value, to be rounded.\n\n Valid data types: DOUBLE \n \nrounding-unit \n specifies a positive numeric expression that specifies the rounding unit.\n\n Valid data types: DOUBLE \n \nDetails: \nThe ROUND function rounds the first argument to a value that is very close to a multiple \nof the second argument. The results might not be an exact multiple of the second argument."}},{"Name":"ROUNDE","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, and returns \nan even multiple when the first argument is halfway between the two nearest multiples. \n\nReturn value data type: DOUBLE \n\nSyntax: ROUNDE (expression [, rounding-unit] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value and that is to be rounded. \n Valid data types: DOUBLE \n\nrounding-unit \n is a positive, numeric expression that specifies the rounding unit. \n Default: 1 \n Valid data types: DOUBLE \n \nDetails: \nThe ROUNDE function rounds the first argument to the nearest multiple of the second argument. \n \nComparisons: \nThe ROUNDE function is the same as the ROUND function except that when the first argument \nis halfway between the two nearest multiples of the second argument, ROUNDE returns an even\nmultiple. ROUND returns the multiple with the larger absolute value."}},{"Name":"ROUNDZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, using \nzero fuzzing. \n\nReturn value data type: DOUBLE \n\nSyntax: ROUNDZ (expression [, rounding-unit ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\nrounding-unit \n specifies any valid expression that evaluates to a numeric expression and that specifies \n the rounding unit. \n\n Requirements: Only positive values are valid. \n Valid data types: DOUBLE \n Default value: 1 \n \nDetails: \nThe ROUNDZ function rounds the first argument to the nearest multiple of the second argument."}},{"Name":"SCAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nth word from a character expression. \n \nReturn value data type: NCHAR \nSyntax: SCAN( expression, n [, delimiters ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \nn \n is a non-zero numeric expression that specifies the number of the word in the character \n expression that you want SCAN to select. The following rules apply: \n\n o If n is positive, SCAN counts words from left to right in the character string. \n o If n is negative, SCAN counts words from right to left in the character string. \n o If n is greater than the number of words in expression, SCAN returns a blank value.\n\ndelimiters \n specifies any valid expression that evaluates to a character string and that SCAN \n uses as word separators in the expression.\n\n Requirement: If delimiter is a constant, enclose delimiter in single quotation marks. \n ASCII default delimiters: blank . , ( + & ! $ * ) ; ^ -- / % | \n In environments without the ^ character, SCAN uses the ~ character instead.\n \n EBCDIC default delimiters: blank . < ( + | & ! $ * ) ; \u00ac -- / , % \u00a2 \n Valid data types: NCHAR \n \nDetails:\nLeading delimiters before the first word in the expression do not effect SCAN. If there \nare two or more contiguous delimiters, SCAN treats them as one."}},{"Name":"SECOND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the second from a SAS time or datetime value. \n \nReturn value data type: DOUBLE \n\nSyntax: SECOND(time | datetime) \n\nArguments: \ntime \n specifies any valid expression that represents a SAS time value.\n Valid data types: DOUBLE \n\ndatetime \n specifies any valid expression that represents a SAS datetime value. \n Valid data types: DOUBLE \n \nDetails: \nThe SECOND function produces a numeric value that represents a specific second of \nthe minute. The result can be any number that is >= 0 and < 60."}},{"Name":"SIGN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a number that indicates the sign of a numeric value expression. \n \nReturn value data type: DOUBLE \n\nSyntax: SIGN (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe SIGN function returns the following values: \n\n -1 if expression < 0 \n \n 0 if expression = 0 \n \n 1 if expression > 0."}},{"Name":"SIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the trigonometric sine. \n \nReturn value data type: DOUBLE \n\nSyntax: SIN (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE"}},{"Name":"SINH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hyperbolic sine. \n \nReturn value data type: DOUBLE \n\nSyntax: SINH (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe SINH function returns the hyperbolic sine of the argument, which is given by\n\n(\u03f5^argument - \u03f5^-argument)/2"}},{"Name":"SKEWNESS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the skewness. \n \nReturn value data type: DOUBLE \n\nSyntax: SKEWNESS(expression-1, expression-2, expression-3 [, ...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirements: At least three non-null or non-missing arguments are required. \n Otherwise, the function returns a null or missing value. \n Valid data types: DOUBLE \n \nDetails: \nIf all non-null or non-missing arguments have equal values, the skewness is mathematically \nundefined and the SKEWNESS function returns a null or missing value."}},{"Name":"SLEEP","Type":"SAS_FUNCTION","Help":{"#cdata":"For a specified period of time, suspends the execution of a program that invokes \nthis function. \n\nReturn value data type: DOUBLE \n\nSyntax: SLEEP(number-of-time-units [, time- unit ] ) \n\nArguments: \nnumber-of-time-units \n specifies any valid expression that evaluates to a numeric value and that specifies the \n number of units of time for which you want to suspend execution of a program.\n\n Range: n \u2265 0 \n\ntime-unit \n specifies the unit of time, as a power of 10, which is applied to number-of-time-units. \n For example, 1 corresponds to a second, and .001 to a millisecond. \n\n Default: 1 in a Windows PC environment, .001 in other environments \n \nDetails: \nThe SLEEP function suspends the execution of a program that invokes this function for \na period of time that you specify. The maximum sleep period for the SLEEP function is \n46 days."}},{"Name":"SMALLEST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kth smallest non-null or non-missing value. \n \nReturn value data type: DOUBLE \n\nSyntax: SMALLEST (k, expression [, ...expression ] ) \n\nArguments: \nk \n specifies any valid expression that evaluates to a numeric value to return. \n Valid data types: DOUBLE \n\nexpression \n specifies any valid expression that evaluates to a numeric value to be processed. \n Valid data types: DOUBLE \n \nDetails: \nIf k is null or missing, less than zero, or greater than the number of values, the result \nis a null or missing value. \n \nComparisons: \nThe SMALLEST function differs from the ORDINAL function in that SMALLEST ignores null \nand missing values, but ORDINAL counts null and missing values."}},{"Name":"SQRT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the square root of a value. \n \nReturn value data type: DOUBLE \n\nSyntax: SQRT (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a nonnegative numeric value.\n\n Valid data types: DOUBLE"}},{"Name":"STD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the standard deviation. \n \nReturn value data type: DOUBLE \n\nSyntax: STD(expression-1, expression-2 [, ...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Requirements: At least two non-null or non-missing arguments are required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE"}},{"Name":"STDERR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the standard error of the mean. \n \nReturn value data type: DOUBLE \n\nSyntax: STDERR(expression-1, expression-2 [, ...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirements: At least two non-null or non-missing arguments are required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE"}},{"Name":"STRIP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string with all leading and trailing blanks removed. \n \nReturn value data type: NCHAR \n\nSyntax: STRIP(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: NCHAR \n \nDetails: \nThe STRIP function returns the argument with all leading and trailing blanks removed. \nIf the argument is blank, STRIP returns a string with a length of zero. \n\nIf the value that is trimmed is shorter than the length of the receiving variable, \nSAS pads the value with new trailing blanks.\n\nNote: The STRIP function is useful for concatenation because the concatenation \noperator does not remove trailing blanks."}},{"Name":"SUBSTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a substring, allowing a result with a length of zero. \n \nReturn value data type: VARCHAR, NVARCHAR \nSyntax: SUBSTR(character-expression, position-expression [, length-expression ] ) \n\nArguments: \ncharacter-expression \n specifies any valid expression that evaluates to a character string. \n Valid data types: CHAR, NCHAR \n\nposition-expression \n specifies any valid expression that evaluates to an integer and that specifies the \n position of the first character in the substring. \n Valid data types: INTEGER \n\nlength-expression \n specifies any valid expression that evaluates to an integer and that specifies the length \n of the substring. If you do not specify length-expression, the SUBSTR function returns \n the substring that extends from the position that you specify to the end of the string. \n Valid data types: INTEGER \n \nDetails: \nThe following information applies to the SUBSTR function: \n\n o The SUBSTR function returns a string with a length of zero if either position-expression or \n length-expression has a missing or null value, or if position-expression is a non-positive value. \n o If the value for length-expression is non-positive, the SUBSTR function ignores length-expression. \n o If the length that you specify extends beyond the end of the string, the result is truncated \n at the end, so that the last character of the result is the last character of the string."}},{"Name":"SUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sum of the non-null or non-missing arguments. \n \nReturn value data type: BIGINT if all argument data types are BIGINT, otherwise, DOUBLE \n\nSyntax: SUM(expression-1, expression-2 [, ...expression-n ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirements: At least two arguments are required. \n Valid data types: DOUBLE, BIGINT \n \nDetails: \nNull and missing values are ignored and not included in the computation. If all of the \narguments have missing values, the result is a missing value. If all the arguments have \na null value, the result is a null value."}},{"Name":"TAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the tangent. \n \nReturn value data type: DOUBLE \n\nSyntax: TAN (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value in radians.\n\n Restriction: expression cannot be an odd multiple of \u03c0/2 \n Valid data types: DOUBLE"}},{"Name":"TANH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hyperbolic tangent. \n \nReturn value data type: DOUBLE \n\nSyntax: TANH (expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Restriction: expression cannot be an odd multiple of \u03c0/2 \n Valid data types: DOUBLE \n \nDetails: \nThe TANH function returns the hyperbolic tangent of the argument, which is given by\n\n(\u03f5^argument - \u03f5^-argument)/(\u03f5^argument + \u03f5^-argument)"}},{"Name":"TIME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current time of day as a numeric SAS time value. \n \nReturn value data type: DOUBLE \n\nSyntax: TIME() \n\nDetails: \nThe TIME function does not take any arguments. It produces the current time in the form \nof a SAS time value."}},{"Name":"TIMEPART","Type":"SAS_FUNCTION","Help":{"#cdata":"Extracts a time value from a SAS datetime value. \n \nReturn value data type: DOUBLE \n\nSyntax: TIMEPART(datetime) \n\nArguments: \ndatetime \n specifies any valid expression that represents a SAS datetime value.\n\n Valid data types: DOUBLE"}},{"Name":"TODAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current date as a numeric SAS date value. \n \nReturn value data type: DOUBLE \n\nSyntax: TODAY() \n \nDetails: \nThe TODAY function does not take any arguments. It produces the current date in the \nform of a SAS date value, which is the number of days since January 1, 1960."}},{"Name":"TRANSLATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Replaces specific characters in a character expression. \n \nReturn value data type: NCHAR \nSyntax: TRANSLATE(expression, to-characters, from-characters) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. expression \n contains the original character value. \n Valid data types: CHAR \n\nto-characters \n specifies the characters that you want TRANSLATE to use as substitutes. \n Valid data types: NCHAR \n\nfrom-characters \n specifies the characters that you want TRANSLATE to replace. \n Valid data types: NCHAR \n \nDetails: \nValues of to-characters and from-characters correspond on a character-by-character basis; \nTRANSLATE changes the first character in from-characters to the first character in to-characters, \nand so on. If to-characters has fewer characters than from-characters, TRANSLATE changes the \nextra from-characters to blanks. If to-characters has more characters than \nfrom-characters, TRANSLATE ignores the extra to-characters."}},{"Name":"TRANWRD","Type":"SAS_FUNCTION","Help":{"#cdata":"Replaces or removes all occurrences of a word in a character string. \n \nReturn value data type: NCHAR \n\nSyntax: TRANWRD(source-expression, target-expression, replacement-expression) \n\nArguments:\nsource-expression \n specifies any valid expression that evaluates to a character string, whose characters \n you want to replace. \n Valid data types: NCHAR \n\ntarget-expression \n specifies any valid expression that evaluates to a character string and that is searched \n for in source-expression. \n Valid data types: NCHAR \n Requirement: The length of the target-expression must be greater than zero. \n\nreplacement-expression \n specifies any valid expression that evaluates to a character string and that replaces \n target-expression. \n Valid data types: NCHAR \n \nDetails: \nThe TRANWRD function replaces or removes all occurrences of a given word (or a pattern of \ncharacters) within a character string. The TRANWRD function does not remove trailing blanks \nin the target-expression string and the replacement-expression string."}},{"Name":"TRIGAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the trigamma function. \n \nReturn value data type: DOUBLE \n\nSyntax: TRIGAMMA( expression ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n\n Restriction: Nonpositive integers are invalid. \n Valid data types: DOUBLE \n \nDetails: \nThe TRIGAMMA function returns the derivative of the DIGAMMA function. For expression > 0, \nthe TRIGAMMA function is the second derivative of the LGAMMA function."}},{"Name":"TRIM|TRIMN","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes trailing blanks from a character expression. \n \nReturn value data type: VARCHAR, NVARCHAR \n\nSyntax: TRIM ( expression ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string.\n Valid data types: CHAR, NCHAR \n \nDetails:\nThe TRIM function removes trailing blanks from expression and returns the trimmed value \nas a result. If the resulting string is blank, TRIM returns a zero length string. TRIM \nis useful for concatenating because concatenation does not remove trailing blanks."}},{"Name":"TRUNC","Type":"SAS_FUNCTION","Help":{"#cdata":"Truncates a numeric value to a specified length. \n \nReturn value data type: DOUBLE \nSyntax: TRUNC(expression, length-expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. \n Valid data types: DOUBLE \n\nlength-expression \n specifies any valid expression that evaluates to a numeric value. \n Range: 3 - 8 \n Valid data types: DOUBLE \n \nDetails: \nThe TRUNC function truncates a full-length numeric expression (stored as a DOUBLE) \nto a smaller number of bytes, as specified in length-expression and pads the truncated \nbytes with 0s. The truncation and subsequent expansion duplicate the effect of storing \nnumbers in less than full length and then reading them."}},{"Name":"UPCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in an argument to uppercase. \n \nReturn value data type: VARCHAR, NVARCHAR \n\nSyntax: UPCASE(expression) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a character string. \n Valid data types: CHAR, NCHAR \n \nDetails: \nThe UPCASE function copies a character expression, converts all lowercase letters to \nuppercase letters, and returns the altered value as a result. \n \nComparisons: \nThe LOWCASE function converts all letters in an argument to lowercase letters. The \nUPCASE function converts all letters in an argument to uppercase letters."}},{"Name":"USS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the uncorrected sum of squares. \n \nReturn value data type: DOUBLE \n\nSyntax: USS(expression [, ...expression ] ) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value.\n\n Requirement: At least one non-null or non-missing argument is required. Otherwise, \n the function returns a null or missing value. \n Valid data types: DOUBLE"}},{"Name":"VAR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the variance. \n \nReturn value data type: DOUBLE \n\nSyntax: VAR(expression-1, expression-2 [ ,...expression-n]) \n\nArguments: \nexpression \n specifies any valid expression that evaluates to a numeric value. The argument list \n can consist of a variable list. \n\n Requirements: At least two non-null or non-missing arguments are required. Otherwise, \n the function returns a null or missing value. \n \n Valid data types: DOUBLE"}},{"Name":"VERIFY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position of the first character that is unique to an expression. \n \nReturn value data type: DOUBLE \nSyntax: VERIFY(target-expression, search-expression) \n\nArguments: \ntarget-expression \n specifies any valid expression that evaluates to a character string that is to be searched. \n\n Requirements: Literal character strings must be enclosed in single quotation marks. \n Valid data types: NCHAR \n\nsearch-expression \n specifies any valid expression that evaluates to a character string.\n\n Requirements: Literal character strings must be enclosed in single quotation marks. \n Valid data types: NCHAR \n \nDetails: \nThe VERIFY function returns the position of the first character in target-expression that \nis not present in search-expression. If there are no characters in target-expression that \nare unique from those in search-expression, VERIFY returns a 0."}},{"Name":"WEEKDAY","Type":"SAS_FUNCTION","Help":{"#cdata":"From a SAS date value, returns an integer that corresponds to the day of the week. \n \nReturn value data type: DOUBLE \n\nSyntax: WEEKDAY(expression) \n\nArguments: \nexpression \n specifies any valid expression that represents a SAS date value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe WEEKDAY function produces an integer that represents the day of the week, where 1 = Sunday, \n2 = Monday, ..., 7 = Saturday."}},{"Name":"WHICHC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the first position of a character string from a list of character strings. \n \nReturn value data type: DOUBLE \nSyntax: WHICHC(search-expression, expression-list-item-1, expression-list-item-2 [, ...expression-list-item-n ] ) \n\nArguments: \nsearch-expression \n specifies any valid expression that evaluates to a character string that is compared with \n a list of character string expressions. \n\n Requirements: Literal character strings must be enclosed in single quotation marks. \n Valid data types: NCHAR \n \nstring-expression-list-item \n specifies any valid expression that evaluates to a character string and that is a member of a list of character string expressions. \n\n Requirements: Literal character strings must be enclosed in single quotation marks. \n At least two expressions are required in the list. \n Valid data types: NCHAR \n \nDetails: \nThe WHICHC function searches the character expression list, from left to right, for the \nfirst expression that matches the search expression. If a match is found, WHICHC returns \nits position in the expression list. If none of the expressions match the search expression, \nWHICHC returns a value of 0."}},{"Name":"WHICHN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the first position of a number from a list of numbers. \n \nReturn value data type: DOUBLE \nSyntax: WHICHN(search-expression, expression-list-item-1, expression-list-item-2 \n [, ...expression-list-item-n ] ) \n\nArguments: \nsearch-expression \n specifies any valid expression that evaluates to a number and that is compared with \n a list of numeric expressions. \n Valid data types: DOUBLE \n\nexpression-list-item \n specifies any valid expression that evaluates to a number and is part of a list. \n Requirements: At least two expressions are required in the list. \n Valid data types: DOUBLE \n \nDetails: \nThe WHICHN function searches the numeric expression list, from left to right, for the \nfirst expression that matches the search expression. If a match is found, WHICHN returns \nits position in the expression list. If none of the expressions match the search expression, \nWHICHN returns a value of 0. Arguments for the WHICHN functions can be any numeric data type."}},{"Name":"YEAR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the year from a SAS date value. \n \nReturn value data type DOUBLE \n\nSyntax: YEAR(date) \n\nArguments: \ndate \n specifies any valid expression that represents a SAS date value.\n\n Valid data types: DOUBLE \n \nDetails: \nThe YEAR function produces a four-digit numeric value that represents the year."}},{"Name":"YYQ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS date value from year and quarter year values. \n \nReturn value data type: DOUBLE \n\nSyntax: YYQ(year,quarter) \n\nArguments: \nyear \n specifies any valid expression that evaluates to a two-digit or four-digit integer \n that represents the year. The YEARCUTOFF= system option defines the year value for \n two-digit dates.\n\n Valid data types: DOUBLE \n \nquarter \n specifies the quarter of the year (1, 2, 3, or 4). \n Valid data types: DOUBLE \n \nDetails: \nThe YYQ function returns a SAS date value that corresponds to the first day of the \nspecified quarter. If either year or quarter is null or missing, or if the quarter \nvalue is not valid, the result is a null or missing value."}},{"Name":"PRXCHANGE","Type":"SAS_FUNCTION","Help":{"#cdata":"Performs a pattern-matching replacement. \n \nReturned data type: CHAR\n\nSyntax: PRXCHANGE(perl-regular-expression | regular-expression-id, times, source)\n\nArguments:\nperl-regular-expression\n specifies a character constant, variable, or expression with a value that is a Perl regular expression.\n Data type: CHAR\nregular-expression-id\n specifies a numeric variable with a value that is a pattern identifier that is returned from the PRXPARSE function.\n Restriction: If you use this argument, you must also use the PRXPARSE function.\n Data type: INTEGER\ntimes\n is a numeric constant, variable, or expression that specifies the number of times to search for a match and \n replace a matching pattern.\n Data type: INTEGER\n Tip: If the value of times is \u20131, then matching patterns continue to be replaced until the end of source is reached. \nsource\n specifies a character constant, variable, or expression that you want to search.\n Data type: CHAR"}},{"Name":"PRXPAREN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the last bracket match for which there is a match in a pattern. \n \nSyntax: PRXPAREN(regular-expression-id) \n\nArguments:\nregular-expression-id\n specifies a numeric variable with a value that is an identification number that is returned by the PRXPARSE function."}},{"Name":"PRXPARSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Compiles a Perl regular expression (PRX) that can be used for pattern matching of a character value.\n\nReturned data type: INTEGER\n\nSyntax: regular-expression-id=PRXPARSE(perl-regular-expression)\n\nArguments:\nregular-expression-id\n is a numeric pattern identifier that is returned by the PRXPARSE function.\n Data type: INTEGER\nperl-regular-expression\n specifies a character, constant, variable, or expression with a value that is a Perl regular expression.\n Data type: CHAR"}},{"Name":"PRXPOSN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string that contains the value for a capture buffer.\n\nReturned data type: CHAR\n\nSyntax: PRXPOSN(regular-expression-id, capture-buffer, source)\n\nArguments:\nregular-expression-id\n specifies a numeric variable with a value that is a pattern identifier that is returned by the PRXPARSE function.\n\n Data type: INTEGER\ncapture-buffer\n is a numeric constant, variable, or expression that identifies the capture buffer for which to retrieve a value:\n \u2022If the value of capture-buffer is zero, PRXPOSN returns the entire match.\n \u2022If the value of capture-buffer is between 1 and the number of open parentheses in the regular expression, then PRXPOSN returns the value for that capture buffer.\n \u2022If the value of capture-buffer is greater than the number of open parentheses, then PRXPOSN returns a missing value.\n Data type: INTEGER \n \nsource\n specifies the text from which to extract capture buffers.\n Data type: CHAR"}},{"Name":"KCOUNT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of double-byte characters in an expression. \n \nSyntax: KCOUNT([']source['])\n\nArguments:\n'source'\n specifies any valid expression that evaluates to a character string.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks."}},{"Name":"KSTRCAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Concatenates two or more character expressions.\n\nReturned data type: NCHAR\n\nSyntax: KSTRCAT(expression-1, expression-2[, \u2026 expression-n] ) \n\nArguments: \nexpression\n specifies any single-byte or double-byte character expression.\n\n Requirement: At least two expressions are required.\n Data type: NCHAR"}},{"Name":"KSTRIP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string with all leading and trailing blanks removed.\n\nReturned data type: NCHAR\nSyntax: KSTRIP([']string['])\n\nArguments:\n[']string[']\n specifies any valid expression that evaluates to a character string.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks."}},{"Name":"KUDPATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Inserts, deletes, and replaces character value contents.\n\nReturned data type: NCHAR \n\nSyntax: \nKUPDATE([']expression['], position, n [, [']characters-to-replace[']] ) \nKUPDATE([']expression['], position [, n], [']characters-to-replace['])\n\nArguments:\n[']expression[']\n specifies any valid expression that evaluates to a character string.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks.\n\nposition\n specifies a numeric expression that is the beginning character position.\n Data type: INTEGER\nn\n specifies a numeric expression that is the length of the substring to be replaced.\n Restrictions: n cannot be larger than the length of the expression that remains in expression after \n position.n is optional, but you cannot omit both n and characters-to-replace from the function.\n Data type: INTEGER\n Tip: If you omit n, SAS uses all of the characters in characters-to-replace to replace the values of expression.\n\n[']characters-to-replace[']\n specifies an expression which evaluates to a character string that replaces the contents of expression.\n Restriction: characters-to-replace is optional, but you cannot omit both characters-to-replace and n from the function.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks."}},{"Name":"KUPDATES","Type":"SAS_FUNCTION","Help":{"#cdata":"Inserts, deletes, and replaces the contents of the character value according to the byte position of the \ncharacter value in the argument. \n\nReturned data type: NCHAR\nSyntax:\nKUPDATES([']expression['], position, n [, [']characters-to-replace[']] ) \nKUPDATES([']expression['], position [, n], [']characters-to-replace['])\n\nArguments:\n[']expression[']\n specifies any valid expression that evaluates to a character string.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks. \nposition\n specifies a numeric expression that is the beginning character position in bytes.\n Data type: INTEGER\nn\n specifies the length of the substring to be replaced in bytes.\n Restrictions: n cannot be larger than the length (in bytes) of the expression that remains in expression after position.\n n is optional, but you cannot omit both n and characters-to-replace from the function.\n Data type: INTEGER\n Tip: If you omit n, SAS uses all of the characters in characters-to-replace to replace the values of expression.\n\n[']characters-to-replace[']\n specifies an expression which evaluates to a character string that replaces the contents of expression.\n Restriction: characters-to-replace is optional, but you cannot omit both characters-to-replace and n from the function.\n Data type: NCHAR\n Tip: Enclose a literal string of characters in quotation marks."}},{"Name":"UUIDGEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the short form of a Universal Unique Identifier (UUID).\n\nReturned data type: CHAR \n\nSyntax: UUIDGEN( )\n\nWithout Arguments\n The UUIDGEN function has no arguments."}}],"#comment":{}}} ================================================ FILE: server/data/DS2Keywords.json ================================================ {"Keywords":{"Keyword":[{"Name":"ALTER=","Help":{"#cdata":"Syntax: ALTER=alter-password \n \nSyntax Description:\nalter-password \n must be a valid SAS name.\n \nDetails \nThe ALTER= option applies only to a SAS data set. You can use this option to assign \na password or to access a read-protected, write-protected, or alter-protected file. \nWhen you replace a data set that is protected with an ALTER password, the new data \nset inherits the ALTER password. \n\nThe password is blotted out when the code is written in the SAS log. For example: \n\n set a(alter=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"Type":"TABLE_OPTION"},{"Name":"BUFNO=","Help":{"#cdata":"Specifies the number of buffers to be allocated for processing a SAS data set. \n \nSyntax: BUFNO= n | nK | hexX | MIN | MAX \n\nSyntax Description:\n\nn | nK \n specifies the number of buffers in multiples of 1 (bytes); 1,024 (kilobytes). For example, \n a value of 8 specifies 8 buffers, and a value of 1k specifies 1024 buffers.\n\nhex \n specifies the number of buffers as a hexadecimal value. You must specify the value beginning \n with a number (0-9), followed by an X. For example, the value 2dx sets the number of buffers \n to 45 buffers.\n\nMIN \n sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value \n for the operating environment. This is the default.\n\nMAX \n sets the number of buffers to the maximum possible number in your operating environment, \n up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"Type":"TABLE_OPTION","Values":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."}},{"Name":"BUFSIZE=","Help":{"#cdata":"Specifies the size of a permanent buffer page for an output SAS data set. \n \nSyntax: BUFSIZE= n | nK | nM | nG | hexX | MAX \n\nSyntax Description:\n\nn | nK | nM | nG \nspecifies the page size in multiples of 1 (bytes); 1,024 (kilobytes); 1,048,576 (megabytes); \nor 1,073,741,824 (gigabytes). For example, a value of 8 specifies a page size of 8 bytes, and \na value of 4k specifies a page size of 4096 bytes. \n\nhexX \nspecifies the page size as a hexadecimal value. You must specify the value beginning with a \nnumber (0-9), followed by an X. For example, the value 2dx sets the page size to 45 bytes.\n\nMAX \nsets the page size to the maximum possible number in your operating environment, up to the \nlargest four-byte, signed integer, which is 231-1, or approximately 2 billion bytes."},"Type":"TABLE_OPTION","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the page size in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion bytes."}},{"Name":"BULKLOAD=","Help":{"#cdata":"Loads rows of data as one unit. Default value: NO \n \nSyntax: BULKLOAD=YES | NO \n\nSyntax Description:\n\nYES \ncalls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.\n\nNO \nuses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."},"Type":"TABLE_OPTION","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Calls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.","@ToolTip2":"Uses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."}},{"Name":"COMPRESS=","Help":{"#cdata":"\n \nSyntax: COMPRESS=NO | YES | CHAR | BINARY \n\nSyntax Description:\nNO \nspecifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).\n\nYES | CHAR \nspecifies that the observations in a newly created SAS data set are compressed (variable-length records) \nby SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive \ncharacters (including blanks) to two-byte or three-byte representations. \n\n Alias: ON \n Tip: Use this compression algorithm for character data. \n Note: COMPRESS=CHAR is accepted by Version 7 and later versions. \n\nBINARY \n specifies that the observations in a newly created SAS data set are compressed (variable-length records) \n by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression \n to compress the file.\n\n Tip: This method is highly effective for compressing medium to large (several hundred bytes or larger) \n blocks of binary data (numeric variables). Because the compression function operates on a single record \n at a time, the record length needs to be several hundred bytes or larger for effective compression."},"Type":"TABLE_OPTION","Values":{"@Value1":"NO","@Value2":"YES|ON","@Value3":"CHAR","@Value4":"BINARY"},"ToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations.","@ToolTip3":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations. COMPRESS=CHAR is accepted by Version 7 and later versions.","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression to compress the file."}},{"Name":"DBCREATE_TABLE_OPTS=","Help":{"#cdata":"Syntax: DBCREATE_TABLE_OPTS= 'DBMS-option(s)' \n\nSpecifies DBMS-specific options to be added to the DATA statement.\n\nArguments:\nDBMS-option(s)\n specifies one or more valid DBMS-specific options. If more than one option is specified, \n the options should be separated in the same way as options are separated in the DBMS."},"Type":"TABLE_OPTION"},{"Name":"DBKEY=","Help":{"#cdata":"Specifies a key column to optimize DBMS retrieval. Can improve performance when you \nare processing a join that involves a large DBMS table and a small SAS data set \nor DBMS table.\n \nSyntax: DBKEY=([ ' ] column [ ' ] [... [ ' ] column [ ' ] ]) \n\nSyntax Description: \n\ncolumn \n used by SAS to build an internal WHERE clause to search for matches in the DBMS table \n based on the key column. For example:\n\n select * from sas.a, dbms.b(dbkey=x) where a.x=b.x;\n \nIn this example, DBKEY= specifies column x , which matches the key column designated in \nthe WHERE clause. However, if the DBKEY= column does NOT match the key column in the \nWHERE clause, then DBKEY= is not used."},"Type":"TABLE_OPTION"},{"Name":"DBNULL=","Help":{"#cdata":"Indicates whether NULL is a valid value for the specified columns when a table is created. \n \nSyntax: DBNULL={ _ALL=YES | NO } | ( [column=YES | NO [ ... column=YES | NO ] ] ) \n\nSyntax Description: \n_ALL_ \n specifies that the YES or NO applies to all columns in the table. (This is valid in \n the interfaces to Informix, Oracle, Sybase, and Teradata only.)\n\nYES \n specifies that the NULL value is valid for the specified columns in the DBMS table.\n\nNO \n specifies that the NULL value is not valid for the specified columns in the DBMS table.\n\ncolumn \n specifies the name of a column. \n\nDetails: \nThis option is valid only for creating DBMS tables. If you specify more than one column name, \nthe names must be separated with spaces.\n\nThe DBNULL= option processes values from left to right, so if you specify a column name twice, \nor if you use the _ALL_ value, the last value overrides the first value that is specified for \nthe column."},"Type":"TABLE_OPTION","SubOptionsKeywords":"_ALL_"},{"Name":"DROP=","Help":{"#cdata":"For an input table, excludes the specified columns from processing; for an output table, excludes the specified columns from being written to the table.\n \nSyntax: DROP= ( column-list ); \n\nArguments: \ncolumn-list \n specifies the names of the columns to omit from the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the format \n col: are not supported. \n \nDetails: \nThe DROP= table option specifies that all columns in the column-list should not be included \nin the creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the drop attribute is specified, all columns not included in the drop \nstatement will be used to create columns in the output rows.\n\nIf the DROP= table option is associated with an input table, the columns are not available \nfor processing during program execution."},"Type":"TABLE_OPTION"},{"Name":"ENCRYPT=","Help":{"#cdata":"Specifies whether to encrypt an output SAS data set. \n \nSyntax: ENCRYPT=YES | NO \n\nSyntax Description:\nYES \n encrypts the file. The encryption method uses passwords. At a minimum, you must specify \n the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because \n the encryption method uses passwords, you cannot change any password on an encrypted data \n set without re-creating the data set.\n\nNO \n does not encrypt the file.\n\nCAUTION:\nRecord all passwords. \nIf you forget the password, you cannot reset it without assistance from SAS. The process \nis time-consuming and resource-intensive."},"Type":"TABLE_OPTION","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Encrypts the file. The encryption method uses passwords. At a minimum, you must specify the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because the encryption method uses passwords, you cannot change any password on an encrypted data set without re-creating the data set.","@ToolTip2":"Does not encrypt the file."}},{"Name":"ENCRYPTKEY=","Help":{"#cdata":"Syntax: ENCRYPTKEY=[\" | ']key-value[\" | '] \n\nSpecifies a key value for AES encryption.\n\nArguments:\nkey-value\n assigns an encrypt key value. The key value can be up to 64-bytes long. You are able to create \n an ENCRYPTKEY= key value with or without quotation marks using the following rules:\n \n no quotation marks\n \u2022alphanumeric characters and underscores only\n \u2022up to 64-bytes\n \u2022uppercase and lowercase letters\n \u2022must start with a letter\n \u2022no blank spaces\n \u2022is not case-sensitive\n\n single quotation marks\n \u2022alphanumeric, special, and DBCS characters\n \u2022up to 64-bytes\n \u2022uppercase and lowercase letters\n \u2022blank spaces, but not all blanks\n \u2022is case-sensitive\n \n double quotation marks\n \u2022alphanumeric, special, and DBCS characters\n \u2022up to 64 bytes\n \u2022uppercase and lowercase letters\n \u2022enables macro resolution\n \u2022blank spaces, but not all blanks\n \u2022is case-sensitive"},"Type":"TABLE_OPTION"},{"Name":"IN=","Help":{"#cdata":"Syntax: IN=variable \n \nArguments:\nvariable\n names the new variable whose value indicates whether that input table contributed data to the \n current row. Within a DS2 program, the value of the variable is 1 if the table contributed to \n the current row, and 0 otherwise.\n\nInteraction:\n If the variable is not explicitly declared, it is automatically declared in the local scope \n of the SET or DATA statement as INTEGER.\nData type: BIGINT, INTEGER, SMALLINT, TINYINT"},"Type":"TABLE_OPTION"},{"Name":"KEEP=","Help":{"#cdata":"For an input table, specifies the columns to process; for an output table, specifies \nthe columns to write to the table. \n \nSyntax: KEEP=( column-list ); \n\nArguments:\n\ncolumn-list \n specifies the names of the columns to keep in the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the \n format col: are not supported. \n \nDetails: \nThe KEEP= table option specifies that all columns in the column-list should be included in \nthe creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the keep attribute is specified, all columns not included in the KEEP \nstatement will be dropped from the output rows.\n\nIf the KEEP= table option is associated with an input table, only the columns that are \nspecified by the KEEP= table option are available for processing during program execution."},"Type":"TABLE_OPTION"},{"Name":"LABEL=","Help":{"#cdata":" \n \nSyntax: LABEL='label' \n\nSyntax Description: \n\n'label' \n specifies a text string of up to 256 characters. If the label text contains single \n quotation marks, use double quotation marks around the label, or use two single \n quotation marks in the label text and surround the string with single quotation \n marks. To remove a label from a table, assign a label that is equal to a blank \n that is enclosed in quotation marks.\n \nDetails: \nYou can use the LABEL= option on both input and output tables. When you use LABEL= \non input tables, it assigns a label for the table for the duration of the TSPL program. \nWhen it is specified for an output table, the label becomes a permanent part of that \ntable."},"Type":"TABLE_OPTION"},{"Name":"LOCKTABLE=","Help":{"#cdata":"Places shared or exclusive locks on tables. \n \nSyntax: LOCKTABLE=SHARE | EXCLUSIVE \n\nSyntax Description:\n\nSHARE \n locks a table in shared mode, allowing other users or processes to read data from the \n tables, but preventing users from updating data.\n\nEXCLUSIVE \n locks a table exclusively, preventing other users from accessing any table that you open. \n\nDetails: \nYou can lock tables only if you are the owner or have been granted the necessary privilege. \n\nIf you access the BASE table driver through PROC TSPL, the default value for the LOCKTABLE \noption is EXCLUSIVE. However, if you access the BASE table driver through a table server, \nor if you run your program locally with the SAS Table Server LIBNAME engine, the default \nvalue for the LOCKTABLE option is SHARE."},"Type":"TABLE_OPTION","Values":{"@Value1":"SHARE","@Value2":"EXCLUSIVE"},"ToolTips":{"@ToolTip1":"Locks a table in shared mode, allowing other users or processes to read data from the tables, but preventing users from updating data.","@ToolTip2":"Locks a table exclusively, preventing other users from accessing any table that you open."}},{"Name":"OVERWRITE=","Help":{"#cdata":"For a table, drops the output table before the replacement output table is populated \nwith rows; for packages and threads, drops the existing package or thread if a package \nor thread by the same name exists. \n \nSyntax: OVERWRITE= YES | NO; \n\nArguments: \n\nYES | NO \n specifies whether the output table is deleted before a replacement output table \n is created or whether a package or thread is dropped.\n\n Default: NO \n\nCAUTION:\nFor tables, use the OVERWRITE=YES statement only with data that is backed up or \nwith data that you can reconstruct. Because the output table is deleted first, \ndata will be lost if a failure occurs while the output table is being written."},"Type":"TABLE_OPTION","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that the output table is deleted before a replacement output table is created or a package or thread is dropped.","@ToolTip2":"Specifies that the output table is not deleted before a replacement output table is created or a package or thread is dropped."}},{"Name":"PW=","Help":{"#cdata":"Assigns a READ, WRITE, and ALTER password to a SAS file, and enables access to a password-protected SAS file. \n \nSyntax: PW=password \n\nSyntax Description:\npassword \n must be a valid SAS name.\n\nDetails:\nThe PW= option applies to all types of SAS files. You can use this option to assign \na password to a SAS file or to access a password-protected SAS file.\n\nWhen replacing a SAS data set that is protected by an ALTER password, the new data \nset inherits the ALTER password. When the code is written to the SAS log the password \nis blotted out, for example: \n\n drop thread job2 (pw=xxxxxxx);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"Type":"TABLE_OPTION"},{"Name":"READ=","Help":{"#cdata":"\n \nSyntax: READ=read-password \n\nSyntax Description: \nread-password \n must be a valid SAS name. \n \nDetails: \nThe READ= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a read-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n declare package sales (read=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"Type":"TABLE_OPTION"},{"Name":"RENAME=","Help":{"#cdata":"\n \nSyntax: RENAME= (old-name { = | AS } new-name [... old-name { = | AS } new-name ] ) ; \n\nArguments: \nold-name \n the column you want to rename.\n\nnew-name \n the new name of the column. It must be a valid name for the data source.\n \nDetails: \nThe RENAME= table option allows you to change the names of one or more columns.\n\nIf you use RENAME= when you create a table, the new column name is included in the output \ntable. If you use RENAME= on an input table, the new name is used in TSPL programming statements.\n\nIf you use RENAME= in the same TSPL program with either the DROP= or the KEEP= table option, \nthe DROP= and the KEEP= table options are applied before RENAME=. You must use the old name in \nthe DROP= and KEEP= table options. You cannot drop and rename the same column in the same statement.\n\nIn addition to changing the name of a column, RENAME= also changes the label for the column."},"Type":"TABLE_OPTION","SubOptionsKeywords":"AS"},{"Name":"TYPE=","Help":{"#cdata":"Specifies the data set type for a specially structured SAS data set. \n \nSyntax: TYPE=data-set-type \n\nSyntax Description: \ndata-set-type \n specifies the special type of the data set.\n\nDetails: \nUse the TYPE= table option in a DATA step to create a special SAS data set in the proper \nformat, or to identify the special type of the SAS data set in a procedure statement. \n\nYou can use the CONTENTS procedure to determine the type of a data set."},"Type":"TABLE_OPTION"},{"Name":"WRITE=","Help":{"#cdata":"Assigns a WRITE password to a SAS file that prevents users from writing to a file, \nunless they enter the password. \n \nSyntax: WRITE=write-password \n\nSyntax Description: \nwrite-password \n must be a valid SAS name. \n \nDetails: \nThe WRITE= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a write-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n drop thread job2a (write=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"Type":"TABLE_OPTION"}],"#comment":{}}} ================================================ FILE: server/data/HashPackageMethods.json ================================================ {"Keywords":{"Keyword":[{"Name":"ADD","Type":"HASH_PACKAGE","Help":{"#cdata":"Adds the specified data that is associated with the given key to the hash package.\n \nSyntax: rc = package.ADD(); \n\nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package."}},{"Name":"CHECK","Type":"HASH_PACKAGE","Help":{"#cdata":"Checks whether the specified key is stored in the hash package. \n \nSyntax: rc = package.CHECK(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nYou use the CHECK method to determine whether a key exists in the hash table but \nthe data variable is not updated. The CHECK method returns a zero value if the key \nis found in the hash table and a non-zero value if the key is not found."}},{"Name":"CLEAR","Type":"HASH_PACKAGE","Help":{"#cdata":"Removes all items from a hash package without deleting the hash package instance. \n \nSyntax: rc = package.CLEAR(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails:\nThe CLEAR method removes the items from within the hash package but leaves the hash \npackage instance so that it can be re-used. To remove a hash package completely, use \nthe DELETE method.\n\nTo clear all items from the hash package MyHash, use the following code: \n\n rc = myhash.clear();"}},{"Name":"defineData","Type":"HASH_PACKAGE","Help":{"#cdata":"Defines data, associated with the specified data variables, to be stored in the hash package. \n \nSyntax: rc = package.DEFINEDATA('datavarname'); \n \nArguments: \nrc \n specifies whether the method succeeded or failed. \n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\npackage \n specifies the name of the hash package.\n'datavarname' \n specifies the name of the data variable.\n \nDetails: \nThe hash package works by storing and retrieving data based on unique lookup keys. The keys \nand data are variables, which you use to initialize the hash package by using dot notation \nmethod calls. You define a key by passing the key variable name to the DEFINEKEY method. You \ndefine data by passing the data variable name to the DEFINEDATA method. You call the DEFINEDATA \nmethod for each data variable you create. When you have defined all key and data variables, \nyou must call the DEFINEDONE method to complete initialization of the hash package. Keys and \ndata consist of any number of character or numeric variables."}},{"Name":"defineDone","Type":"HASH_PACKAGE","Help":{"#cdata":"Indicates that all key and data definitions are complete. \n \nSyntax: rc = package.DEFINEDONE( ); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nThe hash package works by storing and retrieving data based on unique lookup keys. The keys \nand data are variables, which you use to initialize the hash package by using dot notation \nmethod calls. You define a key by passing the key variable name to the DEFINEKEY method. You \ndefine data by passing the data variable name to the DEFINEDATA method. When you have defined \nall key and data variables, you must call the DEFINEDONE method to complete initialization of \nthe hash package. Keys and data consist of any number of character or numeric variables."}},{"Name":"defineKey","Type":"HASH_PACKAGE","Help":{"#cdata":"Defines key variables for the hash package. \n \nSyntax: rc = package.DEFINEKEY('keyvarname'); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n\n'keyvarname' \n specifies the name of the key variable. \n The key variable name can also be enclosed in double quotation marks.\n \nDetails: \nThe hash package works by storing and retrieving data based on unique lookup keys. The keys \nand data are variables, which you use to initialize the hash package by using dot notation \nmethod calls. You define a key by passing the key variable name to the DEFINEKEY method. \nYou call the DEFINEKEY method for each key variable you create. You define data by passing \nthe data variable name to the DEFINEDATA method. When you have defined all key and data \nvariables, you must call the DEFINEDONE method to complete initialization of the hash \npackage. Keys and data consist of any number of character or numeric variables."}},{"Name":"DELETE","Type":"HASHORHITER_PACKAGE","Help":{"#cdata":"Deletes the hash or hash iterator package. \n \nSyntax: rc = package.DELETE( ); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message is written to the log.\n\npackage \n specifies the name of the hash or hash iterator package.\n \nDetails: \nWhen you no longer need the hash or hash iterator package, delete it by using the DELETE \nmethod. If you attempt to use a hash or hash iterator package after you delete it, an error \nwill be written to the log. If you want to delete all the items from within a hash package \nand save the hash package to use again, use the CLEAR method."}},{"Name":"FIND","Type":"HASH_PACKAGE","Help":{"#cdata":"Determines whether the specified key is stored in the hash package. \n \nSyntax: rc = package.FIND(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nYou use the key variable values to determine whether a key exists in the hash table. \nIf the key exists, the data values are copied into the data variables. The FIND method \nreturns a zero value if the key is found in the hash table and a non-zero value if the \nkey is not found."}},{"Name":"FIRST","Type":"HASHITERATOR_PACKAGE","Help":{"#cdata":"Returns the first value in the underlying hash package. \n \nSyntax: rc = package.FIRST( ); \n\nArguments: \nrc \n specifies whether the method succeeded or failed. \n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message will be written to the log.\n\npackage \n specifies the name of the hash iterator package.\n \nDetails: \nThe FIRST method returns the first data item in the hash package. If you use the ordered: 'yes' \nor ordered: 'ascending' parameter in the DECLARE PACKAGE statement or the _NEW_ operator when \nyou instantiate the hash package, then the data item that is returned is the one with the 'least' \nkey (smallest numeric value or first alphabetic character), because the data items are sorted in \nascending key-value order in the hash package. Repeated calls to the NEXT method will iteratively \ntraverse the hash package and return the data items in ascending key order. Conversely, if you \nuse the ordered: 'descending' parameter in the DECLARE PACKAGE statement or the _NEW_ operator \nwhen you instantiate the hash package, then the data item that is returned is the one with the \n'highest' key (largest numeric value or last alphabetic character), because the data items are \nsorted in descending key-value order in the hash package. Repeated calls to the NEXT method will \niteratively traverse the hash package and return the data items in descending key order.\n\nUse the LAST method to return the last data item in the hash package. \nNote: The FIRST method sets the data variable to the value of the data item so that it is \navailable for use after the method call."}},{"Name":"ITEM_SIZE","Type":"HASH_PACKAGE","Help":{"#cdata":"Returns the size (in bytes) for an item in a hash package. \n \nSyntax: variable-name=package.ITEM_SIZE; \n\nArguments: \nvariable-name \n specifies the name of the variable that contains the size of the item in the hash \n package after the method is complete.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nThe ITEM_SIZE attribute returns the size (in bytes) of an item, which includes the key \nand data variables and some internal information. You can set an estimate of how much \nmemory the hash package is using with the ITEM_SIZE and NUM_ITEMS attributes. The \nITEM_SIZE attribute does not reflect the initial overhead that the hash package \nrequires, nor does it take into account any necessary internal alignments. Therefore, \nthe use of ITEM_SIZE does not provide exact memory usage, but it does return a good \napproximation."}},{"Name":"LAST","Type":"HASHITERATOR_PACKAGE","Help":{"#cdata":"Returns the last value in the underlying hash package. \n \nSyntax: rc = package.LAST(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, then an \n appropriate error message is written to the log.\n\npackage \n specifies the name of the hash iterator package.\n \nDetails: \nThe LAST method returns the last data item in the hash package. If you use the ordered: \n'yes' or ordered: 'ascending' parameter in the DECLARE PACKAGE statement or the _NEW_ \noperator when you instantiate the hash package, then the data item that is returned is \nthe one with the 'highest' key (largest numeric value or last alphabetic character), \nbecause the data items are sorted in ascending key-value order in the hash package. \nConversely, if you use the ordered: 'descending' parameter in the DECLARE PACKAGE \nstatement or the _NEW_ operator when you instantiate the hash package, then the data \nitem that is returned is the one with the 'least' key (smallest numeric value or \nfirst alphabetic character), because the data items are sorted in descending key-value \norder in the hash package.\n\nUse the FIRST method to return the first data item in the hash package."}},{"Name":"NEXT","Type":"HASHITERATOR_PACKAGE","Help":{"#cdata":"Returns the next value in the underlying hash package. \n \nSyntax: rc = package.NEXT(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash iterator package.\n \nDetails: \nUse the NEXT method iteratively to traverse the hash package and return the data items \nin key order. The FIRST method returns the first data item in the hash package. You can \nuse the PREV method to return the previous data item in the hash package."}},{"Name":"NUM_ITEMS","Type":"HASH_PACKAGE","Help":{"#cdata":"Returns the number of items in the hash package. \n \nSyntax: variable-name=package.NUM_ITEMS; \n \nArguments: \nvariable-name \n specifies the number of items in the hash package after the method is complete.\n\npackage \n specifies the name of the hash package.\n\nDetails: \nThe NUM_ITEMS attribute returns the number of key/data pairs stored in the hash table."}},{"Name":"OUTPUT","Type":"HASH_PACKAGE","Help":{"#cdata":"Creates a table that contains the data in the hash package. \n \nSyntax: rc = package.OUTPUT ( 'datasource' ); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. \n If you do not supply a return code variable for the method call and the method \n fails, then an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash iterator package.\n\n'datasource' \n specifies the name of the output table.\n The name of the hash table can be a literal or character variable.\n \nDetails: \nHash package keys are not automatically stored as part of the output table. The keys \nmust be defined as data items by using the DEFINEDATA method to be included in the \noutput table."}},{"Name":"PREV","Type":"HASHITERATOR_PACKAGE","Help":{"#cdata":"Returns the previous value in the underlying hash package. \n \nSyntax \nrc = package.PREV( ); \n\nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. \n If you do not supply a return code variable for the method call and the method \n fails, then an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash iterator package.\n \nDetails: \nUse the PREV method iteratively to traverse the hash package and return the data \nitems in reverse key order. The FIRST method returns the first data item in the \nhash package. The LAST method returns the last data item in the hash package. You \ncan use the NEXT method to return the next data item in the hash package."}},{"Name":"REF","Type":"HASH_PACKAGE","Help":{"#cdata":"Consolidates a FIND and ADD methods into a single method call. \n \nSyntax: rc = package.REF(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. \n If you do not supply a return code variable for the method call and the method \n fails, then an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nYou can consolidate FIND and ADD methods into a single REF method."}},{"Name":"REMOVE","Type":"HASH_PACKAGE","Help":{"#cdata":"Removes the data that is associated with the specified key from the hash package. \n \nSyntax: rc = package.REMOVE(); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nThe REMOVE method uses the values in the key variables to find and remove an existing \nkey in a hash table.\n\nYou specify the key and then use the REMOVE method to remove the key and data in a \nhash object."}},{"Name":"REPLACE","Type":"HASH_PACKAGE","Help":{"#cdata":"Replaces the data that is associated with the specified key with new data. \n \nSyntax: rc = package.REPLACE( ); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you \n do not supply a return code variable for the method call and the method fails, then \n an appropriate error message is written to the log.\n\npackage \n specifies the name of the hash package.\n \nDetails: \nThe REPLACE method uses the values in the key variables to find a key/data pair in the \nhash table. If a pair is found, the data is replaced with the current value in the data \nvariables."}},{"Name":"SETCUR","Type":"HASHITERATOR_PACKAGE","Help":{"#cdata":"Specifies a starting key item for iteration. \n \nSyntax \nrc=package.SETCUR( ); \n \nArguments: \nrc \n specifies whether the method succeeded or failed.\n\n A return code of zero indicates success; a non-zero value indicates failure. If you do \n not supply a return code variable for the method call and the method fails, an appropriate \n error message will be printed to the log.\n\npackage \n specifies the name of the hash iterator package.\n \nDetails: \nThe hash iterator enables you to start iteration on any item in the hash package. The \nSETCUR method sets the starting key for iteration. You use the KEY option to specify \nthe starting item. You can use the FIRST or LAST methods to start iteration on the \nfirst or last item, respectively."}}]}} ================================================ FILE: server/data/MacroDefinitionOptions.json ================================================ {"Keywords":{"Keyword":[{"Name":"CMD","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Specifies that the macro can accept either a name-style invocation or a command-style \ninvocation."}},{"Name":"DES=","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"[Syntax: DES='text'] \n \nSpecifies a description (up to 40 characters) for the macro entry in the macro catalog."}},{"Name":"PARMBUFF|PBUFF","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Assigns the entire list of parameter values in a macro call, including the parentheses in \na name-style invocation, as the value of the automatic macro variable SYSPBUFF."}},{"Name":"STMT","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Specifies that the macro can accept either a name-style invocation or a statement-style \ninvocation."}},{"Name":"SECURE","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Causes the contents of a macro to be encrypted when stored in a stored compiled macro \nlibrary."}},{"Name":"NOSECURE","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Specifies the contents of a macro not to be encrypted when stored in a stored compiled \nmacro library."}},{"Name":"SOURCE","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Combines and stores the source of the compiled macro with the compiled macro code as \nan entry in a SAS catalog in a permanent SAS data library."}},{"Name":"STORE","Type":"MACRO_DEFINITION_OPTION","Help":{"#cdata":"Stores the compiled macro as an entry in a SAS catalog in a permanent SAS data library."}},{"Name":"MINDELIMITER=","Help":{"#cdata":"[Syntax: MINDELIMITER='single character';] \n \nSpecifies a value that will override the value of the MINDELIMITER= global option. \nThe value must be a single character enclosed in single quotation marks and can \nappear only once in a %MACRO statement."},"Type":"MACRO_DEFINITION_OPTION"},{"Name":"MINOPERATOR","Help":{"#cdata":"Specifies that the macro processor recognizes and evaluates the mnemonic IN and the \nspecial character # as logical operators when evaluating arithmetic or logical \nexpressions during the execution of the macro."},"Type":"MACRO_DEFINITION_OPTION"},{"Name":"NOMINOPERATOR","Help":{"#cdata":"Specifies that the macro processor does not recognize the mnemonic IN and the special \ncharacter # as logical operators when evaluating arithmetic or logical expressions \nduring the execution of the macro. The setting of this argument overrides the setting \nof the MINOPERATOR global system option."},"Type":"MACRO_DEFINITION_OPTION"}]}} ================================================ FILE: server/data/ODS_Tagsets.json ================================================ {"Keywords":{"Keyword":[{"Name":"CHTML","Type":"S","Help":{"#cdata":"Produces a compact, minimal HTML that does not use style information."}},{"Name":"CORE","Type":"S","Help":{"#cdata":"Contains a table of Unicode values and mnemonics."}},{"Name":"CSV","Type":"S","Help":{"#cdata":"Produces tabular output that contains columns of data values that are separated by commas."}},{"Name":"CSVALL","Type":"S","Help":{"#cdata":"Produces output that contains columns of data values that are separated by commas. ODS CSVALL \nproduces tabular output with titles, notes, and bylines."}},{"Name":"CVSBYLINE","Type":"S","Help":{"#cdata":"Produces output with comma-separated values and columns of data that are separated by commas."}},{"Name":"DEFAULT","Type":"S","Help":{"#cdata":"Produces XML output."}},{"Name":"DOCBOOK","Type":"S","Help":{"#cdata":"Produces XML output that conforms to the DocBook DTD by OASIS."}},{"Name":"ExcelXP","Type":"S","Help":{"#cdata":"Produces Microsoft's spreadsheetML XML. This tagset is used to import data into XML."}},{"Name":"HTML4","Type":"S","Help":{"#cdata":"Produces HTML 4.0 embedded style sheets."}},{"Name":"HTMLCSS","Type":"S","Help":{"#cdata":"Produces HTML output with cascading style sheets that is similar to ODS HTML output."}},{"Name":"HTMLPANEL","Type":"S","Help":{"#cdata":"Creates panels for By-grouped graphs."}},{"Name":"HTMLSCROLL","Type":"S","Help":{"#cdata":"Enables tables to be scrollable. The scrolling is actually done with JavaScript. This tagset adds \nthe JavaScript and necessary infrastructure to the standard HTML4 tagset."}},{"Name":"IMODE","Type":"S","Help":{"#cdata":"Produces HTML output as a column of output that is separated by lines."}},{"Name":"MSOFFICE2K","Type":"S","Help":{"#cdata":"Produces HTML code for output generated by ODS for Microsoft Office products."}},{"Name":"MVSHTML","Type":"S","Help":{"#cdata":"Produces URLs within HTML files that are used in the z/OS operating environment."}},{"Name":"PHTML","Type":"S","Help":{"#cdata":"Produces simple HTML output that uses twelve style elements and no class attributes."}},{"Name":"PYX","Type":"S","Help":{"#cdata":"Produces PYX, which is a simple, line-oriented notation used by Pyxie to describe the information \ncommunicated by an XML parser to an XML application."}},{"Name":"RTF","Type":"S","Help":{"#cdata":"Opens, manages, or closes the RTF destination, which produces measured output that is written in\nRich Text Format for use with Microsoft Word 2002.\n \nSyntax:\n(1) ODS TAGSETS.RTF <( identifier)> action; \n(2) ODS TAGSETS.RTF <( identifier)> ;"}},{"Name":"SASREPORT","Type":"S","Help":{"#cdata":"Causes imbedded data to be produced in CSV format."}},{"Name":"SQL","Type":"S","Help":{"#cdata":"Generates SQL statements for creation of tables in an SQL database. It's a brute-force way of getting \na data set into your database (SAS/CONNECT or SAS/SHARE being the best way, if you have access to \none of those products)."}},{"Name":"SUPERMAP","Type":"S","Help":{"#cdata":"This new mapping tagset does almost everything you would want from a mapping tagset. It is all the \nother mapping tagsets in one. Control the events to be displayed, the attributes shown, and display \nevents only if their values match a regular expression."}},{"Name":"TABLEEDITOR","Type":"S","Help":{"#cdata":"Creates HTML output with the same kind of functionality that you would get from Visual Basic .Net (VB.NET). \nYou can easily export the output to Excel or other filetypes."}},{"Name":"WML","Type":"S","Help":{"#cdata":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with \na list of URLs as a table of contents."}},{"Name":"WMLOLIST","Type":"S","Help":{"#cdata":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with \nan option list for the table of contents."}},{"Name":"XBRL","Type":"S","Help":{"#cdata":"Generates XBRL XML."}},{"Name":"XHTML","Type":"S","Help":{"#cdata":"Produces output in HTML format."}},{"Name":"EVENT_HTML","Type":"S","Help":{"#cdata":"Creates XML output that shows which events are being triggered and which variables are used by an \nevent to send output from a SAS process to an output file.\""}},{"Name":"NAMEDHTML","Type":"S","Help":{"#cdata":"Creates HTML output similar to STYLE_POPUP, but with all the objects labeled as they are when \nusing ODS TRACE."}},{"Name":"SHORT_MAP","Type":"S","Help":{"#cdata":"Creates a subset of the XML output that is created by the EVENT_MAP tagset."}},{"Name":"STYLE_DISPLAY","Type":"S","Help":{"#cdata":"Creates a sample page of HTML output that is similar to STYLE_POPUP output."}},{"Name":"STYLE_POPUP","Type":"S","Help":{"#cdata":"Creates HTML like HTMLCSS, but if you're using Internet Explorer, STYLE_POPUP displays a window \nthat shows the resolved ODS style definition for any item that you select."}},{"Name":"TEXT_MAP","Type":"S","Help":{"#cdata":"Creates text output that shows which events are being triggered as ODS handles the output objects."}},{"Name":"TPL_STYLE_LIST","Type":"S","Help":{"#cdata":"Creates HTML output in a bulleted list similar to EVENT_MAP but lists only a subset of the \npossible attributes."}},{"Name":"TPL_STYLE_MAP","Type":"S","Help":{"#cdata":"Creates XML output similar to EVENT_MAP but lists only a subset of the possible attributes."}}]}} ================================================ FILE: server/data/Procedures/DATA.json ================================================ {"Procedure":{"#comment":{},"Name":"DATA","ProductGroup":"BASE","ProcedureHelp":{"#cdata":""},"ProcedureOptions":{"ProcedureOption":[{"ProcedureOptionName":"_NULL_","ProcedureOptionHelp":{"#cdata":"Specifies that SAS does not create a data set when it executes the DATA step."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"_DATA_","ProcedureOptionHelp":{"#cdata":"Special SAS dataset name. Generated SAS dataset name in WORK library."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"_LAST_","ProcedureOptionHelp":{"#cdata":"Special SAS dataset name. Most recently created SAS dataset."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"VIEW=","ProcedureOptionHelp":{"#cdata":"Names a view that the DATA step uses to store the input DATA step view."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"SOURCE=","ProcedureOptionHelp":{"#cdata":"Specifies one of the following source options: SAVE, ENCRYPT, and NOSAVE."},"ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"SAVE","@Value2":"ENCRYPT","@Value3":"NOSAVE"},"ProcedureOptionToolTips":{"@ToolTip1":"Saves the source code that created a stored compiled DATA step program or a DATA step view.","@ToolTip2":"Encrypts and saves the source code that created a stored compiled DATA step program or a DATA step view.","@ToolTip3":"Does not save the source code."}},{"ProcedureOptionName":"ALTER=","ProcedureOptionHelp":{"#cdata":"[password-option] \n \nAssigns an alter password to a SAS data file. The password allows you to protect or \nreplace a stored compiled DATA step program or a DATA step view."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"READ=","ProcedureOptionHelp":{"#cdata":"[password-option] \n \nAssigns a read password to a SAS data file. The password allows you to read or \nexecute a stored compiled DATA step program or a DATA step view."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"PW=","ProcedureOptionHelp":{"#cdata":"[password-option] \n \nAssigns a READ and ALTER password, both having the same value."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"PGM=","ProcedureOptionHelp":{"#cdata":"Names the stored compiled program that SAS creates or executes in the DATA step."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"LABEL=","ProcedureOptionHelp":{"#cdata":"Specifies a label for a SAS data set."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"WHERE=","ProcedureOptionHelp":{"#cdata":"Specifies specific conditions to use to select observations from a SAS data set."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"UNIQUE","ProcedureOptionHelp":{"#cdata":"Specifies that the values of the key variables must be unique."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"NOMISS","ProcedureOptionHelp":{"#cdata":"Specifies to exclude all observations with missing values."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"DEBUG","ProcedureOptionHelp":{"#cdata":"Enables you to debug your program interactively by helping to identify logic errors, and sometimes \ndata errors."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"NESTING","ProcedureOptionHelp":{"#cdata":"Specifies that a note will be printed to the SAS log for the beginning and end of each DO-END and \nSELECT-END nesting level. This option enables you to debug mismatched DO-END and SELECT-END statements \nand is particularly useful in large programs where the nesting level is not obvious."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"STACK=","ProcedureOptionHelp":{"#cdata":"Specifies the maximum number of nested LINK statements."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"NOLIST","ProcedureOptionHelp":{"#cdata":"Suppresses the output of all variables to the SAS log when the value of _ERROR_ is 1."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"ALTER=","ProcedureOptionType":"V"},{"ProcedureOptionName":"BUFNO=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"}},{"ProcedureOptionName":"BUFSIZE=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"ProcedureOptionName":"CNTLLEV=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"LIB","@Value2":"MEM","@Value3":"REC"}},{"ProcedureOptionName":"COMPRESS=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"NO","@Value2":"YES","@Value3":"CHAR","@Value4":"BINARY"}},{"ProcedureOptionName":"DLDMGACTION=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"FAIL","@Value2":"ABORT","@Value3":"REPAIR","@Value4":"NOINDEX","@Value5":"PROMPT"}},{"ProcedureOptionName":"ENCRYPT=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"ENCRYPTKEY=","ProcedureOptionType":"V"},{"ProcedureOptionName":"GENMAX=","ProcedureOptionType":"V"},{"ProcedureOptionName":"GENNUM=","ProcedureOptionType":"V"},{"ProcedureOptionName":"INDEX=","ProcedureOptionType":"V"},{"ProcedureOptionName":"LABEL=","ProcedureOptionType":"V"},{"ProcedureOptionName":"OUTREP=","ProcedureOptionType":"V"},{"ProcedureOptionName":"PW=","ProcedureOptionType":"V"},{"ProcedureOptionName":"PWREQ=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"READ=","ProcedureOptionType":"V"},{"ProcedureOptionName":"REPEMPTY=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"REPLACE=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"REUSE=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"SPILL=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"SORTEDBY=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"by-clause < / collate-name>","@Value2":"_NULL_"}},{"ProcedureOptionName":"TOBSNO=","ProcedureOptionType":"V"},{"ProcedureOptionName":"TRANTAB=","ProcedureOptionType":"V"},{"ProcedureOptionName":"TYPE=","ProcedureOptionType":"V"},{"ProcedureOptionName":"WRITE=","ProcedureOptionType":"V"},{"ProcedureOptionName":"FILECLOSE=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"DISP","@Value2":"LEAVE","@Value3":"REREAD","@Value4":"REWIND"}},{"ProcedureOptionName":"FIRSTOBS=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"ProcedureOptionName":"IN=","ProcedureOptionType":"V"},{"ProcedureOptionName":"OBS=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"nT","@Value6":"hexX","@Value7":"MIN","@Value8":"MAX"}},{"ProcedureOptionName":"POINTOBS=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"WHERE=","ProcedureOptionType":"V"},{"ProcedureOptionName":"WHEREUP=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"SGIO=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"IDXNAME=","ProcedureOptionType":"V"},{"ProcedureOptionName":"IDXWHERE=","ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"ProcedureOptionName":"DROP=","ProcedureOptionType":"V"},{"ProcedureOptionName":"KEEP=","ProcedureOptionType":"V"},{"ProcedureOptionName":"RENAME=","ProcedureOptionType":"V"},{"ProcedureOptionName":"EXTENDOBSCOUNTER=","ProcedureOptionType":"V"},{"ProcedureOptionName":"ENCODING=","ProcedureOptionType":"V"},{"ProcedureOptionName":"APPEND=","ProcedureOptionType":"V"},{"ProcedureOptionName":"COPIES=","ProcedureOptionType":"V"},{"ProcedureOptionName":"DUPLICATE=","ProcedureOptionType":"V"},{"ProcedureOptionName":"CASLIB=","ProcedureOptionType":"V"},{"ProcedureOptionName":"ONDEMAND=","ProcedureOptionType":"V"},{"ProcedureOptionName":"ORDERBY=(","ProcedureOptionType":"V"},{"ProcedureOptionName":"PARTITION=","ProcedureOptionType":"V"},{"ProcedureOptionName":"SCRIPT=","ProcedureOptionType":"V"},{"ProcedureOptionName":"COMPRESS=","ProcedureOptionType":"V"},{"ProcedureOptionName":"PROMOTE=","ProcedureOptionType":"V"},{"ProcedureOptionName":"TAG=","ProcedureOptionType":"V"},{"ProcedureOptionName":"TEMPNAMES=","ProcedureOptionType":"V"},{"ProcedureOptionName":"TEMPEXPRESS=","ProcedureOptionType":"V"}],"#comment":[{},{}]},"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"ABORT","StatementHelp":{"#cdata":"Syntax: ABORT | RETURN | > ; \n \nStops executing the current DATA step, SAS job, or SAS session.\n\nn is an integer value that enables you to specify a condition code: \n \n o when used with the CANCEL argument, the value is placed in the SYSINFO automatic macro variable \n o when not used with the CANCEL argument, the error code that is returned by SAS is ERROR. The value \n of ERROR depends on the operating system. The condition code n is returned to the operating system \n as the final SAS system exit code."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ABEND","StatementOptionHelp":{"#cdata":"Causes abnormal termination of the current SAS job or session. Results depend on the method \nof operation: \n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log that states that execution was terminated by the ABEND option \n of the ABORT macro statement\n o does not execute any subsequent statements or check syntax\n o returns control to the operating environment; further action is based on how your operating environment \n and your site treat jobs that end abnormally.\n\no windowing environment and interactive line mode \n\n o causes your windowing environment and interactive line mode to stop processing immediately \n and return you to your operating environment."},"StatementOptionType":"S"},{"StatementOptionName":"CANCEL","StatementOptionHelp":{"#cdata":"Causes the cancellation of the current submitted statements. The results depend on the method \nof operation:\n\no batch mode and noninteractive mode\n\n o The entire SAS program and SAS system are terminated.\n o The error message is written to the SAS log.\n\no windowing environment and interactive line mode \n\n o It only clears the current submitted program.\n o Other subsequent submitted programs are not affected.\n o The error message is written to the SAS log.\n\no workspace server and stored process server \n\n o It only clears currently submitted program.\n o Other subsequent submit calls are not affected.\n o The error message is written to the SAS log.\n\no SAS IntrNet application server \n\n o A separate execution is created for each request. The execution submits the request code. A CANCEL \n argument in the request code clears the current submitted code but does not terminate the execution \n of the SAS session."},"StatementOptionType":"S"},{"StatementOptionName":"CANCEL FILE","StatementOptionHelp":{"#cdata":"Causes only the contents of the autoexec file or %INCLUDE file to be cleared by the %ABORT statement. \nOther submitted source statements will be executed after the autoexec or %INCLUDE file."},"StatementOptionType":"S"},{"StatementOptionName":"RETURN","StatementOptionHelp":{"#cdata":"Causes abnormal termination of the current SAS job or session. Results depend on the method \nof operation: \n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log that states that execution was terminated by the RETURN option \n in the ABORT macro statement\n o does not execute any subsequent statements or check syntax\n o returns control to the operating environment with a condition code indicating an error.\n\no windowing environment and interactive line mode \n\n o causes your windowing environment and interactive line mode to stop processing immediately \n and return you to your operating environment."},"StatementOptionType":"S"},{"StatementOptionName":"<n>","StatementOptionHelp":{"#cdata":"Replace with an actual integer value.\n \nn is an integer value that enables you to specify a condition code: \n \n o when used with the CANCEL argument, the value is placed in the SYSINFO automatic macro variable \n o when not used with the CANCEL argument, the error code that is returned by SAS is ERROR. The value \n of ERROR depends on the operating system. The condition code n is returned to the operating system \n as the final SAS system exit code."},"StatementOptionType":"S"},{"StatementOptionName":"NOLIST","StatementOptionHelp":{"#cdata":"Suppresses the output of all variables to the SAS log. \n \nRequirement: NOLIST must be the last option in the ABORT statement."},"StatementOptionType":"S"}]}},{"StatementName":"ARRAY","StatementHelp":{"#cdata":"Syntax: ARRAY array-name { subscript } <$> \n <(initial-value-list)>; \n \nDefines the elements of an array."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"_ALL_","StatementOptionHelp":{"#cdata":"Specifies all variables."},"StatementOptionType":"S"},{"StatementOptionName":"_TEMPORARY_","StatementOptionHelp":{"#cdata":"Creates a list of temporary data elements."},"StatementOptionType":"S"},{"StatementOptionName":"_NUMERIC_","StatementOptionHelp":{"#cdata":"Specifies all numeric variables."},"StatementOptionType":"S"},{"StatementOptionName":"_CHARACTER_","StatementOptionHelp":{"#cdata":"Specifies all character variables."},"StatementOptionType":"S"}]}},{"StatementName":"BY","StatementHelp":{"#cdata":"Syntax: BY variable-1 \n <... variable-n > ; \n \nControls the operation of a SET, MERGE, MODIFY, or UPDATE statement in the DATA step and sets up \nspecial grouping variables. "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DESCENDING","StatementOptionHelp":{"#cdata":"Specifies that the data sets are sorted in descending order by the variable that is specified. \nDESCENDING means largest to smallest numerically, or reverse alphabetical for character variables."},"StatementOptionType":"S"},{"StatementOptionName":"GROUPFORMAT","StatementOptionHelp":{"#cdata":"Uses the formatted values, instead of the internal values, of the BY variables to determine where \nBY groups begin and end, and therefore how FIRST.variable and LAST.variable are assigned. Although \nthe GROUPFORMAT option can appear anywhere in the BY statement, the option applies to all variables \nin the BY statement."},"StatementOptionType":"S"},{"StatementOptionName":"NOTSORTED","StatementOptionHelp":{"#cdata":"Specifies that observations with the same BY value are grouped together but are not necessarily \nsorted in alphabetical or numeric order."},"StatementOptionType":"S"}]}},{"StatementName":"CALL","StatementHelp":{"#cdata":"Syntax: CALL routine(parameter-1<, ...parameter-n>); \n \nInvokes a SAS CALL routine."},"StatementOptions":null},{"StatementName":"DATALINES|CARDS|LINES","StatementHelp":{"#cdata":"Syntax: DATALINES; | CARDS; | LINES;\n \nSpecifies that data lines follow."},"StatementStates":"CARDS","StatementOptions":null},{"StatementName":"DATALINES4|CARDS4|LINES4","StatementHelp":{"#cdata":"Syntax: DATALINES4; | CARDS4; | LINES4;\n \nIndicates that data lines that contain semicolons follow."},"StatementStates":"CARDS4","StatementOptions":null},{"StatementName":"CONTINUE","StatementHelp":{"#cdata":"Syntax: CONTINUE; \n \nStops processing the current DO-loop iteration and resumes processing the next iteration."},"StatementOptions":null},{"StatementName":"DECLARE|DCL","StatementHelp":{"#cdata":"Declares a hash or hash iterator object; creates an instance of and initializes data for a hash \nor hash iterator object.\n \nSyntax: \n(1) DECLARE object object-reference; \n(2) DECLARE object object-reference<(>)>; "},"StatementOptions":null},{"StatementName":"DELETE","StatementHelp":{"#cdata":"Syntax: DELETE; \n \nStops processing the current observation."},"StatementOptions":null},{"StatementName":"DESCRIBE","StatementHelp":{"#cdata":"Syntax: DESCRIBE;\n \nRetrieves source code from a stored compiled DATA step program or a DATA step view."},"StatementOptions":null},{"StatementName":"DISPLAY","StatementHelp":{"#cdata":"Syntax: DISPLAY window<.group> ; \n \nDisplays a window that is created with the WINDOW statement."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"NOINPUT","StatementOptionHelp":{"#cdata":"Specifies that you cannot input values into fields that are displayed in the window."},"StatementOptionType":"S"},{"StatementOptionName":"BLANK","StatementOptionHelp":{"#cdata":"Clears the window."},"StatementOptionType":"S"},{"StatementOptionName":"BELL","StatementOptionHelp":{"#cdata":"Produces an audible alarm, beep, or bell sound when the window is displayed if your personal \ncomputer is equipped with a speaker device that provides sound."},"StatementOptionType":"S"},{"StatementOptionName":"DELETE","StatementOptionHelp":{"#cdata":"Deletes the display of the window after processing passes from the DISPLAY statement on which \nthe option appears."},"StatementOptionType":"S"}]}},{"StatementName":"DO WHILE","StatementHelp":{"#cdata":"Executes statements in a DO-loop repetitively while a condition is true. \n \nSyntax: \nDO WHILE (expression); \n...more SAS statements... \nEND;"},"StatementOptions":null},{"StatementName":"DO UNTIL","StatementHelp":{"#cdata":"Executes statements in a DO loop repetitively until a condition is true.\n \nSyntax: \nDO UNTIL (expression); \n...more SAS statements... \nEND;"},"StatementOptions":null},{"StatementName":"DO","StatementHelp":{"#cdata":"Specifies a group of statements to be executed as a unit.\n \nSyntax: \n(1) DO; \n...more SAS statements... \nEND; \n\n(2) DO index-variable=specification-1 <, ... specification-n>; \n... more SAS statements ... \nEND; \n\n(3) DO UNTIL (expression); \n...more SAS statements... \nEND \n\n(4) DO WHILE (expression); \n...more SAS statements... \nEND;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"UNTIL","StatementOptionHelp":{"#cdata":"Executes statements in a DO loop repetitively until a condition is true.\n \nSyntax: \nDO UNTIL (expression); \n...more SAS statements... \nEND"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Executes statements in a DO-loop repetitively while a condition is true. \n \nSyntax: \nDO WHILE (expression); \n...more SAS statements... \nEND;"},"StatementOptionType":"S"},{"StatementOptionName":"OVER","StatementOptionType":"S"},{"StatementOptionName":"TO","StatementOptionHelp":{"#cdata":"Separates the start and stop integers or expressions that control the number of times the \nportion of the DATA step between the iterative DO and END statements is processed."},"StatementOptionType":"S"},{"StatementOptionName":"BY","StatementOptionHelp":{"#cdata":"Precedes an increment integer (other than 0) or an expression that generates an integer to be \nadded to the value of the index variable in each iteration of the DO loop."},"StatementOptionType":"S"}]}},{"StatementName":"DROP","StatementHelp":{"#cdata":"Syntax: DROP variable-list; \n \nExcludes variables from output SAS data sets."},"StatementOptions":null},{"StatementName":"END","StatementHelp":{"#cdata":"Syntax: END; \n \nEnds a DO group or SELECT group processing."},"StatementOptions":null},{"StatementName":"ERROR","StatementHelp":{"#cdata":"Syntax: ERROR ; \n \nSets _ERROR_ to 1. A message written to the SAS log is optional."},"StatementOptions":null},{"StatementName":"EXECUTE","StatementHelp":{"#cdata":"Syntax: EXECUTE;\n \nExecutes a stored compiled DATA step program."},"StatementOptions":null},{"StatementName":"FILE","StatementHelp":{"#cdata":"Specifies the current output file for PUT statements.\n\nSyntax: \n(1) FILE file-specification ; \n(2) FILE file-specification ; \n(3) FILE file-specification ; \n(4) FILE LOG | PRINT ; \n\nwhere\n\nfile-specification \nidentifies an external file that the DATA step uses to write output from a PUT statement. \nFile-specification can have these forms: \n\n 'external-file' \n specifies the physical name of an external file, which is enclosed in quotation marks. \n The physical name is the name by which the operating environment recognizes the file.\n\n fileref \n specifies the fileref of an external file. \n\n Requirement: You must have previously associated fileref with an external file in a FILENAME \n statement or function, or in an appropriate operating environment command. There is only one \n exception to this rule: when you use the FILEVAR= option, the fileref is simply a placeholder. \n\n fileref(file) \n specifies a fileref that is previously assigned to an external file that is an aggregate \n grouping of files. Follow the fileref with the name of a file or member, which is enclosed \n in parentheses.\n \n LOG \n is a reserved fileref that directs the output that is produced by any PUT statements to the SAS log.\n PRINT \n is a reserved fileref that directs the output that is produced by any PUT statements to the same \n file as the output that is produced by SAS procedures.\n\ndevice-type \nspecifies the type of device or the access method that is used if the fileref points to an input \nor output device or a location that is not a physical file: DISK, DUMMY, GTERM, PIPE, PLOTTER,\nPRINTER, TAPE, TEMP, TERMINAL, UPRINTER. type specifies the type of file in z/OS: DLI, HFS, MVS,\nPIPE, VSAM.\n\noperating-environment-options or host-options\nAdditional specifications might be required when you specify some devices. See the SAS documentation \nfor your operating environment before specifying a value other than DISK. Values in addition to the \nones listed here might be available in some operating environments."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"LOG","StatementOptionHelp":{"#cdata":"Is a reserved fileref that directs the output that is produced by any PUT statements to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"DISK","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies that the device is a disk drive."},"StatementOptionType":"S"},{"StatementOptionName":"DUMMY","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies that the output to the file is discarded. Tip: Specifying DUMMY can be \nuseful for testing."},"StatementOptionType":"S"},{"StatementOptionName":"GTERM","StatementOptionHelp":{"#cdata":"[device-type] \n \nIndicates that the output device type is a graphics device that will receive graphics data."},"StatementOptionType":"S"},{"StatementOptionName":"PIPE","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies an unnamed pipe. Note: Some operating environments do not support pipes."},"StatementOptionType":"S"},{"StatementOptionName":"PLOTTER","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies an unbuffered graphics output device."},"StatementOptionType":"S"},{"StatementOptionName":"PRINTER","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies a printer or printer spool file."},"StatementOptionType":"S"},{"StatementOptionName":"TAPE","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies a tape drive."},"StatementOptionType":"S"},{"StatementOptionName":"TEMP","StatementOptionHelp":{"#cdata":"[device-type] \n \nCreates a temporary file that exists only as long as the filename is assigned. \n\nRestriction: Do not specify a physical pathname. If you do, SAS returns an error."},"StatementOptionType":"S"},{"StatementOptionName":"TERMINAL","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies the user's terminal."},"StatementOptionType":"S"},{"StatementOptionName":"UPRINTER","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies a Universal Printing printer definition name."},"StatementOptionType":"S"},{"StatementOptionName":"DLI","StatementOptionHelp":{"#cdata":"[type] \n \nFor IMS-DL/I databases."},"StatementOptionType":"S"},{"StatementOptionName":"HFS","StatementOptionHelp":{"#cdata":"[type] \n \nFor UNIX System Services files."},"StatementOptionType":"S"},{"StatementOptionName":"MVS","StatementOptionHelp":{"#cdata":"[type] \n \nFor z/OS data sets."},"StatementOptionType":"S"},{"StatementOptionName":"VSAM","StatementOptionHelp":{"#cdata":"[type] \n \nFor VSAM files."},"StatementOptionType":"S"},{"StatementOptionName":"COLUMN=|COL=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS automatically sets to the current column location of the pointer."},"StatementOptionType":"V"},{"StatementOptionName":"DELIMITER=|DLM=","StatementOptionHelp":{"#cdata":"Specifies an alternate delimiter (other than a blank) to be used for LIST output."},"StatementOptionType":"V"},{"StatementOptionName":"DLMSTR=","StatementOptionHelp":{"#cdata":"Specifies a character string as an alternate delimiter (other than a blank) to be used \nfor LIST output"},"StatementOptionType":"V"},{"StatementOptionName":"DLMSOPT=","StatementOptionHelp":{"#cdata":"Specifies a parsing option for the DLMSTR= T option that removes trailing blanks of the \nstring delimiter."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'T'"},"StatementOptionToolTips":{"@ToolTip1":"Removes trailing blanks of the string delimiter."}},{"StatementOptionName":"DROPOVER","StatementOptionHelp":{"#cdata":"Discards data items that exceed the output line length (as specified by the LINESIZE= \nor LRECL= options in the FILE statement)."},"StatementOptionType":"S"},{"StatementOptionName":"DSD","StatementOptionHelp":{"#cdata":"Specifies that data values that contain embedded delimiters, such as tabs or commas, \nbe enclosed in quotation marks."},"StatementOptionType":"S"},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"Specifies the encoding to use when writing to the output file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"FILENAME=","StatementOptionHelp":{"#cdata":"Defines a character variable, whose name you supply, that SAS sets to the value of the physical \nname of the file currently open for PUT statement output."},"StatementOptionType":"V"},{"StatementOptionName":"FILEVAR=","StatementOptionHelp":{"#cdata":"Defines a variable whose change in value causes the FILE statement to close the current output \nfile and open a new one the next time the FILE statement executes."},"StatementOptionType":"V"},{"StatementOptionName":"FLOWOVER","StatementOptionHelp":{"#cdata":"Causes data that exceeds the current line length to be written on a new line."},"StatementOptionType":"S"},{"StatementOptionName":"FOOTNOTES|FOOTNOTE","StatementOptionHelp":{"#cdata":"Specifies that the currently defined footnotes are printed."},"StatementOptionType":"S"},{"StatementOptionName":"NOFOOTNOTES|NOFOOTNOTE","StatementOptionHelp":{"#cdata":"Specifies that the currently defined footnotes are not printed."},"StatementOptionType":"S"},{"StatementOptionName":"HEADER=","StatementOptionHelp":{"#cdata":"Defines a statement label that identifies a group of SAS statements that you want to execute \neach time SAS begins a new output page"},"StatementOptionType":"V"},{"StatementOptionName":"LINE=","StatementOptionHelp":{"#cdata":"Defines a variable whose value is the current relative line number within the group of lines \navailable to the output pointer."},"StatementOptionType":"V"},{"StatementOptionName":"LINESIZE=|LS=","StatementOptionHelp":{"#cdata":"Sets the maximum number of columns per line for reports and the maximum record length for \ndata files."},"StatementOptionType":"V"},{"StatementOptionName":"LINESLEFT=|LL=","StatementOptionHelp":{"#cdata":"Defines a variable whose value is the number of lines left on the current page."},"StatementOptionType":"V"},{"StatementOptionName":"LRECL=","StatementOptionHelp":{"#cdata":"Specifies the logical record length of the output file."},"StatementOptionType":"V"},{"StatementOptionName":"MOD","StatementOptionHelp":{"#cdata":"Writes the output lines after any existing lines in the file."},"StatementOptionType":"S"},{"StatementOptionName":"N=","StatementOptionHelp":{"#cdata":"Specifies the number of lines that you want available to the output pointer in the current \niteration of the DATA step."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"PAGESIZE|PS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the number of lines that are available to the output pointer. Replace n with an integer.","@ToolTip2":"Specifies that the entire page is available to the output pointer."}},{"StatementOptionName":"ODS=","StatementOptionHelp":{"#cdata":"[Syntax: ODS < = (ODS-suboptions) >] \n \nSpecifies to use the Output Delivery System to format the output from a DATA step."},"StatementOptionType":"S|V"},{"StatementOptionName":"OLD","StatementOptionHelp":{"#cdata":"Replaces the previous contents of the file."},"StatementOptionType":"S"},{"StatementOptionName":"PAD","StatementOptionHelp":{"#cdata":"Specifies that records written to an external file are padded with blanks to the length that \nis specified in the LRECL= option."},"StatementOptionType":"S"},{"StatementOptionName":"NOPAD","StatementOptionHelp":{"#cdata":"Specifies that records written to an external file are not padded with blanks to the length \nthat is specified in the LRECL= option."},"StatementOptionType":"S"},{"StatementOptionName":"PAGESIZE=|PS=","StatementOptionHelp":{"#cdata":"[Syntax: PAGESIZE=value] \n \nSets the number of lines per page for your reports."},"StatementOptionType":"V"},{"StatementOptionName":"PRINT","StatementOptionHelp":{"#cdata":"Either a reserved fileref that directs the output that is produced by any PUT statements to \nthe same file as the output that is produced by SAS procedures, or an option that specifies \nthat carriage-control characters are placed in the output lines."},"StatementOptionType":"S"},{"StatementOptionName":"NOPRINT","StatementOptionHelp":{"#cdata":"Specifies that carriage-control characters are placed in the output lines."},"StatementOptionType":"S"},{"StatementOptionName":"STOPOVER","StatementOptionHelp":{"#cdata":"Stops processing the DATA step immediately if a PUT statement attempts to write \na data item that exceeds the current line length."},"StatementOptionType":"S"},{"StatementOptionName":"TITLES|TITLE","StatementOptionHelp":{"#cdata":"Specifies that the current title lines are printed on the pages of files."},"StatementOptionType":"S"},{"StatementOptionName":"NOTITLES|NOTITLE","StatementOptionHelp":{"#cdata":"Specifies that the current title lines are not printed on the pages of files."},"StatementOptionType":"S"},{"StatementOptionName":"_FILE_=","StatementOptionHelp":{"#cdata":"[Syntax: _FILE_=variable] \n \nNames a character variable that references the current output buffer of this FILE statement."},"StatementOptionType":"V"},{"StatementOptionName":"BLKSIZE=|BLK=","StatementOptionHelp":{"#cdata":"[Syntax: BLKSIZE=block-size] \n \n[Windows/UNIX Host Option]\n\nSpecifies the number of bytes that are physically read or written in an I/O operation. \nThe default is 8K. The maximum is 1M (Windows) or 1G-1(UNIX). \n\nIn UNIX, if you specify RECFM=S370VBS, then you should specify BLKSIZE=32760 in order \nto avoid errors with records longer than 255 characters."},"StatementOptionType":"V"},{"StatementOptionName":"BLOCK","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"NOBLOCK","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"BYTE","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"MESSAGE","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"COMMAND","StatementOptionHelp":{"#cdata":"[Windows Host Option]\n \nAllows remote commands to be issued to DDE server applications that not use the \nSYSTEM topic name."},"StatementOptionType":"S"},{"StatementOptionName":"EOFCONNECT","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes and is valid only when you are defining \nthe server. This option indicates that if an end-of-file (EOF) character is \nreceived from a client, the server should try to connect to the next client."},"StatementOptionType":"S"},{"StatementOptionName":"HOTLINK","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to use the DDE HOTLINK."},"StatementOptionType":"S"},{"StatementOptionName":"NOTAB","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to ignore tab characters between variables."},"StatementOptionType":"S"},{"StatementOptionName":"IGNOREDOSEOF","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used in the context of I/O operations on variable record format files. When this \noption is specified, any occurrence of ^Z is interpreted as character data and \nnot as an end-of-file marker."},"StatementOptionType":"S"},{"StatementOptionName":"RECFM=","StatementOptionHelp":{"#cdata":"[Windows/UNIX/z/OS Host Option] \n \nSpecifies the record format of the external file. \n\nUnder z/OS, the following values can be appended to the RECFM values: \n\n o A specifies that the first byte of each record is an ANSI printer-control character.\n \n o M specifies that the file is a machine control character file. SAS does not interpret \n machine code control characters, nor does it create them in output files. \n \n o S specifies that the file contains spanned records (V), or the file contains standard blocks (F)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"F","@Value2":"P","@Value3":"S","@Value4":"V|D","@Value5":"N","@Value6":"s370V","@Value7":"S370VB","@Value8":"S370VBS","@Value9":"STREAMLF","@Value10":"FB","@Value11":"VB","@Value12":"U"},"StatementOptionToolTips":{"@ToolTip1":"Fixed-record format","@ToolTip2":"Print format.","@ToolTip3":"Stream-record format.","@ToolTip4":"Variable-record format (the default)","@ToolTip5":"Indicates binary format and causes the file to be treated as a byte stream. If LRECL is not specified, by default SAS reads 256 bytes at a time from the file.","@ToolTip6":"Indicates the variable S370 record format (V).","@ToolTip7":"Indicates the variable block S370 record format (VB).","@ToolTip8":"Indicates the variable block with spanned records S370 record format (VBS).","@ToolTip9":"[For OpenVMS] Specifies StreamLF record format. Records are delimited by LF.","@ToolTip10":"Specifies fixed-length records, blocked.","@ToolTip11":"Specifies variable-length records, blocked.","@ToolTip12":"Specifies undefined-length records, unblocked."}},{"StatementOptionName":"RETRY=","StatementOptionHelp":{"#cdata":"[Syntax: RETRY=seconds] \n \n[Windows Host Option]\n\nIs used only in the context of named pipes. This option specifies how long a named \npipe client should wait for a busy pipe. The minimum (and default) value for seconds \nis 10."},"StatementOptionType":"V"},{"StatementOptionName":"SERVER","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."},"StatementOptionType":"S"},{"StatementOptionName":"CLIENT","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."},"StatementOptionType":"S"},{"StatementOptionName":"TERMSTR=","StatementOptionHelp":{"#cdata":"[Windows/UNIX Host Option] \n \nSpecifies the end-of-line character for the file. Use this option to share files \nbetween the UNIX and Windows operating environments."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CR","@Value2":"CRLF","@Value3":"LF","@Value4":"NULL","@Value5":"NONE","@Value6":"NL","@Value7":"LFCR","@Value8":"CRNL"},"StatementOptionToolTips":{"@ToolTip1":"Carriage return (CR).","@ToolTip2":"Carriage return (CR) followed by line feed (LF).","@ToolTip3":"Line feed only (the default).","@ToolTip4":"NULL character (0x00).","@ToolTip5":"Record terminators are not used. This parameter provides the same function as FILEDATA=BINARY.","@ToolTip6":"The newline character (x'15') is used as the record terminator. This parameter provides the same function as FILEDATA=TEXT.","@ToolTip7":"The sequence LF followed by CR is used as the record terminator.","@ToolTip8":"The sequence CR followed by NL is used as the record terminator."}},{"StatementOptionName":"UNBUF","StatementOptionHelp":{"#cdata":"[UNIX Host Option] \n \nTells SAS not to perform buffered writes to the file on any subsequent FILE statement. \nThis option applies especially when you are reading from or writing to a data collection \ndevice. As explained in SAS Language Reference: Dictionary, it also prevents buffered \nreads on INFILE statements."},"StatementOptionType":"S"},{"StatementOptionName":"ALQ=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks initially allocated to an external file when it is created. \nThe value can range from 0 to 2,147,483,647. If the value is 0 (the default), the minimum \nnumber of blocks required for the given file format is used.\n\nThe ALQ= option (allocation quantity) is used for output and corresponds to the FAB$L_ALQ \nfield in OpenVMS Record Management Services (RMS)."},"StatementOptionType":"V"},{"StatementOptionName":"CC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option] \n \nSpecifies the carriage-control format of the SAS log and the procedure output file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FORTRAN","@Value2":"PRINT","@Value3":"CR"},"StatementOptionToolTips":{"@ToolTip1":"Indicates FORTRAN carriage-control format. This is the default for print files.","@ToolTip2":"Indicates OpenVMS print format.","@ToolTip3":"Indicates OpenVMS carriage-return, carriage-control format. This is the default for nonprinting files."}},{"StatementOptionName":"DEQ=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks added when OpenVMS RMS automatically extends an external \nfile during a write operation. The value can range from 0 to 65,535. The default value \nis 0, telling OpenVMS RMS to use the process's default value. A large value results in \nfewer file extensions over the life of the file; a small value results in numerous file \nextensions over the life of the file. A file with numerous file extensions might be \nnoncontiguous, thereby slowing record access.\n\nThe DEQ= option (default file extension quantity) is used for output and corresponds to \nthe FAB$W_DEQ field in OpenVMS RMS."},"StatementOptionType":"V"},{"StatementOptionName":"FAC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file access attributes used for external files. Use this option \nto indicate the level of access you want to allow for an external file. You can allow \nREAD, WRITE, UPDATE, and DELETE access (as well as no access). By default with external \nfiles, files opened for input allow read access, files opened for output allow WRITE \naccess, and files opened for update allow READ and WRITE access. The form of the FAC= \noption is \n\nFAC=access-option-list\n\nwhere access-option-list can be one of the following: \n\nDEL specifies DELETE access.\n \nGET specifies READ access.\n \nPUT specifies WRITE access.\n \nUPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want DELETE, READ, and WRITE access: \n\nfac=(del,get,put)"},"StatementOptionType":"V"},{"StatementOptionName":"GSFCC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option] \n \nSpecifies the file format of graphic stream files (GSF files). When specified in \nthe FILENAME statement, it affects only the GSF files that are created using that \nfileref."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"PRINT","@Value2":"CR","@Value3":"NONE"},"StatementOptionToolTips":{"@ToolTip1":"Creates a GSF file. It is a VFC format file with carriage control set to null. These files can be used with most utilities with the exception of some file transfer protocols, such as Kermit. This is the default value for this option.","@ToolTip2":"Creates a carriage return carriage control file.","@ToolTip3":"Creates a file with no carriage control. This format is useful if you plan to download the file to a personal computer."}},{"StatementOptionName":"KEY=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies which key SAS uses to read the records in an RMS file with indexed organization. \nThe KEY= option is always used with the KEYVALUE= option. "},"StatementOptionType":"V"},{"StatementOptionName":"KEYVALUE=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the key value with which to begin reading an indexed file. "},"StatementOptionType":"V"},{"StatementOptionName":"MBC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the size of the I/O buffers that OpenVMS RMS allocates for a particular file. \nThe value can range from 0 to 127 and represents the number of blocks used for each buffer. \nBy default, this option is set to 0 and the default values for the process are used.\n\nThe MBC= option (multiblock count) is used for both input and output to control the \nallocation for a particular file. If you want to control the allocation size for all \nthe external files used during the current SAS session, you can use the MBC= option in \nevery FILE, FILENAME, or INFILE statement. You can also use the DCL SET RMS_DEFAULT \ncommand to specify a process default, and let the SAS values default to the process's \ndefault values.\n\nThe MBC= option corresponds to the RAB$B_MBC field in OpenVMS RMS or the CONNECT \nMULTIBLOCK_COUNT attribute when using FDL. This option is not supported for DECnet \noperations."},"StatementOptionType":"V"},{"StatementOptionName":"MBF=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of I/O buffers you want OpenVMS RMS to allocate for a particular file. \nThe value can range from 0 to 127 and represents the number of buffers used. By default, \nthis option is set to a value of 2. If a value of 0 is specified, the default value for the \nprocess is used.\n\nThe MBF= option (multibuffer count) is used for both input and output to control the number \nof buffers allocated for a particular file. If you want to control the number of buffers \nallocated for all the external files used during the SAS session, you can use the MBF= \noption in every FILE, FILENAME, or INFILE statement. The DCL SET RMS_DEFAULT command can \nbe used to specify a process default. Then, you can let the SAS values default to the \nprocess's default values.\n\nThe MBF= option corresponds to the RAB$B_MBF field in OpenVMS RMS or the CONNECT MULTIBUFFER_COUNT \nattribute when using FDL. This option is not supported for DECnet operations."},"StatementOptionType":"V"},{"StatementOptionName":"SHR=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file-sharing attributes used for external files. With this option, \nyou can indicate the access level you want to give other users. You can allow READ, WRITE, \nUPDATE, and DELETE access (as well as no access). By default with external files, files \nopened for input allow shared read access, and files opened for output or UPDATE do not \nallow shared access.\n\nHowever, you can allow other users to have READ and WRITE access to a file that you are \nopening for input only. To accomplish this, use the SHR= option. The syntax of the SHR= \noption is \n\nSHR=share-option-list\n\nwhere share-option-list can be one of the following: DEL specifies DELETE access.\n\nGET specifies shared READ access.\n \nNONE specifies no shared access.\n \nPUT specifies shared WRITE access.\n \nUPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want shared DELETE, READ, and WRITE access: \n\nshr=(del,get,put)"},"StatementOptionType":"V"},{"StatementOptionName":"CLOSE=","StatementOptionHelp":{"#cdata":"[z/OS Host Option] \n \nIndicates how a tape volume is positioned at the end of the DATA step."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"REREAD","@Value2":"LEAVE","@Value3":"REWIND","@Value4":"FREE","@Value5":"DISP"},"StatementOptionToolTips":{"@ToolTip1":"Positions the tape at the logical beginning of the data set.","@ToolTip2":"Positions the tape at the logical end of the data set.","@ToolTip3":"Rewinds the tape to the physical beginning of the volume.","@ToolTip4":"Dynamically deallocates the tape volume.","@ToolTip5":"Is implied by the control language."}},{"StatementOptionName":"CSRC","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies that you want to use the CSRCESRV services (available with z/OS) to compress \ndata on output. For example: \n\n data _null_;\n file myfile csrc;\n put ... ;\n run;\n\nYou cannot use this option with an external file that has a fixed-length record format."},"StatementOptionType":"S"},{"StatementOptionName":"DCB=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: DCB=fileref \n\nspecifies the fileref of an external file that was referenced in an earlier FILE or \nINFILE statement in the same DATA step. SAS uses that file's RECFM=, LRECL=, and BLKSIZE= \ninformation for the current file."},"StatementOptionType":"V"},{"StatementOptionName":"DEVTYPE=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: DEVTYPE=variable \n\nDefines a character variable (minimum length 24) that SAS sets to the device type. \nSAS obtains the device type by using the z/OS operating environment DEVTYPE macro."},"StatementOptionType":"V"},{"StatementOptionName":"DSCB=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: DSCB=variable \n\nDefines a character variable (minimum length 96) that SAS sets to the Data Set Control \nBlock (DSCB) information from a non-VSAM data set."},"StatementOptionType":"V"},{"StatementOptionName":"JFCB=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: JFCB=variable \n\nDefines a character variable (minimum length 176) that SAS sets to the Job File \nControl Block (JFCB)."},"StatementOptionType":"V"},{"StatementOptionName":"UCBNAME=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: UCBNAME=variable \n\nDefines a character variable (minimum length 3) that SAS sets to the unit name \n(device address), which is derived from information in the unit control block (UCB)."},"StatementOptionType":"V"},{"StatementOptionName":"VOLUME=|VOLUMES=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: VOLUME=variable | VOLUMES=variable \n\nDefines a character variable (with a minimum length of six characters) that SAS sets \nto the tape VOLSER or the disk volume serial number. In the case of a multivolume file, \nthe VOLUME= variable contains the concatenated volume serial numbers up to the length \nof the variable or the first 30 volumes, whichever is less. The value in the VOLUME= \nvariable contains the volume serial number of the first data set in the concatenation \nwhen the file is opened. This serial number changes if you open a subsequent data set \nin the concatenation."},"StatementOptionType":"V"},{"StatementOptionName":"BOM|BOMFILE","StatementOptionHelp":{"#cdata":"[UNIX/z/OS Host Option]\n \nIncludes a Byte Order Mark when a UNICODE-encoded file is created."},"StatementOptionType":"S"},{"StatementOptionName":"NOBOM|NOBOMFILE","StatementOptionHelp":{"#cdata":"[UNIX/z/OS Host Option]\n \nSpecifies that a Byte Order Mark is not included when a UNICODE-encoded file is created."},"StatementOptionType":"S"},{"StatementOptionName":"FILEDATA=","StatementOptionHelp":{"#cdata":"[UNIX/z/OS Host Option] \n \nThe FILEDATA= option specifies that the file being processed is expected to contain \neither binary or text data."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BINARY","@Value2":"TEXT"},"StatementOptionToolTips":{"@ToolTip1":"The FILEDATA= option specifies that the file being processed is expected to contain binary data.","@ToolTip2":"The FILEDATA= option specifies that the file being processed is expected to contain text data."}},{"StatementOptionName":"BUFND=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: BUFND=value \n\nIndicates how many data buffers to use for the VSAM data set."},"StatementOptionType":"V"},{"StatementOptionName":"BUFNI=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: BUFNI=value \n\nIndicates how many index buffers to use for the VSAM data set."},"StatementOptionType":"V"},{"StatementOptionName":"FEEDBACK=|FDBK=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: FEEDBACK=variable | FDBK=variable \n\nDefines a numeric variable that SAS sets to the VSAM logical error code. This option \nis similar to the _FDBK_ automatic variable. When SAS sets the FEEDBACK variable, you \nmust reset it to 0 in order to continue."},"StatementOptionType":"V"},{"StatementOptionName":"KEYLEN=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: KEYLEN=variable \n\nSpecifies a numeric SAS variable that, when used with GENKEY, specifies the length \nof the key that is to be compared to the keys in the file."},"StatementOptionType":"V"},{"StatementOptionName":"KEYPOS=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: KEYPOS=variable \n\nIndicates the numeric variable that SAS sets to the position of the VSAM key field. \nThis option enables you to read keys without knowing the key position in advance. \nThis variable is set to the column number (starting from 1)."},"StatementOptionType":"V"},{"StatementOptionName":"PASSWD=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: PASSWD=value \n\nGives the appropriate password for a VSAM data set that has password protection."},"StatementOptionType":"V"},{"StatementOptionName":"RC4STOP","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nStops the DATA step from executing if a return code greater than 4 is returned by \nthe operating environment when the VSAM data set is opened."},"StatementOptionType":"S"},{"StatementOptionName":"RECORDS=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: RECORDS=variable \n\nDefines a numeric variable that SAS sets to the number of logical records in a \nVSAM data set that has been opened for input."},"StatementOptionType":"V"},{"StatementOptionName":"RECORG=","StatementOptionHelp":{"#cdata":"[z/OS Host Option] \n \nSpecifies the organization of records in a new VSAM data set. Use this option only \nif SMS is active."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"KS","@Value2":"ES","@Value3":"RR","@Value4":"LS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a VSAM key-sequenced data set.","@ToolTip2":"Specifies a VSAM entry-sequenced data set.","@ToolTip3":"Specifies a VSAM relative-record data set.","@ToolTip4":"Specifies a VSAM linear-space data set."}},{"StatementOptionName":"RESET","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nIndicates that the VSAM file is reset to empty (no records) when it is opened. \nThis option applies only to loading a VSAM data set that has been marked REUSE. \nYou cannot use this option if the data set contains an alternate index."},"StatementOptionType":"S"},{"StatementOptionName":"RRN=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: RRN=variable \n\nDefines a numeric variable that you set to the relative record number (RRN) of the \nrecord that you want to read or write. This option indicates that keyed direct access \nis being used; it is appropriate for RRDS only."},"StatementOptionType":"V"}],"#comment":[{},{},{}]}},{"StatementName":"GO TO|GOTO","StatementHelp":{"#cdata":"Syntax: GO TO label | GOTO label;\n \nJumps to a new statement."},"StatementOptions":null},{"StatementName":"IF","StatementHelp":{"#cdata":"Executes a SAS statement for observations that meet specific conditions. \n\nSyntax: \n(1) IF expression THEN statement; \n \n(2) IF condition;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"THEN","StatementOptionHelp":{"#cdata":"If the conditions that are specified in the IF clause are met, the IF-THEN statement executes a SAS \nstatement for observations that are read from a SAS data set, for records in an external file, or \nfor computed values."},"StatementOptionType":"S"},{"StatementOptionName":"DO","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct."},"StatementOptionType":"S"},{"StatementOptionName":"WHEN","StatementOptionHelp":{"#cdata":"WHEN statement in an IF-THEN-WHEN construct."},"StatementOptionType":"S"},{"StatementOptionName":"OUTPUT","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct."},"StatementOptionType":"S"},{"StatementOptionName":"GO TO|GOTO","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct. \n \nSyntax: ... GO TO label; | ... GOTO label;\n \nJumps to a new statement."},"StatementOptionType":"S"},{"StatementOptionName":"PUT","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct.\n \nWrites lines to the SAS log, to the SAS output window, or to an external location that is \nspecified in the most recent FILE statement."},"StatementOptionType":"S"},{"StatementOptionName":"STOP","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct. \n \nStops execution of the current DATA step."},"StatementOptionType":"S"},{"StatementOptionName":"RETURN","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct. \n \nStops executing statements at the current point in the DATA step and returns to \na predetermined point in the step. "},"StatementOptionType":"S"},{"StatementOptionName":"CALL","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct. \n \nSyntax: CALL routine(parameter-1<, ...parameter-n>); \n \nInvokes a SAS CALL routine."},"StatementOptionType":"S"},{"StatementOptionName":"SET","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN construct.\n \nSyntax: SET >; \n \nReads an observation from one or more SAS data sets."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"ELSE","StatementHelp":{"#cdata":"If the condition in an IF-THEN statement is false and an ELSE statement is present, \nthen the ELSE action is carried out."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"THEN","StatementOptionHelp":{"#cdata":"If the conditions that are specified in the IF clause are met, the IF-THEN statement executes a SAS \nstatement for observations that are read from a SAS data set, for records in an external file, or \nfor computed values."},"StatementOptionType":"S"},{"StatementOptionName":"IF","StatementOptionHelp":{"#cdata":"Executes a SAS statement for observations that meet specific conditions."},"StatementOptionType":"S"},{"StatementOptionName":"DO","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN-ELSE construct.\n \nSpecifies a group of statements to be executed as a unit."},"StatementOptionType":"S"},{"StatementOptionName":"OUTPUT","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN-ELSE construct.\n \nWrites the current observation to a SAS data set."},"StatementOptionType":"S"},{"StatementOptionName":"PUT","StatementOptionHelp":{"#cdata":"Action statement in an IF-THEN-ELSE construct.\n \nWrites lines to the SAS log, to the SAS output window, or to an external location that is \nspecified in the most recent FILE statement."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"%IF","StatementHelp":{"#cdata":"Syntax: %IF expression %THEN action; <%ELSE action;>\n \nConditionally process a portion of a macro."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"%THEN","StatementOptionHelp":{"#cdata":"Conditionally process a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%DO","StatementOptionHelp":{"#cdata":"Action statement in a %IF-%THEN-%DO construct."},"StatementOptionType":"S"},{"StatementOptionName":"%LET","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nCreates a macro variable and assigns it a value."},"StatementOptionType":"S"},{"StatementOptionName":"%RETURN","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nExecution causes normal termination of the currently executing macro."},"StatementOptionType":"S"},{"StatementOptionName":"%PUT","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nWrites text or macro variable information to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"%GOTO","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nSyntax: ... %GOTO label ;\n \nJumps to a new statement."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"%ELSE","StatementHelp":{"#cdata":"Part of a %IF-%THEN-%ELSE statement that conditionally processes a portion of a macro.\n \nSyntax: \n\n%IF expression %THEN action; \n<%ELSE action;> "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"%THEN","StatementOptionHelp":{"#cdata":"Conditionally processes a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%IF","StatementOptionHelp":{"#cdata":"Conditionally processes a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%DO","StatementOptionHelp":{"#cdata":"Action statement in an %ELSE-%DO construct."},"StatementOptionType":"S"},{"StatementOptionName":"%LET","StatementOptionHelp":{"#cdata":"Syntax: %LET macro-variable =;\n \nCreates a macro variable and assigns it a value."},"StatementOptionType":"S"},{"StatementOptionName":"%GOTO","StatementOptionHelp":{"#cdata":"Action statement in an %ELSE statement.\n \nSyntax: ... %GOTO label ;\n \nJumps to a new statement."},"StatementOptionType":"S"},{"StatementOptionName":"%RETURN","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nExecution causes normal termination of the currently executing macro."},"StatementOptionType":"S"},{"StatementOptionName":"%PUT","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nWrites text or macro variable information to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"INFILE","StatementHelp":{"#cdata":"Specifies an external file to read with an INPUT statement. \n \nSyntax: \n(1) INFILE file-specification ; \n(2) INFILE file-specification ; \n(3) INFILE file-specification ; \n(4) INFILE DBMS-specifications; \n(5) INFILE DATALINES | CARDS ; \n\nfile-specification \nidentifies a file in one of the following forms: \n\n fileref \n specifies the assigned fileref or the allocated ddname of the file. A fileref must \n conform to the rules for ddnames. That is, it can consist of up to eight letters, \n numbers, or national characters ($, @, and #) and underscores (_). The first character \n must be either a letter or a national character.\n\n fileref(member) \n specifies a member of a partitioned data set, where the PDS or PDSE is specified by \n the assigned fileref or allocated ddname.\n\n If you specify a fileref that is not allocated, then SAS attempts to construct a data \n set name with the following three qualifiers: \n\n o the value of the SYSPREF= option (usually the user ID) \n o the specified fileref \n o DATA\n\n If a file is found that has this constructed data set name, then SAS opens it and reads it. \n The value of the FILEEXT= system option can affect the way SAS interprets PDS and PDSE member names. \n\n 'physical-filename' \n specifies a physical file, which can be a member of a partitioned data set (PDS), an extended \n partitioned data set (PDSE), or a UNIX System Services file, using the following syntax:\n\n o a fully qualified data set name. For example: 'myid.raw.datax'\n o a fully qualified data set name with a member in parentheses. For example: 'sas.raw.data(mem1)'\n o a partially qualified data set name with a period preceding it. For example: '.raw.data'\n o a partially qualified data set name with a period preceding it and a member name in parentheses. \n For example: '.raw.data(mem1)'\n o for PDS members, a fully or partially qualified data set name with a wildcard name in parentheses. \n For example: '.raw.data(mem*)', '.raw.data(*mem1)', '.raw.data(*)'\n o a UNIX System Services file. For example: '/u/userid/raw' or 'HFS:raw' or '/u/userid/data/*'"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DATALINES|CARDS","StatementOptionHelp":{"#cdata":"Specifies that the input data immediately follows the DATALINES|CARDS statement in the DATA step. \nUsing DATALINES|CARDS allows you to use the INFILE statement options to control how the INPUT \nstatement reads instream data lines."},"StatementOptionType":"S"},{"StatementOptionName":"DATALINES4|CARDS4","StatementOptionHelp":{"#cdata":"Specifies that the input data immediately follows the DATALINES4|CARDS4 statement in the DATA step. \nUsing DATALINES4|CARDS4 allows you to use the INFILE statement options to control how the INPUT \nstatement reads instream data lines."},"StatementOptionType":"S"},{"StatementOptionName":"DISK","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies that the device is a disk drive."},"StatementOptionType":"S"},{"StatementOptionName":"DUMMY","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies that the output to the file is discarded. Tip: Specifying DUMMY can be \nuseful for testing."},"StatementOptionType":"S"},{"StatementOptionName":"GTERM","StatementOptionHelp":{"#cdata":"[device-type] \n \nIndicates that the output device type is a graphics device that will receive graphics data."},"StatementOptionType":"S"},{"StatementOptionName":"PIPE","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies an unnamed pipe. Note: Some operating environments do not support pipes."},"StatementOptionType":"S"},{"StatementOptionName":"PLOTTER","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies an unbuffered graphics output device."},"StatementOptionType":"S"},{"StatementOptionName":"PRINTER","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies a printer or printer spool file."},"StatementOptionType":"S"},{"StatementOptionName":"TAPE","StatementOptionHelp":{"#cdata":"[device-type] Specifies a tape drive."},"StatementOptionType":"S"},{"StatementOptionName":"TEMP","StatementOptionHelp":{"#cdata":"[device-type] \n \nCreates a temporary file that exists only as long as the filename is assigned. \n\nRestriction: Do not specify a physical pathname. If you do, SAS returns an error."},"StatementOptionType":"S"},{"StatementOptionName":"TERMINAL","StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies the user's terminal."},"StatementOptionType":"S"},{"StatementOptionName":"UPRINTER","StatementOptionType":["S","S"],"StatementOptionHelp":{"#cdata":"[device-type] \n \nSpecifies a Universal Printing printer definition StatementOptionName."}},{"StatementOptionName":"DLI","StatementOptionHelp":{"#cdata":"[type] \n \nFor IMS-DL/I databases."},"StatementOptionType":"S"},{"StatementOptionName":"HFS","StatementOptionHelp":{"#cdata":"[type] \n \nFor UNIX System Services files."},"StatementOptionType":"S"},{"StatementOptionName":"MVS","StatementOptionHelp":{"#cdata":"[type] \n \nFor z/OS data sets."},"StatementOptionType":"S"},{"StatementOptionName":"VSAM","StatementOptionHelp":{"#cdata":"[type] \n \nFor VSAM files."},"StatementOptionType":"S"},{"StatementOptionName":"IDMS","StatementOptionHelp":{"#cdata":"[type] \n \nFor CA-IDMS files."},"StatementOptionType":"S"},{"StatementOptionName":"ISAM","StatementOptionHelp":{"#cdata":"[type] \n \nFor ISAM files."},"StatementOptionType":"S"},{"StatementOptionName":"VTOC","StatementOptionHelp":{"#cdata":"[type] \n \nFor a Volume Table of Contents (VTOC)."},"StatementOptionType":"S"},{"StatementOptionName":"COLUMN=|COL=","StatementOptionHelp":{"#cdata":"Names a variable that SAS uses to assign the current column location of the input pointer. \nLike automatic variables, the COLUMN= variable is not written to the data set."},"StatementOptionType":"V"},{"StatementOptionName":"DELIMITER=|DLM=","StatementOptionHelp":{"#cdata":"Specifies an alternate delimiter (other than a blank) to be used for LIST input."},"StatementOptionType":"V"},{"StatementOptionName":"DLMSTR=","StatementOptionHelp":{"#cdata":"Specifies a character string as an alternate delimiter (other than a blank) to be \nused for LIST input"},"StatementOptionType":"V"},{"StatementOptionName":"DLMSOPT=","StatementOptionHelp":{"#cdata":"Specifies whether case-insensitive comparisons will be done, or trailing blanks of the string \ndelimiter will be removed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'I'","@Value2":"'T'"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that case-insensitive comparisons will be done.","@ToolTip2":"Specifies that trailing blanks of the string delimiter will be removed."}},{"StatementOptionName":"DSD","StatementOptionHelp":{"#cdata":"Specifies that when data values are enclosed in quotation marks, delimiters within the value \nare treated as character data. The DSD option changes how SAS treats delimiters when you use \nLIST input and sets the default delimiter to a comma. When you specify DSD, SAS treats two \nconsecutive delimiters as a missing value and removes quotation marks from character values."},"StatementOptionType":"S"},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"Specifies the encoding to use when reading from the external file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"END=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS sets to 1 when the current input data record is the last in \n the input file. Until SAS processes the last data record, the END= variable is set to 0. \n Like automatic variables, this variable is not written to the data set. \n \n Restriction: You cannot use the END= option with UNBUFFERED option, DATALINES or DATALINES4 \n statement, and an INPUT statement that reads multiple input data records."},"StatementOptionType":"V"},{"StatementOptionName":"EOF=","StatementOptionHelp":{"#cdata":"Specifies a statement label that is the object of an implicit GO TO when the INFILE statement \nreaches end of file."},"StatementOptionType":"V"},{"StatementOptionName":"EOV=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS sets to 1 when the first record in a file in a series of \nconcatenated files is read."},"StatementOptionType":"V"},{"StatementOptionName":"EXPANDTABS","StatementOptionHelp":{"#cdata":"Specifies to expand tab characters to the standard tab setting, which is set at 8-column \nintervals that start at column 9."},"StatementOptionType":"S"},{"StatementOptionName":"NOEXPANDTABS","StatementOptionHelp":{"#cdata":"Specifies not to expand tab characters to the standard tab setting, which is set at 8-column \nintervals that start at column 9."},"StatementOptionType":"S"},{"StatementOptionName":"FILENAME=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS sets to the physical StatementOptionName of the currently opened \ninput file. Like automatic variables, the FILENAME= variable is not written to the data set."},"StatementOptionType":"V"},{"StatementOptionName":"FILEVAR=","StatementOptionHelp":{"#cdata":"Specifies a variable whose change in value causes the INFILE statement to close the current input \nfile and open a new one."},"StatementOptionType":"V"},{"StatementOptionName":"FIRSTOBS=","StatementOptionHelp":{"#cdata":"Specifies a record number that SAS uses to begin reading input data records in the input file."},"StatementOptionType":"V"},{"StatementOptionName":"FLOWOVER","StatementOptionHelp":{"#cdata":"Causes an INPUT statement to continue to read the next input data record if it does not \nfind values in the current input line for all the variables in the statement."},"StatementOptionType":"S"},{"StatementOptionName":"LENGTH=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS sets to the length of the current input line."},"StatementOptionType":"V"},{"StatementOptionName":"LINE=","StatementOptionHelp":{"#cdata":"Specifies a variable that SAS sets to the line location of the input pointer in the \ninput buffer. Like automatic variables, the LINE= variable is not written to the \ndata set."},"StatementOptionType":"V"},{"StatementOptionName":"LINESIZE=|LS=","StatementOptionHelp":{"#cdata":"Specifies the record length that is available to the INPUT statement."},"StatementOptionType":"V"},{"StatementOptionName":"LRECL=","StatementOptionHelp":{"#cdata":"Specifies the logical record length."},"StatementOptionType":"V"},{"StatementOptionName":"N=","StatementOptionHelp":{"#cdata":"Specifies the number of lines that are available to the input pointer at one time."},"StatementOptionType":"V"},{"StatementOptionName":"MISSOVER","StatementOptionHelp":{"#cdata":"Prevents an INPUT statement from reading a new input data record if it does not \nfind values in the current input line for all the variables in the statement."},"StatementOptionType":"S"},{"StatementOptionName":"MOD","StatementOptionHelp":{"#cdata":"Indicates that data written to the file should be appended to the file"},"StatementOptionType":"S"},{"StatementOptionName":"NEW","StatementOptionHelp":{"#cdata":"Indicates that a new file is to be opened for output. If the file already exists, \nthen it is deleted and re-created."},"StatementOptionType":"S"},{"StatementOptionName":"OLD","StatementOptionHelp":{"#cdata":"Indicates that a new file is to be opened for output. If the file already exists, \nthen the previous contents of the file are replaced."},"StatementOptionType":"S"},{"StatementOptionName":"NBYTE=","StatementOptionHelp":{"#cdata":"Specifies the StatementOptionName of a variable that contains the number of bytes \nto read from a file when you are reading data in stream record format (RECFM=S in \nthe FILENAME statement)."},"StatementOptionType":"V"},{"StatementOptionName":"OBS=","StatementOptionHelp":{"#cdata":"Use OBS= with FIRSTOBS= to read a range of records from the middle of a file. "},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the record number of the last record to read in an input file that is read sequentially.","@ToolTip2":"Specifies the maximum number of observations to process, which will be at least as large as the largest signed, 32-bit integer."}},{"StatementOptionName":"PAD","StatementOptionHelp":{"#cdata":"SAS pads the records that are read from an external file with blanks to the length that is \nspecified in the LRECL= option."},"StatementOptionType":"S"},{"StatementOptionName":"NOPAD","StatementOptionHelp":{"#cdata":"SAS does not pad the records that are read from an external file with blanks to the length that \nis specified in the LRECL= option."},"StatementOptionType":"S"},{"StatementOptionName":"PRINT","StatementOptionHelp":{"#cdata":"Specifies that the input file contains carriage-control characters."},"StatementOptionType":"S"},{"StatementOptionName":"NOPRINT","StatementOptionHelp":{"#cdata":"Specifies that the input file does not contain carriage-control characters."},"StatementOptionType":"S"},{"StatementOptionName":"SCANOVER","StatementOptionHelp":{"#cdata":"Causes the INPUT statement to scan the input data records until the character string that \nis specified in the @'character-string' expression is found."},"StatementOptionType":"S"},{"StatementOptionName":"SHAREBUFFERS|SHAREBUFS","StatementOptionHelp":{"#cdata":"Specifies that the FILE statement and the INFILE statement share the same buffer."},"StatementOptionType":"S"},{"StatementOptionName":"START=","StatementOptionHelp":{"#cdata":"Specifies a variable whose value SAS uses as the first column number of the record \nthat the PUT _INFILE_ statement writes. Like automatic variables, the START \nvariable is not written to the data set."},"StatementOptionType":"V"},{"StatementOptionName":"STOPOVER","StatementOptionHelp":{"#cdata":"Causes the DATA step to stop processing if an INPUT statement reaches the end of the \ncurrent record without finding values for all variables in the statement."},"StatementOptionType":"S"},{"StatementOptionName":"TERMSTR=","StatementOptionHelp":{"#cdata":"[Windows/UNIX Host Option] \n \nSpecifies the end-of-line character for the file. Use this option to share files \nbetween the UNIX and Windows operating environments."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CR","@Value2":"CRLF","@Value3":"LF","@Value4":"NULL","@Value5":"NONE","@Value6":"NL","@Value7":"LFCR","@Value8":"CRNL"},"StatementOptionToolTips":{"@ToolTip1":"Carriage return (CR).","@ToolTip2":"Carriage return (CR) followed by line feed (LF).","@ToolTip3":"Line feed only (the default).","@ToolTip4":"NULL character (0x00).","@ToolTip5":"Record terminators are not used. This parameter provides the same function as FILEDATA=BINARY.","@ToolTip6":"The newline character (x'15') is used as the record terminator. This parameter provides the same function as FILEDATA=TEXT.","@ToolTip7":"The sequence LF followed by CR is used as the record terminator.","@ToolTip8":"The sequence CR followed by NL is used as the record terminator."}},{"StatementOptionName":"TRUNCOVER","StatementOptionHelp":{"#cdata":"Overrides the default behavior of the INPUT statement when an input data record is shorter \nthan the INPUT statement expects. By default, the INPUT statement automatically reads the \nnext input data record. TRUNCOVER enables you to read variable-length records when some \nrecords are shorter than the INPUT statement expects. Variables without any values assigned \nare set to missing."},"StatementOptionType":"S"},{"StatementOptionName":"UNBUFFERED|UNBUF","StatementOptionHelp":{"#cdata":"Tells SAS not to perform a buffered (\"look ahead\") read."},"StatementOptionType":"S"},{"StatementOptionName":"_INFILE_=","StatementOptionHelp":{"#cdata":"Specifies a character variable that references the contents of the current input buffer \nfor this INFILE statement."},"StatementOptionType":"V"},{"StatementOptionName":"BLKSIZE=|BLK=","StatementOptionHelp":{"#cdata":"[Syntax: BLKSIZE=block-size] \n \n[Windows/UNIX Host Option]\n\nSpecifies the number of bytes that are physically read or written in an I/O operation. \nThe default is 8K. The maximum is 1M (Windows) or 1G-1(UNIX). \n\nIn UNIX, if you specify RECFM=S370VBS, then you should specify BLKSIZE=32760 in order \nto avoid errors with records longer than 255 characters."},"StatementOptionType":"V"},{"StatementOptionName":"BLOCK","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"NOBLOCK","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"BYTE","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"MESSAGE","StatementOptionHelp":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."},"StatementOptionType":"S"},{"StatementOptionName":"EOFCONNECT","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes and is valid only when you are defining \nthe server. This option indicates that if an end-of-file (EOF) character is \nreceived from a client, the server should try to connect to the next client."},"StatementOptionType":"S"},{"StatementOptionName":"HOTLINK","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to use the DDE HOTLINK."},"StatementOptionType":"S"},{"StatementOptionName":"NOTAB","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to ignore tab characters between variables."},"StatementOptionType":"S"},{"StatementOptionName":"IGNOREDOSEOF","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used in the context of I/O operations on variable record format files. When this \noption is specified, any occurrence of ^Z is interpreted as character data and \nnot as an end-of-file marker."},"StatementOptionType":"S"},{"StatementOptionName":"RECFM=","StatementOptionHelp":{"#cdata":"[Windows/UNIX Host Option] \n \nSpecifies the record format of the external file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"F","@Value2":"P","@Value3":"S","@Value4":"V|D","@Value5":"N","@Value6":"s370V","@Value7":"S370VB","@Value8":"S370VBS","@Value9":"STREAMLF"},"StatementOptionToolTips":{"@ToolTip1":"Fixed-record format","@ToolTip2":"Print format.","@ToolTip3":"Stream-record format.","@ToolTip4":"Variable-record format (the default)","@ToolTip5":"Indicates binary format and causes the file to be treated as a byte stream. If LRECL is not specified, by default SAS reads 256 bytes at a time from the file.","@ToolTip6":"Indicates the variable S370 record format (V).","@ToolTip7":"Indicates the variable block S370 record format (VB).","@ToolTip8":"Indicates the variable block with spanned records S370 record format (VBS).","@ToolTip9":"[For OpenVMS] Specifies StreamLF record format. Records are delimited by LF."}},{"StatementOptionName":"RETRY=","StatementOptionHelp":{"#cdata":"[Syntax: RETRY=seconds] \n \n[Windows Host Option]\n\nIs used only in the context of named pipes. This option specifies how long a named \npipe client should wait for a busy pipe. The minimum (and default) value for seconds \nis 10."},"StatementOptionType":"V"},{"StatementOptionName":"SERVER","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."},"StatementOptionType":"S"},{"StatementOptionName":"CLIENT","StatementOptionHelp":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."},"StatementOptionType":"S"},{"StatementOptionName":"FAC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file access attributes used for external files. Use this option \nto indicate the level of access you want to allow for an external file. You can allow \nREAD, WRITE, UPDATE, and DELETE access (as well as no access). By default with external \nfiles, files opened for input allow read access, files opened for output allow WRITE \naccess, and files opened for update allow READ and WRITE access. The form of the FAC= \noption is \n\nFAC=access-option-list\n\nwhere access-option-list can be one of the following: \n\nDEL specifies DELETE access.\n \nGET specifies READ access.\n \nPUT specifies WRITE access.\n \nUPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want DELETE, READ, and WRITE access: \n\nfac=(del,get,put)"},"StatementOptionType":"V"},{"StatementOptionName":"KEY=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies which key SAS uses to read the records in an RMS file with indexed organization. \nThe KEY= option is always used with the KEYVALUE= option. "},"StatementOptionType":"V"},{"StatementOptionName":"KEYVALUE=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the key value with which to begin reading an indexed file. "},"StatementOptionType":"V"},{"StatementOptionName":"MBC=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the size of the I/O buffers that OpenVMS RMS allocates for a particular file. \nThe value can range from 0 to 127 and represents the number of blocks used for each buffer. \nBy default, this option is set to 0 and the default values for the process are used.\n\nThe MBC= option (multiblock count) is used for both input and output to control the \nallocation for a particular file. If you want to control the allocation size for all \nthe external files used during the current SAS session, you can use the MBC= option in \nevery FILE, FILENAME, or INFILE statement. You can also use the DCL SET RMS_DEFAULT \ncommand to specify a process default, and let the SAS values default to the process's \ndefault values.\n\nThe MBC= option corresponds to the RAB$B_MBC field in OpenVMS RMS or the CONNECT \nMULTIBLOCK_COUNT attribute when using FDL. This option is not supported for DECnet \noperations."},"StatementOptionType":"V"},{"StatementOptionName":"MBF=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of I/O buffers you want OpenVMS RMS to allocate for a particular file. \nThe value can range from 0 to 127 and represents the number of buffers used. By default, \nthis option is set to a value of 2. If a value of 0 is specified, the default value for the \nprocess is used.\n\nThe MBF= option (multibuffer count) is used for both input and output to control the number \nof buffers allocated for a particular file. If you want to control the number of buffers \nallocated for all the external files used during the SAS session, you can use the MBF= \noption in every FILE, FILENAME, or INFILE statement. The DCL SET RMS_DEFAULT command can \nbe used to specify a process default. Then, you can let the SAS values default to the \nprocess's default values.\n\nThe MBF= option corresponds to the RAB$B_MBF field in OpenVMS RMS or the CONNECT MULTIBUFFER_COUNT \nattribute when using FDL. This option is not supported for DECnet operations."},"StatementOptionType":"V"},{"StatementOptionName":"SHR=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file-sharing attributes used for external files. With this option, \nyou can indicate the access level you want to give other users. You can allow READ, WRITE, \nUPDATE, and DELETE access (as well as no access). By default with external files, files \nopened for input allow shared read access, and files opened for output or UPDATE do not \nallow shared access.\n\nHowever, you can allow other users to have READ and WRITE access to a file that you are \nopening for input only. To accomplish this, use the SHR= option. The syntax of the SHR= \noption is \n\nSHR=share-option-list\n\nwhere share-option-list can be one of the following: DEL specifies DELETE access.\n\nGET specifies shared READ access.\n \nNONE specifies no shared access.\n \nPUT specifies shared WRITE access.\n \nUPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want shared DELETE, READ, and WRITE access: \n\nshr=(del,get,put)"},"StatementOptionType":"V"},{"StatementOptionName":"FILEDATA=","StatementOptionHelp":{"#cdata":"[UNIX/z/OS Host Option] \n \nThe FILEDATA= option specifies that the file being processed is expected to contain \neither binary or text data."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BINARY","@Value2":"TEXT"},"StatementOptionToolTips":{"@ToolTip1":"The FILEDATA= option specifies that the file being processed is expected to contain binary data.","@ToolTip2":"The FILEDATA= option specifies that the file being processed is expected to contain text data."}},{"StatementOptionName":"BACKWARD|BKWD","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nCauses SAS to read the VSAM data set backwards (INFILE only)"},"StatementOptionType":"S"},{"StatementOptionName":"BUFND=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: BUFND=value \n\nIndicates how many data buffers to use for the VSAM data set."},"StatementOptionType":"V"},{"StatementOptionName":"BUFNI=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: BUFNI=value \n\nIndicates how many index buffers to use for the VSAM data set."},"StatementOptionType":"V"},{"StatementOptionName":"CONTROLINTERVAL|CTLINTV|CNV","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nIndicates that you want to read physical VSAM control interval records rather than \nlogical records. This option is typically used for diagnostic purposes (INFILE only)."},"StatementOptionType":"S"},{"StatementOptionName":"ERASE=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: ERASE=variable \n\nDefines a numeric SAS variable that you must set to 1 when you want to erase \na VSAM record (INFILE only)."},"StatementOptionType":"V"},{"StatementOptionName":"FEEDBACK=|FDBK=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: FEEDBACK=variable | FDBK=variable \n\nDefines a numeric variable that SAS sets to the VSAM logical error code. This option \nis similar to the _FDBK_ automatic variable. When SAS sets the FEEDBACK variable, you \nmust reset it to 0 in order to continue."},"StatementOptionType":"V"},{"StatementOptionName":"GENKEY","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nCauses SAS to use the KEY= variable as the leading portion of a record's key. VSAM \nretrieves the first record whose key matches the generic key (INFILE only)."},"StatementOptionType":"S"},{"StatementOptionName":"KEYLEN=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: KEYLEN=variable \n\nSpecifies a numeric SAS variable that, when used with GENKEY, specifies the length \nof the key that is to be compared to the keys in the file."},"StatementOptionType":"V"},{"StatementOptionName":"KEYPOS=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: KEYPOS=variable \n\nIndicates the numeric variable that SAS sets to the position of the VSAM key field. \nThis option enables you to read keys without knowing the key position in advance. \nThis variable is set to the column number (starting from 1)."},"StatementOptionType":"V"},{"StatementOptionName":"NRLS","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSpecifies not to use record-level sharing (RLS) to open an RLS-eligible data set (INFILE only)."},"StatementOptionType":"S"},{"StatementOptionName":"PASSWD=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: PASSWD=value \n\nGives the appropriate password for a VSAM data set that has password protection."},"StatementOptionType":"V"},{"StatementOptionName":"RBA=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: RBA=variable \n\nSpecifies a numeric variable that you set to the relative byte address (RBA) of \nthe data record that you want to read. The RBA= option indicates that addressed \ndirect access is being used; it is appropriate for KSDS and ESDS. If you specify \nthe CONTROLINTERVAL option, you can use the RBA= option to access control records \nin an RRDS (INFILE only)."},"StatementOptionType":"V"},{"StatementOptionName":"RC4STOP","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nStops the DATA step from executing if a return code greater than 4 is returned by \nthe operating environment when the VSAM data set is opened."},"StatementOptionType":"S"},{"StatementOptionName":"RECORDS=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: RECORDS=variable \n\nDefines a numeric variable that SAS sets to the number of logical records in a \nVSAM data set that has been opened for input."},"StatementOptionType":"V"},{"StatementOptionName":"RECORG=","StatementOptionHelp":{"#cdata":"[z/OS Host Option] \n \nSpecifies the organization of records in a new VSAM data set. Use this option only \nif SMS is active."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"KS","@Value2":"ES","@Value3":"RR","@Value4":"LS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a VSAM key-sequenced data set.","@ToolTip2":"Specifies a VSAM entry-sequenced data set.","@ToolTip3":"Specifies a VSAM relative-record data set.","@ToolTip4":"Specifies a VSAM linear-space data set."}},{"StatementOptionName":"RESET","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nIndicates that the VSAM file is reset to empty (no records) when it is opened. \nThis option applies only to loading a VSAM data set that has been marked REUSE. \nYou cannot use this option if the data set contains an alternate index."},"StatementOptionType":"S"},{"StatementOptionName":"RRN=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: RRN=variable \n\nDefines a numeric variable that you set to the relative record number (RRN) of the \nrecord that you want to read or write. This option indicates that keyed direct access \nis being used; it is appropriate for RRDS only."},"StatementOptionType":"V"},{"StatementOptionName":"SEQUENTIAL","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSpecifies sequential VSAM record retrieval when either the RBA= (for an ESDS) or \nthe RRN= option (for an RRDS) is specified (INFILE only)."},"StatementOptionType":"S"},{"StatementOptionName":"SKIP","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nIndicates skip-sequential processing of VSAM files. Skip-sequential processing finds \nthe first record whose value is the same as the value specified by the KEY= option; \nrecords are read sequentially thereafter (INFILE only)."},"StatementOptionType":"S"},{"StatementOptionName":"UPDATE=","StatementOptionHelp":{"#cdata":"[VSAM Option]\n \nSyntax: UPDATE=variable \n\nDefines a numeric SAS variable that indicates that not every record that it reads \nis to be updated. Use this option when you are updating records in a VSAM data set \n(INFILE only). When an INFILE and a FILE statement reference the same VSAM data set, \nrecords are retrieved for update by default."},"StatementOptionType":"V"},{"StatementOptionName":"CCHHR=","StatementOptionHelp":{"#cdata":"[VTOC Option under z/OS] \n \nSyntax: CCHHR=variable \n\nspecifies a character variable to which the physical address (cylinder head record) \nof a record is returned. This applies to files on CKD disks only."},"StatementOptionType":"V"},{"StatementOptionName":"CLOSE=","StatementOptionHelp":{"#cdata":"[z/OS Host Option] \n \nIndicates how a tape volume is positioned at the end of the DATA step."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"REREAD","@Value2":"LEAVE","@Value3":"REWIND","@Value4":"FREE","@Value5":"DISP"},"StatementOptionToolTips":{"@ToolTip1":"Positions the tape at the logical beginning of the data set.","@ToolTip2":"Positions the tape at the logical end of the data set.","@ToolTip3":"Rewinds the tape to the physical beginning of the volume.","@ToolTip4":"Dynamically deallocates the tape volume.","@ToolTip5":"Is implied by the control language."}},{"StatementOptionName":"CSRC","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies that you want to use the CSRCESRV services (available with z/OS) to compress \ndata on output. For example: \n\n data _null_;\n file myfile csrc;\n put ... ;\n run;\n\nYou cannot use this option with an external file that has a fixed-length record format."},"StatementOptionType":"S"},{"StatementOptionName":"DCB=","StatementOptionHelp":{"#cdata":"[OpenVMS Host Option]\n \nSyntax: DCB=fileref \n\nspecifies the fileref of an external file that was referenced in an earlier FILE or \nINFILE statement in the same DATA step. SAS uses that file's RECFM=, LRECL=, and BLKSIZE= \ninformation for the current file."},"StatementOptionType":"V"},{"StatementOptionName":"CVAF","StatementOptionHelp":{"#cdata":"[VTOC Option under z/OS] \n \nTells SAS to use the Common VTOC Access Facility (CVAF) of the IBM program product \nData Facility/Device Support (DF/DS) for indexed VTOCs. If the VTOC is not indexed, \nor if your installation does not have CVAF, this option is ignored."},"StatementOptionType":"S"}],"#comment":[{},{},{}]}},{"StatementName":"INPUT","StatementHelp":{"#cdata":"Syntax: INPUT <@|@@>; \n \nDescribes the arrangement of values in the input data record and assigns input values to the \ncorresponding SAS variables."},"StatementOptions":null},{"StatementName":"KEEP","StatementHelp":{"#cdata":"Syntax: KEEP variable-list; \n \nSpecifies the variables to include in output SAS data sets."},"StatementOptions":null},{"StatementName":"LEAVE","StatementHelp":{"#cdata":"Syntax: LEAVE; \n \nStops processing the current loop and resumes with the next statement in the sequence."},"StatementOptions":null},{"StatementName":"LENGTH","StatementHelp":{"#cdata":"Syntax: LENGTH variable-specification(s); \n \nSpecifies the number of bytes for storing variables."},"StatementOptions":{"StatementOption":{"StatementOptionName":"DEFAULT=","StatementOptionHelp":{"#cdata":"[Syntax: DEFAULT=n] \n \nChanges the default number of bytes that SAS uses to store the values of any newly created \nnumeric variables."},"StatementOptionType":"V"}}},{"StatementName":"LINK","StatementHelp":{"#cdata":"Syntax: LINK label; \n \nDirects program execution immediately to the statement label that is specified and, if followed \nby a RETURN statement, returns execution to the statement that follows the LINK statement."},"StatementOptions":null},{"StatementName":"LIST","StatementHelp":{"#cdata":"Syntax: LIST; \n \nWrites to the SAS log the input data record for the observation that is being processed."},"StatementOptions":null},{"StatementName":"LOCK","StatementHelp":{"#cdata":"Syntax: LOCK libref<.member-name<.member-type | .entry-name.entry-type>> ; \n \nAcquires and releases an exclusive lock on an existing SAS file."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"LIST|QUERY|SHOW","StatementOptionHelp":{"#cdata":"Writes to the SAS log whether you have an exclusive lock on the specified SAS file."},"StatementOptionType":"S"},{"StatementOptionName":"CLEAR","StatementOptionHelp":{"#cdata":"Releases a lock on the specified SAS file that was acquired by using the LOCK statement in your \nSAS session."},"StatementOptionType":"S"}]}},{"StatementName":"LOSTCARD","StatementHelp":{"#cdata":"Syntax: LOSTCARD; \n \nResynchronizes the input data when SAS encounters a missing or invalid record in data that \nhas multiple records per observation. "},"StatementOptions":null},{"StatementName":"MERGE","StatementHelp":{"#cdata":"Syntax: MERGE SAS-data-set-1 <(data-set-options)> \n SAS-data-set-2 <(data-set-options) > \n <...SAS-data-set-n<(data-set-options)>> \n ; \n \nJoins observations from two or more SAS data sets into a single observation."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"END=","StatementOptionHelp":{"#cdata":"[Syntax: END=variable] \n \nNames and creates a temporary variable that contains an end-of-file indicator."},"StatementOptionType":"V"},{"StatementOptionName":"ALTER=","StatementOptionType":"V"},{"StatementOptionName":"BUFNO=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"}},{"StatementOptionName":"BUFSIZE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"StatementOptionName":"CNTLLEV=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"LIB","@Value2":"MEM","@Value3":"REC"}},{"StatementOptionName":"COMPRESS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO","@Value2":"YES","@Value3":"CHAR","@Value4":"BINARY"}},{"StatementOptionName":"DLDMGACTION=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"FAIL","@Value2":"ABORT","@Value3":"REPAIR","@Value4":"NOINDEX","@Value5":"PROMPT"}},{"StatementOptionName":"ENCRYPT=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"ENCRYPTKEY=","StatementOptionType":"V"},{"StatementOptionName":"GENMAX=","StatementOptionType":"V"},{"StatementOptionName":"GENNUM=","StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionType":"V"},{"StatementOptionName":"LABEL=","StatementOptionType":"V"},{"StatementOptionName":"OUTREP=","StatementOptionType":"V"},{"StatementOptionName":"PW=","StatementOptionType":"V"},{"StatementOptionName":"PWREQ=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"READ=","StatementOptionType":"V"},{"StatementOptionName":"REPEMPTY=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"REPLACE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"REUSE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SPILL=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SORTEDBY=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"by-clause < / collate-name>","@Value2":"_NULL_"}},{"StatementOptionName":"TOBSNO=","StatementOptionType":"V"},{"StatementOptionName":"TRANTAB=","StatementOptionType":"V"},{"StatementOptionName":"TYPE=","StatementOptionType":"V"},{"StatementOptionName":"WRITE=","StatementOptionType":"V"},{"StatementOptionName":"FILECLOSE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"DISP","@Value2":"LEAVE","@Value3":"REREAD","@Value4":"REWIND"}},{"StatementOptionName":"FIRSTOBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"StatementOptionName":"IN=","StatementOptionType":"V"},{"StatementOptionName":"OBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"nT","@Value6":"hexX","@Value7":"MIN","@Value8":"MAX"}},{"StatementOptionName":"POINTOBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"WHERE=","StatementOptionType":"V"},{"StatementOptionName":"WHEREUP=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SGIO=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"IDXNAME=","StatementOptionType":"V"},{"StatementOptionName":"IDXWHERE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"DROP=","StatementOptionType":"V"},{"StatementOptionName":"KEEP=","StatementOptionType":"V"},{"StatementOptionName":"RENAME=","StatementOptionType":"V"},{"StatementOptionName":"EXTENDOBSCOUNTER=","StatementOptionType":"V"}],"#comment":{}}},{"StatementName":"MISSING","StatementHelp":{"#cdata":"Syntax: MISSING character(s); \n \nAssigns characters in your input data to represent special missing values for numeric data."},"StatementOptions":null},{"StatementName":"MODIFY","StatementHelp":{"#cdata":"Replaces, deletes, and appends observations in an existing SAS data set in place but does not \ncreate an additional copy.\n \nSyntax: \n(1) MODIFY master-data-set <(data-set-option(s))> transaction-data-set <(data-set-option(s))> \n ; \n BY by-variable; \n\n(2) MODIFY master-data-set <(data-set-option(s))> KEY=index ; \n\n(3) MODIFY master-data-set <(data-set-option(s))> POINT=variable; \n\n(4) MODIFY master-data-set <(data-set-option(s))> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"END=","StatementOptionHelp":{"#cdata":"[Syntax: END=variable] \n \nCreates and names a temporary variable that contains an end-of-file indicator."},"StatementOptionType":"V"},{"StatementOptionName":"KEY=","StatementOptionHelp":{"#cdata":"[Syntax: KEY=index] \n \nSpecifies a simple or composite index of the SAS data file that is being modified. \nThe KEY= argument retrieves observations from that SAS data file based on index \nvalues that are supplied by like-named variables in another source of information."},"StatementOptionType":"V"},{"StatementOptionName":"NOBS=","StatementOptionHelp":{"#cdata":"[Syntax: NOBS=variable] \n \nCreates and names a temporary variable whose value is usually the total number \nof observations in the input data set. For certain SAS views, SAS cannot determine \nthe number of observations. In these cases, SAS sets the value of the NOBS= variable \nto the largest positive integer value available in the operating environment."},"StatementOptionType":"V"},{"StatementOptionName":"POINT=","StatementOptionHelp":{"#cdata":"[Syntax: POINT=variable] \n \nReads SAS data sets using random (direct) access by observation number. variable \nnames a variable whose value is the number of the observation to read. The POINT= \nvariable is available anywhere in the DATA step, but it is not added to any SAS \ndata set."},"StatementOptionType":"V"},{"StatementOptionName":"UNIQUE","StatementOptionHelp":{"#cdata":"Causes a KEY= search always to begin at the top of the index for the data file being modified."},"StatementOptionType":"S"},{"StatementOptionName":"UPDATEMODE=","StatementOptionHelp":{"#cdata":"Specifies whether missing variable values in a transaction data set are to be allowed to replace \nexisting variable values in a master data set."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MISSINGCHECK","@Value2":"NOMISSINGCHECK"},"StatementOptionToolTips":{"@ToolTip1":"Prevents missing variable values in a transaction data set from replacing values in a master data set.","@ToolTip2":"Allows missing variable values in a transaction data set to replace values in a master data set by preventing the check from being performed."}},{"StatementOptionName":"CUREOBS=","StatementOptionHelp":{"#cdata":"[Syntax: CUROBS=variable] \n \nCreates and names a variable that contains the observation number that was just read from the data set."},"StatementOptionType":"V"},{"StatementOptionName":"KEYRESET=","StatementOptionHelp":{"#cdata":"[Syntax: KEYRESET=variable] \n \nControls whether a KEY= search should begin at the top of the index for the data set that is being read. \nWhen the value of the KEYRESET variable is 1, the index lookup begins at the top of the index. When the \nvalue of the KEYRESET variable is 0, the index lookup is not reset and the lookup continues where the \nprior lookup ended. \n\nInteraction:\nThe KEYRESET= option is similar to the UNIQUE option, except the KEYRESET= option enables you to determine \nwhen the KEY= search should begin at the top of the index again."},"StatementOptionType":"V"}]}},{"StatementName":"OUTPUT","StatementHelp":{"#cdata":"Syntax: OUTPUT; \n \nWrites the current observation to a SAS data set."},"StatementOptions":null},{"StatementName":"PAGE","StatementHelp":{"#cdata":"Syntax: PAGE; \n \nSkips to a new page in the SAS log."},"StatementOptions":null},{"StatementName":"PUT","StatementHelp":{"#cdata":"Syntax: PUT <_ODS_><@|@@>; \n \nWrites lines to the SAS log, to the SAS output window, or to an external location that is \nspecified in the most recent FILE statement."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"_INFILE_","StatementOptionHelp":{"#cdata":"Writes the last input data record that is read either from the current input file or from the data \nlines that follow a DATELINES statement."},"StatementOptionType":"S"},{"StatementOptionName":"_ALL_","StatementOptionHelp":{"#cdata":"Writes the values of all variables, which includes automatic variables, that are defined in the \ncurrent DATA step by using named output."},"StatementOptionType":"S"},{"StatementOptionName":"_ODS_","StatementOptionHelp":{"#cdata":"Moves data values for all columns (as defined by the ODS option in the FILE statement) into \na special buffer, from which it is eventually written to the data component. The ODS option \nin the FILE statement defines the structure of the data component that holds the results of \nthe DATA step."},"StatementOptionType":"S"},{"StatementOptionName":"OVERPRINT","StatementOptionHelp":{"#cdata":"Causes the values that follow the keyword OVERPRINT to print on the most recently written \noutput line."},"StatementOptionType":"S"},{"StatementOptionName":"_BLANKPAGE_","StatementOptionHelp":{"#cdata":"Advances the pointer to the first line of a new page, even when the pointer is positioned \non the first line and the first column of a new page."},"StatementOptionType":"S"},{"StatementOptionName":"_PAGE_","StatementOptionHelp":{"#cdata":"Advances the pointer to the first line of a new page. SAS automatically begins a new \npage when a line exceeds the current PAGESIZE= value."},"StatementOptionType":"S"}]}},{"StatementName":"PUTLOG","StatementHelp":{"#cdata":"Syntax: PUTLOG 'message'; \n \nWrites a message to the SAS log."},"StatementOptions":null},{"StatementName":"REDIRECT","StatementHelp":{"#cdata":"Syntax: REDIRECT INPUT | OUTPUT old-name-1 = new-name-1<... old-name-n = new-name-n>; \n \nPoints to different input or output SAS data sets when you execute a stored program."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"INPUT","StatementOptionHelp":{"#cdata":"Specifies to redirect input data sets."},"StatementOptionType":"RS"},{"StatementOptionName":"OUTPUT","StatementOptionHelp":{"#cdata":"Specifies to redirect output data sets."},"StatementOptionType":"RS"}]}},{"StatementName":"REMOVE","StatementHelp":{"#cdata":"Syntax: REMOVE ; \n \nDeletes an observation from a SAS data set."},"StatementOptions":null},{"StatementName":"RENAME","StatementHelp":{"#cdata":"Syntax: RENAME old-name-1=new-name-1 ... ; \n \nSpecifies new names for variables in output SAS data sets. "},"StatementOptions":null},{"StatementName":"REPLACE","StatementHelp":{"#cdata":"Syntax: REPLACE <...data-set-name-n>; \n \nReplaces an observation in the same location."},"StatementOptions":null},{"StatementName":"RETAIN","StatementHelp":{"#cdata":"Syntax: RETAIN \n < ... element-list-n >>; \n \nCauses a variable that is created by an INPUT or assignment statement to retain its value from \none iteration of the DATA step to the next."},"StatementOptions":null},{"StatementName":"RETURN","StatementHelp":{"#cdata":"Syntax: RETURN; \n \nStops executing statements at the current point in the DATA step and returns to a predetermined \npoint in the step."},"StatementOptions":null},{"StatementName":"SELECT","StatementHelp":{"#cdata":"Executes one of several statements or groups of statements.\n \nSyntax: \nSELECT <(select-expression)>; \n WHEN-1 (when-expression-1 <..., when-expression-n>) statement; \n <... WHEN-n (when-expression-1 <..., when-expression-n>) statement;> \n \nEND;"},"StatementOptions":null},{"StatementName":"WHEN","StatementHelp":{"#cdata":"SELECT groups contain WHEN statements that identify SAS statements that are executed when a particular \ncondition is true. Use at least one WHEN statement in a SELECT group.\n \nSyntax: WHEN-1 (when-expression-1 <..., when-expression-n>) statement; "},"StatementOptions":{"StatementOption":{"StatementOptionName":"DO","StatementOptionHelp":{"#cdata":"Action statement."},"StatementOptionType":"S"}}},{"StatementName":"OTHERWISE","StatementHelp":{"#cdata":"An optional OTHERWISE statement specifies a statement to be executed if no WHEN condition is met. \nAn END statement ends a SELECT group.\n\n \nSyntax: \n <... WHEN-n (when-expression-1 <..., when-expression-n>) statement;> \n "},"StatementOptions":{"StatementOption":{"StatementOptionName":"DO","StatementOptionHelp":{"#cdata":"Action statement."},"StatementOptionType":"S"}}},{"StatementName":"SET","StatementHelp":{"#cdata":"Syntax: SET > ; \n \nReads an observation from one or more SAS data sets."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"END=","StatementOptionHelp":{"#cdata":"[Syntax: END=variable] \n \nCreates and names a temporary variable that contains an end-of-file indicator. \nThe variable, which is initialized to zero, is set to 1 when SET reads the last \nobservation of the last data set listed. This variable is not added to any new \ndata set."},"StatementOptionType":"V"},{"StatementOptionName":"KEY=","StatementOptionHelp":{"#cdata":"[Syntax: KEY=index] \n \nProvides nonsequential access to observations in a SAS data set, which \nare based on the value of an index variable or a key."},"StatementOptionType":"V"},{"StatementOptionName":"INDSNAME=","StatementOptionHelp":{"#cdata":"[Syntax: INDSNAME=variable] \n \nCreates and names a variable that stores the name of the SAS data set from which \nthe current observation is read. The stored name can be a data set name or a physical \nname. The physical name is the name by which the operating environment recognizes the \nfile."},"StatementOptionType":"V"},{"StatementOptionName":"NOBS=","StatementOptionHelp":{"#cdata":"[Syntax: NOBS=variable] \n \nCreates and names a temporary variable whose value is usually the total number \nof observations in the input data set or data sets. If more than one data set \nis listed in the SET statement, NOBS= the total number of observations in the \ndata sets that are listed. The number of observations includes those observations \nthat are marked for deletion but are not yet deleted."},"StatementOptionType":"V"},{"StatementOptionName":"OPEN=","StatementOptionHelp":{"#cdata":"Allows you to delay the opening of any concatenated SAS data sets until they are ready to be processed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"IMMEDIATE","@Value2":"DEFER"},"StatementOptionToolTips":{"@ToolTip1":"During the compilation phase, opens all data sets that are listed in the SET statement.","@ToolTip2":"Opens the first data set during the compilation phase, and opens subsequent data sets during the execution phase. When the DATA step reads and processes all observations in a data set, it closes the data set and opens the next data set in the list."}},{"StatementOptionName":"POINT=","StatementOptionHelp":{"#cdata":"[Syntax: POINT=variable] \n \nSpecifies a temporary variable whose numeric value determines which observation \nis read. POINT= causes the SET statement to use random (direct) access to read \na SAS data set."},"StatementOptionType":"V"},{"StatementOptionName":"UNIQUE","StatementOptionType":"S"},{"StatementOptionName":"CUREOBS=","StatementOptionHelp":{"#cdata":"[Syntax: CUROBS=variable] \n \nCreates and names a variable that contains the observation number that was just read from the data set."},"StatementOptionType":"V"},{"StatementOptionName":"KEYRESET=","StatementOptionHelp":{"#cdata":"[Syntax: KEYRESET=variable] \n \nControls whether a KEY= search should begin at the top of the index for the data set that is being read. \nWhen the value of the KEYRESET variable is 1, the index lookup begins at the top of the index. When the \nvalue of the KEYRESET variable is 0, the index lookup is not reset and the lookup continues where the \nprior lookup ended. \n\nInteraction:\nThe KEYRESET= option is similar to the UNIQUE option, except the KEYRESET= option enables you to determine \nwhen the KEY= search should begin at the top of the index again."},"StatementOptionType":"V"},{"StatementOptionName":"ALTER=","StatementOptionType":"V"},{"StatementOptionName":"BUFNO=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"}},{"StatementOptionName":"BUFSIZE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"StatementOptionName":"CNTLLEV=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"LIB","@Value2":"MEM","@Value3":"REC"}},{"StatementOptionName":"COMPRESS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO","@Value2":"YES","@Value3":"CHAR","@Value4":"BINARY"}},{"StatementOptionName":"DLDMGACTION=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"FAIL","@Value2":"ABORT","@Value3":"REPAIR","@Value4":"NOINDEX","@Value5":"PROMPT"}},{"StatementOptionName":"ENCRYPT=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"ENCRYPTKEY=","StatementOptionType":"V"},{"StatementOptionName":"GENMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Requests generations for a data set and specifies the maximum number of versions."}},{"StatementOptionName":"GENNUM=","StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionType":"V"},{"StatementOptionName":"NOMISS","StatementOptionType":"S"},{"StatementOptionName":"LABEL=","StatementOptionType":"V"},{"StatementOptionName":"OUTREP=","StatementOptionType":"V"},{"StatementOptionName":"PW=","StatementOptionType":"V"},{"StatementOptionName":"PWREQ=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"READ=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Assigns a read password to a SAS file and enables access to a read-protected SAS file."}},{"StatementOptionName":"REPEMPTY=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"REPLACE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"REUSE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SPILL=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SORTEDBY=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"by-clause < / collate-name>","@Value2":"_NULL_"}},{"StatementOptionName":"TOBSNO=","StatementOptionType":"V"},{"StatementOptionName":"TRANTAB=","StatementOptionType":"V"},{"StatementOptionName":"TYPE=","StatementOptionType":"V"},{"StatementOptionName":"WRITE=","StatementOptionType":"V"},{"StatementOptionName":"FILECLOSE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"DISP","@Value2":"LEAVE","@Value3":"REREAD","@Value4":"REWIND"}},{"StatementOptionName":"FIRSTOBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"}},{"StatementOptionName":"IN=","StatementOptionType":"V"},{"StatementOptionName":"OBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"nT","@Value6":"hexX","@Value7":"MIN","@Value8":"MAX"}},{"StatementOptionName":"POINTOBS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"WHERE=","StatementOptionType":"V"},{"StatementOptionName":"WHEREUP=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"SGIO=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"IDXNAME=","StatementOptionType":"V"},{"StatementOptionName":"IDXWHERE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"}},{"StatementOptionName":"DROP=","StatementOptionType":"V"},{"StatementOptionName":"KEEP=","StatementOptionType":"V"},{"StatementOptionName":"RENAME=","StatementOptionType":"V"},{"StatementOptionName":"EXTENDOBSCOUNTER=","StatementOptionType":"V"}],"#comment":{}}},{"StatementName":"SKIP","StatementHelp":{"#cdata":"Syntax: SKIP ; \n \nCreates a blank line in the SAS log."},"StatementOptions":null},{"StatementName":"STOP","StatementHelp":{"#cdata":"Syntax: STOP; \n \nStops execution of the current DATA step."},"StatementOptions":null},{"StatementName":"UPDATE","StatementHelp":{"#cdata":"Updates a master file by applying transactions. \n \nSyntax: \nUPDATE master-data-set<(data-set-options)> transaction-data-set<(data-set-options)> \n \n \n ; \n BY by-variable;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"END=","StatementOptionHelp":{"#cdata":"[Syntax: END=variable] \n \nCreates and names a temporary variable that contains an end-of-file indicator. \nThis variable is initialized to 0 and is set to 1 when UPDATE processes the last \nobservation. This variable is not added to any data set."},"StatementOptionType":"V"},{"StatementOptionName":"UPDATEMODE=","StatementOptionHelp":{"#cdata":"Specifies whether missing variable values in a transaction data set are to be allowed to replace \nexisting variable values in a master data set."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MISSINGCHECK","@Value2":"NOMISSINGCHECK"},"StatementOptionToolTips":{"@ToolTip1":"Prevents missing variable values in a transaction data set from replacing values in a master data set.","@ToolTip2":"Allows missing variable values in a transaction data set to replace values in a master data set."}}]}},{"StatementName":"WINDOW","StatementOptions":{"StatementOption":[{"StatementOptionName":"COLOR=|C=","StatementOptionHelp":{"#cdata":"Specifies the color of the window background for operating environments that have this capability. \nIn other operating environments, this option affects the color of the window border."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BLACK","@Value2":"GRAY","@Value3":"PINK","@Value4":"BLUE","@Value5":"GREEN","@Value6":"RED","@Value7":"BROWN","@Value8":"MAGENTA","@Value9":"WHITE","@Value10":"CYAN","@Value11":"ORANGE","@Value12":"YELLOW"},"StatementOptionToolTips":{"@ToolTip1":"BLACK","@ToolTip2":"GRAY|GREY","@ToolTip3":"PINK","@ToolTip4":"BLUE","@ToolTip5":"GREEN","@ToolTip6":"RED","@ToolTip7":"BROWN","@ToolTip8":"MAGENTA","@ToolTip9":"WHITE","@ToolTip10":"CYAN","@ToolTip11":"ORANGE","@ToolTip12":"YELLOW"}},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=columns] \n \nSpecifies the number of columns in the window."},"StatementOptionType":"V"},{"StatementOptionName":"ICOLUMN=","StatementOptionHelp":{"#cdata":"[Syntax: ICOLUMN=column] \n \nSpecifies the initial column within the monitor at which the window is displayed."},"StatementOptionType":"V"},{"StatementOptionName":"IROW=","StatementOptionHelp":{"#cdata":"[Syntax: IROW=row] \n \nSpecifies the initial row (or line) within the monitor at which the window is displayed."},"StatementOptionType":"V"},{"StatementOptionName":"KEYS=","StatementOptionHelp":{"#cdata":"[Syntax: KEYS=<catalog.>keys-entry] \n \nSpecifies the name of a KEYS entry that contains the function key definitions \nfor the window."},"StatementOptionType":"DV"},{"StatementOptionName":"MENU=","StatementOptionHelp":{"#cdata":"[Syntax: MENU=<catalog.>pmenu-entry] \n \nSpecifies the name of a menu (pmenu) you have built with the PMENU procedure."},"StatementOptionType":"DV"},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=rows] \n \nSpecifies the number of rows (or lines) in the window."},"StatementOptionType":"V"},{"StatementOptionName":"ATTR=|A=","StatementOptionHelp":{"#cdata":"Syntax: ATTR=attribute | (attribute-1 <... , attribute-n>) \n \nControls these highlighting attributes of the field: "},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BLINK","@Value2":"HIGHLIGHT","@Value3":"REV_VIDEO","@Value4":"UNDERLINE"},"StatementOptionToolTips":{"@ToolTip1":"Causes the field to blink.","@ToolTip2":"Displays the field at high intensity.","@ToolTip3":"Displays the field in reverse video.","@ToolTip4":"Underlines the field."}},{"StatementOptionName":"AUTOSKIP=|SKIP=","StatementOptionHelp":{"#cdata":"Controls whether the cursor moves to the next unprotected field of the current window or group \nwhen you have entered data in all positions of a field."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the cursor moves automatically to the next unprotected field.","@ToolTip2":"Specifies that the cursor does not move automatically."}},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Determines whether the macro processor displays the characters you are entering into a macro variable \nvalue as you enter them."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that SAS displays characters in a field as you type them in.","@ToolTip2":"Specifies that the entered characters are not displayed."}},{"StatementOptionName":"PERSIST=","StatementOptionHelp":{"#cdata":"Controls whether a field is displayed by all executions of a DISPLAY statement in the same iteration \nof the DATA step until the DISPLAY statement contains the BLANK option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that each execution of the DISPLAY statement displays all previously displayed contents of the field as well as the contents that are scheduled for display by the current DISPLAY statement. If the new contents overlap persisting contents, the persisting contents are no longer displayed.","@ToolTip2":"Specifies that each execution of a DISPLAY statement displays only the current contents of the field."}},{"StatementOptionName":"PROTECT=|P=","StatementOptionHelp":{"#cdata":"Controls whether information can be entered into a field."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that you cannot enter information.","@ToolTip2":"Specifies that you can enter information."}},{"StatementOptionName":"REQUIRED=","StatementOptionHelp":{"#cdata":"Controls whether a field can be left blank."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that you must enter a value in the field.","@ToolTip2":"Specifies that you can leave the field blank."}},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=group] \n \nSpecifies a group of related fields."},"StatementOptionType":"V"}]}},{"StatementName":"ODS LISTING","StatementHelp":{"#cdata":"Opens, manages, or closes the LISTING destination. \n \nSyntax: \n(1) ODS LISTING ; \n(2) ODS LISTING ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the LISTING destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE/SELECT ALL \n \nExcludes/Selects all output objects for the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE/SELECT NONE \n \nExcludes/Selects no output objects for the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"DATAPANEL=","StatementOptionHelp":{"#cdata":"Suggests how to split a table that is too wide to fit on a single page into sections of columns and \nrows. Each section of columns and rows is a data panel. Each data panel has column headings at the top."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"DATA","@Value3":"PAGE"},"StatementOptionToolTips":{"@ToolTip1":"Writes the specified number of observations in a panel, if possible. More than one panel can occur on every page if space permits. Range: 1 to the largest integer that the operating system supports.","@ToolTip2":"Bases the size of the panel on the way that the table is stored in memory. This value provides the fastest performance. However, if the table contains many columns, the number of rows in each panel might be small.","@ToolTip3":"Tries to make panels that match the page size. If the table contains more columns than can fit on a page, the first page is filled with as many observations as possible for as many columns as can fit on a single line. The second page contains the same observations for the next group of columns, and so on, until all rows and columns have been printed."}},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"[Syntax: DEVICE= device-driver] \n \nSpecifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination."},"StatementOptionType":"V"},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Syntax: FILE=file-specification\n \nSpecifies the file to write to. file-specification is one of the following:\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GPATH=","StatementOptionHelp":{"#cdata":"Syntax: GPATH= file-specification <(url='Uniform-Resource-Locator' | NONE)> \n\nSpecifies the location for all graphics output that is generated while the destination is open. \n\nfile-specification \nspecifies the file or SAS catalog to which to write. file-specification is one of the following:\n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file.\n \n libref.catalog \n specifies a SAS catalog to which to write.\n\nURL= 'Uniform-Resource-Locator' | NONE \nspecifies a URL for file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references \n that it creates to the file.\n\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE \n specifies that no information from the GPATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"Syntax: URL= 'Uniform-Resource-Locator' | NONE \n\nSpecifies a URL for file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references \n that it creates to the file.\n\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE \n specifies that no information from the GPATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution of ODS graphics output. Output from device-based graphics is not \naffected. Default: 100"},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package."},"StatementOptionType":"S"},{"StatementOptionName":"SGE=","StatementOptionHelp":{"#cdata":"Determines whether you can edit ODS graphics output with the ODS Graphics Editor."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ON","@Value2":"OFF"},"StatementOptionToolTips":{"@ToolTip1":"Turns on the ability to edit ODS graphics output with the ODS Graphics Editor.","@ToolTip2":"Turns off the ability to edit ODS graphics output with the ODS Graphics Editor."}}]}},{"StatementName":"ODS DOCUMENT","StatementHelp":{"#cdata":"Opens, manages, or closes the DOCUMENT destination, which produces a hierarchy of \noutput objects that enables you to produce multiple ODS output formats without \nrerunning a PROC or DATA step. \n\nSyntax:\n(1) ODS DOCUMENT action; \n\n(2) ODS DOCUMENT \n member-name <(access-option)>> \n > )> \n ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"See the EXCLUDE or SELECT option."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"See the EXCLUDE or SELECT option."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"CATALOG=|CAT=","StatementOptionHelp":{"#cdata":"By default, no value is assigned to CATALOG=, which means that temporary GRSEGs \nare not copied to a permanent catalog."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"_NULL_"},"StatementOptionToolTips":{"@ToolTip1":"Copies any temporary GRSEG to the specified permanent catalog and keeps a reference to the permanent GRSEG in the document. This value persists until the ODS DOCUMENT statement is closed, or until you delete it by specifying CATALOG=_NULL_. The permanent catalog has the following form: ;","@ToolTip2":"Deletes the catalog name that was previously specified for the CATALOG= option. Thereafter, temporary GRSEGs are not copied into the permanent catalog, and thus are unavailable in subsequent sessions."}},{"StatementOptionName":"DIR=","StatementOptionHelp":{"#cdata":"Syntax: DIR= (> ); \n \nSpecifies the directory path and/or label for ODS output. \n\nLABEL=label \nassigns a label to a path.\n\nPATH= path <(access-option)> \nis specified as a sequence of entries that are delimited by backslashes.\n\n path can have the form: \n\n path<#sequence-number> \n where path is the name of the path.\n\n #sequence-number \n is a number which, when combined with a pathname, uniquely identifies the entry in the directory that \n contains it. \n\n access-option \n specifies the access mode for the ODS document. \n\n WRITE -- opens a document and provides write access as well as read access. \n\n UPDATE -- opens an ODS document and appends new content to the document. UPDATE provides update access \n as well as read access."},"StatementOptionType":"V"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Is specified as a sequence of entries that are delimited by backslashes."},"StatementOptionType":"V"},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"Assigns a label to a path."},"StatementOptionType":"V"},{"StatementOptionName":"WRITE","StatementOptionHelp":{"#cdata":"[access-option] \n \nOpens a document and provides write access as well as read access."},"StatementOptionType":"S"},{"StatementOptionName":"UPDATE","StatementOptionHelp":{"#cdata":"[access-option] \n \nOpens an ODS document and appends new content to the document. UPDATE provides \nupdate access as well as read access."},"StatementOptionType":"S"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"Syntax: NAME= member-name<(access-option)> \nwhere:\n\nlibref \nspecifies the SAS library where the document is stored.\n\n Default: If no library name is specified, the WORK library is used. \n\nmember-name \nspecifies the document name.\n\naccess-option \nspecifies the access mode for the ODS document. \n\n WRITE \n opens a document and provides write access as well as read access. \n\n UPDATE \n opens an ODS document and appends new content to the document. UPDATE provides update access as well \n as read access."},"StatementOptionType":"DV"}]}},{"StatementName":"ODS OUTPUT","StatementHelp":{"#cdata":"Produces a SAS data set from an output object and manages the selection and exclusion lists for the \nOUTPUT destination. \n\nSyntax:\n(1) ODS OUTPUT action; \n(2) ODS OUTPUT data-set-definition(s);"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the OUTPUT destination. When an ODS destination is closed, ODS does not send output to that \ndestination. Closing a destination frees some system resources."},"StatementOptionType":"S"},{"StatementOptionName":"CLEAR","StatementOptionHelp":{"#cdata":"Sets the list for the OUTPUT destination to EXCLUDE ALL."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes to the SAS log the current selection or exclusion list for the OUTPUT destination. If the \nlist is the default list (EXCLUDE ALL), then SHOW also writes the current overall selection or exclusion list."},"StatementOptionType":"S"},{"StatementOptionName":"MATCH_ALL=","StatementOptionHelp":{"#cdata":"Syntax: MATCH_ALL= \n\nCreates a new data set for each output object."},"StatementOptionType":"V"},{"StatementOptionName":"PERSIST=","StatementOptionHelp":{"#cdata":"Determines when ODS closes any data sets that it is creating, and determines when ODS removes output \nobjects from the selection list for the OUTPUT destination."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"PROC","@Value2":"RUN"},"StatementOptionToolTips":{"@ToolTip1":"Maintains the list of definitions even after the procedure ends, until you explicitly modify it.","@ToolTip2":"Maintains the list of definitions and keeps open the data sets that it is creating even if the procedure or DATA step ends, or until you explicitly modify the list."}},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"S"}]}},{"StatementName":"ODS GRAPHICS","StatementHelp":{"#cdata":"Syntax: ODS GRAPHICS ; \n \n Enables or disables ODS graphics processing and sets graphics environment options. This statement \n affects ODS template-based graphics only. The ODS GRAPHICS statement does not affect device-based \n graphics."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"OFF","StatementOptionHelp":{"#cdata":"Disables ODS Graphics processing."},"StatementOptionType":"RS"},{"StatementOptionName":"ON","StatementOptionHelp":{"#cdata":"Enables ODS Graphics processing. This is the default if no argument is used."},"StatementOptionType":"RS"},{"StatementOptionName":"ANTIALIAS=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Does not smooth jagged edges of components other than text in the graph.","@ToolTip2":"Smooths jagged edges of all components in the graph."},"Help":{"#cdata":"Specifies whether anti-aliasing is applied to the rendering of the line and markers in any graph."}},{"StatementOptionName":"ANTIALIAS","StatementOptionHelp":{"#cdata":"Smooths jagged edges of all components in the graph."},"StatementOptionType":"S"},{"StatementOptionName":"NOANTIALIAS","StatementOptionHelp":{"#cdata":"Does not smooth jagged edges of components other than text in the graph."},"StatementOptionType":"S"},{"StatementOptionName":"ANTIALIASMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the maximum number of markers or lines to be anti-aliased before anti-aliasing is disabled. \nDefault: 1000"}},{"StatementOptionName":"BORDER=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to draw a border around the graph.","@ToolTip2":"Specifies to draw a border around the graph."},"StatementOptionHelp":{"#cdata":"Specifies whether to draw a border around the graph."}},{"StatementOptionName":"BORDER","StatementOptionHelp":{"#cdata":"Specifies whether to draw a border around the graph."},"StatementOptionType":"S"},{"StatementOptionName":"NOBORDER","StatementOptionHelp":{"#cdata":"Specifies not to draw a border around any graph."},"StatementOptionType":"S"},{"StatementOptionName":"DISCRETEMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the maximum number of discrete values to be shown in any graph. Default: 1000"}},{"StatementOptionName":"GROUPMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the maximum number of group values to be shown in any graph. Any graph that supports the \nGROUP= option is affected. Default: 1000"}},{"StatementOptionName":"HEIGHT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the height of any graph."}},{"StatementOptionName":"IMAGEFMT=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"BMP","@Value2":"DIB","@Value3":"EMF","@Value4":"EPSI","@Value5":"GIF","@Value6":"JFIF","@Value7":"JPEG","@Value8":"PBM","@Value9":"PDF","@Value10":"PNG","@Value11":"PS","@Value12":"SASEMF","@Value13":"TIFF","@Value14":"WMF","@Value15":"STATIC"},"StatementOptionToolTips":{"@ToolTip1":"Microsoft Windows Device Independent Bitmap","@ToolTip2":"Microsoft Windows Device Independent Bitmap","@ToolTip3":"Microsoft NT Enhanced Metafile","@ToolTip4":"Microsoft NT Enhanced Metafile","@ToolTip5":"Graphics Interchange Format","@ToolTip6":"JPEG File Interchange Format","@ToolTip7":"Joint Photographic Experts Group","@ToolTip8":"Portable Bitmap Utilities","@ToolTip9":"Portable Document Format","@ToolTip10":"Portable Network Graphic","@ToolTip11":"PostScript Image File Format","@ToolTip12":"Enhanced Metafile","@ToolTip13":"Tagged Image File Format","@ToolTip14":"Microsoft Windows Metafile","@ToolTip15":"Uses the best quality static image format for the active output destination. This is the default."},"StatementOptionHelp":{"#cdata":"[Syntax: IMAGEFMT=image-file-type | STATIC] \n \nSpecifies the image format to be used. If the image format is not valid for the \nactive output destination, the format is automatically changed to the default \nimage format for that destination."}},{"StatementOptionName":"IMAGEMAP=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to generate data tips.","@ToolTip2":"Specifies to generate data tips."},"StatementOptionHelp":{"#cdata":"Specifies to generate data tips."}},{"StatementOptionName":"IMAGEMAP","StatementOptionHelp":{"#cdata":"Specifies to generate data tips."},"StatementOptionType":"S"},{"StatementOptionName":"NOIMAGEMAP","StatementOptionHelp":{"#cdata":"Specifies not to generate data tips."},"StatementOptionType":"S"},{"StatementOptionName":"IMAGENAME=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: IMAGENAME=\"filename\"] \n \nSpecifies the base image filename."}},{"StatementOptionName":"LABELMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: LABELMAX= n] \n \nSpecifies the maximum number of labeled areas before labeling is disabled. \n\nDefault: 200"}},{"StatementOptionName":"MAXLEGENDAREA=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: MAXLEGENDAREA= n] \n \nSpecifies an integer that is interpreted as the maximum percentage of the overall \ngraphics area that a legend can occupy. Default: 20"}},{"StatementOptionName":"PANELCELLMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: PANELCELLMAX=n] \n \nSpecifies the maximum number of cells in a graph panel where the number of cells \nis determined dynamically by classification variables. Default: 10000"}},{"StatementOptionName":"RESET","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Resets all of the options to their defaults."}},{"StatementOptionName":"RESET=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"ALL","@Value2":"ANTIALIAS","@Value3":"ANTIALIASMAX","@Value4":"BORDER","@Value5":"INDEX","@Value6":"HEIGHT","@Value7":"IMAGEMAP","@Value8":"LABELMAX","@Value9":"SCALE","@Value10":"TIPMAX","@Value11":"WIDTH"},"StatementOptionToolTips":{"@ToolTip1":"Resets all of the reset-options to their defaults.","@ToolTip2":"Resets the ANTIALIAS option to its default.","@ToolTip3":"Resets the ANTIALIASMAX option to its default.","@ToolTip4":"Resets the BORDER= option to its default.","@ToolTip5":"Resets the index counter that is appended to static image files.","@ToolTip6":"Resets the HEIGHT= option to its default.","@ToolTip7":"Resets the IMAGEMAP= option to its default.","@ToolTip8":"Resets the LABELMAX= option to its default.","@ToolTip9":"Resets the SCALE= option to its default.","@ToolTip10":"Resets the TIPMAX= option to its default.","@ToolTip11":"Resets the WIDTH= option to its default."},"StatementOptionHelp":{"#cdata":"Resets the specified option to its default value."}},{"StatementOptionName":"SCALE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Does not scale the components of graph proportionally.","@ToolTip2":"Scales the components of graph proportionally."},"StatementOptionHelp":{"#cdata":"Specifies the width of any graph. Requires a nonnegative number."}},{"StatementOptionName":"SCALE","StatementOptionHelp":{"#cdata":"Scales the components of graph proportionally."},"StatementOptionType":"S"},{"StatementOptionName":"NOSCALE","StatementOptionHelp":{"#cdata":"Does not scale the components of graph proportionally."},"StatementOptionType":"S"},{"StatementOptionName":"TIPMAX=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TIPMAX=n] \n \nSpecifies the maximum number of distinct mouse-over areas allowed before data tips \nare disabled. Default: 500"}},{"StatementOptionName":"WIDTH=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: WIDTH=dimension] \n \nSpecifies the width of any graph. Requires a nonnegative number."}}]}},{"StatementName":"ODS MARKUP|ODS HTML|ODS CHTML|ODS HTMLCSS|ODS HTML3|ODS IMODE|ODS PHTML|ODS CSVALL|ODS DOCBOOK|ODS WML|ODS SASREPORT|ODS TROFF|ODS HTML4|ODS LATEX|ODS WMLOLIST","StatementHelp":{"#cdata":"Opens, manages, or closes the specified destination, which produces SAS output that is formatted using \none of many different markup languages.\n \nSyntax: \nODS MARKUP|HTML|CHTML|HTMLCSS|HTML3|IMODE|PHTML|CSVALL|DOCBOOK|WML|SASREPORT|TROFF|\n HTML4|LATEX|WMLOLIST<(identifier)> ; \nODS MARKUP|HTML|CHTML|HTMLCSS|HTML3|IMODE|PHTML|CSVALL|DOCBOOK|WML|SASREPORT|TROFF|\n HTML4|LATEX|WMLOLIST<(identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies a unique base name for the anchor tag that identifies each output object \nin the current body file."},"StatementOptionType":"V"},{"StatementOptionName":"ARCHIVE=","StatementOptionHelp":{"#cdata":"[Syntax: ARCHIVE='string'] \n \nThe ARCHIVE= option is only valid for the GOPTIONS Java device. The ARCHIVE= option \nallows you to specify a string to identify which applet to use in order to view the \nODS HTML output."},"StatementOptionType":"V"},{"StatementOptionName":"ATTRIBUTES=","StatementOptionHelp":{"#cdata":"[Syntax: ATTRIBUTES=(attribute-pair-1 ... attribute-pair-n)] \n \nWrites the specified attributes between the tags that generate dynamic graphics output."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"[Syntax: BASE= 'base-text'] \n \nSpecifies the text to use as the first part of all links and references that ODS \ncreates in the output files."},"StatementOptionType":"V"},{"StatementOptionName":"BODY=|FILE=","StatementOptionHelp":{"#cdata":"[Syntax: BODY= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains the primary \noutput that is created by the ODS statement."},"StatementOptionType":"V","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"CHARSET=","StatementOptionHelp":{"#cdata":"[Syntax: CHARSET=character-set] \n \nSpecifies the character set to be generated in the META declaration for the HTML output."},"StatementOptionType":"V"},{"StatementOptionName":"CODE=","StatementOptionHelp":{"#cdata":"[Syntax: CODE= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains relevant \nstyle information, such as XSL (Extensible Stylesheet Language)."},"StatementOptionType":"V","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"CODEBASE=","StatementOptionHelp":{"#cdata":"[Syntax: CODEBASE='string'] \n \nCreates a file path that is used by the GOPTIONS devices."},"StatementOptionType":"V"},{"StatementOptionName":"CONTENTS=","StatementOptionHelp":{"#cdata":"Syntax: CONTENTS= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a table of contents for \nthe output. These files remain open until you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or \n ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file \n and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME statement to \n assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for \nwriting the output files."},"StatementOptionType":"S","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default device for each \nopen output destination."},"StatementOptionType":"V"},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"EVENT=","StatementOptionHelp":{"#cdata":"Syntax: EVENT=event-name (FILE= | FINISH | LABEL= | NAME= | START | STYLE= |TARGET= | TEXT= | URL= )\n \nSpecifies an event and the value for event variables that are associated with the event."},"StatementOptionType":"V","SubOptionsKeywords":"FILE=|FINISH|LABEL=|NAME|START|STYLE=|TARGET=|TEXT=|URL="},{"StatementOptionName":"FRAME=","StatementOptionHelp":{"#cdata":"Syntax: FRAME='file-specification' \n \nOpens a MARKUP family destination and, for HTML output, specifies the file that integrates the table \nof contents, the page contents, and the body file."},"StatementOptionType":"V","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders. If you open the frame file, \nthen you see a table of contents, a table of pages, or both, as well as the body file. For XLM \noutput, FRAME= specifies the file that contains the DTD. These files remain open until you do \none of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."},"StatementOptionType":"S"},{"StatementOptionName":"GPATH=","StatementOptionHelp":{"#cdata":"Syntax: GPATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location for all graphics output that is generated while the destination is open. \n\n 'aggregate-file-storage-location' \n specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref \n is a file reference that has been assigned to an aggregate storage location. Use the FILENAME \n statement to assign a fileref.\n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for file-specification. \n\n Uniform-Resource-Locator -- is the URL you specify. ODS uses this URL instead of the filename in \n all the links and references that it creates to the file.\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE -- specifies that no information from the GPATH= option appears in the links or references."},"StatementOptionType":"DV"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."},"StatementOptionType":"S"},{"StatementOptionName":"HEADTEXT=","StatementOptionHelp":{"#cdata":"Specifies tags to place between the and tags in all the files that the destination \nwrites to. \n\nSyntax: HEADTEXT= 'markup-document-head' \n\nwhere:\n\n markup-document-head \n specifies the markup tags to place between the and tags.\n\n Requirement: You must enclose markup-document-head in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 100. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."},"StatementOptionType":"V"},{"StatementOptionName":"METATEXT=","StatementOptionHelp":{"#cdata":"Specifies HTML code to use as the tag between the and tags of all the HTML \nfiles that the destination writes to. \n\nSyntax: METATEXT= 'metatext-for-document-head' \n\nwhere:\n\n 'metatext-for-document-head' \n specifies the HTML code that provides the browser with information about the document that it is loading. \n For example, this attribute could specify the content type and the character set to use.\n\n Requirement: You must enclose metatext-for-document-head in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"NEWFILE=|","StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new body file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."}},{"StatementOptionName":"OPTIONS","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS ( DOC= | )] \n \nSpecifies tagset-specific suboptions and a named value.\n\n(DOC='QUICK' | 'HELP' | 'SETTINGS') \nprovides information about the specified tagset. \n\n QUICK \n describes the options available for this tagset. \n\n HELP \n provides generic help and information with a quick reference.\n\n SETTINGS \n provides the current option settings.\n\nsuboption(s) \nspecifies one or more suboptions that are valid for the specified tagset. Suboptions have the \nfollowing format: \n\n keyword='value' \n You can get information about suboptions for a specific tagset by specifying one of the following \n options when opening an ODS tagset statement or at any time after the destination has been opened. \n \n options(doc='help');\n options(doc='quick'); \n options(doc='settings');"},"StatementOptionType":"S"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package."},"StatementOptionType":"S"},{"StatementOptionName":"PAGE=","StatementOptionHelp":{"#cdata":"Syntax: PAGE= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a description \nof each page of the body file, and contains links to the body file. ODS produces a \nnew page of output whenever a procedure requests a new page. These files remain open \nuntil you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement \n or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first \n file and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n Interaction: If you specify an entry name, you must also specify a library and catalog. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."},"StatementOptionType":"V","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"PARAMETERS=","StatementOptionHelp":{"#cdata":"Syntax: PARAMETERS=(parameter-pair-1 ... parameter-pair-n) \n \nWrites the specified parameters between the tags that generate dynamic graphics output.\n\n parameter-pair \n specifies the name and value of each parameter. parameter-pair has the following form: \n\n 'parameter-name'= 'parameter-value' \n\n where:\n \n parameter-name -- is the name of the parameter.\n\n parameter-value -- is the value of the parameter.\n Requirement: You must enclose parameter-name and parameter-value in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."},"StatementOptionType":"DV"},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"StatementOptionType":"V","SubOptionsKeywords":"NONE"},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition to use in writing the output files."},"StatementOptionType":"V"},{"StatementOptionName":"STYLESHEET=","StatementOptionHelp":{"#cdata":"Syntax: STYLESHEET= 'file-specification' \n \nOpens a markup family destination and places the style information for markup output into an external \nfile, or reads style sheet information from an existing file. These files remain open until you do one \nof the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\nfile-specification is one of the following:\n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to.\n Interaction: If you specify an entry name, you must also specify a library and catalog. See the discussion \n of the PATH= option. \n\nsuboption(s) -- specifies one or more suboptions in parentheses."},"StatementOptionType":"V","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"TAGSET=|TYPE=","StatementOptionHelp":{"#cdata":"Specifies a keyword value for a tagset. A tagset is a template that defines how to \ncreate an output type from a SAS format."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CHTML","@Value2":"CORE","@Value3":"CSV","@Value4":"CSVALL","@Value5":"CSVBYLINE","@Value6":"DEFAULT","@Value7":"DOCBOOK","@Value8":"ExcelXP","@Value9":"HTML4","@Value10":"HTMLCSS","@Value11":"HTMLPANEL","@Value12":"IMODE","@Value13":"MSOFFICE2K","@Value14":"MVSHTML","@Value15":"PHTML","@Value16":"PYX","@Value17":"RTF","@Value18":"SASREPORT","@Value19":"WML","@Value20":"WMLOLIST","@Value21":"XHTML","@Value22":"EVENT_MAP","@Value23":"NAMEDHTML","@Value24":"SHORT_MAP","@Value25":"STYLE_DISPLAY","@Value26":"STYLE_POPUP","@Value27":"TEXT_MAP","@Value28":"TPL_STYLE_LIST","@Value29":"TPL_STYLE_MAP"},"StatementOptionToolTips":{"@ToolTip1":"Produces compact, minimal HTML output that does not use style information.","@ToolTip2":"Contains a table of Unicode values and mnemonics.","@ToolTip3":"Produces tabular output that contains columns of data values that are separated by commas.","@ToolTip4":"Produces tabular output with titles that contain columns of data values that are separated by commas.","@ToolTip5":"Produces output with comma-separated values and columns of data that are separated by commas.","@ToolTip6":"Produces XML output.","@ToolTip7":"Produces XML output that conforms to the DocBook DTD by OASIS.","@ToolTip8":"Produces Microsoft's spreadsheetML XML. This tagset is used to import data into XML.","@ToolTip9":"Produces HTML 4.0 embedded style sheets.","@ToolTip10":"produces HTML output with cascading style sheets that is similar to ODS HTML output.","@ToolTip11":"Creates panels for By-grouped graphs.","@ToolTip12":"produces HTML output as a column of output that is separated by lines.","@ToolTip13":"Produces HTML code for output generated by ODS for Microsoft Office products.","@ToolTip14":"Produces URLs within HTML files that are used in the z/OS operating environment.","@ToolTip15":"Produces simple HTML output that uses twelve style elements and no class attributes.","@ToolTip16":"Produces PYX, which is a simple, line-oriented notation used by Pyxie to describe the information communicated by an XML parser to an XML application.","@ToolTip17":"Produces measured RTF.","@ToolTip18":"Causes imbedded data to be produced in CSV format.","@ToolTip19":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with a list of URLs as a table of contents.","@ToolTip20":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with an option list for the table of contents.","@ToolTip21":"Produces output in HTML format.","@ToolTip22":"Creates XML output that shows which events are being triggered and which variables are used by an event to send output from a SAS process to an output file.","@ToolTip23":"Creates HTML output similar to STYLE_POPUP, but with all the objects labeled as they are when using ODS TRACE.","@ToolTip24":"Creates a subset of the XML output that is created by the EVENT_MAP tagset.","@ToolTip25":"Creates a sample page of HTML output that is similar to STYLE_POPUP output.","@ToolTip26":"Creates HTML like HTMLCSS, but if you're using Internet Explorer, STYLE_POPUP displays a window that shows the resolved ODS style definition for any item that you select.","@ToolTip27":"Creates text output that shows which events are being triggered as ODS handles the output objects.","@ToolTip28":"Creates HTML output in a bulleted list similar to EVENT_MAP but lists only a subset of the possible attributes.","@ToolTip29":"Creates XML output similar to EVENT_MAP but lists only a subset of the possible attributes."}},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT='variable-value'] \n \nInserts text into your document by triggering the paragraph event and specifying \na text string to be assigned to the VALUE event variable."},"StatementOptionType":"V"},{"StatementOptionName":"TRANTAB=","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."},"StatementOptionType":"V"}]}},{"StatementName":"ODS PRINTER|ODS PS|ODS PCL|ODS PDF","StatementHelp":{"#cdata":"Syntax: Opens, manages, or closes the specified destination (PRINTER, PS, PCL, PDF), which produces\nprintable output.\n \nSyntax: \n(1) ODS PRINTER|PS|PCL|PDF <(identifier)> ; \n(2) ODS PRINTER|PS|PCL|PDF <(identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"See the EXCLUDE or SELECT option."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"See the EXCLUDE or SELECT option."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the root name for the anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts into the metadata of a file, the text string that you specify as the author."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates in the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BOOKMARKLIST=","StatementOptionHelp":{"#cdata":"Specifies whether to generate and display the list of bookmarks for a PDF file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"HIDE","@Value2":"NONE|NO|OFF","@Value3":"SHOW|YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Generates a list of bookmarks for your PDF file. The bookmarks are not automatically displayed when you open the PDF file.","@ToolTip2":"Specifies not to generate a list of bookmarks for your PDF file.","@ToolTip3":"Generates a list of bookmarks for your PDF file. The bookmarks are automatically displayed when you open the PDF file."}},{"StatementOptionName":"BOOKMARKGEN=","StatementOptionHelp":{"#cdata":"Controls the generation of bookmarks in a PDF file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO|OFF","@Value2":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to generate bookmarks in the PDF file.","@ToolTip2":"Specifies to generate bookmarks in the PDF file."}},{"StatementOptionName":"BOOKMARKGEN","StatementOptionHelp":{"#cdata":"Specifies to generate bookmarks in the PDF file."},"StatementOptionType":"S"},{"StatementOptionName":"NOBOOKMARKGEN","StatementOptionHelp":{"#cdata":"Specifies not to generate bookmarks in the PDF file."},"StatementOptionType":"S"},{"StatementOptionName":"COLOR=","StatementOptionHelp":{"#cdata":"Applies the specified color scheme to your output."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FULL","@Value2":"GRAY|GREY","@Value3":"MONO|BW","@Value4":"NO","@Value5":"YES"},"StatementOptionToolTips":{"@ToolTip1":"Creates full color output for both text and graphics.","@ToolTip2":"Creates gray scale output for both text and graphics.","@ToolTip3":"Creates monochromatic output for both text and graphics.","@ToolTip4":"Does not use all the color information that the style definition provides.","@ToolTip5":"Uses all the color information that a style definition provides, including background color."}},{"StatementOptionName":"COLUMNS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n] \n \nSpecifies the number of columns to place across each page of output. \n \nn \nis the number columns per page.\n\nDefault: 1"}},{"StatementOptionName":"COMPRESS=","StatementOptionHelp":{"#cdata":"[Syntax: COMPRESS=n] \n \nControls the compression of a PDF file. Compression reduces the size of the file.\n \nn \nspecifies the level of compression. The larger the number, the greater the compression. \nFor example, n=0 is completely uncompressed, and n=9 is the maximum compression level. \n\nDefault: 6 \nRange: 0-9"},"StatementOptionType":"V"},{"StatementOptionName":"CONTENTS=","StatementOptionHelp":{"#cdata":"Controls the generation of a printable table of contents."},"StatementOptionType":"S","StatementOptionValues":{"@Value1":"NO","@Value2":"YES"},"StatementOptionToolTips":{"@ToolTip1":"Does not generate a printable table of contents.","@ToolTip2":"Generates a printable table of contents."}},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Generates a printable table of contents page."},"StatementOptionType":"S"},{"StatementOptionName":"NOCONTENTS","StatementOptionHelp":{"#cdata":"Does not generate a printable table of contents."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for output files. Default: 150 \n \nRestriction: The DPI= option takes effect only if specified at the opening of a file."},"StatementOptionType":"V"},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Syntax: FILE='external-file' | fileref \n \nSpecifies the file that contains the output. \n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement \n to assign a fileref."},"StatementOptionType":"V"},{"StatementOptionName":"HOST","StatementOptionHelp":{"#cdata":"Specifies that ODS use the printer drivers that the host system provides. \n \nInteraction: In an ODS printer family statement that refers to an open ODS PRINTER destination, \nthe HOST option forces ODS to close the destination and all files that are associated with it, \nand to open a new instance of the destination."},"StatementOptionType":"S"},{"StatementOptionName":"KEYWORDS=","StatementOptionHelp":{"#cdata":"[Syntax: KEYWORDS='keywords-text'] \n \nInserts into the output file's metadata, a string of keywords. \n \nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the \nPDFMARK option specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The KEYWORDS= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose keywords-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (identifier)] \n \nEnables you to open multiple instances of the same destination at the same time. Each \ninstance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"Creates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the file that is currently open.","@ToolTip3":"Starts a new file for each output object. For SAS/GRAPH this means that ODS creates a new file for each SAS/GRAPH output file that the program generates.","@ToolTip4":"Starts a new file for each page of output. A page break occurs when a procedure explicitly starts a new page (not because the page size was exceeded) or when you start a new procedure.","@ToolTip5":"Starts a body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC","StatementOptionHelp":{"#cdata":"Specifies that ODS omit the table of contents (Bookmark list) that is produced by default when \nproducing PDF or PDFMARK output. \n\nInteraction: The NOTOC option specifies BOOKMARKLIST=OFF and CONTENTS= OFF."},"StatementOptionType":"S"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. If no name \nis specified, then the output is added to the unnamed package that was opened last."},"StatementOptionType":"S"},{"StatementOptionName":"PCL","StatementOptionHelp":{"#cdata":"Creates PCL output. \n \nRestriction: Do not use this option in conjunction with the PDF or PS option. \n\nInteraction: If you use the PCL option in an ODS PRINTER statement that refers to an open \nODS PRINTER destination, the option will force ODS to close the destination and all files \nthat are associated with it, and to open a new instance of the destination."},"StatementOptionType":"S"},{"StatementOptionName":"PDF","StatementOptionHelp":{"#cdata":"Creates PDF output. \n \nRestriction: Do not use this option in conjunction with the PCL or PS option. \n\nInteraction: If you use the PDF option in an ODS PRINTER statement that refers to an open \nODS PRINTER destination, the option will force ODS to close the destination and all files \nthat are associated with it, and to open a new instance of the destination.]"},"StatementOptionType":"S"},{"StatementOptionName":"PDFMARK","StatementOptionHelp":{"#cdata":"Enables ODS to insert special tags into a PostScript file. When you use software such as Adobe Acrobat \n(not Adobe Viewer), Acrobat Distiller interprets the tags to create a PDF file that contains the \nfollowing items: \n\n o bookmarks for each section of the output and for each table.\n\n o references for items that are associated with the URL= style attribute.\n\n o notes for items that are associated with the FLYOVER= style attribute. \n Notes are optional, and are based on the PDFNOTE option.\n\n o author, keywords, subject, and title in the metadata of a file."},"StatementOptionType":"S"},{"StatementOptionName":"PDFNOTE","StatementOptionHelp":{"#cdata":"Adds notes to a PDF file for items that are associated with the FLYOVER= style attribute."},"StatementOptionType":"S"},{"StatementOptionName":"NOPDFNOTE","StatementOptionHelp":{"#cdata":"Modifies the behavior of PDFMARK so that notes are not added to the file for items that are associated \nwith the FLYOVER= style attribute."},"StatementOptionType":"S"},{"StatementOptionName":"PDFTOC=","StatementOptionHelp":{"#cdata":"[Syntax: PDFTOC=n] \n \nControls the level of the expansion of the table of contents in PDF documents."},"StatementOptionType":"V"},{"StatementOptionName":"PRINTER=|PRT=","StatementOptionHelp":{"#cdata":"[Syntax: PRINTER=printer-name] \n \nCreates output that is formatted for the specified printer. \n \nDefault: If you do not specify a printer, then ODS formats the printer output for the printer \nthat is specified by one of two SAS system options: \n \n o SYSPRINT= if you are using the Windows operating environment and do not specify any of the\n following options: PCL, PDFMARK, POSTSCRIPT, PS, or SAS.\n\n o PRINTERPATH= in all other cases.\n \nRestriction: printer-name must match a subkey in either the SAS registry or the Windows \nprinter registry."},"StatementOptionType":"V"},{"StatementOptionName":"PS|POSTCRIPT=","StatementOptionHelp":{"#cdata":"Creates PostScript output."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"Syntax: STYLE=style-definition] \n \nSpecifies the style definition to use in writing the printer output."},"StatementOptionType":"V"},{"StatementOptionName":"SUBJECT=","StatementOptionHelp":{"#cdata":"[Syntax: SUBJECT='subject-text'] \n \nInserts into the metadata of a file the text string that you specify as the subject.\n\nsubject-text \nis the text in the metadata of a file that indicates the subject.\n\nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the \nPDFMARK option specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The SUBJECT= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose subject-text in quotation marks. "},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT='text-string'] \n \nInserts a text string into your output. \n \nRequirement: You must enclose text-string in quotation marks. "},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='title-text'] \n \nInserts into the metadata of a file, the text string that you specify as the title. \n\nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the \nPDFMARK option specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The TITLE= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"UNIFORM","StatementOptionHelp":{"#cdata":"For multiple page tables, ensures uniformity from page to page within a single table. \nWhen the UNIFORM option is in effect, ODS reads the entire table before it starts to \nprint it so that it can determine the column widths that are necessary to accommodate \nall the data. These column widths are applied to all pages of a multiple page table. \n\nNote: With BY-group processing, SAS writes the results of each BY group to a separate \ntable, so the output might not be uniform across BY groups."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PROCTITLE","StatementHelp":{"#cdata":"Syntax: ODS PROCTITLE; \n \nWrites, in the output, the name of the procedure that produces the results."},"StatementOptions":null},{"StatementName":"ODS NOPROCTITLE","StatementHelp":{"#cdata":"Syntax: ODS NOPROCTITLE;\n \nSuppresses the writing of the title of the procedure that produces the results."},"StatementOptions":null},{"StatementName":"ODS PROCLABEL","StatementHelp":{"#cdata":"Enables you to change a procedure label.\n \nSyntax: ODS PROCLABEL 'string';\n \nwhere:\n\n'string' is the procedure label that you specify."},"StatementOptions":null},{"StatementName":"ODS RESULTS","StatementHelp":{"#cdata":"Syntax: ODS RESULTS ON | OFF; \n \nTracks ODS output in the Results window."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON","StatementOptionHelp":{"#cdata":"Tracks output that ODS generates in the Results window."},"StatementOptionType":"S"},{"StatementOptionName":"OFF","StatementOptionHelp":{"#cdata":"Turns off the tracking of output that ODS generates in the Results window."},"StatementOptionType":"S"}]}},{"StatementName":"ODS TEXT=","StatementHelp":{"#cdata":"Inserts text into your ODS output. \n \nSyntax: ODS TEXT= 'text-string';\n \nwhere:\n\ntext-string\nspecifies the text to insert into your output. This text is sent to all open supported \noutput destinations.\n\nRestriction: The ODS TEXT= statement does not support the OUTPUT destination or the LISTING \ndestination. All other ODS destinations are supported. \n\nRequirement: You must enclose 'text-string' in parentheses. \n\nTip: The UserText style element controls text specified with the TEXT= statement."},"StatementOptions":null},{"StatementName":"ODS TRACE","StatementHelp":{"#cdata":"Syntax: ODS TRACE ON ; | ODS TRACE OFF;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON|OUTPUT|YES","StatementOptionHelp":{"#cdata":"Turns on the writing of the trace record."},"StatementOptionType":"RS"},{"StatementOptionName":"OFF|NO","StatementOptionHelp":{"#cdata":"Turns off the writing of the trace record."},"StatementOptionType":"RS"},{"StatementOptionName":"EXCLUDED","StatementOptionHelp":{"#cdata":"Includes, in the trace record, information for excluded output objects."},"StatementOptionType":"S"},{"StatementOptionName":"LABEL","StatementOptionHelp":{"#cdata":"Includes the label path for the output object in the record. You can use a label path anywhere that \nyou can use a path."},"StatementOptionType":"S"},{"StatementOptionName":"LISTING","StatementOptionHelp":{"#cdata":"Writes the trace record to the Listing destination, so that each part of the trace record immediately \nprecedes the output object that it describes."},"StatementOptionType":"S"}]}},{"StatementName":"ODS USEGOPT","StatementHelp":{"#cdata":"Syntax: ODS USEGOPT; \n \nSpecifies that ODS use traditional SAS/GRAPH option settings for non-graphical output."},"StatementOptions":null},{"StatementName":"ODS NOUSEGOPT","StatementHelp":{"#cdata":"Syntax: ODS NOUSEGOPT; \n \nSpecifies that ODS not use traditional SAS/GRAPH option settings for non-graphical output."},"StatementOptions":null},{"StatementName":"ODS VERIFY","StatementHelp":{"#cdata":"Syntax: ODS VERIFY ; \n \nPrints or suppresses a message indicating that a style definition or a table definition being \nused is not supplied by SAS."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON|YES","StatementOptionHelp":{"#cdata":"Prints the warning and sends output objects to open destinations."},"StatementOptionType":"S"},{"StatementOptionName":"OFF|NO","StatementOptionHelp":{"#cdata":"Suppresses the warning."},"StatementOptionType":"S"},{"StatementOptionName":"ERROR","StatementOptionHelp":{"#cdata":"Prints an error message instead of a warning message and does not send output objects \nto open destinations."},"StatementOptionType":"S"},{"StatementOptionName":"WARN","StatementOptionHelp":{"#cdata":"Prints a warning message and does not send output objects to open destinations."},"StatementOptionType":"S"}]}},{"StatementName":"ODS ESCAPECHAR=","StatementHelp":{"#cdata":"Defines a representative character to be used in output strings.\n \nSyntax: ODS ESCAPECHAR= 'escape-character';\n\nescape-character \nspecifies the special character that identifies the inline formatting symbol. The \nescape-character should be one of the following rarely used characters: @, ^, or \\."},"StatementOptions":null},{"StatementName":"ODS RTF","StatementHelp":{"#cdata":"Opens, manages, or closes the RTF destination, which produces measured output that is written \nin Rich Text Format for use with Microsoft Word 2002.\n \nSyntax: \nODS RTF <( identifier)> action; \nODS RTF <( identifier)> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the RTF destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the base name for the RTF anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts the text string that you specify as the author into the metadata of a file."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates in the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BODYTITLE","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes are placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document.\n\nRestriction: The BODYTITLE option can be specified only when you create a new RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BODYTITLE_AUX","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes be placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document. These titles \nand footnotes are put into cells, which allows titles and footnotes to be centered, \nleft-justified, or right-justified.\n\nRestriction: You can specify the BODYTITLE_AUX option only when you are creating a \nnew RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n | MAX] \n \nSpecifies the number of columns to place across each page of output. \n \nDefault: the number of one-inch columns that fit on the page."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Is the number of one-inch columns that you want on the page.","@ToolTip2":"Specifies the maximum number of one-inch-wide columns for the paper size and margin setting. This value is dependent upon the paper size and page orientation."}},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Produces a table of contents page for RTF documents that are opened in Microsoft Word. \nThe table of contents page contains a Table of Contents field, which puts all of the \ncontents information that is embedded in the document into a table of contents. To \nexpand the table of contents, right-click under the title in Microsoft Word and select \nUpdate Field from the selection list. \n\nRestriction: Do not use the CONTENTS option with the NEWFILE option."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your \noutput will be rendered on. CSS uses media type blocks to specify how a document is \nto be presented on different media: on the screen, on paper, with a speech synthesizer, \nwith a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination."},"StatementOptionType":"V"},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Opens the RTF destination and specifies the RTF file or SAS catalog to which to write. This file \nremains open until you do one of the following actions:\n\n o Close the RTF destination with ODS RTF CLOSE or ODS _ALL_ CLOSE.\n\n o Specify a different file to which to write.\n\nSyntax: FILE= 'external-file' | fileref\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined footnotes within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined footnotes from appearing in the graphics file. Instead, \nthey become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined titles within the graphics output that is called \nby the body file."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined titles from appearing in the graphics output. \nInstead, the titles become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 200. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."},"StatementOptionType":"V"},{"StatementOptionName":"KEEPN","StatementOptionHelp":{"#cdata":"ODS allows table splits only if the entire table cannot fit on one page."},"StatementOptionType":"S"},{"StatementOptionName":"NOKEEPN","StatementOptionHelp":{"#cdata":"ODS lets a table split at a page break."},"StatementOptionType":"S"},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS not to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"OPERATOR=","StatementOptionHelp":{"#cdata":"[Syntax: OPERATOR= 'text-string'] \n \nInserts the text you specify into the metadata of the RTF file."},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. \nIf no name is specified, then the output is added to the unnamed package that was \nopened last."},"StatementOptionType":"S"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."},"StatementOptionType":"DV"},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"StatementOptionType":"V","SubOptionsKeywords":"NONE"},{"StatementOptionName":"SASDATE","StatementOptionHelp":{"#cdata":"Writes to the RTF file the time and the date that you started your SAS session. \n\nRestriction: You can specify SASDATE only when you open a new file. If you specify the option \nat any other time, ODS writes a warning message to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition for ODS to use to write the RTF files."},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT= 'text-string'] \n \nInserts text into your RTF output. \n \nRestriction: You cannot use both the NEWFILE= and TEXT= options in the same ODS RTF statement. \nYou must use a separate ODS RTF statement for each of these options. \n\nRequirement: You must enclose a text-string in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE= 'title-text'] \n \nInserts the text string that you specify as the title into the metadata of a file.\n\ntitle-text \nis the text in the metadata of a file that indicates the title.\n\nRequirement: You must enclose a title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"TRANTAB=","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."},"StatementOptionType":"V"}]}},{"StatementName":"ODS TAGSETS.RTF","StatementHelp":{"#cdata":"Opens, manages, or closes the RTF destination, which produces measured output that is written in \nRich Text Format for use with Microsoft Word 2002.\n \nSyntax: \nODS TAGSETS.RTF <( identifier)> action; \nODS TAGSETS.RTF <( identifier)> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the RTF destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"See the SELECT or EXCLUDE option."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the base name for the RTF anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts the text string that you specify as the author into the metadata of a file."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates in the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BODYTITLE","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes are placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document.\n\nRestriction: The BODYTITLE option can be specified only when you create a new RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BODYTITLE_AUX","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes be placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document. These titles \nand footnotes are put into cells, which allows titles and footnotes to be centered, \nleft-justified, or right-justified.\n\nRestriction: You can specify the BODYTITLE_AUX option only when you are creating a new \nRTF file."},"StatementOptionType":"S"},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n | MAX] \n \nSpecifies the number of columns to place across each page of output. \n \nDefault: the number of one-inch columns that fit on the page."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Is the number of one-inch columns that you want on the page.","@ToolTip2":"Specifies the maximum number of one-inch-wide columns for the paper size and margin setting. This value is dependent upon the paper size and page orientation."}},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Produces a table of contents page for RTF documents that are opened in Microsoft \nWord. The table of contents page contains a Table of Contents field, which puts \nall of the contents information that is embedded in the document into a table of \ncontents. To expand the table of contents, right-click under the title in Microsoft \nWord and select Update Field from the selection list. \n\nRestriction: Do not use the CONTENTS option with the NEWFILE option."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default device for each \nopen output destination."},"StatementOptionType":"V"},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing \n(transcodes) of external files."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Opens the RTF destination and specifies the RTF file or SAS catalog to which to write. \nThis file remains open until you do one of the following actions:\n\n o Close the RTF destination with ODS RTF CLOSE or ODS _ALL_ CLOSE.\n\n o Specify a different file to which to write.\n\nSyntax: FILE= 'external-file' | fileref\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined footnotes within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined footnotes from appearing in the graphics file. Instead, \nthey become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined titles within the graphics output that is called \nby the body file."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined titles from appearing in the graphics output. Instead, the \ntitles become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 200. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."},"StatementOptionType":"V"},{"StatementOptionName":"KEEPN","StatementOptionHelp":{"#cdata":"ODS allows table splits only if the entire table cannot fit on one page."},"StatementOptionType":"S"},{"StatementOptionName":"NOKEEPN","StatementOptionHelp":{"#cdata":"ODS lets a table split at a page break."},"StatementOptionType":"S"},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS not to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"OPERATOR=","StatementOptionHelp":{"#cdata":"[Syntax: OPERATOR= 'text-string'] \n \nInserts the text you specify into the metadata of the RTF file."},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. If no \nname is specified, then the output is added to the unnamed package that was opened last."},"StatementOptionType":"S"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."},"StatementOptionType":"DV"},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"StatementOptionType":"V","SubOptionsKeywords":"NONE"},{"StatementOptionName":"SASDATE","StatementOptionHelp":{"#cdata":"Writes to the RTF file the time and the date that you started your SAS session. \n\nRestriction: You can specify SASDATE only when you open a new file. If you specify the option \nat any other time, ODS writes a warning message to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition for ODS to use to write the RTF files."},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT= 'text-string' ] \n \nInserts text into your RTF output. \n \nRestriction: You cannot use both the NEWFILE= and TEXT= options in the same ODS RTF \nstatement. You must use a separate ODS RTF statement for each of these options. \n\nRequirement: You must enclose a text-string in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE= 'title-text'] \n \nInserts the text string that you specify as the title into the metadata of a file.\n\ntitle-text \nis the text in the metadata of a file that indicates the title.\n\nRequirement: You must enclose a title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"TRANTAB=","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."},"StatementOptionType":"V"},{"StatementOptionName":"OPTIONS","StatementOptionHelp":{"#cdata":"Syntax: OPTIONS (CONTENTS= | DOC= | SECT= | TABLES_OFF= |TOC_DATA= |TROWD= |TRHDR= | TROWHDRCELL= ) \n \nSpecifies ODS TAGSETS.RTF specific suboptions and a named value. \n\n(CONTENTS= 'YES') \nproduces a table of contents (TOC) page for RTF documents that are opened in Microsoft Word.\n\n(DOC='QUICK' | 'HELP' | 'SETTINGS') \nprovides information about the tagset.\n\n(SECT='rtf_control_string' | 'OFF' | 'NONE') \ninserts RTF control words into the section data specifications.\n\nTABLES_OFF='style_elements' | 'STYLE_ELEMENTS' | 'OFF' ) \ndetermines whether tables will be used. \n\n(TOC_DATA ='ON' | 'OFF') \nspecifies whether to show the contents data in the RTF file.\n\n(TROWD='rtf_control_string' | ' OFF') \ninserts raw RTF specifications directly into header descriptions of the table row.\n\n(TRHDR='rtf_control_string' | 'OFF') \n\nTROWHDRCELL='text_string' | 'OFF') "},"StatementOptionType":"S","SubOPtionsKeywords":"CONTENTS=|DOC=|SECT=|TABLES_OFF=|TOC_DATA=|TROWD=|TRHDR=|TROWHDRCELL="},{"StatementOptionName":"PAGEPANELS=","StatementOptionHelp":{"#cdata":"Specifies the number of panels permitted per page before ODS inserts a page break."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"NONE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a positive integer. Replace n with an actual value.","@ToolTip2":"Specifies that paneling will be handled the way that it has always been handled by traditional ODS RTF. That is, all of the first panel is written, then all of the second panel, and so on, until all of the table information is written."}},{"StatementOptionName":"TABLEROWS=","StatementOptionHelp":{"#cdata":"[Syntax: TABLEROWS= n] \n \nSpecifies the number of rows in each table before ODS inserts a page break. If the \ntable is narrow enough to fit on a page, n lines will be written to the table before \na page break. If the table is too wide for a page, the page is broken into panels. \nIn each panel, n rows will be written. When all the panels for n rows have been \nwritten, a page break is inserted before the next group of panels is written."},"StatementOptionType":"V"},{"StatementOptionName":"UNIFORM","StatementOptionHelp":{"#cdata":"Ensures uniformity from page to page within a single table that requires multiple pages."},"StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"ODS SELECT","StatementHelp":{"#cdata":"Syntax: ODS SELECT selection(s) | ALL | NONE; \n \nSpecifies output objects for ODS destinations. Each selection has the following form: \n\noutput-object <(PERSIST)> \n\noutput-object \nspecifies the output object to select. \n\nTo specify an output object, you need to know which output objects your SAS program produces. \nThe ODS TRACE statement writes to the SAS log a trace record that includes the path, the label, \nand other information about each output object that your SAS program produces.\n\n(PERSIST) \nkeeps the output-object that precedes the PERSIST option in the selection list, even if the DATA \nor procedure step ends, until you explicitly modify the list with one of the following:\n\n o any ODS EXCLUDE statement\n o ODS SELECT NONE\n o ODS SELECT ALL\n o an ODS SELECT statement that applies to the same output object but does not specify PERSIST\n\nRequirement: You must enclose PERSIST in parentheses."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"Specifies that ODS send all of the output objects to the open destination. \n\nAlias: ODS SELECT DEFAULT \n\nInteraction: If you specify ALL without specifying a destination, ODS sets the overall list to SELECT ALL \nand sets all other lists to their defaults."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"Specifies that ODS does not send any output objects to the open destination.\n\nInteraction: If you specify NONE and you do not specify a destination, ODS sets the overall list to \nSELECT NONE and sets all other lists to their defaults. \n\nTip: Using the NONE action is different from closing a destination. The output destination is still \nopen, but ODS restricts the output that it sends to the destination. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want to \nresume sending output to the suspended destination."},"StatementOptionType":"V"},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"V"},{"StatementOptionName":"WHERE=","StatementOptionHelp":{"#cdata":"[Syntax: WHERE=where-expression] \n \nSelects output objects that meet a particular condition. For example, the following statement \nselects only output objects with the word \"Histogram\" in their name: \n\n ods select where=(_name_ ? 'Histogram');\n\nwhere-expression \nis an arithmetic or logical expression that consists of a sequence of operators and operands. \nwhere-expression has this form: \n\n (subsetting-variable ) \n\n subsetting-variable \n Subsetting variables are a special kind of WHERE expression operand used by SAS to help you find \n common values in items. For example, this ODS SELECT statement selects only output objects with \n the path City_Pop_90.TestsForLocation : \n\n ods select / where=(_path_ = 'City_Pop_90.TestsForLocation' );\n subsetting-variable is one of the following:\n\n _LABEL_ -- is the label of the output object\n _LABELPATH_ -- is the label path of the output object\n _NAME_ -- is the name of the output object.\n _PATH_ -- is the full or partial path of the output object. \n \noperator \ncompares a variable with a value or with another variable. operator can be AND, OR NOT, OR, AND NOT, \nor a comparison operator (= EQ ^= ~= <> NE > GT < LT >= GE <= LE)."},"StatementOptionType":"V"}]}},{"StatementName":"ODS EXCLUDE","StatementHelp":{"#cdata":"Syntax: ODS EXCLUDE exclusions(s) | ALL | NONE; \n \nSpecifies output objects to exclude from ODS destinations. Each exclusion has the following form: \n\n output-object <(PERSIST)> \n\noutput-object \nspecifies one or more output objects to exclude. To specify an output object, you need to know \nwhich output objects your SAS program produces. The ODS TRACE statement writes to the SAS log a \ntrace record that includes the path, the label, and other information about each output object \nthat is produced.\n\n(PERSIST) \nkeeps the output-object that precedes the PERSIST option in the exclusion list, even until you \\\nexplicitly modify the list with any of the following ODS statements:\n\n o any ODS SELECT statement\n o ODS EXCLUDE NONE\n o ODS EXCLUDE ALL\n o an ODS EXCLUDE statement that applies to the same output object but does not specify PERSIST\n\nThis action is true even if the DATA or procedure step ends.\n\nRequirement: You must enclose PERSIST in parentheses."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"Specifies that ODS does not send any output objects to the open destination.\n\nAlias: ODS EXCLUDE DEFAULT \n\nInteraction: If you specify ALL without specifying a destination, ODS sets the overall list to \nEXCLUDE ALL and sets all other lists to their defaults. \n\nTip: Using ODS EXCLUDE ALL is different from closing a destination. The destination remains open, \nbut no output objects are sent to it. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want \nto resume sending output to the suspended destination. "},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"Specifies that ODS send all of the output objects to the open destination.\n\nInteraction: If you specify the NONE argument without specifying a destination, ODS sets the overall \nlist to EXCLUDE NONE and sets all other lists to their defaults. \n\nTip: ODS EXCLUDE NONE has the same effect as ODS SELECT ALL. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want to \nresume sending output to the suspended destination."},"StatementOptionType":"V"},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"V"},{"StatementOptionName":"WHERE=","StatementOptionHelp":{"#cdata":"[Syntax: WHERE=where-expression] \n \nExcludes output objects that meet a particular condition. For example, the following statement \nexcludes only output objects with the word \"Histogram\" in their name: \n\n ods exclude where=(_name_ ? 'Histogram');\n\nwhere-expression \nis an arithmetic or logical expression that consists of a sequence of operators and operands. where-expression has this form: \n\n(subsetting-variable ) \n\n subsetting-variable \n Subsetting variables are a special kind of WHERE expression operand used by SAS to help you find \n common values in items. For example, this EXCLUDE statement excludes only output objects with \n the path City_Pop_90.TestsForLocation : \n\n ods exclude / where=(_path_ = 'City_Pop_90.TestsForLocation' );\n subsetting-variable is one of the following:\n\n _LABEL_ -- is the label of the output object\n _LABELPATH_ -- is the label path of the output object\n _NAME_ -- is the name of the output object.\n _PATH_ -- is the full or partial path of the output object. \n \noperator \ncompares a variable with a value or with another variable. operator can be AND, OR NOT, OR, AND NOT, \nor a comparison operator (= EQ ^= ~= <> NE > GT < LT >= GE <= LE)."},"StatementOptionType":"V"}]}},{"StatementName":"SIGNON","StatementHelp":{"#cdata":"Syntax: SIGNON ;\n \nInitiates a connection between a client session and a server session."},"StatementOptions":null},{"StatementName":"SIGNOFF","StatementHelp":{"#cdata":"Syntax: SIGNOFF \n \nEnds the connection between a client session and a server session."},"StatementOptions":null},{"StatementName":"RSUBMIT","StatementHelp":{"#cdata":"Syntax: RSUBMIT ; ENDRSUBMIT ; \n RDISPLAY \n RGET ; \n %SYSRPUT macro-variable=value; \n %SYSLPUT macro-variable=value ; \n WAITFOR <_ANY_ | _ALL_> task1...taskn ; \n LISTTASK <_ALL_ | task>; \n KILLTASK <_ALL_ | task1...taskn>; \n \nMarks the beginning of a block of statements that a client session submits to a server\nsession for execution."},"StatementOptions":null},{"StatementName":"ENDRSUBMIT","StatementHelp":{"#cdata":"Marks the end of a block of statements that a client session submits to a server session \nfor execution."},"StatementOptions":null},{"StatementName":"SYSTASK","StatementHelp":{"#cdata":"Syntax: SYSTASK COMMAND \"operating system command\"\n \n \n \n \n >; \n SYSTASK LIST <_ALL_ | taskname> ; \n SYSTASK KILL taskname ; \n \nExecutes, lists, or terminates asynchronous tasks."},"StatementOptions":null},{"StatementName":"LISTTASK","StatementHelp":{"#cdata":"Syntax: LISTTASK <_ALL_|task> ; \n \nLists all active connections or tasks and identifies the execution status of each connection or task."},"StatementOptions":null},{"StatementName":"KILLTASK","StatementHelp":{"#cdata":"Syntax: KILLTASK _ALL_ |task1...taskn ;\n \nFor asynchronous tasks, forces one or more active tasks or server sessions to terminate immediately."},"StatementOptions":null},{"StatementName":"RDISPLAY","StatementHelp":{"#cdata":"Syntax: RDISPLAY <server-ID >;\n \nCreates a Log window to display the lines from the log and an Output window to list the output \ngenerated from the execution of the statements within an asynchronous RSUBMIT block."},"StatementOptions":null},{"StatementName":"RGET","StatementHelp":{"#cdata":"Syntax: RGET <server-ID>;\n \nRetrieves the log and output that are created by an asynchronous RSUBMIT and merges them into the\nLog and Output windows of the client session."},"StatementOptions":null},{"StatementName":"WAITFOR","StatementHelp":{"#cdata":"Syntax: WAITFOR<_ANY_ | _ALL_> taskname ;\n \nSuspends execution of the current SAS session until the specified tasks finish executing."},"StatementOptions":null},{"StatementName":"METHOD","StatementHelp":{"#cdata":"Syntax: METHOD method ( [ [ ,... < parameter > ] ] ) \n [ RETURNS data-type ]>; \n ... method-body ... \n END; \n \n[This statement is valid only in DS2 and HPDS2 procedures.]\n\nDefines a block of code that can be called and executed multiple times."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"RETURNS","StatementOptionHelp":{"#cdata":"Syntax: RETURNS data-type \n \nSpecifies the data type of the value that the method returns. The type \ncan be any valid character, numeric, or date type."},"StatementOptionType":"S"},{"StatementOptionName":"INIT","StatementOptionHelp":{"#cdata":"Calls a TSPL system method where program initializations can take place.\n \n Syntax: \n METHOD INIT(); \n END; \n\nWithout Arguments\nThe METHOD INIT statement has no arguments. If you try to pass arguments, an error will occur.\n\nDetails: \nTypically, the INIT method will contain any initialization code such as variable initialization \nor opening of tables. Code in the INIT method will run once at the beginning of the TSPL program. \nBefore the INIT method has run, variables in the program data vector which have not been retained \n'(by using the RETAIN statement) will be set to either SAS missing values or null values depending \non whether you are in SAS mode or ANSI mode. \n\nEvery TSPL program will contain, either implicitly or explicitly, the INIT, RUN, and TERM methods. \nIf you do not specify a METHOD INIT statement, TSPL will automatically provide one."},"StatementOptionType":"S"},{"StatementOptionName":"RUN","StatementOptionHelp":{"#cdata":"\n \nSyntax:\n METHOD RUN(); \n END; \n\nWithout Arguments:\nThe METHOD RUN statement has no arguments. If you try to pass arguments, an error \nwill occur.\n\nDetails: \nTypically, the RUN method will contain the main TSPL program code. The RUN method \nhas the same feature of automatic, implicit looping as the Base SAS DATA step. After \nthe RUN method has been executed one time, the RUN method either runs again or \ncontrol is passed to the TERM method.\n\nEvery TSPL program will contain, either implicitly or explicitly, the INIT, RUN, \nand TERM methods. If you do not specify a METHOD RUN statement, TSPL will \nautomatically provide one."},"StatementOptionType":"S"},{"StatementOptionName":"TERM","StatementOptionHelp":{"#cdata":"\n \nSyntax:\n METHOD TERM(); \n END; \n \nWithout Arguments:\nThe METHOD TERM statement has no arguments. If you try to pass arguments, an error \nwill occur.\n\nDetails:\nTypically, the TERM method will contain any finalization code such as writing data \nto the SAS log. Code in the TERM method will run once at the end of the TSPL program.\n\nEvery TSPL program will contain, either implicitly or explicitly, the INIT, RUN, and \nTERM methods. If you do not specify a METHOD TERM statement, TSPL will automatically\nprovide one."},"StatementOptionType":"S"},{"StatementOptionName":"INT|INTEGER","StatementOptionHelp":{"#cdata":"Specifies an integer variable."},"StatementOptionType":"S"},{"StatementOptionName":"BIGINT","StatementOptionHelp":{"#cdata":"Specifies an integer variable."},"StatementOptionType":"S"},{"StatementOptionName":"IDENTITY","StatementOptionHelp":{"#cdata":"Specifies an integer variable."},"StatementOptionType":"S"},{"StatementOptionName":"SMALLINT","StatementOptionHelp":{"#cdata":"Specifies an integer variable."},"StatementOptionType":"S"},{"StatementOptionName":"TINYINT","StatementOptionHelp":{"#cdata":"Specifies an integer variable."},"StatementOptionType":"S"},{"StatementOptionName":"DOUBLE","StatementOptionHelp":{"#cdata":"Specifies a floating-point variable."},"StatementOptionType":"S"},{"StatementOptionName":"DOUBLE PRECISION","StatementOptionHelp":{"#cdata":"Specifies a floating-point variable."},"StatementOptionType":"S"},{"StatementOptionName":"FLOAT","StatementOptionHelp":{"#cdata":"Specifies a floating-point variable."},"StatementOptionType":"S"},{"StatementOptionName":"REAL","StatementOptionHelp":{"#cdata":"Specifies a floating-point variable."},"StatementOptionType":"S"},{"StatementOptionName":"VARBINARY|BINARY VARYING","StatementOptionHelp":{"#cdata":"Specifies a varying-length binary variable.\n\nAlias: BINARY VARYING \n\nRequirement: If you specify VARBINARY, you must also specify the length of the binary \nvariable in bytes."},"StatementOptionType":"S"},{"StatementOptionName":"NCHAR","StatementOptionHelp":{"#cdata":"Specifies a character variable."},"StatementOptionType":"S"},{"StatementOptionName":"NVARCHAR","StatementOptionHelp":{"#cdata":"Specifies a character variable."},"StatementOptionType":"S"},{"StatementOptionName":"CHAR","StatementOptionHelp":{"#cdata":"Specifies a character variable."},"StatementOptionType":"S"},{"StatementOptionName":"VARCHAR","StatementOptionHelp":{"#cdata":"Specifies a character variable."},"StatementOptionType":"S"},{"StatementOptionName":"TIME","StatementOptionHelp":{"#cdata":"Syntax: TIME (precision)\n \nSpecifies a time variable. \n\nprecision \nspecifies the precision for a TIME data type.\n\nDefault: 0"},"StatementOptionType":"S"},{"StatementOptionName":"TIMESTAMP","StatementOptionHelp":{"#cdata":"Syntax: TIMESTAMP (precision) \n \nSpecifies both a date and time variable. \n\nprecision \nspecifies the precision for a TIMESTAMP data type.\n\nDefault: 6"},"StatementOptionType":"S"},{"StatementOptionName":"DATE","StatementOptionHelp":{"#cdata":"Specifies a date variable."},"StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"PACKAGE","StatementHelp":{"#cdata":"[This statement is valid only in DS2 and HPDS2 procedures.]\n \nSyntax: \n(1) PACKAGE package [ / [SAS_ENCRYPT=YES|NO] [table-options]]; \n ... package-body ... \n \n [ ENDPACKAGE ] ; \n \n(2) PACKAGE { HASH | HITER } / EXTENSION= 'HASH' | 'HITER'; \n ... package-body ... \n \n [ ENDPACKAGE ] ; \n\nCreates a DS2 package. \n\npackage \nspecifies the package name. package can be one of these forms. \n\n catalog.schema.package \n schema.package \n catalog.package \n package \n\n catalog \n is an implementation of the ANSI SQL standard for an SQL catalog, which is a data container \n object that groups logically related schemas. \n\n schema \n is an implementation of the ANSI SQL standard for an SQL schema, which is a data container \n object that groups files such as tables and views and other objects supported by a data source \n such as stored procedures. \n\n package \n is the name of the package.\n Requirement: Package naming conventions are based on the data source."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"SAS_ENCRYPT=","StatementOptionHelp":{"#cdata":"Specifies the encryption algorithm. \n\nDefault: NO"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the SAS Proprietary algorithm.","@ToolTip2":"Specifies the Advanced Encryption Standard (AES) algorithm."}},{"StatementOptionName":"HASH","StatementOptionHelp":{"#cdata":"Specifies the name of the package as HASH to register the hash package \nfor use in a DS2 program."},"StatementOptionType":"RS"},{"StatementOptionName":"HITER","StatementOptionHelp":{"#cdata":"Specifies the name of the package as HITER to register the hash iterator package \nfor use in a DS2 program."},"StatementOptionType":"RS"},{"StatementOptionName":"EXTENSION=|EXT=","StatementOptionHelp":{"#cdata":"Specifies that the package is of type hash or hash iterator."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'HASH'","@Value2":"'HITER'"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the package is of type hash.","@ToolTip2":"Specifies that the package is of type hash iterator."}},{"StatementOptionName":"ALTER=","StatementOptionHelp":{"#cdata":"Syntax: ALTER=alter-password \n \nSyntax Description:\nalter-password \n must be a valid SAS name.\n \nDetails: \nThe ALTER= option applies only to a SAS data set. You can use this option to assign \na password or to access a read-protected, write-protected, or alter-protected file. \nWhen you replace a data set that is protected with an ALTER password, the new data \nset inherits the ALTER password. \n\nThe password is blotted out when the code is written in the SAS log. For example: \n\n set a(alter=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"BUFNO=","StatementOptionHelp":{"#cdata":"Specifies the number of buffers to be allocated for processing a SAS data set. \n \nSyntax: BUFNO= n | nK | hexX | MIN | MAX \n\nSyntax Description:\n\nn | nK \n specifies the number of buffers in multiples of 1 (bytes); 1,024 (kilobytes). For example, \n a value of 8 specifies 8 buffers, and a value of 1k specifies 1024 buffers.\n\nhex \n specifies the number of buffers as a hexadecimal value. You must specify the value beginning \n with a number (0-9), followed by an X. For example, the value 2dx sets the number of buffers \n to 45 buffers.\n\nMIN \n sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value \n for the operating environment. This is the default.\n\nMAX \n sets the number of buffers to the maximum possible number in your operating environment, \n up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."}},{"StatementOptionName":"BUFSIZE=","StatementOptionHelp":{"#cdata":"Specifies the size of a permanent buffer page for an output SAS data set. \n \nSyntax: BUFSIZE= n | nK | nM | nG | hexX | MAX \n\nSyntax Description:\n\nn | nK | nM | nG \nspecifies the page size in multiples of 1 (bytes); 1,024 (kilobytes); 1,048,576 (megabytes); \nor 1,073,741,824 (gigabytes). For example, a value of 8 specifies a page size of 8 bytes, and \na value of 4k specifies a page size of 4096 bytes. \n\nhexX \nspecifies the page size as a hexadecimal value. You must specify the value beginning with a \nnumber (0-9), followed by an X. For example, the value 2dx sets the page size to 45 bytes.\n\nMAX \nsets the page size to the maximum possible number in your operating environment, up to the \nlargest four-byte, signed integer, which is 231-1, or approximately 2 billion bytes."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the page size in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion bytes."}},{"StatementOptionName":"BULKLOAD=","StatementOptionHelp":{"#cdata":"Loads rows of data as one unit. Default value: NO \n \nSyntax: BULKLOAD=YES | NO \n\nSyntax Description:\n\nYES \ncalls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.\n\nNO \nuses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Calls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.","@ToolTip2":"Uses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."}},{"StatementOptionName":"COMPRESS=","StatementOptionHelp":{"#cdata":"Specifies how observations are compressed in a new output SAS data set. \n \nSyntax: COMPRESS=NO | YES | CHAR | BINARY \n\nSyntax Description:\nNO \nspecifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).\n\nYES | CHAR \nspecifies that the observations in a newly created SAS data set are compressed (variable-length records) \nby SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive \ncharacters (including blanks) to two-byte or three-byte representations. \n\n Alias: ON \n Tip: Use this compression algorithm for character data. \n Note: COMPRESS=CHAR is accepted by Version 7 and later versions. \n\nBINARY \n specifies that the observations in a newly created SAS data set are compressed (variable-length records) \n by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression \n to compress the file.\n\n Tip: This method is highly effective for compressing medium to large (several hundred bytes or larger) \n blocks of binary data (numeric variables). Because the compression function operates on a single record \n at a time, the record length needs to be several hundred bytes or larger for effective compression."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO","@Value2":"YES|ON","@Value3":"CHAR","@Value4":"BINARY"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations.","@ToolTip3":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations. COMPRESS=CHAR is accepted by Version 7 and later versions.","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression to compress the file."}},{"StatementOptionName":"DBKEY=","StatementOptionHelp":{"#cdata":"Specifies a key column to optimize DBMS retrieval. Can improve performance when you \nare processing a join that involves a large DBMS table and a small SAS data set \nor DBMS table.\n \nSyntax: DBKEY=([ ' ] column [ ' ] [... [ ' ] column [ ' ] ]) \n\nSyntax Description: \n\ncolumn \n used by SAS to build an internal WHERE clause to search for matches in the DBMS table \n based on the key column. For example:\n\n select * from sas.a, dbms.b(dbkey=x) where a.x=b.x;\n \nIn this example, DBKEY= specifies column x , which matches the key column designated in \nthe WHERE clause. However, if the DBKEY= column does NOT match the key column in the \nWHERE clause, then DBKEY= is not used."},"StatementOptionType":"V"},{"StatementOptionName":"DBNULL=","StatementOptionHelp":{"#cdata":"Indicates whether NULL is a valid value for the specified columns when a table is created. \n \nSyntax: DBNULL={ _ALL=YES | NO } | ( [column=YES | NO [ ... column=YES | NO ] ] ) \n\nSyntax Description: \n_ALL_ \n specifies that the YES or NO applies to all columns in the table. (This is valid in \n the interfaces to Informix, Oracle, Sybase, and Teradata only.)\n\nYES \n specifies that the NULL value is valid for the specified columns in the DBMS table.\n\nNO \n specifies that the NULL value is not valid for the specified columns in the DBMS table.\n\ncolumn \n specifies the name of a column. \n\nDetails: \nThis option is valid only for creating DBMS tables. If you specify more than one column name, \nthe names must be separated with spaces.\n\nThe DBNULL= option processes values from left to right, so if you specify a column name twice, \nor if you use the _ALL_ value, the last value overrides the first value that is specified for \nthe column."},"StatementOptionType":"V","SubOptionsKeywords":"_ALL_"},{"StatementOptionName":"DROP=","StatementOptionHelp":{"#cdata":"For an input table, excludes the specified columns from processing; for an output table, excludes the specified columns from being written to the table.\n \nSyntax: DROP= ( column-list ); \n\nArguments: \ncolumn-list \n specifies the names of the columns to omit from the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the format \n col: are not supported. \n \nDetails: \nThe DROP= table option specifies that all columns in the column-list should not be included \nin the creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the drop attribute is specified, all columns not included in the drop \nstatement will be used to create columns in the output rows.\n\nIf the DROP= table option is associated with an input table, the columns are not available \nfor processing during program execution."},"StatementOptionType":"V"},{"StatementOptionName":"ENCRYPT=","StatementOptionHelp":{"#cdata":"Specifies whether to encrypt an output SAS data set. \n \nSyntax: ENCRYPT=YES | NO \n\nSyntax Description:\nYES \n encrypts the file. The encryption method uses passwords. At a minimum, you must specify \n the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because \n the encryption method uses passwords, you cannot change any password on an encrypted data \n set without re-creating the data set.\n\nNO \n does not encrypt the file.\n\nCAUTION:\nRecord all passwords. \nIf you forget the password, you cannot reset it without assistance from SAS. The process \nis time-consuming and resource-intensive."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Encrypts the file. The encryption method uses passwords. At a minimum, you must specify the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because the encryption method uses passwords, you cannot change any password on an encrypted data set without re-creating the data set.","@ToolTip2":"Does not encrypt the file."}},{"StatementOptionName":"KEEP=","StatementOptionHelp":{"#cdata":"For an input table, specifies the columns to process; for an output table, specifies \nthe columns to write to the table. \n \nSyntax: KEEP=( column-list ); \n\nArguments:\n\ncolumn-list \n specifies the names of the columns to keep in the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the \n format col: are not supported. \n \nDetails: \nThe KEEP= table option specifies that all columns in the column-list should be included in \nthe creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the keep attribute is specified, all columns not included in the KEEP \nstatement will be dropped from the output rows.\n\nIf the KEEP= table option is associated with an input table, only the columns that are \nspecified by the KEEP= table option are available for processing during program execution."},"StatementOptionType":"V"},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"Specifies a label for a table.\n \nSyntax: LABEL='label' \n\nSyntax Description: \n\n'label' \n specifies a text string of up to 256 characters. If the label text contains single \n quotation marks, use double quotation marks around the label, or use two single \n quotation marks in the label text and surround the string with single quotation \n marks. To remove a label from a table, assign a label that is equal to a blank \n that is enclosed in quotation marks.\n \nDetails: \nYou can use the LABEL= option on both input and output tables. When you use LABEL= \non input tables, it assigns a label for the table for the duration of the DS2 program. \nWhen it is specified for an output table, the label becomes a permanent part of that \ntable."},"StatementOptionType":"V"},{"StatementOptionName":"LOCKTABLE=","StatementOptionHelp":{"#cdata":"Places shared or exclusive locks on tables. \n \nSyntax: LOCKTABLE=SHARE | EXCLUSIVE \n\nSyntax Description:\n\nSHARE \n locks a table in shared mode, allowing other users or processes to read data from the \n tables, but preventing users from updating data.\n\nEXCLUSIVE \n locks a table exclusively, preventing other users from accessing any table that you open. \n\nDetails: \nYou can lock tables only if you are the owner or have been granted the necessary privilege. \n\nIf you access the BASE table driver through PROC DS2, the default value for the LOCKTABLE \noption is EXCLUSIVE. However, if you access the BASE table driver through a table server, \nor if you run your program locally with the SAS Table Server LIBNAME engine, the default \nvalue for the LOCKTABLE option is SHARE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"SHARE","@Value2":"EXCLUSIVE"},"StatementOptionToolTips":{"@ToolTip1":"Locks a table in shared mode, allowing other users or processes to read data from the tables, but preventing users from updating data.","@ToolTip2":"Locks a table exclusively, preventing other users from accessing any table that you open."}},{"StatementOptionName":"OVERWRITE=","StatementOptionHelp":{"#cdata":"For a table, drops the output table before the replacement output table is populated \nwith rows; for packages and threads, drops the existing package or thread if a package \nor thread by the same name exists. \n \nSyntax: OVERWRITE= YES | NO; \n\nArguments: \n\nYES | NO \n specifies whether the output table is deleted before a replacement output table \n is created or whether a package or thread is dropped.\n\n Default: NO \n\nCAUTION:\nFor tables, use the OVERWRITE=YES statement only with data that is backed up or \nwith data that you can reconstruct. Because the output table is deleted first, \ndata will be lost if a failure occurs while the output table is being written."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the output table is deleted before a replacement output table is created or a package or thread is dropped.","@ToolTip2":"Specifies that the output table is not deleted before a replacement output table is created or a package or thread is dropped."}},{"StatementOptionName":"PW=","StatementOptionHelp":{"#cdata":"Assigns a READ, WRITE, and ALTER password to a SAS file, and enables access to a password-protected SAS file. \n \nSyntax: PW=password \n\nSyntax Description:\npassword \n must be a valid SAS name.\n\nDetails:\nThe PW= option applies to all types of SAS files. You can use this option to assign \na password to a SAS file or to access a password-protected SAS file.\n\nWhen replacing a SAS data set that is protected by an ALTER password, the new data \nset inherits the ALTER password. When the code is written to the SAS log the password \nis blotted out, for example: \n\n drop thread job2 (pw=xxxxxxx);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"READ=","StatementOptionHelp":{"#cdata":"Assigns a READ password to a SAS file that prevents users from reading the file, \nunless they enter the password. \n \nSyntax: READ=read-password \n\nSyntax Description: \nread-password \n must be a valid SAS name. \n \nDetails: \nThe READ= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a read-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n declare package sales (read=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"RENAME=","StatementOptionHelp":{"#cdata":"Changes the name of a column.\n \nSyntax: RENAME= (old-name { = | AS } new-name [... old-name { = | AS } new-name ] ) ; \n\nArguments: \nold-name \n the column you want to rename.\n\nnew-name \n the new name of the column. It must be a valid name for the data source.\n \nDetails: \nThe RENAME= table option allows you to change the names of one or more columns.\n\nIf you use RENAME= when you create a table, the new column name is included in the output \ntable. If you use RENAME= on an input table, the new name is used in DS2 programming statements.\n\nIf you use RENAME= in the same DS2 program with either the DROP= or the KEEP= table option, \nthe DROP= and the KEEP= table options are applied before RENAME=. You must use the old name in \nthe DROP= and KEEP= table options. You cannot drop and rename the same column in the same statement.\n\nIn addition to changing the name of a column, RENAME= also changes the label for the column."},"StatementOptionType":"V","SubOptionsKeywords":"AS"},{"StatementOptionName":"AS","StatementOptionHelp":{"#cdata":"Syntax: RENAME= (old-name AS new-name [... old-name AS new-name ] ) ;\n \nSeparates the new-name from the old-name."},"StatementOptionType":"S"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the data set type for a specially structured SAS data set. \n \nSyntax: TYPE=data-set-type \n\nSyntax Description: \ndata-set-type \n specifies the special type of the data set.\n\nDetails: \nUse the TYPE= table option to create a special SAS data set in the proper format, \nor to identify the special type of the SAS data set in a procedure statement. \n\nYou can use the CONTENTS procedure to determine the type of a data set."},"StatementOptionType":"V"},{"StatementOptionName":"WRITE=","StatementOptionHelp":{"#cdata":"Assigns a WRITE password to a SAS file that prevents users from writing to a file, \nunless they enter the password. \n \nSyntax: WRITE=write-password \n\nSyntax Description: \nwrite-password \n must be a valid SAS name. \n \nDetails: \nThe WRITE= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a write-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n drop thread job2a (write=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"V"}],"#comment":{}}},{"StatementName":"ENDPACKAGE","StatementHelp":{"#cdata":"[This statement is valid only in DS2 and HPDS2 procedures.]\n \nSyntax: ENDPACKAGE; \n \nMarks the end of a PACKAGE statement. \n\nAlthough the ENDPACKAGE statement is not required, it can make the code easier to read."}},{"StatementName":"THREAD","StatementHelp":{"#cdata":"[This statement is valid only in DS2 and HPDS2 procedures.]\n \nSyntax: THREAD thread [ ( data-type variable [ , ... data-type variable ] ) ] [ / [SAS_ENCRYPT=YES|NO] [table-options]]; \n ... thread-body ... \n \n [ ENDTHREAD ; ] \n\nCreates a DS2 program thread. \n\nthread \nspecifies the thread name. thread can be one of these forms. \n\n catalog.schema.thread \n schema.thread \n catalog.thread \n thread \n\n catalog \n is an implementation of the ANSI SQL standard for an SQL catalog, which is a data container \n object that groups logically related schemas. \n\n schema \n is an implementation of the ANSI SQL standard for an SQL schema, which is a data container \n object that groups files such as tables and views and other objects supported by a data source \n such as stored procedures. \n\n thread \n is the name of the thread.\n Requirement: Thread naming conventions are based on the data source."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"SAS_ENCRYPT=","StatementOptionHelp":{"#cdata":"Specifies the encryption algorithm. \n\nDefault: NO"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the SAS Proprietary algorithm.","@ToolTip2":"Specifies the Advanced Encryption Standard (AES) algorithm."}},{"StatementOptionName":"ALTER=","StatementOptionHelp":{"#cdata":"Syntax: ALTER=alter-password \n \nSyntax Description:\nalter-password \n must be a valid SAS name.\n \nDetails: \nThe ALTER= option applies only to a SAS data set. You can use this option to assign \na password or to access a read-protected, write-protected, or alter-protected file. \nWhen you replace a data set that is protected with an ALTER password, the new data \nset inherits the ALTER password. \n\nThe password is blotted out when the code is written in the SAS log. For example: \n\n set a(alter=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"BUFNO=","StatementOptionHelp":{"#cdata":"Specifies the number of buffers to be allocated for processing a SAS data set. \n \nSyntax: BUFNO= n | nK | hexX | MIN | MAX \n\nSyntax Description:\n\nn | nK \n specifies the number of buffers in multiples of 1 (bytes); 1,024 (kilobytes). For example, \n a value of 8 specifies 8 buffers, and a value of 1k specifies 1024 buffers.\n\nhex \n specifies the number of buffers as a hexadecimal value. You must specify the value beginning \n with a number (0-9), followed by an X. For example, the value 2dx sets the number of buffers \n to 45 buffers.\n\nMIN \n sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value \n for the operating environment. This is the default.\n\nMAX \n sets the number of buffers to the maximum possible number in your operating environment, \n up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."}},{"StatementOptionName":"BUFSIZE=","StatementOptionHelp":{"#cdata":"Specifies the size of a permanent buffer page for an output SAS data set. \n \nSyntax: BUFSIZE= n | nK | nM | nG | hexX | MAX \n\nSyntax Description:\n\nn | nK | nM | nG \nspecifies the page size in multiples of 1 (bytes); 1,024 (kilobytes); 1,048,576 (megabytes); \nor 1,073,741,824 (gigabytes). For example, a value of 8 specifies a page size of 8 bytes, and \na value of 4k specifies a page size of 4096 bytes. \n\nhexX \nspecifies the page size as a hexadecimal value. You must specify the value beginning with a \nnumber (0-9), followed by an X. For example, the value 2dx sets the page size to 45 bytes.\n\nMAX \nsets the page size to the maximum possible number in your operating environment, up to the \nlargest four-byte, signed integer, which is 231-1, or approximately 2 billion bytes."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the page size in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion bytes."}},{"StatementOptionName":"BULKLOAD=","StatementOptionHelp":{"#cdata":"Loads rows of data as one unit. Default value: NO \n \nSyntax: BULKLOAD=YES | NO \n\nSyntax Description:\n\nYES \ncalls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.\n\nNO \nuses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Calls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.","@ToolTip2":"Uses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."}},{"StatementOptionName":"COMPRESS=","StatementOptionHelp":{"#cdata":"Specifies how observations are compressed in a new output SAS data set. \n \nSyntax: COMPRESS=NO | YES | CHAR | BINARY \n\nSyntax Description:\nNO \nspecifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).\n\nYES | CHAR \nspecifies that the observations in a newly created SAS data set are compressed (variable-length records) \nby SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive \ncharacters (including blanks) to two-byte or three-byte representations. \n\n Alias: ON \n Tip: Use this compression algorithm for character data. \n Note: COMPRESS=CHAR is accepted by Version 7 and later versions. \n\nBINARY \n specifies that the observations in a newly created SAS data set are compressed (variable-length records) \n by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression \n to compress the file.\n\n Tip: This method is highly effective for compressing medium to large (several hundred bytes or larger) \n blocks of binary data (numeric variables). Because the compression function operates on a single record \n at a time, the record length needs to be several hundred bytes or larger for effective compression."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO","@Value2":"YES|ON","@Value3":"CHAR","@Value4":"BINARY"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations.","@ToolTip3":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations. COMPRESS=CHAR is accepted by Version 7 and later versions.","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression to compress the file."}},{"StatementOptionName":"DBKEY=","StatementOptionHelp":{"#cdata":"Specifies a key column to optimize DBMS retrieval. Can improve performance when you \nare processing a join that involves a large DBMS table and a small SAS data set \nor DBMS table.\n \nSyntax: DBKEY=([ ' ] column [ ' ] [... [ ' ] column [ ' ] ]) \n\nSyntax Description: \n\ncolumn \n used by SAS to build an internal WHERE clause to search for matches in the DBMS table \n based on the key column. For example:\n\n select * from sas.a, dbms.b(dbkey=x) where a.x=b.x;\n \nIn this example, DBKEY= specifies column x , which matches the key column designated in \nthe WHERE clause. However, if the DBKEY= column does NOT match the key column in the \nWHERE clause, then DBKEY= is not used."},"StatementOptionType":"V"},{"StatementOptionName":"DBNULL=","StatementOptionHelp":{"#cdata":"Indicates whether NULL is a valid value for the specified columns when a table is created. \n \nSyntax: DBNULL={ _ALL=YES | NO } | ( [column=YES | NO [ ... column=YES | NO ] ] ) \n\nSyntax Description: \n_ALL_ \n specifies that the YES or NO applies to all columns in the table. (This is valid in \n the interfaces to Informix, Oracle, Sybase, and Teradata only.)\n\nYES \n specifies that the NULL value is valid for the specified columns in the DBMS table.\n\nNO \n specifies that the NULL value is not valid for the specified columns in the DBMS table.\n\ncolumn \n specifies the name of a column. \n\nDetails: \nThis option is valid only for creating DBMS tables. If you specify more than one column name, \nthe names must be separated with spaces.\n\nThe DBNULL= option processes values from left to right, so if you specify a column name twice, \nor if you use the _ALL_ value, the last value overrides the first value that is specified for \nthe column."},"StatementOptionType":"V","SubOptionsKeywords":"_ALL_"},{"StatementOptionName":"DROP=","StatementOptionHelp":{"#cdata":"For an input table, excludes the specified columns from processing; for an output table, excludes the specified columns from being written to the table.\n \nSyntax: DROP= ( column-list ); \n\nArguments: \ncolumn-list \n specifies the names of the columns to omit from the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the format \n col: are not supported. \n \nDetails: \nThe DROP= table option specifies that all columns in the column-list should not be included \nin the creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the drop attribute is specified, all columns not included in the drop \nstatement will be used to create columns in the output rows.\n\nIf the DROP= table option is associated with an input table, the columns are not available \nfor processing during program execution."},"StatementOptionType":"V"},{"StatementOptionName":"ENCRYPT=","StatementOptionHelp":{"#cdata":"Specifies whether to encrypt an output SAS data set. \n \nSyntax: ENCRYPT=YES | NO \n\nSyntax Description:\nYES \n encrypts the file. The encryption method uses passwords. At a minimum, you must specify \n the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because \n the encryption method uses passwords, you cannot change any password on an encrypted data \n set without re-creating the data set.\n\nNO \n does not encrypt the file.\n\nCAUTION:\nRecord all passwords. \nIf you forget the password, you cannot reset it without assistance from SAS. The process \nis time-consuming and resource-intensive."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Encrypts the file. The encryption method uses passwords. At a minimum, you must specify the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because the encryption method uses passwords, you cannot change any password on an encrypted data set without re-creating the data set.","@ToolTip2":"Does not encrypt the file."}},{"StatementOptionName":"KEEP=","StatementOptionHelp":{"#cdata":"For an input table, specifies the columns to process; for an output table, specifies \nthe columns to write to the table. \n \nSyntax: KEEP=( column-list ); \n\nArguments:\n\ncolumn-list \n specifies the names of the columns to keep in the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the \n format col: are not supported. \n \nDetails: \nThe KEEP= table option specifies that all columns in the column-list should be included in \nthe creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the keep attribute is specified, all columns not included in the KEEP \nstatement will be dropped from the output rows.\n\nIf the KEEP= table option is associated with an input table, only the columns that are \nspecified by the KEEP= table option are available for processing during program execution."},"StatementOptionType":"V"},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"Specifies a label for a table.\n \nSyntax: LABEL='label' \n\nSyntax Description: \n\n'label' \n specifies a text string of up to 256 characters. If the label text contains single \n quotation marks, use double quotation marks around the label, or use two single \n quotation marks in the label text and surround the string with single quotation \n marks. To remove a label from a table, assign a label that is equal to a blank \n that is enclosed in quotation marks.\n \nDetails: \nYou can use the LABEL= option on both input and output tables. When you use LABEL= \non input tables, it assigns a label for the table for the duration of the DS2 program. \nWhen it is specified for an output table, the label becomes a permanent part of that \ntable."},"StatementOptionType":"V"},{"StatementOptionName":"LOCKTABLE=","StatementOptionHelp":{"#cdata":"Places shared or exclusive locks on tables. \n \nSyntax: LOCKTABLE=SHARE | EXCLUSIVE \n\nSyntax Description:\n\nSHARE \n locks a table in shared mode, allowing other users or processes to read data from the \n tables, but preventing users from updating data.\n\nEXCLUSIVE \n locks a table exclusively, preventing other users from accessing any table that you open. \n\nDetails: \nYou can lock tables only if you are the owner or have been granted the necessary privilege. \n\nIf you access the BASE table driver through PROC DS2, the default value for the LOCKTABLE \noption is EXCLUSIVE. However, if you access the BASE table driver through a table server, \nor if you run your program locally with the SAS Table Server LIBNAME engine, the default \nvalue for the LOCKTABLE option is SHARE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"SHARE","@Value2":"EXCLUSIVE"},"StatementOptionToolTips":{"@ToolTip1":"Locks a table in shared mode, allowing other users or processes to read data from the tables, but preventing users from updating data.","@ToolTip2":"Locks a table exclusively, preventing other users from accessing any table that you open."}},{"StatementOptionName":"OVERWRITE=","StatementOptionHelp":{"#cdata":"For a table, drops the output table before the replacement output table is populated \nwith rows; for packages and threads, drops the existing package or thread if a package \nor thread by the same name exists. \n \nSyntax: OVERWRITE= YES | NO; \n\nArguments: \n\nYES | NO \n specifies whether the output table is deleted before a replacement output table \n is created or whether a package or thread is dropped.\n\n Default: NO \n\nCAUTION:\nFor tables, use the OVERWRITE=YES statement only with data that is backed up or \nwith data that you can reconstruct. Because the output table is deleted first, \ndata will be lost if a failure occurs while the output table is being written."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the output table is deleted before a replacement output table is created or a package or thread is dropped.","@ToolTip2":"Specifies that the output table is not deleted before a replacement output table is created or a package or thread is dropped."}},{"StatementOptionName":"PW=","StatementOptionHelp":{"#cdata":"Assigns a READ, WRITE, and ALTER password to a SAS file, and enables access to a password-protected SAS file. \n \nSyntax: PW=password \n\nSyntax Description:\npassword \n must be a valid SAS name.\n\nDetails:\nThe PW= option applies to all types of SAS files. You can use this option to assign \na password to a SAS file or to access a password-protected SAS file.\n\nWhen replacing a SAS data set that is protected by an ALTER password, the new data \nset inherits the ALTER password. When the code is written to the SAS log the password \nis blotted out, for example: \n\n drop thread job2 (pw=xxxxxxx);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"READ=","StatementOptionHelp":{"#cdata":"Assigns a READ password to a SAS file that prevents users from reading the file, \nunless they enter the password. \n \nSyntax: READ=read-password \n\nSyntax Description: \nread-password \n must be a valid SAS name. \n \nDetails: \nThe READ= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a read-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n declare package sales (read=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"V"},{"StatementOptionName":"RENAME=","StatementOptionHelp":{"#cdata":"Changes the name of a column.\n \nSyntax: RENAME= (old-name { = | AS } new-name [... old-name { = | AS } new-name ] ) ; \n\nArguments: \nold-name \n the column you want to rename.\n\nnew-name \n the new name of the column. It must be a valid name for the data source.\n \nDetails: \nThe RENAME= table option allows you to change the names of one or more columns.\n\nIf you use RENAME= when you create a table, the new column name is included in the output \ntable. If you use RENAME= on an input table, the new name is used in DS2 programming statements.\n\nIf you use RENAME= in the same DS2 program with either the DROP= or the KEEP= table option, \nthe DROP= and the KEEP= table options are applied before RENAME=. You must use the old name in \nthe DROP= and KEEP= table options. You cannot drop and rename the same column in the same statement.\n\nIn addition to changing the name of a column, RENAME= also changes the label for the column."},"StatementOptionType":"V","SubOptionsKeywords":"AS"},{"StatementOptionName":"AS","StatementOptionHelp":{"#cdata":"Syntax: RENAME= (old-name AS new-name [... old-name AS new-name ] ) ;\n \nSeparates the new-name from the old-name."},"StatementOptionType":"S"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the data set type for a specially structured SAS data set. \n \nSyntax: TYPE=data-set-type \n\nSyntax Description: \ndata-set-type \n specifies the special type of the data set.\n\nDetails: \nUse the TYPE= table option to create a special SAS data set in the proper format, \nor to identify the special type of the SAS data set in a procedure statement. \n\nYou can use the CONTENTS procedure to determine the type of a data set."},"StatementOptionType":"V"},{"StatementOptionName":"WRITE=","StatementOptionHelp":{"#cdata":"Assigns a WRITE password to a SAS file that prevents users from writing to a file, \nunless they enter the password. \n \nSyntax: WRITE=write-password \n\nSyntax Description: \nwrite-password \n must be a valid SAS name. \n \nDetails: \nThe WRITE= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a write-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n drop thread job2a (write=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"V"}],"#comment":{}}},{"StatementName":"ENDTHREAD","StatementHelp":{"#cdata":"[This statement is valid only in DS2 and HPDS2 procedures.]\n \nSyntax: ENDTHREAD; \n \nMarks the end of a THREAD statement. \n\nAlthough the ENDTHREAD statement is not required, it can make the code easier to read."},"StatementOptions":null},{"StatementName":"TABLE","StatementHelp":{"#cdata":"[This statement is valid only in DS2 and HPDS2 procedures.]\n \nSyntax: TABLE | DATA [ ] [... ] ; \n ... program-body ... \n \n [ ENDTABLE | ENDDATA; ] \n\nBegins a DS2 program and provides names for any output tables. \n\n::=table (table-options)\n | _ROWSET_ (table-options)\n | _NULL_\n \nWithout Arguments:\nIf you do not specify any table names with the TABLE|DATA statement, then the DS2 program \nreturns table rows to the client application and no tables are created.\n\nArguments:\ntable \nspecifies the name of the table. table can be one of these forms. \n\n catalog.schema.table-name \n schema.table-name \n catalog.table-name \n table-name \n \nwhere:\n catalog \n is an implementation of the ANSI SQL standard for an SQL catalog, which is a data \n container object that groups logically related schemas. \n\n schema \n is an implementation of the ANSI SQL standard for an SQL schema, which is a data \n container object that groups files such as tables and views and other objects supported \n by a data source such as stored procedures. \n\n table-name \n is the name of the table.\n\n Requirements: Table naming conventions are based on the data source.\n\n_ROWSET_\nspecifies that the DATA statement should not create a table, but it should instead return \ntable rows to the client application.\n\n_NULL_\nspecifies that the DATA statement should not create a table or return rows to the client \napplication.\n\ntable-options\nspecifies optional arguments that the DS2 program applies when it writes rows to the output table."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"_ROWSET_","StatementOptionHelp":{"#cdata":"Specifies that the TABLE statement should not create a table, but it should instead \nreturn table rows to the client application."},"StatementOptionType":"S"},{"StatementOptionName":"_NULL_","StatementOptionHelp":{"#cdata":"Specifies that the TABLE statement should not create a table or return rows to the client application."},"StatementOptionType":"S"},{"StatementOptionName":"ALTER=","StatementOptionHelp":{"#cdata":"Syntax: ALTER=alter-password \n \nSyntax Description:\nalter-password \n must be a valid SAS name.\n \nDetails: \nThe ALTER= option applies only to a SAS data set. You can use this option to assign \na password or to access a read-protected, write-protected, or alter-protected file. \nWhen you replace a data set that is protected with an ALTER password, the new data \nset inherits the ALTER password. \n\nThe password is blotted out when the code is written in the SAS log. For example: \n\n set a(alter=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"TV"},{"StatementOptionName":"BUFNO=","StatementOptionHelp":{"#cdata":"Specifies the number of buffers to be allocated for processing a SAS data set. \n \nSyntax: BUFNO= n | nK | hexX | MIN | MAX \n\nSyntax Description:\n\nn | nK \n specifies the number of buffers in multiples of 1 (bytes); 1,024 (kilobytes). For example, \n a value of 8 specifies 8 buffers, and a value of 1k specifies 1024 buffers.\n\nhex \n specifies the number of buffers as a hexadecimal value. You must specify the value beginning \n with a number (0-9), followed by an X. For example, the value 2dx sets the number of buffers \n to 45 buffers.\n\nMIN \n sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value \n for the operating environment. This is the default.\n\nMAX \n sets the number of buffers to the maximum possible number in your operating environment, \n up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."}},{"StatementOptionName":"BUFSIZE=","StatementOptionHelp":{"#cdata":"Specifies the size of a permanent buffer page for an output SAS data set. \n \nSyntax: BUFSIZE= n | nK | nM | nG | hexX | MAX \n\nSyntax Description:\n\nn | nK | nM | nG \nspecifies the page size in multiples of 1 (bytes); 1,024 (kilobytes); 1,048,576 (megabytes); \nor 1,073,741,824 (gigabytes). For example, a value of 8 specifies a page size of 8 bytes, and \na value of 4k specifies a page size of 4096 bytes. \n\nhexX \nspecifies the page size as a hexadecimal value. You must specify the value beginning with a \nnumber (0-9), followed by an X. For example, the value 2dx sets the page size to 45 bytes.\n\nMAX \nsets the page size to the maximum possible number in your operating environment, up to the \nlargest four-byte, signed integer, which is 231-1, or approximately 2 billion bytes."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the page size in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion bytes."}},{"StatementOptionName":"BULKLOAD=","StatementOptionHelp":{"#cdata":"Loads rows of data as one unit. Default value: NO \n \nSyntax: BULKLOAD=YES | NO \n\nSyntax Description:\n\nYES \ncalls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.\n\nNO \nuses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Calls a DBMS-specific bulk load facility in order to insert or append rows to a DBMS table.","@ToolTip2":"Uses the dynamic SAS/ACCESS engine to insert or append data to a DBMS table."}},{"StatementOptionName":"COMPRESS=","StatementOptionHelp":{"#cdata":"Specifies how observations are compressed in a new output SAS data set. \n \nSyntax: COMPRESS=NO | YES | CHAR | BINARY \n\nSyntax Description:\nNO \nspecifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).\n\nYES | CHAR \nspecifies that the observations in a newly created SAS data set are compressed (variable-length records) \nby SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive \ncharacters (including blanks) to two-byte or three-byte representations. \n\n Alias: ON \n Tip: Use this compression algorithm for character data. \n Note: COMPRESS=CHAR is accepted by Version 7 and later versions. \n\nBINARY \n specifies that the observations in a newly created SAS data set are compressed (variable-length records) \n by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression \n to compress the file.\n\n Tip: This method is highly effective for compressing medium to large (several hundred bytes or larger) \n blocks of binary data (numeric variables). Because the compression function operates on a single record \n at a time, the record length needs to be several hundred bytes or larger for effective compression."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"NO","@Value2":"YES|ON","@Value3":"CHAR","@Value4":"BINARY"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations.","@ToolTip3":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding). RLE compresses observations by reducing repeated consecutive characters (including blanks) to two-byte or three-byte representations. COMPRESS=CHAR is accepted by Version 7 and later versions.","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression). RDC combines run-length encoding and sliding-window compression to compress the file."}},{"StatementOptionName":"DBKEY=","StatementOptionHelp":{"#cdata":"Specifies a key column to optimize DBMS retrieval. Can improve performance when you \nare processing a join that involves a large DBMS table and a small SAS data set \nor DBMS table.\n \nSyntax: DBKEY=([ ' ] column [ ' ] [... [ ' ] column [ ' ] ]) \n\nSyntax Description: \n\ncolumn \n used by SAS to build an internal WHERE clause to search for matches in the DBMS table \n based on the key column. For example:\n\n select * from sas.a, dbms.b(dbkey=x) where a.x=b.x;\n \nIn this example, DBKEY= specifies column x , which matches the key column designated in \nthe WHERE clause. However, if the DBKEY= column does NOT match the key column in the \nWHERE clause, then DBKEY= is not used."},"StatementOptionType":"TV"},{"StatementOptionName":"DBNULL=","StatementOptionHelp":{"#cdata":"Indicates whether NULL is a valid value for the specified columns when a table is created. \n \nSyntax: DBNULL={ _ALL=YES | NO } | ( [column=YES | NO [ ... column=YES | NO ] ] ) \n\nSyntax Description: \n_ALL_ \n specifies that the YES or NO applies to all columns in the table. (This is valid in \n the interfaces to Informix, Oracle, Sybase, and Teradata only.)\n\nYES \n specifies that the NULL value is valid for the specified columns in the DBMS table.\n\nNO \n specifies that the NULL value is not valid for the specified columns in the DBMS table.\n\ncolumn \n specifies the name of a column. \n\nDetails: \nThis option is valid only for creating DBMS tables. If you specify more than one column name, \nthe names must be separated with spaces.\n\nThe DBNULL= option processes values from left to right, so if you specify a column name twice, \nor if you use the _ALL_ value, the last value overrides the first value that is specified for \nthe column."},"StatementOptionType":"TV","SubOptionsKeywords":"_ALL_"},{"StatementOptionName":"DROP=","StatementOptionHelp":{"#cdata":"For an input table, excludes the specified columns from processing; for an output table, excludes the specified columns from being written to the table.\n \nSyntax: DROP= ( column-list ); \n\nArguments: \ncolumn-list \n specifies the names of the columns to omit from the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the format \n col: are not supported. \n \nDetails: \nThe DROP= table option specifies that all columns in the column-list should not be included \nin the creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the drop attribute is specified, all columns not included in the drop \nstatement will be used to create columns in the output rows.\n\nIf the DROP= table option is associated with an input table, the columns are not available \nfor processing during program execution."},"StatementOptionType":"TV"},{"StatementOptionName":"ENCRYPT=","StatementOptionHelp":{"#cdata":"Specifies whether to encrypt an output SAS data set. \n \nSyntax: ENCRYPT=YES | NO \n\nSyntax Description:\nYES \n encrypts the file. The encryption method uses passwords. At a minimum, you must specify \n the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because \n the encryption method uses passwords, you cannot change any password on an encrypted data \n set without re-creating the data set.\n\nNO \n does not encrypt the file.\n\nCAUTION:\nRecord all passwords. \nIf you forget the password, you cannot reset it without assistance from SAS. The process \nis time-consuming and resource-intensive."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Encrypts the file. The encryption method uses passwords. At a minimum, you must specify the READ= or the PW= table option at the same time that you specify ENCRYPT=YES. Because the encryption method uses passwords, you cannot change any password on an encrypted data set without re-creating the data set.","@ToolTip2":"Does not encrypt the file."}},{"StatementOptionName":"KEEP=","StatementOptionHelp":{"#cdata":"For an input table, specifies the columns to process; for an output table, specifies \nthe columns to write to the table. \n \nSyntax: KEEP=( column-list ); \n\nArguments:\n\ncolumn-list \n specifies the names of the columns to keep in the output table.\n\n Restriction: Numbered range lists in the format col1-col5 and name prefix lists in the \n format col: are not supported. \n \nDetails: \nThe KEEP= table option specifies that all columns in the column-list should be included in \nthe creation of output rows. Normally, all columns in the program data vector are included \nin the output rows. If the keep attribute is specified, all columns not included in the KEEP \nstatement will be dropped from the output rows.\n\nIf the KEEP= table option is associated with an input table, only the columns that are \nspecified by the KEEP= table option are available for processing during program execution."},"StatementOptionType":"TV"},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"Specifies a label for a table.\n \nSyntax: LABEL='label' \n\nSyntax Description: \n\n'label' \n specifies a text string of up to 256 characters. If the label text contains single \n quotation marks, use double quotation marks around the label, or use two single \n quotation marks in the label text and surround the string with single quotation \n marks. To remove a label from a table, assign a label that is equal to a blank \n that is enclosed in quotation marks.\n \nDetails: \nYou can use the LABEL= option on both input and output tables. When you use LABEL= \non input tables, it assigns a label for the table for the duration of the DS2 program. \nWhen it is specified for an output table, the label becomes a permanent part of that \ntable."},"StatementOptionType":"TV"},{"StatementOptionName":"LOCKTABLE=","StatementOptionHelp":{"#cdata":"Places shared or exclusive locks on tables. \n \nSyntax: LOCKTABLE=SHARE | EXCLUSIVE \n\nSyntax Description:\n\nSHARE \n locks a table in shared mode, allowing other users or processes to read data from the \n tables, but preventing users from updating data.\n\nEXCLUSIVE \n locks a table exclusively, preventing other users from accessing any table that you open. \n\nDetails: \nYou can lock tables only if you are the owner or have been granted the necessary privilege. \n\nIf you access the BASE table driver through PROC DS2, the default value for the LOCKTABLE \noption is EXCLUSIVE. However, if you access the BASE table driver through a table server, \nor if you run your program locally with the SAS Table Server LIBNAME engine, the default \nvalue for the LOCKTABLE option is SHARE."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"SHARE","@Value2":"EXCLUSIVE"},"StatementOptionToolTips":{"@ToolTip1":"Locks a table in shared mode, allowing other users or processes to read data from the tables, but preventing users from updating data.","@ToolTip2":"Locks a table exclusively, preventing other users from accessing any table that you open."}},{"StatementOptionName":"OVERWRITE=","StatementOptionHelp":{"#cdata":"For a table, drops the output table before the replacement output table is populated \nwith rows; for packages and threads, drops the existing package or thread if a package \nor thread by the same name exists. \n \nSyntax: OVERWRITE= YES | NO; \n\nArguments: \n\nYES | NO \n specifies whether the output table is deleted before a replacement output table \n is created or whether a package or thread is dropped.\n\n Default: NO \n\nCAUTION:\nFor tables, use the OVERWRITE=YES statement only with data that is backed up or \nwith data that you can reconstruct. Because the output table is deleted first, \ndata will be lost if a failure occurs while the output table is being written."},"StatementOptionType":"TV","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the output table is deleted before a replacement output table is created or a package or thread is dropped.","@ToolTip2":"Specifies that the output table is not deleted before a replacement output table is created or a package or thread is dropped."}},{"StatementOptionName":"PW=","StatementOptionHelp":{"#cdata":"Assigns a READ, WRITE, and ALTER password to a SAS file, and enables access to a password-protected SAS file. \n \nSyntax: PW=password \n\nSyntax Description:\npassword \n must be a valid SAS name.\n\nDetails:\nThe PW= option applies to all types of SAS files. You can use this option to assign \na password to a SAS file or to access a password-protected SAS file.\n\nWhen replacing a SAS data set that is protected by an ALTER password, the new data \nset inherits the ALTER password. When the code is written to the SAS log the password \nis blotted out, for example: \n\n drop thread job2 (pw=xxxxxxx);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. \nYou should use the operating system-supplied utilities and file-system security \ncontrols in order to control access to SAS files outside of SAS."},"StatementOptionType":"TV"},{"StatementOptionName":"READ=","StatementOptionHelp":{"#cdata":"Assigns a READ password to a SAS file that prevents users from reading the file, \nunless they enter the password. \n \nSyntax: READ=read-password \n\nSyntax Description: \nread-password \n must be a valid SAS name. \n \nDetails: \nThe READ= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a read-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n declare package sales (read=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"TV"},{"StatementOptionName":"RENAME=","StatementOptionHelp":{"#cdata":"Changes the name of a column.\n \nSyntax: RENAME= (old-name { = | AS } new-name [... old-name { = | AS } new-name ] ) ; \n\nArguments: \nold-name \n the column you want to rename.\n\nnew-name \n the new name of the column. It must be a valid name for the data source.\n \nDetails: \nThe RENAME= table option allows you to change the names of one or more columns.\n\nIf you use RENAME= when you create a table, the new column name is included in the output \ntable. If you use RENAME= on an input table, the new name is used in DS2 programming statements.\n\nIf you use RENAME= in the same DS2 program with either the DROP= or the KEEP= table option, \nthe DROP= and the KEEP= table options are applied before RENAME=. You must use the old name in \nthe DROP= and KEEP= table options. You cannot drop and rename the same column in the same statement.\n\nIn addition to changing the name of a column, RENAME= also changes the label for the column."},"StatementOptionType":"TV","SubOptionsKeywords":"AS"},{"StatementOptionName":"AS","StatementOptionHelp":{"#cdata":"Syntax: RENAME= (old-name AS new-name [... old-name AS new-name ] ) ;\n \nSeparates the new-name from the old-name."},"StatementOptionType":"S"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the data set type for a specially structured SAS data set. \n \nSyntax: TYPE=data-set-type \n\nSyntax Description: \ndata-set-type \n specifies the special type of the data set.\n\nDetails: \nUse the TYPE= table option to create a special SAS data set in the proper format, \nor to identify the special type of the SAS data set in a procedure statement. \n\nYou can use the CONTENTS procedure to determine the type of a data set."},"StatementOptionType":"TV"},{"StatementOptionName":"WRITE=","StatementOptionHelp":{"#cdata":"Assigns a WRITE password to a SAS file that prevents users from writing to a file, \nunless they enter the password. \n \nSyntax: WRITE=write-password \n\nSyntax Description: \nwrite-password \n must be a valid SAS name. \n \nDetails: \nThe WRITE= option applies to all types of SAS files except catalogs. You can use this \noption to assign a password to a SAS file or to access a write-protected SAS file. When \nthe code is written to the SAS log, the password is blotted out, for example: \n\n drop thread job2a (write=XXXXXXX);\n\nNote: A SAS password does not control access to a SAS file beyond the SAS system. You \nshould use the operating system-supplied utilities and file-system security controls \nin order to control access to SAS files outside of SAS."},"StatementOptionType":"TV"}],"#comment":{}}},{"StatementName":"ENDTABLE","StatementHelp":{"#cdata":"Syntax: ENDTABLE; \n \nMarks the end of a TABLE statement."},"StatementOptions":null},{"StatementName":"ENDDATA","StatementHelp":{"#cdata":"Syntax: ENDDATA ; \n \n[This statement is valid only in DS2 and HPDS2 procedures.]\n \nThe ENDDATA statement terminates the DS2 code block. The statements between the DATA and ENDDATA\nstatement are submitted to the grid for execution. The DS2 run, init, and term methods are specified\nbetween the DATA and ENDDATA statements."},"StatementOptions":null}],"#comment":{}}}} ================================================ FILE: server/data/Procedures/DEFINE_EVENT.json ================================================ {"Procedure":{"Name":"DEFINE_EVENT","ProductGroup":"SAS/BASE","ProcedureHelp":{"#cdata":""},"ProcedureOptions":null,"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"FILE=","StatementHelp":{"#cdata":"Syntax: FILE= BODY | CODE | CONTENTS | DATA | FRAME | PAGES | STYLESHEET; \n \nRedirects event output to any of the known types of output that are open.\n\nRestriction:The FILE= attribute is valid only in markup family destinations. \n\nInteraction:The names of the output files correspond to the output file names on \nthe ODS MARKUP statement that are specified with the BODY=, CODE=, CONTENTS=, FRAME=, \nPAGES=, and STYLESHEET= options."},"StatementOptions":null},{"StatementName":"PURE_STYLE=","StatementHelp":{"#cdata":"Syntax: PURE_STYLE= YES | NO;\n \nEnables the event to use any style element that has been defined. \n\nYES \n enables the event to use any of the style elements that have been defined. \n Alias:ON \nNO \n does not enable the event to use any of the style elements that have been defined. \n Alias:OFF \n\nDefault:NO \n\nRestriction:The PURE_STYLE= attribute is valid only in markup family destinations."},"StatementOptions":null},{"StatementName":"STYLE=","StatementHelp":{"#cdata":"Syntax: STYLE= style-element;\n \nSpecifies a style element. \n\nRestriction:The STYLE= attribute is valid only in markup family destinations. \n\nTip:When a carriage return separates style attributes, add a space before or after \nthe carriage return to prevent syntax errors. SAS does not interpret a carriage \nreturn as a space."},"StatementOptions":null},{"StatementName":"BLOCK","StatementHelp":{"#cdata":"Syntax: BLOCK event ; \n \nDisables the specified event.\n\nRequired Argument:\nevent -- specifies the event.\n\nOptional Argument:\n event-statement-condition(s) -- specifies one or more conditions that must be true for the event statement to execute. \n\n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"BREAK","StatementHelp":{"#cdata":"Syntax: BREAK ; \n\nStops the current event from executing. Statements below the BREAK statement are not executed. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"CLOSE","StatementHelp":{"#cdata":"Syntax: CLOSE < / event-statement-condition(s)>; \n \nCloses the current stream variable and directs all future output to the output file.\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"CONTINUE","StatementHelp":{"#cdata":"Syntax: CONTINUE ; \n\nSpecifies that the execution of the DO loop returns to the corresponding DO statement \nfor re-evaluation of the IF event statement condition. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"DELSTREAM","StatementHelp":{"#cdata":"Syntax: DELSTREAM $$stream-variable-name ; \n \nDeletes the specified stream variable.\n\nRequired Argument \n stream-variable \n specifies the stream variable to be deleted. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"DO","StatementHelp":{"#cdata":"Syntax: DO ; \n \nBegins a statement block that executes if the required condition is true.\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"DONE","StatementHelp":{"#cdata":"Syntax: DONE; \n \nEnds a DO or ELSE statement block."},"StatementOptions":null},{"StatementName":"ELSE","StatementHelp":{"#cdata":"Syntax: ELSE ; \n\nBegins a statement block that executes if the corresponding DO statement is false.\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"EVAL","StatementHelp":{"#cdata":"Syntax: EVAL $<$>user-defined-variable-name user-defined-variable-value where-expression ; \n\nCreates or updates a user-defined variable by setting the value of the variable to the \nreturn value of a WHERE expression. \n\nRequired Arguments \n user-defined-variable \n specifies the user-defined variable that you want to create or update. A user-defined-variable has one of the following forms: \n o $dictionary-variable['key'] \n o $list-variable[] \n o $scalar-variable\n o $$stream-variable\n\nwhere-expression \n any expression that can be used in the WHERE= data set option. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"FLUSH","StatementHelp":{"#cdata":"Syntax: FLUSH ; \n \nWrites buffered output to the current output file or the current stream variable.\n\nOptional Argument \n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"ITERATE","StatementHelp":{"#cdata":"Syntax: ITERATE $dictionary-variable | $list-variable;\n \nSpecifies a dictionary variable or list variable to loop through, and assigns the \nvariable's value to the _NAME_ and _VALUE_ event variables for each iteration. \n\nRequired Arguments: \n dictionary-variable \n specifies a dictionary variable. \n Requirement:dictionary-variable must be preceded by the \u201c$\u201d symbol. \n Tip:User-defined variables are not case sensitive. \n\n list-variable \n specifies a list variable. \n Requirement:list-variable must be preceded by the \u201c$\u201d symbol. \n Tip:User-defined variables are not case sensitive. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"NDENT","StatementHelp":{"#cdata":"Syntax: NDENT ; \n\nIndents output one more level than the number of spaces specified by the INDENT= attribute.\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"NEXT","StatementHelp":{"#cdata":"Syntax: NEXT $dictionary-variable | $list-variable ; \n \nSpecifies to increase a dictionary or list variable incrementally to the next \nvalue and to repopulate the event variables _VALUE_ and _NAME_ as appropriate.\n\nRequired Arguments: \n dictionary-variable \n specifies a dictionary variable that is designated as an iterator by the ITERATE statement. \n Requirement:dictionary-variable must be preceded by the \u201c$\u201d symbol. \n Tip:User-defined variables are not case sensitive. \n\nlist-variable \n specifies a list variable that is designated as an iterator by the ITERATE statement. \n Requirement:list-variable must be preceded by the \u201c$\u201d symbol. \n Tip:User-defined variables are not case sensitive. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":" OPEN","StatementHelp":{"#cdata":"Syntax: OPEN $$stream-variable-name ; \n \nOpens or creates a stream variable. When the PUT statements occur after the \nOPEN statement, all text or variable data that is specified by PUT statements \nis appended to the stream variable instead of the output file.\n\nRequired Argument:\nstream\u2013variable \n specifies a stream variable, which is a temporary item store that contains output. \n Tips:User-defined variables are not case sensitive. \n If you assign the name of a memory variable to stream-variable, then the stream variable \n resolves as the value of the memory variable. For example, the following program uses the \n memory variable $MyStream as a stream variable: \n\n set $mystream 'test';\n open $mystream;\n put 'The memory variable $mystream is being used as a stream variable';\n close;\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUT","StatementHelp":{"#cdata":"Syntax: PUT <'text' > < / event-statement-condition(s)>; \n \nWrites text, new lines, variable values, or DATA step function return values \nto an output file. \n\nOptional Arguments:\n\nNL -- specifies a new line.\n Aliases:CR, LF\n\ntext -- specifies a string of text. \n Requirement:text must be enclosed in quotation marks. \n Interactions: The PUT statement pairs text strings with variables. A string of text \n that precedes a variable creates a string-value pair if the variable has a value. \n For example, for the following PUT statement, if the event variable ForeGround has \n a value of blue, then the output is color=blue: \n\n put 'color=' foreground;\n\nvalue \n specifies any event variable, style variable, dynamic variable, user-defined variable, \n or DATA step function whose value you want to output. \n\n Restriction:DATA step functions cannot be nested. \n Requirement:User-defined variables must be preceded by a '$' or '$$' character. \n Interactions:The PUT statement pairs text strings with variables. A string of text that \n precedes a variable creates a string-value pair, if the variable has a value. \n \nevent-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUTL","StatementHelp":{"#cdata":"Syntax: PUTL <'text'> ; \n \nWrites text, new lines, variable values, or DATA step function return values \nto an output file and automatically adds a new line to the end of the output. \n\nOptional Arguments:\n\nNL -- specifies a new line.\n Aliases:CR, LF\n\ntext -- specifies a string of text. \n Requirement:text must be enclosed in quotation marks. \n Interactions: The PUTL statement pairs text strings with variables. A string of text \n that precedes a variable creates a string-value pair if the variable has a value. \n For example, for the following PUTL statement, if the event variable ForeGround has \n a value of blue, then the output is color=blue: \n\n putl 'color=' foreground;\n\nvalue \n specifies any event variable, style variable, dynamic variable, user-defined variable, \n or DATA step function whose value you want to output. \n\n Restriction:DATA step functions cannot be nested. \n Requirement:User-defined variables must be preceded by a '$' or '$$' character. \n Interactions:The PUTL statement pairs text strings with variables. A string of text that \n precedes a variable creates a string-value pair, if the variable has a value. \n \nevent-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUTLOG","StatementHelp":{"#cdata":"Syntax: PUTLOG <'text'> ; \n \nWrites text, new lines, variable values, or DATA step function return values to the log. \n\nOptional Arguments:\n\ntext -- specifies a string of text. \n Requirement:text must be enclosed in quotation marks. \n Interactions: The PUTLOG statement pairs text strings with variables. A string of text \n that precedes a variable creates a string-value pair if the variable has a value. \n For example, for the following PUTLOG statement, if the event variable ForeGround has \n a value of blue, then the output is color=blue: \n\n putlog 'color=' foreground;\n\nvalue \n specifies any event variable, style variable, dynamic variable, user-defined variable, \n or DATA step function whose value you want to output. \n\n Restriction:DATA step functions cannot be nested. \n Requirement:User-defined variables must be preceded by a '$' or '$$' character. \n Interactions:The PUTLOG statement pairs text strings with variables. A string of text that \n precedes a variable creates a string-value pair, if the variable has a value. \n \nevent-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUTQ","StatementHelp":{"#cdata":"Syntax: PUTQ <'text'> ; \n \nWrites text, new lines, variable values, or DATA step function return values \nto an output file and places quotes around the value of the variable. \n\nOptional Arguments:\n\nNL -- specifies a new line.\n Aliases:CR, LF\n\ntext -- specifies a string of text. \n Requirement:text must be enclosed in quotation marks. \n Interactions: The PUTQ statement pairs text strings with variables. A string of text \n that precedes a variable creates a string-value pair if the variable has a value. \n For example, for the following PUTQ statement, if the event variable ForeGround has \n a value of blue, then the output is color=blue: \n\n putl 'color=' foreground;\n\nvalue \n specifies any event variable, style variable, dynamic variable, user-defined variable, \n or DATA step function whose value you want to output. \n\n Restriction:DATA step functions cannot be nested. \n Requirement:User-defined variables must be preceded by a '$' or '$$' character. \n Interactions:The PUTQ statement pairs text strings with variables. A string of text that \n precedes a variable creates a string-value pair, if the variable has a value. \n \nevent-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUTSTREAM","StatementHelp":{"#cdata":"Syntax: PUTSTREAM stream-variable < / event-statement-condition(s)>; \n \nWrites the contents of the specified stream variable to an output file. \n\nRequired Argument:\n stream-variable \n specifies a stream variable, which is a temporary item store that contains output. \n Tip:If you assign the name of a memory variable to stream-variable-name, then the stream \n variable resolves as the value of the memory variable. For example, the following partial \n program uses the memory variable $MyStream as a stream variable: \n\n set $mystream 'test';\n open $mystream;\n put 'The memory variable $mystream is being used as a stream variable';\n close;\n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"PUTVARS","StatementHelp":{"#cdata":"Syntax: PUTVARS (variable-group | dictionary-variable | list-variable) <'text'> \n < / event-statement-condition(s)>; \n \nIterates over each value in a variable group, list, or dictionary and writes text, \nnew lines, variable values, or DATA step function return values to an output file. \nEach iteration populates the special variables _VALUE_ and __NAME_ . Putvars prints \nonce for each variable or value that it finds.\n\nRequired Arguments:\n variable-group \n specifies the type of variable to use in each iteration when you specify the name or value \n in the variable. variable-group is one of the following: \n EVENT -- specifies to loop through all event variables. \n STYLE -- specifies to loop through all style variables. \n DYNAMIC -- specifies to loop through all dynamic variables. \n MEMORY -- specifies to loop through all memory variables. A memory variable is classified \n as a dictionary variable if it is created with a subscript that contains a key. A memory \n variable is classified as a list variable if it is created with a subscript that is empty \n or contains an index. If you omit a key or an index, then the memory variable is a numeric \n or character scalar variable, depending on the variable's value.\n STREAM -- specifies to loop through all stream variables. \n\n dictionary-variable -- specifies a dictionary variable. \n Requirement: dictionary-variable must be preceded by the '$' symbol. \n Tip:User-defined variables are not case sensitive. \n\n list-variable -- specifies a list variable. \n Requirement:list-variable must be preceded by the \u201c$\u201d symbol. \n Tip:User-defined variables are not case sensitive. \n\nOptional Arguments \n NL -- specifies a new line. Aliases:CR, LF\n text -- specifies a string of text. Requirement: text must be enclosed in quotation marks. \n value -- specifies any event variable, style variable, dynamic variable, user-defined \n variable, or DATA step function whose value you want to output. \n\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"SET","StatementHelp":{"#cdata":"Syntax: SET $dictionary-variable entry ; \nSET $list-variable entry ; \nSET $scalar-variable | $$stream-variable entry ; \n \nCreates or updates a user-defined variable and its value. \n\nRequired Arguments:\n dictionary-variable \n specifies an array that contains a list of numbers or text strings that is identified by a key. \n dictionary-variable has the following form: $dictionary-variable['key'] \n ['key'] specifies a subscript that contains text or a variable that has a character value.\n \n entry -- specifies the value of a dictionary variable, list variable, scalar variable, \n or stream-variable. An entry is one of the following: \n function -- specifies a DATA step function. \n text -- specifies a string of text. \n variable -- specifies any event variable, style variable, dynamic variable, \n user-defined variable, or DATA step function whose value you want to output. \n\n list-variable -- an array that contains a list of numbers or strings of text that \n are indexed. list-variable has the following form: $list-variable[] \n [] specifies a subscript that contains a number or numeric variable.\n \n scalar-variable -- an area of memory that contains numeric or character data.\n stream-variable -- specifies a stream variable, which is a temporary item store that contains output.\n \nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"STOP","StatementHelp":{"#cdata":"Syntax: STOP ; \n \nSpecifies that execution moves to the end of the current statement block.\n\nOptional Argument: \n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:event-statement-condition(s) must be preceded by a slash (/)."},"StatementOptions":null},{"StatementName":"TRIGGER","StatementHelp":{"#cdata":"Syntax: TRIGGER event-name ; \n \nExecutes an event.\n\nWithout Arguments:\n If a triggered event does not have start or finish sections, then it runs the current event statements. \n\nRequired Argument:\n event-name -- specifies the name of the event. \n\nOptional Arguments:\n START -- specifies the start section of an event. \n Interaction:If the program is in the start section of an event, then any event \n that is triggered runs its start section. \n \n FINISH -- specifies the finish section of an event. \n Interaction:If the program is in the finish section of an event, then any event \n that is triggered runs its finish section. \n \n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:an event-statement-condition must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"UNBLOCK","StatementHelp":{"#cdata":"Syntax: UNBLOCK event-name ; \n \nEnables a disabled event.\n\nRequired Argument:\n event-name \n specifies the name of the event. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:an event-statement-condition must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"UNSET","StatementHelp":{"#cdata":"Syntax: UNSET ALL | dictionary-variable | list-variable | scalar-variable | stream-variable \n ; \n\nDeletes a user-defined variable and its value.\n\nRequired Arguments:\n ALL -- deletes all dictionary variables, list variables, and scalar variables. \n Tip:You must delete stream variables individually. \n \n dictionary-variable \n specifies an array that contains a list of numbers or text strings that are identified by a key. \n A dictionary-variable has the following form: $dictionary-variable['key'] \n ['key'] specifies the location in the dictionary variable of the value that you want to delete. \n\n list-variable \n specifies an array that contains a list of numbers or strings of text that are indexed. \n A list-variable has the following form: $list-variable[] \n [] specifies the location in the list variable of the value to be deleted. If you \n omit the index and specify empty brackets, then the entire list variable is deleted.\n \n scalar-variable -- specifies a scalar variable to delete. \n Requirement:Scalar variables must be preceded by the '$' symbol.\n \n stream-variable -- specifies a stream variable to delete. \n Requirement:A user-defined-variable-name must be preceded by the '$$' symbol.\n \nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:an event-statement-condition must be preceded by a slash (/)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"All","StatementOptionHelp":{"#cdata":"Deletes all dictionary variables, list variables, and scalar variables. \n\nTip: You must delete stream variables individually."},"StatementOptionType":"RS"},{"StatementOptionName":"ANY","StatementOptionHelp":{"#cdata":"Syntax: ANY (variable-1,<..., variable-n>) \n\nChecks a list of comma-delimited variables for values. If any of the variables \nhas a value, then the condition is true. \n\nExample:\n put 'One of our variables has a value!'\n nl/if any(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"BREAKIF","StatementOptionHelp":{"#cdata":"Syntax: BREAKIF event \n\nStops an event that is executing. The current statement is executed and the event ends.\n\nTip:Using the BREAKIF condition is more efficient than using a PUT event statement \nand a BREAK event statement with an IF condition together. For example, the following \nstatements are equivalent: \n\n put 'Foreground has a value!' /breakif exists(foreground); \n put 'Foreground has a value!' /if exists(foreground);\n break /if exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CMP","StatementOptionHelp":{"#cdata":"Syntax: CMP (\u201cstring\u201d, variable | variable-list) \n\nCompares, for equality, a string to a variable or list of variables. \n\nExample:\n put 'The foreground is blue!' nl/if cmp('blue',foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"CONTAINS","StatementOptionHelp":{"#cdata":"Syntax: CONTAINS (argument-1, argument-2)\n \nSearches the first argument for the second argument. \n\nExample:\n set $myvariable 'some random text';\n put 'myvariable contains 'ran' nl/if contains($myvariable, 'ran');"},"StatementOptionType":"S"},{"StatementOptionName":"EXIST|EXISTS","StatementOptionHelp":{"#cdata":"Syntax: EXIST | EXISTS (variable | variable-list) \n\nDetermines whether a variable or a list of variables has values. If all of the \nvariables have values, then the condition is true. If a variable has an empty \nstring of length 0, then the variable has no value and the condition is false. \n\nTip:Use the MISSING event variable with the EXIST condition to determine whether a value is missing. \n\nExample:\n put 'All of our variables have a value!'\n nl/if exists(background, foreground, cellpadding, cellspacing);"},"StatementOptionType":"S"},{"StatementOptionName":"IF|WHEN|WHERE","StatementOptionHelp":{"#cdata":"Syntax: IF | WHEN | WHERE (<'string'>) \n\nTests for existence or equality. IF, WHEN, and WHERE are optional and interchangeable. \nAn IF, a WHEN, or a WHERE condition compares values and strings, or checks variables \nfor values. \n\nRestriction:When you specify an IF condition with a single, user-defined variable, then \nthe variable is evaluated to determine if it has a value, according to the variable's \ntype. A string variable type uses the length to determine existence, a numeric variable \ntype uses value, and a dictionary array variable type uses the key (if there is a key \nspecified, then the test is true). \n\nExample:All of the following are equivalent: \n put 'Foreground has a value!' nl/if (foreground);\n put 'Foreground has a value!' nl/if exists(foreground);\n put 'Foreground has a value!' nl/when exists(foreground);\n put 'Foreground has a value!' nl/exists(foreground);\n put 'Foreground has a value!' nl/where exists(foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionHelp":{"#cdata":"Syntax: NOT | ! | ^ <'string'>\n \nNegates a condition. You can use the keyword NOT or the characters '!' or '^'. \n\nRestriction:The character '!' works only as the first character in a condition. \nThe standard WHERE processing syntax is required for subsequent characters. \n\nExample:\n put 'The foreground is not red!' nl/if not cmp('red', foreground);\n put 'The foreground is not red or blue' /if !cmp('red', foreground)\n and ^cmp('blue', foreground);\n put 'The foreground is not red or blue' /if ^cmp('red', foreground)\n and ^cmp('blue', foreground);"},"StatementOptionType":"S"},{"StatementOptionName":"WHILE","StatementOptionHelp":{"#cdata":"Syntax: WHILE condition-expression \n\nIndicates that the corresponding statement block should loop until the WHILE value becomes false. \n\nRestriction:The WHILE condition can be used only with the DO statement. \n\nExample:\n eval $count 0;\n\n do /while $count < 10;\n eval $i $count+1;\n continue /if $count eq 5;\n stop /if $count eq 8;\n put 'Count is ' $i nl;\n else;\n put 'Count was never less than 10' nl;\n done;"},"StatementOptionType":"S"}]}},{"StatementName":"XDENT","StatementHelp":{"#cdata":"Syntax: XDENT ; \n \nIndents output one less indention level, using the number of spaces specified by the INDENT= attribute. \n\nOptional Argument:\n event-statement-condition(s) \n specifies one or more conditions that must be true for the event statement to execute. \n Requirement:an event-statement-condition must be preceded by a slash (/)."},"StatementOptions":null},{"StatementName":"END","StatementHelp":{"#cdata":"Syntax: END; \n \nEnds the tagset or event."},"StatementOptions":null}]}}} ================================================ FILE: server/data/Procedures/DEFINE_TAGSET.json ================================================ {"Procedure":{"Name":"DEFINE_TAGSET","ProductGroup":"SAS/BASE","ProcedureHelp":{"#cdata":""},"ProcedureOptions":null,"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"BREAKTEXT_LENGTH=","StatementHelp":{"#cdata":"Syntax: BREAKTEXT_LENGTH=number\n\nSpecifies the maximum number of characters that will be considered for forced line \nbreaks by ODS. When the number of characters in the text exceeds the number specified \nby the BREAKTEXT_LENGTH= option, then line breaks are inserted by the application that \ndisplays the output. If the number of characters in the text is less than or equal to \nthe number specified by the BREAKTEXT_LENGTH= option, then any necessary line breaks \nare inserted by ODS. The placement of the line breaks is based upon the total available \ntext width."},"StatementOptions":null},{"StatementName":"BREAKTEXT_RATIO=","StatementHelp":{"#cdata":"Syntax: BREAKTEXT_RATIO=number\n\nSpecifies the maximum ratio of the width of space available for text entry to the \nlength of the text that is supposed to fit in that space. If the ratio of width space \nto text length is greater than the ratio specified by the BREAKTEXT_RATIO= option, \nthen any necessary line breaks are inserted by the application that displays the \noutput. If the ratio of width space to text length is equal to or less then the \nratio specified by the BREAKTEXT_RATIO= option, then any necessary line breaks \nare inserted by ODS."},"StatementOptions":null},{"StatementName":"BREAKTEXT_WIDTH=","StatementHelp":{"#cdata":"Syntax: BREAKTEXT_WIDTH=number\n\nSpecifies the maximum width of space available for text entry that ODS will consider \nfor placement of automatic line breaks. If the width of space is greater than the number \nspecified by the BREAKTEXT_WIDTH= option, then any necessary line breaks are inserted by \nthe application that displays the output. If the width of space is less than or equal to \nthe number specified by the BREAKTEXT_WIDTH= option, then ODS inserts necessary line breaks."},"StatementOptions":null},{"StatementName":"COPYRIGHT=","StatementHelp":{"#cdata":"Syntax: COPYRIGHT= '(text)'\n\nSpecifies the text to use as the copyright. \n\nRequirement: When specifying text, enclose the text in parentheses and then quotation marks."},"StatementOptions":null},{"StatementName":"DEFAULT_EVENT=","StatementHelp":{"#cdata":"Syntax: DEFAULT_EVENT= 'event-name'\n\nSpecifies the name of an event to execute by default when the requested event cannot \nbe found in the tagset. \n\nRequirement: When specifying an event-name, enclose the name of the event in quotation marks."},"StatementOptions":null},{"StatementName":"EMBEDDED_STYLESHEET=","StatementHelp":{"#cdata":"Syntax: EMBEDDED_STYLESHEET= YES | ON | NO | OFF\n\nSpecifies whether or not the tagset supports embedded stylesheets.\n\nDefault: The default value is YES or ON, which means that embedded stylesheets are supported. \nTip: If embedded stylesheets are supported and you do not specify a stylesheet in the ODS \nstatement, then the stylesheet is written to the top of the output file. \n\n YES\n supports embedded stylesheets.\n\n Alias: ON \n\n ON\n supports embedded stylesheets.\n\n Alias: YES \n\n NO\n does not support embedded stylesheets.\n\n Alias: OFF \n\n OFF\n does not support embedded stylesheets.\n\n Alias: NO"},"StatementOptions":null},{"StatementName":"IMAGE_FORMATS=","StatementHelp":{"#cdata":"Syntax: IMAGE_FORMATS= 'image-type(s)'\n\nSpecifies a comma-delimited list of image types or file extensions that are valid \nfor an output destination. The image types can be any that are supported by SAS/GRAPH. \nList them in order of preference. \n\nExample: The following IMAGE_FORMATS= statement lists valid image types for the \nHTML destination: \n\n image_formats='gif,jpeg,png';"},"StatementOptions":null},{"StatementName":"INDENT=","StatementHelp":{"#cdata":"Syntax: INDENT=n\n\nspecifies how many spaces the NDENT and XDENT event statements will indent the output.\n\nn\nspecifies a numeric value for the number of spaces that you want the output to indent.\n\nDefault: 0 \nTip: The INDENT= attribute is valid only in markup family destinations."},"StatementOptions":null},{"StatementName":"LOG_NOTE=","StatementHelp":{"#cdata":"Syntax: LOG_NOTE= 'string'\n\nDefines a string that is printed to the SAS log when the tagset is used.\n\nstring\nspecifies the text that is printed to the SAS log.\n\nRequirement: Specify only one string at a time."},"StatementOptions":null},{"StatementName":"MAP=","StatementHelp":{"#cdata":"Syntax: MAP= 'characters'\n\nSpecifies the special characters that require translation.\n\ncharacters\nspecifies one or more special characters.\n\nRequirement: When listing special characters in the MAP= statement, omit blank spaces between them. \nRequirement: When you specify special characters, enclose the list of special characters in quotation marks. \nRequirement: Use the MAP= statement with the MAPSUB statement."},"StatementOptions":null},{"StatementName":"MAPSUB=","StatementHelp":{"#cdata":"Syntax: MAPSUB= 'strings'\n\nSpecifies the text to substitute for the characters that are specified in the MAP= statement.\n\nstrings\nSpecifies the text strings to substitute for the characters that are specified in the MAP= statement.\n\nRequirement: When specifying multiple strings, use a forward slash (/) to separate the text strings. \nRequirement: When specifying strings, enclose the entire string list in quotation marks. \nRequirement: Use the MAPSUB= statement with the MAP= statement."},"StatementOptions":null},{"StatementName":"NOBREAKSPACE=","StatementHelp":{"#cdata":"Syntax: NOBREAKSPACE= 'string'\n\nDefines a nonbreaking space for the markup output.\n\nstring\nspecifies the character that defines a nonbreaking space.\n\nRequirement: When specifying a string, enclose the string in quotation marks. \nRestriction: Specify only one string at a time."},"StatementOptions":null},{"StatementName":"NO_BYTE_ORDER_MARK=","StatementHelp":{"#cdata":"Syntax: NO_BYTE_ORDER_MARK=YES | ON | NO | OFF\n\nSpecifies whether or not a byte-order mark is written to the output files when using \na UTF character set."},"StatementOptions":null},{"StatementName":"OUTPUT_TYPE=","StatementHelp":{"#cdata":"Syntax: OUTPUT_TYPE= CSV | HTML | LATEX | WML | XML\n\nsets a category for the output.\n\n CSV\n produces output with comma-separated values.\n\n HTML\n produces Hypertext Markup Language output.\n\n LATEX\n produces output in LaTeX, which is a document preparation system for high-quality typesetting.\n\n WML\n uses the Wireless Application Protocol (WAP) to produce a wireless markup language.\n\n XML\n produces output in Extensible Markup Language."},"StatementOptions":null},{"StatementName":"PARENT=","StatementHelp":{"#cdata":"Syntax: PARENT= tagset-path\n\nSpecifies the tagset from which the current template inherits.\n\ntagset-path\nspecifies the name of a directory in a template store.\n\nDefault: The current template inherits from the specified template in the first template \nstore where you have Read access. The PATH statement specifies which locations to search \nfor templates that were created by PROC TEMPLATE, as well as the order in which to search \nfor them. \n\nInteraction: When you specify a parent, all of the template options, attributes, and \nstatements that are specified in the parent's template are used in the current template, \nunless the current template overrides them. \n\nRequirement: When you specify a parent, all of the template options, attributes, and \nstatements that are specified in the parent's template are used in the current template, \nunless the current template overrides them. \nTip: Specify a tagset that SAS supplies or a customized tagset. \nTip: Control the item store from which the tagset is read by using the ODS PATH statement."},"StatementOptions":null},{"StatementName":"PURE_STYLE=","StatementHelp":{"#cdata":"Syntax: PURE_STYLE=YES | ON | NO | OFF\n\nSpecifies whether all of the style attributes are available at all times."},"StatementOptions":null},{"StatementName":"REGISTERED_TM=","StatementHelp":{"#cdata":"Syntax: REGISTERED_TM= '(text)'\n\nspecifies the text to use as the registered trademark. \n\nRequirement: When specifying text, enclose the text in parentheses and then quotation marks."},"StatementOptions":null},{"StatementName":"SPLIT=","StatementHelp":{"#cdata":"Syntax: SPLIT= 'string'\n\nDefines a text string to use for line breaks in the markup output.\n\nRequirement: When specifying a string, enclose the string in quotation marks. \nRestriction: Specify one string at a time."},"StatementOptions":null},{"StatementName":"STACKED_COLUMNS=","StatementHelp":{"#cdata":"Syntax: STACKED_COLUMNS= YES | ON | NO | OFF\n\nSpecifies whether or not the tagset lets procedures stack columns on top \nof each other, or place them side by side.\n\nDefault: The default value is YES or ON, which means that columns are stacked. \nTip: To place columns side by side, specify the NO or OFF value.\n\n YES\n stacks columns on top of each other.\n Alias: ON \n\n ON\n stacks columns on top of each other.\n Alias: YES \n\n NO\n stacks columns side by side.\n Alias: OFF \n\n OFF\n stacks columns side by side.\n Alias: NO"},"StatementOptions":null},{"StatementName":"TRADEMARK=","StatementHelp":{"#cdata":"Syntax: TRADEMARK= '(text)'\n\nSpecifies the text to use as the trademark. \n\nRequirement: When specifying text, enclose the text in parentheses and then \nquotation marks."},"StatementOptions":null},{"StatementName":"DEFINE EVENT","StatementHelp":{"#cdata":"Syntax: DEFINE EVENT event-name; \n > \n \n \nDefines what is written to the output file."},"StatementOptions":null},{"StatementName":"NOTES","StatementHelp":{"#cdata":"Syntax: NOTES 'text'; \n \nProvides information about the tagset."},"StatementOptions":null},{"StatementName":"END","StatementHelp":{"#cdata":"Syntax: END; \n\nEnds the tagset."},"StatementOptions":null}]}}} ================================================ FILE: server/data/Procedures/MACRO.json ================================================ {"Procedure":{"#comment":{},"Name":"%MACRO","ProductGroup":"BASE","ProcedureHelp":{"#cdata":"Syntax: %MACRO macro-name <(parameter-list)>>; \n \nThe %MACRO statement begins the definition of a macro, assigns the macro a name, and can include \na list of macro parameters, a list of options, or both."},"ProcedureOptions":{"ProcedureOption":[{"ProcedureOptionName":"CMD","ProcedureOptionHelp":{"#cdata":"Specifies that the macro can accept either a name-style invocation or a command-style invocation."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"DES=","ProcedureOptionHelp":{"#cdata":"[Syntax: DES='text'] \n \nSpecifies a description (up to 40 characters) for the macro entry in the macro catalog."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"MINDELIMITER=","ProcedureOptionHelp":{"#cdata":"[Syntax: MINDELIMITER='single character';] \n \nSpecifies a value that will override the value of the MINDELIMITER= global option. \nThe value must be a single character enclosed in single quotation marks and can \nappear only once in a %MACRO statement."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"MINOPERATOR","ProcedureOptionHelp":{"#cdata":"Specifies that the macro processor recognizes and evaluates the mnemonic IN and the special character # \nas logical operators when evaluating arithmetic or logical expressions during the execution of the macro."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"NOMINOPERATOR","ProcedureOptionHelp":{"#cdata":"Specifies that the macro processor does not recognize the mnemonic IN and the special character # as \nlogical operators when evaluating arithmetic or logical expressions during the execution of the \nmacro. The setting of this argument overrides the setting of the MINOPERATOR global system option."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"PARMBUFF|PBUFF","ProcedureOptionHelp":{"#cdata":"Assigns the entire list of parameter values in a macro call, including the parentheses in a name-style \ninvocation, as the value of the automatic macro variable SYSPBUFF."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"STMT","ProcedureOptionHelp":{"#cdata":"Specifies that the macro can accept either a name-style invocation or a statement-style invocation."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"SOURCE|SRC","ProcedureOptionHelp":{"#cdata":"Combines and stores the source of the compiled macro with the compiled macro code as an entry in a SAS \ncatalog in a permanent SAS data library."},"ProcedureOptionType":"S"},{"ProcedureOptionName":"STORE","ProcedureOptionHelp":{"#cdata":"Stores the compiled macro as an entry in a SAS catalog in a permanent SAS data library."},"ProcedureOptionType":"S"}]},"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"%ABORT","StatementHelp":{"#cdata":"Stops the macro that is executing along with the current DATA step, SAS job, or SAS session. \n \nSyntax: %ABORT | RETURN | > ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ABEND","StatementOptionHelp":{"#cdata":"Causes abnormal termination of the current macro and SAS job or session. Results depend on the method \nof operation: \n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log that states that execution was terminated by the ABEND option \n of the %ABORT macro statement\n o does not execute any subsequent statements or check syntax\n o returns control to the operating environment; further action is based on how your operating environment \n and your site treat jobs that end abnormally.\n\no windowing environment and interactive line mode \n\n o causes your macro, windowing environment, and interactive line mode to stop processing immediately \n and return you to your operating environment."},"StatementOptionType":"S"},{"StatementOptionName":"CANCEL","StatementOptionHelp":{"#cdata":"Causes the cancellation of the current submitted statements. The results depend on the method \nof operation:\n\no batch mode and noninteractive mode\n\n o The entire SAS program and SAS system are terminated.\n o The error message is written to the SAS log.\n\no windowing environment and interactive line mode \n\n o It only clears the current submitted program.\n o Other subsequent submitted programs are not affected.\n o The error message is written to the SAS log.\n\no workspace server and stored process server \n\n o It only clears currently submitted program.\n o Other subsequent submit calls are not affected.\n o The error message is written to the SAS log.\n\no SAS IntrNet application server \n\n o A separate execution is created for each request. The execution submits the request code. A CANCEL \n in the request code clears the current submitted code but does not terminate the execution of the \n SAS session."},"StatementOptionType":"S"},{"StatementOptionName":"CANCEL FILE","StatementOptionHelp":{"#cdata":"Causes only the contents of the autoexec file or %INCLUDE file to be cleared by the %ABORT statement. \nOther submitted source statements will be executed after the autoexec or %INCLUDE file."},"StatementOptionType":"S"},{"StatementOptionName":"RETURN","StatementOptionHelp":{"#cdata":"Causes abnormal termination of the current macro and SAS job or session. Results depend on the method \nof operation: \n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log that states that execution was terminated by the RETURN option \n of the %ABORT macro statement\n o does not execute any subsequent statements or check syntax\n o returns control to the operating environment with a condition code indicating an error.\n\no windowing environment and interactive line mode \n\n o causes your macro, windowing environment, and interactive line mode to stop processing immediately \n and return you to your operating environment."},"StatementOptionType":"S"}]}},{"StatementName":"%COPY","StatementHelp":{"#cdata":"Syntax: %COPY macro-name< / options(s)>\n \nCopies specified items from a SAS macro library."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"SOURCE|SRC","StatementOptionHelp":{"#cdata":"Specifies that the source code of the macro will be copied to the output destination. If the OUTFILE= \noption is not specified, the source is written to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"LIBRARY=|LIB=","StatementOptionHelp":{"#cdata":"[Syntax: LIBRARY= libref] \n \nSpecifies the libref of a SAS library that contains a catalog of stored compiled \nSAS macros. If no library is specified, the libref specified by the SASMSTORE= \noption is used.\n\nRestriction: This libref cannot be WORK."},"StatementOptionType":"V"},{"StatementOptionName":"OUTFILE=","StatementOptionHelp":{"#cdata":"[Syntax: OUTFILE=fileref | 'external file'] \n \nSpecifies the output destination of the %COPY statement. The value can be a fileref \nor an external file."},"StatementOptionType":"V"}]}},{"StatementName":"%DISPLAY","StatementHelp":{"#cdata":"Syntax: %DISPLAY window<.group> ;\n \nYou can display only one group of fields in each execution of a %DISPLAY statement. If you display \na window containing any unprotected fields, enter values into any required fields and press ENTER \nto remove the display from the window."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"NOINPUT","StatementOptionHelp":{"#cdata":"Specifies that you cannot input values into fields displayed in the window. If you omit the NOINPUT \noption, you can input values into unprotected fields displayed in the window. Use the NOINPUT option \nwhen the %DISPLAY statement is inside a macro definition and you want to merge more than one group \nof fields into a single display. Using NOINPUT in a particular %DISPLAY statement causes the group \ndisplayed to remain visible when later groups are displayed."},"StatementOptionType":"S"},{"StatementOptionName":"BLANK","StatementOptionHelp":{"#cdata":"Clears the display in the window. Use the BLANK option to prevent fields from a previous display \nfrom appearing in the current display. This option is useful only when the %DISPLAY statement is \ninside a macro definition and when it is part of a window.group specification. When the %DISPLAY \nstatement is outside a macro definition, the display in the window is cleared automatically after \nthe execution of each %DISPLAY statement."},"StatementOptionType":"S"},{"StatementOptionName":"BELL","StatementOptionHelp":{"#cdata":"Rings your personal computer's bell, if available, when the window is displayed."},"StatementOptionType":"S"},{"StatementOptionName":"DELETE","StatementOptionHelp":{"#cdata":"Deletes the display of the window after processing passes from the %DISPLAY statement on which the \noption appears. DELETE is useful only when the %DISPLAY statement is inside a macro definition."},"StatementOptionType":"S"}]}},{"StatementName":"%DO","StatementHelp":{"#cdata":"Executes a section of a macro repetitively based on the value of an index variable.\n \nSyntax: \n\n%DO macro-variable=start %TO stop <%BY increment>; \n text and macro language statements \n%END;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"%TO","StatementOptionHelp":{"#cdata":"Separates the start and stop integers or macro expressions that control the number of times the \nportion of the macro between the iterative %DO and %END statements is processed."},"StatementOptionType":"S"},{"StatementOptionName":"%BY","StatementOptionHelp":{"#cdata":"Precedes an increment integer (other than 0) or a macro expression that generates an integer to be \nadded to the value of the index variable in each iteration of the loop."},"StatementOptionType":"S"},{"StatementOptionName":"%UNTIL","StatementOptionHelp":{"#cdata":"Executes a section of a macro repetitively until a condition is true.\n \nSyntax: \n\n%DO %UNTIL (expression); \n text and macro language statements \n%END;"},"StatementOptionType":"S"},{"StatementOptionName":"%WHILE","StatementOptionHelp":{"#cdata":"Executes a section of a macro repetitively while a condition is true.\n \nSyntax: \n\n%DO %WHILE (expression); \n text and macro language statements \n%END;"},"StatementOptionType":"S"}]}},{"StatementName":"%DO %UNTIL","StatementHelp":{"#cdata":"Executes a section of a macro repetitively until a condition is true.\n \nSyntax: \n\n%DO %UNTIL (expression); \n text and macro language statements \n%END;"},"StatementOptions":null},{"StatementName":"%DO %WHILE","StatementHelp":{"#cdata":"Executes a section of a macro repetitively while a condition is true.\n \nSyntax: \n\n%DO %WHILE (expression); \n text and macro language statements \n%END;"},"StatementOptions":null},{"StatementName":"%END","StatementHelp":{"#cdata":"Syntax: %END;\n \nEnds a %DO group."},"StatementOptions":null},{"StatementName":"%GLOBAL","StatementHelp":{"#cdata":"Syntax: %GLOBAL macro-variable(s);\n \nCreates macro variables that are available during the execution of an entire SAS session."},"StatementOptions":null},{"StatementName":"%GOTO","StatementHelp":{"#cdata":"Syntax: %GOTO label; \n \nBranches macro processing to the specified label."},"StatementOptions":null},{"StatementName":"%IF","StatementHelp":{"#cdata":"Syntax: %IF expression %THEN action; <%ELSE action;>\n \nConditionally process a portion of a macro."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"%THEN","StatementOptionHelp":{"#cdata":"Conditionally process a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%DO","StatementOptionHelp":{"#cdata":"Action statement in a %IF-%THEN-%DO construct."},"StatementOptionType":"S"},{"StatementOptionName":"%LET","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nCreates a macro variable and assigns it a value."},"StatementOptionType":"S"},{"StatementOptionName":"%RETURN","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nExecution causes normal termination of the currently executing macro."},"StatementOptionType":"S"},{"StatementOptionName":"%PUT","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nWrites text or macro variable information to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"%GOTO","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nSyntax: ... %GOTO label ;\n \nJumps to a new statement."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"%ELSE","StatementHelp":{"#cdata":"Part of a %IF-%THEN-%ELSE statement that conditionally processes a portion of a macro.\n \nSyntax: \n\n%IF expression %THEN action; \n<%ELSE action;> "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"%THEN","StatementOptionHelp":{"#cdata":"Conditionally processes a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%IF","StatementOptionHelp":{"#cdata":"Conditionally processes a portion of a macro."},"StatementOptionType":"S"},{"StatementOptionName":"%DO","StatementOptionHelp":{"#cdata":"Action statement in an %ELSE-%DO construct."},"StatementOptionType":"S"},{"StatementOptionName":"%LET","StatementOptionHelp":{"#cdata":"Syntax: %LET macro-variable =;\n \nCreates a macro variable and assigns it a value."},"StatementOptionType":"S"},{"StatementOptionName":"%GOTO","StatementOptionHelp":{"#cdata":"Action statement in an %ELSE statement.\n \nSyntax: ... %GOTO label ;\n \nJumps to a new statement."},"StatementOptionType":"S"},{"StatementOptionName":"%RETURN","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nExecution causes normal termination of the currently executing macro."},"StatementOptionType":"S"},{"StatementOptionName":"%PUT","StatementOptionHelp":{"#cdata":"Action statement in an %IF-%THEN statement.\n \nWrites text or macro variable information to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"%INPUT","StatementHelp":{"#cdata":"Syntax: %INPUT ;\n \nSupplies values to macro variables during macro execution."},"StatementOptions":null},{"StatementName":"%LET","StatementHelp":{"#cdata":"Syntax: %LET macro-variable =;\n \nCreates a macro variable and assigns it a value."},"StatementOptions":null},{"StatementName":"%LOCAL","StatementHelp":{"#cdata":"Syntax: %LOCAL macro-variable(s);\n \nCreates macro variables that are available only during the execution of the macro where \nthey are defined."},"StatementOptions":null},{"StatementName":"%RETURN","StatementHelp":{"#cdata":"Syntax: %RETURN;\n \nExecution causes normal termination of the currently executing macro."},"StatementOptions":null},{"StatementName":"%PUT","StatementHelp":{"#cdata":"Syntax: %PUT ; \n \nWrites text or macro variable information to the SAS log."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"_ALL_","StatementOptionHelp":{"#cdata":"Lists the values of all user-generated and automatic macro variables."},"StatementOptionType":"S"},{"StatementOptionName":"_AUTOMATIC_","StatementOptionHelp":{"#cdata":"Lists the values of automatic macro variables. The automatic variables listed depend on the SAS products \ninstalled at your site and on your operating system. The scope is identified as AUTOMATIC."},"StatementOptionType":"S"},{"StatementOptionName":"_GLOBAL_","StatementOptionHelp":{"#cdata":"Lists user-generated global macro variables. The scope is identified as GLOBAL."},"StatementOptionType":"S"},{"StatementOptionName":"_LOCAL_","StatementOptionHelp":{"#cdata":"Lists user-generated local macro variables. The scope is the name of the currently executing macro."},"StatementOptionType":"S"},{"StatementOptionName":"_USER_","StatementOptionHelp":{"#cdata":"Describes user-generated global and local macro variables. The scope is identified either as GLOBAL, \nor as the name of the macro in which the macro variable is defined."},"StatementOptionType":"S"}]}},{"StatementName":"%SYMDEL","StatementHelp":{"#cdata":"Syntax: %SYMDEL macro-variable-1 <...macro-variable-n>; \n \nDeletes the specified variable or variables from the macro global symbol table."},"StatementOptions":{"StatementOption":{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning message when an attempt is made to delete a non-existent macro variable."},"StatementOptionType":"S"}}},{"StatementName":"%SYSCALL","StatementHelp":{"#cdata":"Syntax: %SYSCALL call-routine<(call-routine-argument(s))>;\n \nInvokes a SAS call routine. When %SYSCALL invokes a CALL routine, the value of each macro variable \nargument is retrieved and passed unresolved to the CALL routine. Upon completion of the CALL routine, \nthe value for each argument is written back to the respective macro variable. If %SYSCALL encounters \nan error condition, the execution of the CALL routine terminates without updating the macro variable \nvalues, an error message is written to the log, and macro processing continues. "},"StatementOptions":null},{"StatementName":"%SYSEXEC","StatementHelp":{"#cdata":"Syntax: %SYSEXEC ; \n \nIssues operating environment commands."},"StatementOptions":null},{"StatementName":"%SYSLPUT","StatementHelp":{"#cdata":"Syntax: %SYSLPUT macro-variable=>;\n \nCreates a new macro variable or modifies the value of an existing macro variable on a remote \nhost or server. The %SYSLPUT statement is submitted with SAS/CONNECT software from the local \nhost or client to a remote host or server to create a new macro variable on the remote host \nor server, or to modify the value of an existing macro variable on the remote host or server.\n\nNote: The names of the macro variables on the remote and local hosts must not contain any \nleading ampersands."},"StatementOptions":{"StatementOption":{"StatementOptionName":"REMOTE=","StatementOptionHelp":{"#cdata":"[Syntax: REMOTE=remote-session-identifier>;] \n \nIdentifies the is the name of the remote session."},"StatementOptionType":"S"}}},{"StatementName":"%SYSRPUT","StatementHelp":{"#cdata":"Syntax: %SYSRPUT local-macro-variable=remote-macro-variable;\n \nThe %SYSRPUT statement is submitted with SAS/CONNECT to a remote host to retrieve the value \nof a macro variable stored on the remote host. %SYSRPUT assigns that value to a macro variable \non the local host. %SYSRPUT is similar to the %LET macro statement because it assigns a value \nto a macro variable. However, %SYSRPUT assigns a value to a variable on the local host, not on \nthe remote host where the statement is processed. The %SYSRPUT statement places the macro variable \ninto the global symbol table in the client session."},"StatementOptions":null},{"StatementName":"%WINDOW","StatementHelp":{"#cdata":"Syntax: %WINDOW window-namefield-definition(s);\n \nDefines customized windows."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"COLOR=|C=","StatementOptionHelp":{"#cdata":"Specifies the color of the window background. The default color of the window and the contents \nof its fields are both device-dependent."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BLACK","@Value2":"GRAY","@Value3":"PINK","@Value4":"BLUE","@Value5":"GREEN","@Value6":"RED","@Value7":"BROWN","@Value8":"MAGENTA","@Value9":"WHITE","@Value10":"CYAN","@Value11":"ORANGE","@Value12":"YELLOW"},"StatementOptionToolTips":{"@ToolTip1":"BLACK","@ToolTip2":"GRAY|GREY","@ToolTip3":"PINK","@ToolTip4":"BLUE","@ToolTip5":"GREEN","@ToolTip6":"RED","@ToolTip7":"BROWN","@ToolTip8":"MAGENTA","@ToolTip9":"WHITE","@ToolTip10":"CYAN","@ToolTip11":"ORANGE","@ToolTip12":"YELLOW"}},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=columns] \n \nSpecifies the number of display columns in the window, including borders. A window \ncan contain any number of columns and can extend beyond the border of the display. \nThis feature is useful when you need to display a window on a device larger than \nthe one on which you developed it. By default, the window fills all remaining \ncolumns in the display."},"StatementOptionType":"V"},{"StatementOptionName":"ICOLUMN=","StatementOptionHelp":{"#cdata":"[Syntax: ICOLUMN=column] \n \nSpecifies the initial column within the display at which the window is displayed. \nBy default, the macro processor begins the window at column 1 of the display."},"StatementOptionType":"V"},{"StatementOptionName":"IROW=","StatementOptionHelp":{"#cdata":"[Syntax: IROW=row] \n \nSpecifies the initial row (line) within the display at which the window is displayed. \nBy default, the macro processor begins the window at row 1 of the display."},"StatementOptionType":"V"},{"StatementOptionName":"KEYS=","StatementOptionHelp":{"#cdata":"[Syntax: KEYS=<catalog.>keys-entry] \n \nSpecifies the name of a KEYS catalog entry that contains the function key definitions \nfor the window. If you omit libref and catalog, SAS uses SASUSER.PROFILE.keys-entry.\n\nIf you omit the KEYS= option, SAS uses the current function key settings defined in \nthe KEYS window."},"StatementOptionType":"V"},{"StatementOptionName":"MENU=","StatementOptionHelp":{"#cdata":"[Syntax: MENU=<catalog.>pmenu-entry] \n \nSpecifies the name of a menu you have built with the PMENU procedure. If you omit \nlibref and catalog, SAS uses SASUSER.PROFILE.pmenu-entry."},"StatementOptionType":"V"},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=rows] \n \nSpecifies the number of rows in the window, including borders. A window can contain \nany number of rows and can extend beyond the border of the display device. This feature \nis useful when you need to display a window on a device larger than the one on which \nyou developed it. If you omit a number, the window fills all remaining rows in the \ndisplay device."},"StatementOptionType":"V"},{"StatementOptionName":"ATTR=|A=","StatementOptionHelp":{"#cdata":"Syntax: ATTR=attribute | (attribute-1 <... , attribute-n>) \n \nControls several display attributes of the field."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BLINK","@Value2":"HIGHLIGHT","@Value3":"REV_VIDEO","@Value4":"UNDERLINE"},"StatementOptionToolTips":{"@ToolTip1":"Causes the field to blink.","@ToolTip2":"Displays the field at high intensity.","@ToolTip3":"Displays the field in reverse video.","@ToolTip4":"Underlines the field."}},{"StatementOptionName":"AUTOSKIP=|SKIP=","StatementOptionHelp":{"#cdata":"Controls whether the cursor moves to the next unprotected field of the current window or group \nwhen you have entered data in all positions of a field."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Causes the cursor to move automatically to the next unprotected field.","@ToolTip2":"Causes the cursor to not move automatically."}},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Determines whether the macro processor displays the characters you are entering into a macro variable \nvalue as you enter them."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"The macro processor displays the characters as you enter them.","@ToolTip2":"The macro processor does not display the characters as you enter them."}},{"StatementOptionName":"PROTECT=|P=","StatementOptionHelp":{"#cdata":"Controls whether information can be entered into a field containing a macro variable."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"If you specify PROTECT=YES, you cannot enter information into a field. Use the PROTECT= option only for fields containing macro variables; fields containing text are automatically protected.","@ToolTip2":"If you specify PROTECT=NO (the default value), you can enter information."}},{"StatementOptionName":"REQUIRED=","StatementOptionHelp":{"#cdata":"Determines whether you must enter a value for the macro variable in that field."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"If you specify REQUIRED=YES, you must enter a value into that field in order to remove the display from the window. You cannot enter a null value into a required field.","@ToolTip2":"If you specify REQUIRED=NO (the default value), you do not have to enter a value in that field in order to remove the display from the window. Entering a command on the command line of the window removes the effect of REQUIRED=YES."}}]}},{"StatementName":"%INCLUDE","StatementHelp":{"#cdata":"%INCLUDE source(s) >; \n \nBrings a SAS programming statement, data lines, or both, into a current SAS program."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"SOURCE2","StatementOptionHelp":{"#cdata":"Causes the SAS log to show the source statements that are being included in your SAS program."},"StatementOptionType":"S"},{"StatementOptionName":"S2=","StatementOptionHelp":{"#cdata":"[Syntax: S2=length] \n \nSpecifies the length of the record to be used for input. \n \nLength can have these values: \n\n S \n sets S2 equal to the current setting of the S= SAS system option.\n \n 0 \n tells SAS to use the setting of the SEQ= system option to determine whether the line contains \n a sequence field. If the line does contain a sequence field, SAS determines line length by \n excluding the sequence field from the total length.\n \n n \n specifies a number greater than zero that corresponds to the length of the line to be read, \n when the file contains fixed-length records. When the file contains variable-length records, n \n specifies the column in which to begin reading data."},"StatementOptionType":"V"}]}},{"StatementName":"%LIST","StatementHelp":{"#cdata":"Displays lines that are entered in the current session.\n \nSyntax: %LIST>; \n\nwhere\n\n n - means display line n.\n\n n-m - means display lines n through m; can be written as n:m"},"StatementOptions":null},{"StatementName":"PROC","StatementHelp":{"#cdata":"Syntax: PROC procedure-name ;\n \nBegins a PROC step. The PROC step consists of a group of SAS statements that call and execute\na procedure, usually with a SAS data set as input."},"StatementOptions":null},{"StatementName":"DATA","StatementHelp":{"#cdata":"Begins a DATA step and provides names for any output SAS data sets, views, or programs. \n \nSyntax: \n \n(1) DATA > \n <... data-set-name-n <(data-set-options-n)>> > ; \n\n(2) DATA _NULL_ > ; \n\n(3) DATA view-name > \n <... data-set-name-n <(data-set-options-n)>> / \n VIEW=view-name <()> ; \n\n(4) DATA data-set-name / PGM=program-name <()> ; \n\n(5) DATA VIEW=view-name <(password-option)> ; \n DESCRIBE; \n \n(6) DATA PGM=program-name <(password-option)> ; \n \n ;> \n "},"StatementOptions":null},{"StatementName":"SIGNON","StatementHelp":{"#cdata":"Syntax: SIGNON ;\n \nInitiates a connection between a client session and a server session."},"StatementOptions":null},{"StatementName":"SIGNOFF","StatementHelp":{"#cdata":"Syntax: SIGNOFF \n \nEnds the connection between a client session and a server session."},"StatementOptions":null},{"StatementName":"RSUBMIT","StatementHelp":{"#cdata":"Syntax: RSUBMIT ; ENDRSUBMIT ; \n RDISPLAY \n RGET ; \n %SYSRPUT macro-variable=value; \n %SYSLPUT macro-variable=value ; \n WAITFOR <_ANY_ | _ALL_> task1...taskn ; \n LISTTASK <_ALL_ | task>; \n KILLTASK <_ALL_ | task1...taskn>; \n \nMarks the beginning of a block of statements that a client session submits to a server\nsession for execution."},"StatementOptions":null},{"StatementName":"ENDRSUBMIT","StatementHelp":{"#cdata":"Marks the end of a block of statements that a client session submits to a server session \nfor execution."},"StatementOptions":null},{"StatementName":"SYSTASK","StatementHelp":{"#cdata":"Syntax: SYSTASK COMMAND \"operating system command\"\n \n \n \n \n >; \n SYSTASK LIST <_ALL_ | taskname> ; \n SYSTASK KILL taskname ; \n \nExecutes, lists, or terminates asynchronous tasks."},"StatementOptions":null},{"StatementName":"LISTTASK","StatementHelp":{"#cdata":"Syntax: LISTTASK <_ALL_|task> ; \n \nLists all active connections or tasks and identifies the execution status of each connection or task."},"StatementOptions":null},{"StatementName":"KILLTASK","StatementHelp":{"#cdata":"Syntax: KILLTASK _ALL_ |task1...taskn ;\n \nFor asynchronous tasks, forces one or more active tasks or server sessions to terminate immediately."},"StatementOptions":null},{"StatementName":"RDISPLAY","StatementHelp":{"#cdata":"Syntax: RDISPLAY <server-ID >;\n \nCreates a Log window to display the lines from the log and an Output window to list the output \ngenerated from the execution of the statements within an asynchronous RSUBMIT block."},"StatementOptions":null},{"StatementName":"RGET","StatementHelp":{"#cdata":"Syntax: RGET <server-ID>;\n \nRetrieves the log and output that are created by an asynchronous RSUBMIT and merges them into the\nLog and Output windows of the client session."},"StatementOptions":null},{"StatementName":"WAITFOR","StatementHelp":{"#cdata":"Syntax: WAITFOR<_ANY_ | _ALL_> taskname ;\n \nSuspends execution of the current SAS session until the specified tasks finish executing."},"StatementOptions":null},{"StatementName":"SYSECHO","StatementHelp":{"#cdata":"Syntax: SYSECHO <\"text\">; \n\nFires a global statement complete event and passes a text string back to the IOM client."},"StatementOptions":null},{"StatementName":"GOTO|GO TO","StatementHelp":{"#cdata":"Syntax: GOTO label;\n \nJumps to a new statement."},"StatementOptions":null},{"StatementName":"%MEND","StatementHelp":{"#cdata":"Syntax: %MEND ;]\n \nEnds a macro definition."},"StatementOptions":null},{"StatementName":"IF","StatementHelp":{"#cdata":"Executes a SAS statement for observations that meet specific conditions. \n\nSyntax: \n(1) IF expression THEN statement; \n \n(2) IF condition;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"THEN","StatementOptionHelp":{"#cdata":"If the conditions that are specified in the IF clause are met, the IF-THEN statement executes a SAS \nstatement for observations that are read from a SAS data set, for records in an external file, or \nfor computed values."},"StatementOptionType":"S"},{"StatementOptionName":"DO","StatementOptionHelp":{"#cdata":"DO statement in an IF-THEN-DO construct."},"StatementOptionType":"S"},{"StatementOptionName":"WHEN","StatementOptionHelp":{"#cdata":"WHEN statement in an IF-THEN-WHEN construct."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"ELSE","StatementHelp":{"#cdata":"If the condition in an IF-THEN statement is false and an ELSE statement is present, \nthen the ELSE action is carried out."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"THEN","StatementOptionHelp":{"#cdata":"If the conditions that are specified in the IF clause are met, the IF-THEN statement executes a SAS \nstatement for observations that are read from a SAS data set, for records in an external file, or \nfor computed values."},"StatementOptionType":"S"},{"StatementOptionName":"IF","StatementOptionHelp":{"#cdata":"Executes a SAS statement for observations that meet specific conditions."},"StatementOptionType":"S"},{"StatementOptionName":"NOT","StatementOptionType":"S"},{"StatementOptionName":"OR","StatementOptionType":"S"},{"StatementOptionName":"AND","StatementOptionType":"S"}],"#comment":{}}}]}}} ================================================ FILE: server/data/Procedures/ODS.json ================================================ {"Procedure":{"#comment":{},"Name":"ODS","ProductGroup":"BASE","ProcedureHelp":{"#cdata":""},"ProcedureOptions":null,"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"ODS LISTING","StatementHelp":{"#cdata":"Opens, manages, or closes the LISTING destination. \n \nSyntax: \n(1) ODS LISTING ; \n(2) ODS LISTING ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the LISTING destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the LISTING destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the listing destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"DATAPANEL=","StatementOptionHelp":{"#cdata":"Suggests how to split a table that is too wide to fit on a single page into sections of columns and \nrows. Each section of columns and rows is a data panel. Each data panel has column headings at the top."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"DATA","@Value3":"PAGE"},"StatementOptionToolTips":{"@ToolTip1":"Writes the specified number of observations in a panel, if possible. More than one panel can occur on every page if space permits. Range: 1 to the largest integer that the operating system supports.","@ToolTip2":"Bases the size of the panel on the way that the table is stored in memory. This value provides the fastest performance. However, if the table contains many columns, the number of rows in each panel might be small.","@ToolTip3":"Tries to make panels that match the page size. If the table contains more columns than can fit on a page, the first page is filled with as many observations as possible for as many columns as can fit on a single line. The second page contains the same observations for the next group of columns, and so on, until all rows and columns have been printed."}},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"[Syntax: DEVICE= device-driver] \n \nSpecifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"},"StatementOptionType":"V"},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Syntax: FILE=file-specification\n \nSpecifies the file to write to. file-specification is one of the following:\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GPATH=","StatementOptionHelp":{"#cdata":"Syntax: GPATH= file-specification <(url='Uniform-Resource-Locator' | NONE)> \n\nSpecifies the location for all graphics output that is generated while the destination is open. \n\nfile-specification \nspecifies the file or SAS catalog to which to write. file-specification is one of the following:\n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file.\n \n libref.catalog \n specifies a SAS catalog to which to write.\n\nURL= 'Uniform-Resource-Locator' | NONE \nspecifies a URL for file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references \n that it creates to the file.\n\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE \n specifies that no information from the GPATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"Syntax: URL= 'Uniform-Resource-Locator' | NONE \n\nSpecifies a URL for file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references \n that it creates to the file.\n\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE \n specifies that no information from the GPATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution of ODS graphics output. Output from device-based graphics is not \naffected. Default: 100"},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package."},"StatementOptionType":"S"},{"StatementOptionName":"SGE=","StatementOptionHelp":{"#cdata":"Determines whether you can edit ODS graphics output with the ODS Graphics Editor."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ON","@Value2":"OFF"},"StatementOptionToolTips":{"@ToolTip1":"Turns on the ability to edit ODS graphics output with the ODS Graphics Editor.","@ToolTip2":"Turns off the ability to edit ODS graphics output with the ODS Graphics Editor."}}]}},{"StatementName":"ODS DOCUMENT","StatementHelp":{"#cdata":"Opens, manages, or closes the DOCUMENT destination, which produces a hierarchy of output \nobjects that enables you to produce multiple ODS output formats without rerunning a PROC \nor DATA step. \n\nSyntax:\n(1) ODS DOCUMENT action; \n\n(2) ODS DOCUMENT \n member-name <(access-option)>> \n > )> \n ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the DOCUMENT destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"CATALOG=|CAT=","StatementOptionHelp":{"#cdata":"By default, no value is assigned to CATALOG=, which means that temporary GRSEGs \nare not copied to a permanent catalog."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"_NULL_"},"StatementOptionToolTips":{"@ToolTip1":"Copies any temporary GRSEG to the specified permanent catalog and keeps a reference to the permanent GRSEG in the document. This value persists until the ODS DOCUMENT statement is closed, or until you delete it by specifying CATALOG=_NULL_. The permanent catalog has the following form: ;","@ToolTip2":"Deletes the catalog name that was previously specified for the CATALOG= option. Thereafter, temporary GRSEGs are not copied into the permanent catalog, and thus are unavailable in subsequent sessions."}},{"StatementOptionName":"DIR=","StatementOptionHelp":{"#cdata":"Syntax: DIR= (> ); \n \nSpecifies the directory path and/or label for ODS output. \n\nLABEL=label \nassigns a label to a path.\n\nPATH= path <(access-option)> \nis specified as a sequence of entries that are delimited by backslashes.\n\n path can have the form: \n\n path<#sequence-number> \n where path is the name of the path.\n\n #sequence-number \n is a number which, when combined with a pathname, uniquely identifies the entry \n in the directory that contains it. \n\n access-option \n specifies the access mode for the ODS document. \n\n WRITE -- opens a document and provides write access as well as read access. \n\n UPDATE -- opens an ODS document and appends new content to the document. UPDATE \n provides update access as well as read access."},"StatementOptionType":"V"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Is specified as a sequence of entries that are delimited by backslashes."},"StatementOptionType":"V"},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"Assigns a label to a path."},"StatementOptionType":"V"},{"StatementOptionName":"WRITE","StatementOptionHelp":{"#cdata":"[access-option] \n \nOpens a document and provides write access as well as read access."},"StatementOptionType":"S"},{"StatementOptionName":"UPDATE","StatementOptionHelp":{"#cdata":"[access-option] \n \nOpens an ODS document and appends new content to the document. UPDATE provides \nupdate access as well as read access."},"StatementOptionType":"S"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"Syntax: NAME= member-name<(access-option)> \nwhere:\n\nlibref \nspecifies the SAS library where the document is stored.\n\n Default: If no library name is specified, the WORK library is used. \n\nmember-name \nspecifies the document name.\n\naccess-option \nspecifies the access mode for the ODS document. \n\n WRITE \n opens a document and provides write access as well as read access. \n\n UPDATE \n opens an ODS document and appends new content to the document. UPDATE provides update access as well \n as read access."},"StatementOptionType":"V"}]}},{"StatementName":"ODS OUTPUT","StatementHelp":{"#cdata":"Produces a SAS data set from an output object and manages the selection and exclusion lists \nfor the OUTPUT destination. \n\nSyntax:\n(1) ODS OUTPUT action; \n(2) ODS OUTPUT data-set-definition(s);"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the OUTPUT destination. When an ODS destination is closed, ODS does not send \noutput to that destination. Closing a destination frees some system resources."},"StatementOptionType":"S"},{"StatementOptionName":"CLEAR","StatementOptionHelp":{"#cdata":"Sets the list for the OUTPUT destination to EXCLUDE ALL."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes to the SAS log the current selection or exclusion list for the OUTPUT destination. \nIf the list is the default list (EXCLUDE ALL), then SHOW also writes the current overall \nselection or exclusion list."},"StatementOptionType":"S"},{"StatementOptionName":"MATCH_ALL=","StatementOptionHelp":{"#cdata":"Syntax: MATCH_ALL= \n\nCreates a new data set for each output object."},"StatementOptionType":"V"},{"StatementOptionName":"PERSIST=","StatementOptionHelp":{"#cdata":"Determines when ODS closes any data sets that it is creating, and determines when ODS \nremoves output objects from the selection list for the OUTPUT destination."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"PROC","@Value2":"RUN"},"StatementOptionToolTips":{"@ToolTip1":"Maintains the list of definitions even after the procedure ends, until you explicitly modify it.","@ToolTip2":"Maintains the list of definitions and keeps open the data sets that it is creating even if the procedure or DATA step ends, or until you explicitly modify the list."}},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"S"}]}},{"StatementName":"ODS GRAPHICS","StatementHelp":{"#cdata":"Syntax: ODS GRAPHICS ; \n \n Enables or disables ODS graphics processing and sets graphics environment options. \n This statement affects ODS template-based graphics only. The ODS GRAPHICS statement \n does not affect device-based graphics."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"OFF","StatementOptionHelp":{"#cdata":"Disables ODS Graphics processing."},"StatementOptionType":"RS"},{"StatementOptionName":"ON","StatementOptionHelp":{"#cdata":"Enables ODS Graphics processing. This is the default if no argument is used."},"StatementOptionType":"RS"},{"StatementOptionName":"ANTIALIAS=","StatementOptionHelp":{"#cdata":"Specifies whether anti-aliasing is applied to the rendering of the line and markers in any graph."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Does not smooth jagged edges of components other than text in the graph.","@ToolTip2":"Smooths jagged edges of all components in the graph."}},{"StatementOptionName":"ANTIALIAS","StatementOptionHelp":{"#cdata":"Smooths jagged edges of all components in the graph."},"StatementOptionType":"S"},{"StatementOptionName":"NOANTIALIAS","StatementOptionHelp":{"#cdata":"Does not smooth jagged edges of components other than text in the graph."},"StatementOptionType":"S"},{"StatementOptionName":"ANTIALIASMAX=","StatementOptionHelp":{"#cdata":"Specifies the maximum number of markers or lines to be anti-aliased before anti-aliasing \nis disabled. \n\nDefault: 4000"},"StatementOptionType":"V"},{"StatementOptionName":"ATTRPRIORITY=","StatementOptionHelp":{"#cdata":"Syntax: ATTRPRIORITY=AUTO | COLOR | NONE \n \nSpecifies a priority for cycling of the group attributes. \n\nDefault: AUTO\nInteraction: The default lists of data colors, contrast colors, marker symbols, and line patterns are"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"COLOR","@Value3":"NONE"},"StatementOptionToolTips":{"@ToolTip1":"Honors the attribute priority that is set by the active style\u2019s AttrPriority attribute, if present.","@ToolTip2":"Assigns priority to the color attribute rotation by cycling through the list of colors while holding the marker symbol and line pattern constant. When all of the colors are exhausted, the marker symbol and line style attributes increment to the next element, and then the colors in the list are repeated. This pattern repeats as needed.","@ToolTip3":"Does not use an attribute priority in the rotation pattern, even if one is set in the active style\u2019s AttrPriority attribute. The rotation pattern cycles progressively through the attribute lists."}},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether to draw a border around the graph."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to draw a border around the graph.","@ToolTip2":"Specifies to draw a border around the graph."}},{"StatementOptionName":"BORDER","StatementOptionHelp":{"#cdata":"Specifies whether to draw a border around the graph."},"StatementOptionType":"S"},{"StatementOptionName":"NOBORDER","StatementOptionHelp":{"#cdata":"Specifies not to draw a border around any graph."},"StatementOptionType":"S"},{"StatementOptionName":"BYLINE=","StatementOptionHelp":{"#cdata":"Syntax: BYLINE=NOBYLINE | TITLE | FOOTNOTE \n \nSpecifies how the BY group line is displayed in graphs when an analysis is run with a BY statement. \nBy default, no BY line is displayed. \n\nDefault\nNOBYLINE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NOBYLINE","@Value2":"TITLE","@Value3":"FOOTNOTE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that no BY line is displayed. NOBYLINE is the default.","@ToolTip2":"Specifies that the BY line is displayed as a left-justified graph footnote. This is the recommended setting.","@ToolTip3":"Specifies that the BY line is displayed as a centered graph title. Specifying TITLE is not recommended because graphs are not designed to have additional title lines."}},{"StatementOptionName":"DATASKINMAX=","StatementOptionHelp":{"#cdata":"Syntax: DATASKINMAX=n \n \nSpecifies the maximum number of skinned graphical elements allowed per plot. \n\nn\n specifies a positive integer.\n Default: 200"},"StatementOptionType":"V"},{"StatementOptionName":"DISCRETEMAX=","StatementOptionHelp":{"#cdata":"Specifies the maximum number of discrete values to be shown in any graph. \n \nDefault: 1000"},"StatementOptionType":"V"},{"StatementOptionName":"DRILLTARGET=","StatementOptionHelp":{"#cdata":"Syntax: DRILLTARGET=\"_BLANK\" | \"_SELF\" | \"\" \n \nSpecifies the window that displays the drill-down output. \n\nDefault: _SELF"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"_BLANK","@Value2":"_SELF","@Value3":""},"StatementOptionToolTips":{"@ToolTip1":"Opens a new browser window to display the drilldown output. Requirements: You must enclose _BLANK in quotation marks. You must specify _BLANK in lowercase.","@ToolTip2":"Opens the drill-down output the same window. Requirements: You must enclose _SELF in quotation marks. You must specify _SELF in lower case.","@ToolTip3":"Opens the drill down output in the named frame in the current window. If the name does not exist, the output is opened in a new window. Requirement You must enclose frame\u2013name in quotation marks."}},{"StatementOptionName":"GROUPMAX=","StatementOptionHelp":{"#cdata":"Specifies the maximum number of group values to be shown in any graph. Any graph \nthat supports the GROUP= option is affected. \n\nDefault: 1000"},"StatementOptionType":"V"},{"StatementOptionName":"HEIGHT=","StatementOptionHelp":{"#cdata":"Specifies the height of any graph."},"StatementOptionType":"V"},{"StatementOptionName":"IMAGEFMT=","StatementOptionHelp":{"#cdata":"[Syntax: IMAGEFMT=image-file-type | STATIC] \n \nSpecifies the image format to be used. If the image format is not valid for the \nactive output destination, the format is automatically changed to the default \nimage format for that destination."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BMP","@Value2":"DIB","@Value3":"EMF","@Value4":"EPSI","@Value5":"GIF","@Value6":"JFIF","@Value7":"JPEG","@Value8":"PBM","@Value9":"PDF","@Value10":"PNG","@Value11":"PS","@Value12":"SASEMF","@Value13":"TIFF","@Value14":"WMF","@Value15":"STATIC"},"StatementOptionToolTips":{"@ToolTip1":"Microsoft Windows Device Independent Bitmap","@ToolTip2":"Microsoft Windows Device Independent Bitmap","@ToolTip3":"Microsoft NT Enhanced Metafile","@ToolTip4":"Microsoft NT Enhanced Metafile","@ToolTip5":"Graphics Interchange Format","@ToolTip6":"JPEG File Interchange Format","@ToolTip7":"Joint Photographic Experts Group","@ToolTip8":"Portable Bitmap Utilities","@ToolTip9":"Portable Document Format","@ToolTip10":"Portable Network Graphic","@ToolTip11":"PostScript Image File Format","@ToolTip12":"Enhanced Metafile","@ToolTip13":"Tagged Image File Format","@ToolTip14":"Microsoft Windows Metafile","@ToolTip15":"Uses the best quality static image format for the active output destination. This is the default."}},{"StatementOptionName":"IMAGEMAP=","StatementOptionHelp":{"#cdata":"Specifies to generate data tips."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to generate data tips.","@ToolTip2":"Specifies to generate data tips."}},{"StatementOptionName":"IMAGEMAP","StatementOptionHelp":{"#cdata":"Specifies to generate data tips."},"StatementOptionType":"S"},{"StatementOptionName":"NOIMAGEMAP","StatementOptionHelp":{"#cdata":"Specifies not to generate data tips."},"StatementOptionType":"S"},{"StatementOptionName":"IMAGENAME=","StatementOptionHelp":{"#cdata":"[Syntax: IMAGENAME=\"filename\"] \n \nSpecifies the base image filename."},"StatementOptionType":"V"},{"StatementOptionName":"LABELMAX=","StatementOptionHelp":{"#cdata":"[Syntax: LABELMAX= n] \n \nSpecifies the maximum number of labeled areas before labeling is disabled. \n\nDefault: 200"},"StatementOptionType":"V"},{"StatementOptionName":"LABELPLACEMENT=","StatementOptionHelp":{"#cdata":"Syntax: LABELPLACEMENT= GREEDY | SA \n \nSpecifies the label-placement algorithm to use for positioning labels in the graphs."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"GREEDY","@Value2":"SA"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the Greedy method for managing label collision.","@ToolTip2":"Specifies the Simulated Annealing method for managing label collision."}},{"StatementOptionName":"LEGENDAREAMAX=|MAXLEGENDAREA=","StatementOptionHelp":{"#cdata":"[Syntax: MAXLEGENDAREA= n] \n \nSpecifies an integer that is interpreted as the maximum percentage of the \noverall graphics area that a legend can occupy. \n\nDefault: 20"},"StatementOptionType":"V"},{"StatementOptionName":"LOESSOBSMAX=|LOESSMAXOBS=","StatementOptionHelp":{"#cdata":"[Syntax: LOESSOBSMAX=n \n\nSpecifies an upper limit for the number of observations that can be used with a loess plot."},"StatementOptionType":"V"},{"StatementOptionName":"NBINSMAX=","StatementOptionHelp":{"#cdata":"[Syntax: NBINSMAX=n \n \nSpecifies the maximum number of bins that are processed for histograms."},"StatementOptionType":"V"},{"StatementOptionName":"NXYBINSMAX=","StatementOptionHelp":{"#cdata":"[Syntax: NXYBINSMAX=n \n\nSpecifies the maximum number of bins that are processed for heat maps."},"StatementOptionType":"V"},{"StatementOptionName":"OBSMAX=","StatementOptionHelp":{"#cdata":"[Syntax: OBSMAX=n \n\nSpecifies the maximum number of observations that are processed."},"StatementOptionType":"V"},{"StatementOptionName":"OUTPUTFMT=","StatementOptionHelp":{"#cdata":"Syntax: OUTPUTFMT= file\u2013type | STATIC \n \nSpecifies the format to be used. If the image or vector graphic format is not valid for the active \noutput destination, the format is automatically changed to the default format for that destination."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"STATIC"},"StatementOptionToolTips":{"@ToolTip1":"Is the image or vector graphic format to be generated. See \u201cSupported File Types for Output Destinations\u201d on page 306.","@ToolTip2":"Uses the best quality static image format for the active output destination. This is the default output format. TIP: The STATIC keyword can be used to reset the output format to its default state."}},{"StatementOptionName":"PANELCELLMAX=","StatementOptionHelp":{"#cdata":"[Syntax: PANELCELLMAX=n] \n \nSpecifies the maximum number of cells in a graph panel where the number of \ncells is determined dynamically by classification variables. \n\nDefault: 10000"},"StatementOptionType":"V"},{"StatementOptionName":"PUSH|POP","StatementOptionHelp":{"#cdata":"Pushes and pops ODS GRAPHICS settings in a stack."},"StatementOptionType":"S"},{"StatementOptionName":"RESET","StatementOptionHelp":{"#cdata":"Resets all of the options to their defaults."},"StatementOptionType":"S"},{"StatementOptionName":"RESET=","StatementOptionHelp":{"#cdata":"Resets the specified option to its default value."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ALL","@Value2":"ANTIALIAS","@Value3":"ANTIALIASMAX","@Value4":"ATTRPRIORITY","@Value5":"BORDER","@Value6":"INDEX","@Value7":"HEIGHT","@Value8":"IMAGEMAP","@Value9":"LABELMAX","@Value10":"SCALE","@Value11":"TIPMAX","@Value12":"WIDTH"},"StatementOptionToolTips":{"@ToolTip1":"Resets all of the reset-options to their defaults.","@ToolTip2":"Resets the ANTIALIAS option to its default.","@ToolTip3":"Resets the ANTIALIASMAX option to its default.","@ToolTip4":"Resets the BORDER= option to its default.","@ToolTip5":"Resets the ATTRPRIORITY= option to its default.","@ToolTip6":"Resets the index counter that is appended to static image files.","@ToolTip7":"Resets the HEIGHT= option to its default.","@ToolTip8":"Resets the IMAGEMAP= option to its default.","@ToolTip9":"Resets the LABELMAX= option to its default.","@ToolTip10":"Resets the SCALE= option to its default.","@ToolTip11":"Resets the TIPMAX= option to its default.","@ToolTip12":"Resets the WIDTH= option to its default."}},{"StatementOptionName":"SCALE=","StatementOptionHelp":{"#cdata":"Specifies the width of any graph. Requires a nonnegative number."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OFF","@Value2":"ON"},"StatementOptionToolTips":{"@ToolTip1":"Does not scale the components of graph proportionally.","@ToolTip2":"Scales the components of graph proportionally."}},{"StatementOptionName":"SCALE","StatementOptionHelp":{"#cdata":"Scales the components of graph proportionally."},"StatementOptionType":"S"},{"StatementOptionName":"NOSCALE","StatementOptionHelp":{"#cdata":"Does not scale the components of graph proportionally."},"StatementOptionType":"S"},{"StatementOptionName":"SCALEMARKERS=","StatementOptionHelp":{"#cdata":"Syntax: SCALEMARKERS=YES | NO | ON | OFF \n \nSpecifies whether the plot markers are to be scaled with the graph size. The scaling factor \nis based on the height of the graph cells and the height of the graph. \n\nDefault: ON\nRestriction: Scaling is done only if the graph contains multiple cells or single nested cells."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"YES","@Value2":"NO"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the plot markers are to be scaled with the graph size.","@ToolTip2":"Specifies that the plot markers are not scaled with the graph size."}},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current ODS Graphics settings to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"STACKDEPTHMAX=","StatementOptionHelp":{"#cdata":"Syntax: STACKDEPTHMAX=n \n \nSpecifies the maximum stack depth for PUSH and POP requests."},"StatementOptionType":"V"},{"StatementOptionName":"SUBPIXEL=","StatementOptionHelp":{"#cdata":"Syntax: SUBPIXEL=ON | OFF\n \nSpecifies whether subpixel rendering should be used for rendering ODS Graphics."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ON","@Value2":"OFF"},"StatementOptionToolTips":{"@ToolTip1":"Always uses subpixel rendering, when applicable, for rendering lines and bars. ","@ToolTip2":"Never uses subpixel rendering. "}},{"StatementOptionName":"SUBPIXEL","StatementOptionHelp":{"#cdata":"Always uses subpixel rendering, when applicable, for rendering lines and bars."},"StatementOptionType":"S"},{"StatementOptionName":"NOSUBPIXEL","StatementOptionHelp":{"#cdata":"Never uses subpixel rendering."},"StatementOptionType":"S"},{"StatementOptionName":"TIPMAX=","StatementOptionHelp":{"#cdata":"[Syntax: TIPMAX=n] \n \nSpecifies the maximum number of distinct mouse-over areas allowed before data tips \nare disabled. Default: 500"},"StatementOptionType":"V"},{"StatementOptionName":"TOTALCELLMAX=","StatementOptionHelp":{"#cdata":"Syntax: TOTALCELLMAX=n \n \nSpecifies the maximum number of total cells in a graph where the number of cells is determined \ndynamically by classification variables."},"StatementOptionType":"V"},{"StatementOptionName":"WIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: WIDTH=dimension] \n \nSpecifies the width of any graph. Requires a nonnegative number."},"StatementOptionType":"V"}]}},{"StatementName":"ODS MARKUP|ODS HTML|ODS CHTML|ODS HTMLCSS|ODS HTML3|ODS IMODE|ODS PHTML|ODS CSVALL|ODS DOCBOOK|ODS WML|ODS SASREPORT|ODS TROFF|ODS HTML4|ODS LATEX|ODS WMLOLIST","StatementHelp":{"#cdata":"Opens, manages, or closes the specified destination, which produces SAS output that is formatted using \none of many different markup languages.\n \nSyntax: \nODS MARKUP|HTML|CHTML|HTMLCSS|HTML3|IMODE|PHTML|CSVALL|DOCBOOK|WML|SASREPORT|TROFF|\n HTML4|LATEX|WMLOLIST<(identifier)> ; \nODS MARKUP|HTML|CHTML|HTMLCSS|HTML3|IMODE|PHTML|CSVALL|DOCBOOK|WML|SASREPORT|TROFF|\n HTML4|LATEX|WMLOLIST<(identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":" Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies a unique base name for the anchor tag that identifies each output object \nin the current body file."}},{"StatementOptionName":"ARCHIVE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ARCHIVE='string'] \n \nThe ARCHIVE= option is only valid for the GOPTIONS Java device. The ARCHIVE= \noption allows you to specify a string to identify which applet to use in order \nto view the ODS HTML output."}},{"StatementOptionName":"ATTRIBUTES=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ATTRIBUTES=(attribute-pair-1 ... attribute-pair-n)] \n \nWrites the specified attributes between the tags that generate dynamic graphics output."}},{"StatementOptionName":"BASE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BASE= 'base-text'] \n \nSpecifies the text to use as the first part of all links and references that ODS \ncreates in the output files."}},{"StatementOptionName":"BODY=|FILE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BODY= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains the primary \noutput that is created by the ODS statement.","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CHARSET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CHARSET=character-set] \n \nSpecifies the character set to be generated in the META declaration for the \nHTML output."}},{"StatementOptionName":"CODE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CODE= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains relevant \nstyle information, such as XSL (Extensible Stylesheet Language). \n\nsuboption(s)\n specifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files. \n Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all the links \n and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"CODEBASE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CODEBASE='string'] \n \nCreates a file path that is used by the GOPTIONS devices."}},{"StatementOptionName":"CONTENTS=","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Syntax: CONTENTS= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a table of contents for \nthe output. These files remain open until you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement \n or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first \n file and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for \nwriting the output files. \n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. \n For HTML 4.0, the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in \n the browser window title bar. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all \n the links and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"}},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"warabic","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"},"StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."}},{"StatementOptionName":"EVENT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: EVENT=event-name (FILE= | FINISH | LABEL= | NAME= | START | STYLE= |TARGET= | TEXT= | URL= )\n \nSpecifies an event and the value for event variables that are associated with the event. \n\n(FILE= BODY | CODE | CONTENTS | DATA | FRAME | PAGES | STYLESHEET);\n triggers one of the known types of output files that correspond to the BODY=, CODE=, CONTENTS=, FRAME=, PAGES=, and STYLESHEET= options.\n(FINISH)\n triggers the finish section of an event.\n(LABEL='variable-value')\n specifies the value for the LABEL event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(NAME='variable-value')\n specifies the value for the NAME event variable.\n Requirement: variable-value must be enclosed in quotation marks. \n(START)\n triggers the start section of an event.\n(STYLE=style-element)\n specifies a style element.\n(TARGET='variable-value')\n specifies the value for the TARGET event variable. \n(TEXT='variable-value')\n specifies the value for the TEXT event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(URL='variable-value')\n specifies the value for the URL event variable.\n Requirement: variable-value must be enclosed in quotation marks."},"SubOptionsKeywords":"FILE=|FINISH|LABEL=|NAME|START|STYLE=|TARGET=|TEXT=|URL="},{"StatementOptionName":"FRAME=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: FRAME='file-specification' \n \nOpens a MARKUP family destination and, for HTML output, specifies the file that integrates the table \nof contents, the page contents, and the body file. \n\nsuboption(s)\n specifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files. \n Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. For HTML 4.0, \n the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in the browser \n window title bar.\n title-text\n is the text in the metadata of a file that indicates the title. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all the links \n and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders. If you open the frame file, \nthen you see a table of contents, a table of pages, or both, as well as the body file. For XLM \noutput, FRAME= specifies the file that contains the DTD. These files remain open until you do \none of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"GPATH=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: GPATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location for all graphics output that is generated while the destination is open. \n\n 'aggregate-file-storage-location' \n specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref \n is a file reference that has been assigned to an aggregate storage location. Use the FILENAME \n statement to assign a fileref.\n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for file-specification. \n\n Uniform-Resource-Locator -- is the URL you specify. ODS uses this URL instead of the filename in \n all the links and references that it creates to the file.\n Requirement: You must enclose Uniform-Resource-Locator in quotation marks. \n\n NONE -- specifies that no information from the GPATH= option appears in the links or references."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"HEADTEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies tags to place between the and tags in all the files that the destination \nwrites to. \n\nSyntax: HEADTEXT= 'markup-document-head' \n\nwhere:\n\n markup-document-head \n specifies the markup tags to place between the and tags.\n\n Requirement: You must enclose markup-document-head in quotation marks."}},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 100. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."}},{"StatementOptionName":"METATEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies HTML code to use as the tag between the and tags of all the HTML \nfiles that the destination writes to. \n\nSyntax: METATEXT= 'metatext-for-document-head' \n\nwhere:\n\n 'metatext-for-document-head' \n specifies the HTML code that provides the browser with information about the document that it is loading. \n For example, this attribute could specify the content type and the character set to use.\n\n Requirement: You must enclose metatext-for-document-head in quotation marks."}},{"StatementOptionName":"NEWFILE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."},"StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new body file at the specified starting-point."}},{"StatementOptionName":"OPTIONS","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS ( DOC= | )] \n \nSpecifies tagset-specific suboptions and a named value.\n\n(DOC='QUICK' | 'HELP' | 'SETTINGS') \nprovides information about the specified tagset. \n\n QUICK \n describes the options available for this tagset. \n\n HELP \n provides generic help and information with a quick reference.\n\n SETTINGS \n provides the current option settings.\n\nsuboption(s) \nspecifies one or more suboptions that are valid for the specified tagset. Supoptions have the \nfollowing format: \n\n keyword='value' \n You can get information about suboptions for a specific tagset by specifying one of the following \n options when opening an ODS tagset statement or at any time after the destination has been opened. \n \n options(doc='help');\n options(doc='quick'); \n options(doc='settings');"}},{"StatementOptionName":"PACKAGE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package."}},{"StatementOptionName":"PAGE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PAGE= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a description of each \npage of the body file, and contains links to the body file. ODS produces a new page of output \nwhenever a procedure requests a new page. These files remain open until you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or \n ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file \n and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n Interaction: If you specify an entry name, you must also specify a library and catalog. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"PARAMETERS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PARAMETERS=(parameter-pair-1 ... parameter-pair-n) \n \nWrites the specified parameters between the tags that generate dynamic graphics output.\n\n parameter-pair \n specifies the name and value of each parameter. parameter-pair has the following form: \n\n 'parameter-name'= 'parameter-value' \n\n where:\n \n parameter-name -- is the name of the parameter.\n\n parameter-value -- is the value of the parameter.\n Requirement: You must enclose parameter-name and parameter-value in quotation marks."}},{"StatementOptionName":"PATH=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."}},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"SubOptionsKeywords":"NONE"},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition to use in writing the output files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Interaction:\n The STYLE= option is not valid when you are creating XML output.\n\n For a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template Procedure\u201d \n in SAS 9.4 Output Delivery System: Procedures Guide."}},{"StatementOptionName":"STYLESHEET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STYLESHEET= 'file-specification' \n \nOpens a markup family destination and places the style information for markup output into an external \nfile, or reads style sheet information from an existing file. These files remain open until you do one \nof the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\nfile-specification is one of the following:\n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to.\n Interaction: If you specify an entry name, you must also specify a library and catalog. See the discussion \n of the PATH= option. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for writing the \noutput files. Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. \n For HTML 4.0, the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in \n the browser window title bar. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all \n the links and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"TAGSET=|TYPE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"CHTML","@Value2":"CORE","@Value3":"CSV","@Value4":"CSVALL","@Value5":"CSVBYLINE","@Value6":"DEFAULT","@Value7":"DOCBOOK","@Value8":"ExcelXP","@Value9":"HTML4","@Value10":"HTMLCSS","@Value11":"HTMLPANEL","@Value12":"IMODE","@Value13":"MSOFFICE2K","@Value14":"MVSHTML","@Value15":"PHTML","@Value16":"PYX","@Value17":"RTF","@Value18":"SASREPORT","@Value19":"WML","@Value20":"WMLOLIST","@Value21":"XHTML","@Value22":"EVENT_MAP","@Value23":"NAMEDHTML","@Value24":"SHORT_MAP","@Value25":"STYLE_DISPLAY","@Value26":"STYLE_POPUP","@Value27":"TEXT_MAP","@Value28":"TPL_STYLE_LIST","@Value29":"TPL_STYLE_MAP"},"StatementOptionToolTips":{"@ToolTip1":"Produces compact, minimal HTML output that does not use style information.","@ToolTip2":"Contains a table of Unicode values and mnemonics.","@ToolTip3":"Produces tabular output that contains columns of data values that are separated by commas.","@ToolTip4":"Produces tabular output with titles that contain columns of data values that are separated by commas.","@ToolTip5":"Produces output with comma-separated values and columns of data that are separated by commas.","@ToolTip6":"Produces XML output.","@ToolTip7":"Produces XML output that conforms to the DocBook DTD by OASIS.","@ToolTip8":"Produces Microsoft's spreadsheetML XML. This tagset is used to import data into XML.","@ToolTip9":"Produces HTML 4.0 embedded style sheets.","@ToolTip10":"Produces HTML output with cascading style sheets that is similar to ODS HTML output.","@ToolTip11":"Creates panels for By-grouped graphs.","@ToolTip12":"Produces HTML output as a column of output that is separated by lines.","@ToolTip13":"Produces HTML code for output generated by ODS for Microsoft Office products.","@ToolTip14":"Produces URLs within HTML files that are used in the z/OS operating environment.","@ToolTip15":"Produces simple HTML output that uses twelve style elements and no class attributes.","@ToolTip16":"Produces PYX, which is a simple, line-oriented notation used by Pyxie to describe the information communicated by an XML parser to an XML application.","@ToolTip17":"Produces measured RTF.","@ToolTip18":"Causes imbedded data to be produced in CSV format.","@ToolTip19":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with a list of URLs as a table of contents.","@ToolTip20":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with an option list for the table of contents.","@ToolTip21":"Produces output in HTML format.","@ToolTip22":"Creates XML output that shows which events are being triggered and which variables are used by an event to send output from a SAS process to an output file.","@ToolTip23":"Creates HTML output similar to STYLE_POPUP, but with all the objects labeled as they are when using ODS TRACE.","@ToolTip24":"Creates a subset of the XML output that is created by the EVENT_MAP tagset.","@ToolTip25":"Creates a sample page of HTML output that is similar to STYLE_POPUP output.","@ToolTip26":"Creates HTML like HTMLCSS, but if you're using Internet Explorer, STYLE_POPUP displays a window that shows the resolved ODS style definition for any item that you select.","@ToolTip27":"Creates text output that shows which events are being triggered as ODS handles the output objects.","@ToolTip28":"Creates HTML output in a bulleted list similar to EVENT_MAP but lists only a subset of the possible attributes.","@ToolTip29":"Creates XML output similar to EVENT_MAP but lists only a subset of the possible attributes."},"StatementOptionHelp":{"#cdata":"Specifies a keyword value for a tagset. A tagset is a template that defines how to create an output \ntype from a SAS format."}},{"StatementOptionName":"TEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TEXT='variable-value'] \n \nInserts text into your document by triggering the paragraph event and specifying \na text string to be assigned to the VALUE event variable."}},{"StatementOptionName":"TRANTAB=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."}}]}},{"StatementName":"ODS PRINTER|ODS PS|ODS PCL|ODS PDF","StatementHelp":{"#cdata":"Opens, manages, or closes the specified destination (PRINTER, PS, PCL, PDF), which produces\nprintable output.\n \nSyntax: \n(1) ODS PRINTER|PS|PCL|PDF <(identifier)> ; \n(2) ODS PRINTER|PS|PCL|PDF <(identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ACCESSIBLE","StatementOptionHelp":{"#cdata":"[FOR ODS PDF]\n \nSpecifies to add non-visual metadata to the PDF file that enables the file to be accessed by assistive \ntechnology such as a screen reader."},"StatementOptionType":"S"},{"StatementOptionName":"NOACCESSIBLE","StatementOptionHelp":{"#cdata":"[FOR ODS PDF]\n \nSpecifies not to add non-visual metadata to the PDF file that enables the file to be accessed by assistive \ntechnology such as a screen reader."},"StatementOptionType":"S"},{"StatementOptionName":"ACCESSIBLE_IDENTIFIER","StatementOptionHelp":{"#cdata":"[FOR ODS PDF] \n \nSpecifies to add an identifier to the metadata of the PDF file confirming that the PDF produced by \nSAS meets the PDF Matterhorn Protocol."},"StatementOptionType":"S"},{"StatementOptionName":"NOACCESSIBLE_IDENTIFIER","StatementOptionHelp":{"#cdata":"[FOR ODS PDF] \n \nSpecifies to add an identifier to the metadata of the PDF file confirming that the PDF produced by \nSAS meets the PDF Matterhorn Protocol."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the root name for the anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts into the metadata of a file, the text string that you specify as the author."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates \nin the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BOOKMARKLIST=","StatementOptionHelp":{"#cdata":"Specifies whether to generate and display the list of bookmarks for a PDF file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"HIDE","@Value2":"NONE|NO|OFF","@Value3":"SHOW|YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Generates a list of bookmarks for your PDF file. The bookmarks are not automatically displayed when you open the PDF file.","@ToolTip2":"Specifies not to generate a list of bookmarks for your PDF file.","@ToolTip3":"Generates a list of bookmarks for your PDF file. The bookmarks are automatically displayed when you open the PDF file."}},{"StatementOptionName":"BOOKMARKGEN=","StatementOptionHelp":{"#cdata":"Controls the generation of bookmarks in a PDF file."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO|OFF","@Value2":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to generate bookmarks in the PDF file.","@ToolTip2":"Specifies to generate bookmarks in the PDF file."}},{"StatementOptionName":"BOOKMARKGEN","StatementOptionHelp":{"#cdata":"Specifies to generate bookmarks in the PDF file."},"StatementOptionType":"S"},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"NOBOOKMARKGEN","StatementOptionHelp":{"#cdata":"Specifies not to generate bookmarks in the PDF file."},"StatementOptionType":"S"},{"StatementOptionName":"COLOR=","StatementOptionHelp":{"#cdata":"Applies the specified color scheme to your output."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FULL","@Value2":"GRAY|GREY","@Value3":"MONO|BW","@Value4":"NO","@Value5":"YES"},"StatementOptionToolTips":{"@ToolTip1":"Creates full color output for both text and graphics.","@ToolTip2":"Creates gray scale output for both text and graphics.","@ToolTip3":"Creates monochromatic output for both text and graphics.","@ToolTip4":"Does not use all the color information that the style definition provides.","@ToolTip5":"Uses all the color information that a style definition provides, including background color."}},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n] \n \nSpecifies the number of columns to place across each page of output. \n \nn \nis the number columns per page.\n\nDefault: 1"},"StatementOptionType":"V"},{"StatementOptionName":"COMPRESS=","StatementOptionHelp":{"#cdata":"[Syntax: COMPRESS=n] \n \nControls the compression of a PDF file. Compression reduces the size of the file.\n \nn \nspecifies the level of compression. The larger the number, the greater the compression. For example,\nn=0 is completely uncompressed, and n=9 is the maximum compression level. \n\nDefault: 6 \nRange: 0-9"},"StatementOptionType":"V"},{"StatementOptionName":"CONTENTS=","StatementOptionHelp":{"#cdata":"Controls the generation of a printable table of contents."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NO","@Value2":"YES"},"StatementOptionToolTips":{"@ToolTip1":"Does not generate a printable table of contents.","@ToolTip2":"Generates a printable table of contents."}},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Generates a printable table of contents page."},"StatementOptionType":"S"},{"StatementOptionName":"NOCONTENTS","StatementOptionHelp":{"#cdata":"Does not generate a printable table of contents."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for output files. Default: 150 \n \nRestriction: The DPI= option takes effect only if specified at the opening of a file. "},"StatementOptionType":"V"},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Syntax: FILE='external-file' | fileref \n \nSpecifies the file that contains the output. \n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement \n to assign a fileref."},"StatementOptionType":"V"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Specifies to include all of the currently defined footnotes within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined footnotes from appearing in the graphics file. \nInstead, they become part of the Printer file."},"StatementOptionType":"S"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Specifies to include all of the currently defined titles within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined titles from appearing in the graphics output. \nInstead, the titles become part of the Printer file."},"StatementOptionType":"S"},{"StatementOptionName":"HOST","StatementOptionHelp":{"#cdata":"Specifies that ODS use the printer drivers that the host system provides. \n \nInteraction: In an ODS printer family statement that refers to an open ODS PRINTER destination, \nthe HOST option forces ODS to close the destination and all files that are associated with it, \nand to open a new instance of the destination."},"StatementOptionType":"S"},{"StatementOptionName":"KEYWORDS=","StatementOptionHelp":{"#cdata":"[Syntax: KEYWORDS='keywords-text'] \n \nInserts into the output file's metadata, a string of keywords. \n \nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the PDFMARK \noption specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The KEYWORDS= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose keywords-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (identifier)] \n \nEnables you to open multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"Creates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the file that is currently open.","@ToolTip3":"Starts a new file for each output object. For SAS/GRAPH this means that ODS creates a new file for each SAS/GRAPH output file that the program generates.","@ToolTip4":"Starts a new file for each page of output. A page break occurs when a procedure explicitly starts a new page (not because the page size was exceeded) or when you start a new procedure.","@ToolTip5":"Starts a body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC","StatementOptionHelp":{"#cdata":"Specifies that ODS omit the table of contents (Bookmark list) that is produced by default when \nproducing PDF or PDFMARK output. \n\nInteraction: The NOTOC option specifies BOOKMARKLIST=OFF and CONTENTS= OFF."},"StatementOptionType":"S"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. If no name \nis specified, then the output is added to the unnamed package that was opened last."},"StatementOptionType":"S"},{"StatementOptionName":"PCL","StatementOptionHelp":{"#cdata":"Creates PCL output. \n \nRestriction: Do not use this option in conjunction with the PDF or PS option. \n\nInteraction: If you use the PCL option in an ODS PRINTER statement that refers to an open \nODS PRINTER destination, the option will force ODS to close the destination and all files \nthat are associated with it, and to open a new instance of the destination."},"StatementOptionType":"S"},{"StatementOptionName":"PDF","StatementOptionHelp":{"#cdata":"Creates PDF output. \n \nRestriction: Do not use this option in conjunction with the PCL or PS option. \n\nInteraction: If you use the PDF option in an ODS PRINTER statement that refers to an open \nODS PRINTER destination, the option will force ODS to close the destination and all files \nthat are associated with it, and to open a new instance of the destination.]"},"StatementOptionType":"S"},{"StatementOptionName":"PDFMARK","StatementOptionHelp":{"#cdata":"Enables ODS to insert special tags into a PostScript file. When you use software such as Adobe Acrobat \n(not Adobe Viewer), Acrobat Distiller interprets the tags to create a PDF file that contains the \nfollowing items: \n\n o bookmarks for each section of the output and for each table.\n\n o references for items that are associated with the URL= style attribute.\n\n o notes for items that are associated with the FLYOVER= style attribute. \n Notes are optional, and are based on the PDFNOTE option.\n\n o author, keywords, subject, and title in the metadata of a file."},"StatementOptionType":"S"},{"StatementOptionName":"PDFNOTE","StatementOptionHelp":{"#cdata":"Adds notes to a PDF file for items that are associated with the FLYOVER= style attribute."},"StatementOptionType":"S"},{"StatementOptionName":"NOPDFNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Modifies the behavior of PDFMARK so that notes are not added to the file for items that are associated \nwith the FLYOVER= style attribute."}},{"StatementOptionName":"PDFTOC=","StatementOptionHelp":{"#cdata":"[Syntax: PDFTOC=n] \n \nControls the level of the expansion of the table of contents in PDF documents."},"StatementOptionType":"V"},{"StatementOptionName":"PRINTER=|PRT=","StatementOptionHelp":{"#cdata":"[Syntax: PRINTER=printer-name] \n \nCreates output that is formatted for the specified printer. \n \nDefault: If you do not specify a printer, then ODS formats the printer output for the printer \nthat is specified by one of two SAS system options: \n \n o SYSPRINT= if you are using the Windows operating environment and do not specify any of the\n following options: PCL, PDFMARK, POSTSCRIPT, PS, or SAS.\n\n o PRINTERPATH= in all other cases.\n \nRestriction: printer-name must match a subkey in either the SAS registry or the Windows printer registry."},"StatementOptionType":"V"},{"StatementOptionName":"PS|POSTCRIPT=","StatementOptionHelp":{"#cdata":"Creates PostScript output."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"Syntax: STYLE=style-definition] \n \nSpecifies the style definition to use in writing the printer output. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Interaction:\n The STYLE= option is not valid when you are creating XML output.\n\n For a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template Procedure\u201d \n in SAS 9.4 Output Delivery System: Procedures Guide."},"StatementOptionType":"V"},{"StatementOptionName":"SUBJECT=","StatementOptionHelp":{"#cdata":"[Syntax: SUBJECT='subject-text'] \n \nInserts into the metadata of a file the text string that you specify as the subject.\n\nsubject-text \nis the text in the metadata of a file that indicates the subject.\n\nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the \nPDFMARK option specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The SUBJECT= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose subject-text in quotation marks. "},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT='text-string'] \n \nInserts a text string into your output. \n \nRequirement: You must enclose text-string in quotation marks. "},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='title-text'] \n \nInserts into the metadata of a file, the text string that you specify as the title. \n\nRestriction: Use this option only with the ODS PDF statement, the ODS PS statement with the \nPDFMARK option specified, and the ODS PRINTER statement with the PDFMARK option specified. \n\nRestriction: The TITLE= option takes effect only if specified at the opening of a file. \n\nRequirement: You must enclose title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"UNIFORM","StatementOptionHelp":{"#cdata":"For multiple page tables, ensures uniformity from page to page within a single table. \nWhen the UNIFORM option is in effect, ODS reads the entire table before it starts to \nprint it so that it can determine the column widths that are necessary to accommodate \nall the data. These column widths are applied to all pages of a multiple page table. \n\nNote: With BY-group processing, SAS writes the results of each BY group to a separate \ntable, so the output might not be uniform across BY groups."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PROCTITLE","StatementHelp":{"#cdata":"Syntax: ODS PROCTITLE; \n \nWrites, in the output, the name of the procedure that produces the results."},"StatementOptions":null},{"StatementName":"ODS NOPROCTITLE","StatementHelp":{"#cdata":"Syntax: ODS NOPROCTITLE;\n \nSuppresses the writing of the title of the procedure that produces the results."},"StatementOptions":null},{"StatementName":"ODS PROCLABEL","StatementHelp":{"#cdata":"Enables you to change a procedure label.\n \nSyntax: ODS PROCLABEL 'string';\n \nwhere:\n\n'string' is the procedure label that you specify."},"StatementOptions":null},{"StatementName":"ODS LAYOUT","StatementHelp":{"#cdata":"A new feature in SAS 9 for generating PDF documents. The ODS LAYOUT START and ODS \nLAYOUT END statements are used to generate one page for a PDF document."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"START","StatementOptionHelp":{"#cdata":"[Syntax: ODS LAYOUT START ; ] \n \nMarks the beginning of a new ODS LAYOUT block."},"StatementOptionType":"S"},{"StatementOptionName":"END","StatementOptionHelp":{"#cdata":"[Syntax: ODS LAYOUT END ; ] \n \nMarks the end of an ODS LAYOUT block. The ODS LAYOUT START and ODS LAYOUT END statements are used \nto generate one page for a PDF document."},"StatementOptionType":"S"},{"StatementOptionName":"ABSOLUTE","StatementOptionHelp":{"#cdata":"[Syntax: ODS LAYOUT ABSOLUTE< option-1>< option-2 ...> ] \n \nManages the ODS LAYOUT destination when producing one page of output for PRINTER destinations \n(PDF, PS, and PCL). Absolute layout enables you to specify the exact location on a page for \nyour layout container and regions and is limited to one page of layout."},"StatementOptionType":"S"},{"StatementOptionName":"GRIDDED","StatementOptionHelp":{"#cdata":"[Syntax: ODS LAYOUT GRIDDED< option-1>< option-2 ...> ; ] \n \nGridded layout enables you to arrange output in a two-dimensional relative grid structure \n(like a spreadsheet or a piece of graph paper). Gridded layout is a mechanism for arranging \noutput dynamically."},"StatementOptionType":"S"}]}},{"StatementName":"ODS REGION","StatementHelp":{"#cdata":"[Syntax: ODS REGION ; \n ...SAS Graphics/Report code\n \nMarks the beginning of an ODS REGION block. This statement allows you to specify where on a page \nyou would like to place output from a graphics/report procedure."},"StatementOptions":null},{"StatementName":"ODS RESULTS","StatementHelp":{"#cdata":"Syntax: ODS RESULTS ON | OFF; \n \nTracks ODS output in the Results window."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON","StatementOptionHelp":{"#cdata":"Tracks output that ODS generates in the Results window."},"StatementOptionType":"S"},{"StatementOptionName":"OFF","StatementOptionHelp":{"#cdata":"Turns off the tracking of output that ODS generates in the Results window."},"StatementOptionType":"S"}]}},{"StatementName":"ODS TEXT=","StatementHelp":{"#cdata":"Inserts text into your ODS output. \n \nSyntax: ODS TEXT= 'text-string';\n \nwhere:\n\ntext-string\nspecifies the text to insert into your output. This text is sent to all open supported \noutput destinations.\n\nRestriction: The ODS TEXT= statement does not support the OUTPUT destination or the \nLISTING destination. All other ODS destinations are supported. \n\nRequirement: You must enclose 'text-string' in parentheses. \n\nTip: The UserText style element controls text specified with the TEXT= statement."},"StatementOptions":null},{"StatementName":"ODS TRACE","StatementHelp":{"#cdata":"Syntax: ODS TRACE ON ; | ODS TRACE OFF;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON|OUTPUT|YES","StatementOptionHelp":{"#cdata":"Turns on the writing of the trace record."},"StatementOptionType":"RS"},{"StatementOptionName":"OFF|NO","StatementOptionHelp":{"#cdata":"Turns off the writing of the trace record."},"StatementOptionType":"RS"},{"StatementOptionName":"EXCLUDED","StatementOptionHelp":{"#cdata":"Includes, in the trace record, information for excluded output objects."},"StatementOptionType":"S"},{"StatementOptionName":"LABEL","StatementOptionHelp":{"#cdata":"Includes the label path for the output object in the record. You can use a label \npath anywhere that you can use a path."},"StatementOptionType":"S"},{"StatementOptionName":"LISTING","StatementOptionHelp":{"#cdata":"Writes the trace record to the Listing destination, so that each part of the trace \nrecord immediately precedes the output object that it describes."},"StatementOptionType":"S"}]}},{"StatementName":"ODS USEGOPT","StatementHelp":{"#cdata":"Syntax: ODS USEGOPT; \n \nSpecifies that ODS use traditional SAS/GRAPH option settings for non-graphical output."},"StatementOptions":null},{"StatementName":"ODS NOUSEGOPT","StatementHelp":{"#cdata":"Syntax: ODS NOUSEGOPT; \n \nSpecifies that ODS not use traditional SAS/GRAPH option settings for non-graphical output."},"StatementOptions":null},{"StatementName":"ODS VERIFY","StatementHelp":{"#cdata":"Syntax: ODS VERIFY ; \n \nPrints or suppresses a message indicating that a style definition or a table definition being \nused is not supplied by SAS."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ON|YES","StatementOptionHelp":{"#cdata":"Prints the warning and sends output objects to open destinations."},"StatementOptionType":"S"},{"StatementOptionName":"OFF|NO","StatementOptionHelp":{"#cdata":"Suppresses the warning."},"StatementOptionType":"S"},{"StatementOptionName":"ERROR","StatementOptionHelp":{"#cdata":"Prints an error message instead of a warning message and does not send output objects to open destinations."},"StatementOptionType":"S"},{"StatementOptionName":"WARN","StatementOptionHelp":{"#cdata":"Prints a warning message and does not send output objects to open destinations."},"StatementOptionType":"S"}]}},{"StatementName":"ODS ESCAPECHAR=","StatementHelp":{"#cdata":"Defines a representative character to be used in output strings.\n \nSyntax: ODS ESCAPECHAR= 'escape-character';\n\nescape-character \nspecifies the special character that identifies the inline formatting symbol. The escape-character \nshould be one of the following rarely used characters: @, ^, or \\."},"StatementOptions":null},{"StatementName":"ODS RTF","StatementHelp":{"#cdata":"Opens, manages, or closes the RTF destination, which produces measured output that \nis written in Rich Text Format for use with Microsoft Word 2002.\n \nSyntax: \nODS RTF <( identifier)> action; \nODS RTF <( identifier)> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the RTF destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the base name for the RTF anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts the text string that you specify as the author into the metadata of a file."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates in the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BODYTITLE","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes are placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document.\n\nRestriction: The BODYTITLE option can be specified only when you create a new RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BODYTITLE_AUX","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes be placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document. These titles \nand footnotes are put into cells, which allows titles and footnotes to be centered, \nleft-justified, or right-justified.\n\nRestriction: You can specify the BODYTITLE_AUX option only when you are creating a \nnew RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"COLUMNS=","StatementOptionValues":{"@Value1":"","@Value2":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Is the number of one-inch columns that you want on the page.","@ToolTip2":"Specifies the maximum number of one-inch-wide columns for the paper size and margin setting. This value is dependent upon the paper size and page orientation."},"StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n | MAX] \n \nSpecifies the number of columns to place across each page of output. \n \nDefault: the number of one-inch columns that fit on the page."},"StatementOptionType":"V"},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Produces a table of contents page for RTF documents that are opened in Microsoft Word. \nThe table of contents page contains a Table of Contents field, which puts all of the \ncontents information that is embedded in the document into a table of contents. To \nexpand the table of contents, right-click under the title in Microsoft Word and select \nUpdate Field from the selection list. \n\nRestriction: Do not use the CONTENTS option with the NEWFILE option."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default device for each \nopen output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"}},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Opens the RTF destination and specifies the RTF file or SAS catalog to which to write. \nThis file remains open until you do one of the following actions:\n\n o Close the RTF destination with ODS RTF CLOSE or ODS _ALL_ CLOSE.\n\n o Specify a different file to which to write.\n\nSyntax: FILE= 'external-file' | fileref\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined footnotes within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined footnotes from appearing in the graphics file. Instead, \nthey become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined titles within the graphics output that is called \nby the body file."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined titles from appearing in the graphics output. \nInstead, the titles become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 200. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."},"StatementOptionType":"V"},{"StatementOptionName":"KEEPN","StatementOptionHelp":{"#cdata":"ODS allows table splits only if the entire table cannot fit on one page."},"StatementOptionType":"S"},{"StatementOptionName":"NOKEEPN","StatementOptionHelp":{"#cdata":"ODS lets a table split at a page break."},"StatementOptionType":"S"},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS not to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"OPERATOR=","StatementOptionHelp":{"#cdata":"[Syntax: OPERATOR= 'text-string'] \n \nInserts the text you specify into the metadata of the RTF file."},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. If no name \nis specified, then the output is added to the unnamed package that was opened last."},"StatementOptionType":"S"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, \n or partitioned data set. Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"StatementOptionType":"V","SubOptionsKeywords":"NONE"},{"StatementOptionName":"SASDATE","StatementOptionHelp":{"#cdata":"Writes to the RTF file the time and the date that you started your SAS session. \n\nRestriction: You can specify SASDATE only when you open a new file. If you specify the option \nat any other time, ODS writes a warning message to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition for ODS to use to write the RTF files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Interaction:\n The STYLE= option is not valid when you are creating XML output.\n\n For a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template Procedure\u201d \n in SAS 9.4 Output Delivery System: Procedures Guide."},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT= 'text-string' ] \n \nInserts text into your RTF output. \n\nRestriction: You cannot use both the NEWFILE= and TEXT= options in the same ODS RTF \nstatement. You must use a separate ODS RTF statement for each of these options. \n\nRequirement: You must enclose a text-string in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE= 'title-text'] \n \nInserts the text string that you specify as the title into the metadata of a file.\n\ntitle-text \nis the text in the metadata of a file that indicates the title.\n\nRequirement: You must enclose a title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"TRANTAB=","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."},"StatementOptionType":"V"}]}},{"StatementName":"ODS TAGSETS.RTF","StatementHelp":{"#cdata":"Opens, manages, or closes the RTF destination, which produces measured output that \nis written in Rich Text Format for use with Microsoft Word 2002.\n \nSyntax: \nODS TAGSETS.RTF <( identifier)> action; \nODS TAGSETS.RTF <( identifier)> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the RTF destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the RTF destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies the base name for the RTF anchor tag that identifies each output object \nin the current file."},"StatementOptionType":"V"},{"StatementOptionName":"AUTHOR=|NAMED_DEST=|BOOKMARK=","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='author-text'] \n \nInserts the text string that you specify as the author into the metadata of a file."},"StatementOptionType":"V"},{"StatementOptionName":"BASE=","StatementOptionHelp":{"#cdata":"Specifies the text to use as the first part of all references that ODS creates \nin the output files.\n\nSyntax: BASE= 'base-text'\n\nbase-text \nis the text that ODS uses as the first part of all references that ODS creates in the file.\n\nConsider this specification: \n\nBASE='http://www.your-company.com/local-url/'\nIn this case, ODS creates references that begin with the string http://www.your-company.com/local-url/. \nThe appropriate anchor-name completes the link."},"StatementOptionType":"V"},{"StatementOptionName":"BODYTITLE","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes are placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document.\n\nRestriction: The BODYTITLE option can be specified only when you create a new RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BODYTITLE_AUX","StatementOptionHelp":{"#cdata":"Specifies that SAS titles and footnotes be placed into the body of the RTF document \ninstead of into the headers and footers section of the RTF document. These titles \nand footnotes are put into cells, which allows titles and footnotes to be centered, \nleft-justified, or right-justified.\n\nRestriction: You can specify the BODYTITLE_AUX option only when you are creating a new RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=n | MAX] \n \nSpecifies the number of columns to place across each page of output. \n \nDefault: the number of one-inch columns that fit on the page."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Is the number of one-inch columns that you want on the page.","@ToolTip2":"Specifies the maximum number of one-inch-wide columns for the paper size and margin setting. This value is dependent upon the paper size and page orientation."}},{"StatementOptionName":"CONTENTS","StatementOptionHelp":{"#cdata":"Produces a table of contents page for RTF documents that are opened in Microsoft Word. \nThe table of contents page contains a Table of Contents field, which puts all of the \ncontents information that is embedded in the document into a table of contents. To \nexpand the table of contents, right-click under the title in Microsoft Word and select \nUpdate Field from the selection list. \n\nRestriction: Do not use the CONTENTS option with the NEWFILE option."},"StatementOptionType":"S"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default device for each \nopen output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"},"StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."}},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Opens the RTF destination and specifies the RTF file or SAS catalog to which to write. This file \nremains open until you do one of the following actions:\n\n o Close the RTF destination with ODS RTF CLOSE or ODS _ALL_ CLOSE.\n\n o Specify a different file to which to write.\n\nSyntax: FILE= 'external-file' | fileref\n\n 'external-file' \n is the name of an external file to which to write.\n\n fileref \n is a file reference that has been assigned to an external file."},"StatementOptionType":"V"},{"StatementOptionName":"GFOOTNOTE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined footnotes within the graphics output."},"StatementOptionType":"S"},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined footnotes from appearing in the graphics file. Instead, \nthey become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"GTITLE","StatementOptionHelp":{"#cdata":"Includes all of the currently defined titles within the graphics output that is called \nby the body file."},"StatementOptionType":"S"},{"StatementOptionName":"NOGTITLE","StatementOptionHelp":{"#cdata":"Prevents all of the currently defined titles from appearing in the graphics output. Instead, the \ntitles become part of the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 200. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."},"StatementOptionType":"V"},{"StatementOptionName":"KEEPN","StatementOptionHelp":{"#cdata":"ODS allows table splits only if the entire table cannot fit on one page."},"StatementOptionType":"S"},{"StatementOptionName":"NOKEEPN","StatementOptionHelp":{"#cdata":"ODS lets a table split at a page break."},"StatementOptionType":"S"},{"StatementOptionName":"NEWFILE=","StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new file at the specified starting-point."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."}},{"StatementOptionName":"NOTOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS not to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"OPERATOR=","StatementOptionHelp":{"#cdata":"[Syntax: OPERATOR= 'text-string'] \n \nInserts the text you specify into the metadata of the RTF file."},"StatementOptionType":"V"},{"StatementOptionName":"PACKAGE","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package. \n \npackage-name \nspecifies the name of a package that was created with the ODS PACKAGE statement. If no name \nis specified, then the output is added to the unnamed package that was opened last."},"StatementOptionType":"S"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."},"StatementOptionType":"V"},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"StatementOptionType":"V","SubOptionsKeywords":"NONE"},{"StatementOptionName":"SASDATE","StatementOptionHelp":{"#cdata":"Writes to the RTF file the time and the date that you started your SAS session. \n\nRestriction: You can specify SASDATE only when you open a new file. If you specify the option \nat any other time, ODS writes a warning message to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"STARTPAGE=","StatementOptionHelp":{"#cdata":"Controls page breaks."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NEVER","@Value2":"NO|OFF","@Value3":"NOW","@Value4":"YES|ON"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to insert page breaks, even before graphics procedures.","@ToolTip2":"Specifies that no new pages be inserted at the beginning of each procedure, or within certain procedures, even if new pages are requested by the procedure code. A new page will begin only when a page is filled or when you specify STARTPAGE=NOW.","@ToolTip3":"Forces the immediate insertion of a new page.","@ToolTip4":"Inserts a new page at the beginning of each procedure, and within certain procedures, as requested by the procedure code."}},{"StatementOptionName":"STYLE=","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition for ODS to use to write the RTF files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Interaction:\n The STYLE= option is not valid when you are creating XML output.\n\n For a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template Procedure\u201d \n in SAS 9.4 Output Delivery System: Procedures Guide."},"StatementOptionType":"V"},{"StatementOptionName":"TEXT=","StatementOptionHelp":{"#cdata":"[Syntax: TEXT= 'text-string' ] \n \nInserts text into your RTF output. \n \nRestriction: You cannot use both the NEWFILE= and TEXT= options in the same ODS RTF statement. \nYou must use a separate ODS RTF statement for each of these options. \n\nRequirement: You must enclose a text-string in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE= 'title-text'] \n \nInserts the text string that you specify as the title into the metadata of a file.\n\ntitle-text \nis the text in the metadata of a file that indicates the title.\n\nRequirement: You must enclose a title-text in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TOC_DATA","StatementOptionHelp":{"#cdata":"Instructs ODS to insert contents data into the RTF file."},"StatementOptionType":"S"},{"StatementOptionName":"TRANTAB=","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."},"StatementOptionType":"V"},{"StatementOptionName":"OPTIONS","StatementOptionHelp":{"#cdata":"Syntax: OPTIONS (CONTENTS= | DOC= | SECT= | TABLES_OFF= | TOC_DATA= | TOC_LEVEL= | TROWD= | RHDR= | TROWHDRCELL= ) \n \nSpecifies ODS TAGSETS.RTF specific suboptions and a named value. \n\n (CONTENTS= 'YES') \n produces a table of contents (TOC) page for RTF documents that are opened in Microsoft Word.\n\n (DOC='QUICK' | 'HELP' | 'SETTINGS') \n provides information about the tagset.\n\n (SECT='rtf_control_string' | 'OFF' | 'NONE') \n inserts RTF control words into the section data specifications.\n\n (TABLES_OFF='style_elements' | 'STYLE_ELEMENTS' | 'OFF' ) \n determines whether tables will be used. \n\n (TOC_DATA ='ON' | 'OFF') \n specifies whether to show the contents data in the RTF file.\n\n (TOC_LEVEL ='n') \n controls the level of the expansion of the table of contents in RTF documents. This option \n must be used with the (CONTENTS=YES) and (TOC_DATA=YES) options specified.\n \n (TROWD='rtf_control_string' | ' OFF') \n inserts raw RTF specifications directly into header descriptions of the table row.\n\n (TRHDR='rtf_control_string' | 'OFF') \n inserts raw table row RTF specifications directly into the header description of the table row. \n\n (TROWHDRCELL='text_string' | 'OFF')\n inserts raw text into the table row cells. If the RTF Reader does not recognize this text_string, \n it applies the raw text to the location where the RTF is being written in the documentation. \n Otherwise, the RTF Reader interprets the text_string as RTF control words.\n \n (VSPACE='ON' | 'OFF')\n specifies whether to add or remove space before and after tables. \n \n (WATERMARK='text_string ' | ' ')\n inserts a watermark that is displayed diagonally across each page of the RTF document"},"StatementOptionType":"S","SubOPtionsKeywords":"CONTENTS=|DOC=|SECT=|TABLES_OFF=|TOC_DATA=|TOC_LEVEL=|TROWD=|TRHDR=|TROWHDRCELL=|VSPACE=|WATERMARK="},{"StatementOptionName":"PAGEPANELS=","StatementOptionHelp":{"#cdata":"Specifies the number of panels permitted per page before ODS inserts a page break."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"NONE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a positive integer. Replace n with an actual value.","@ToolTip2":"Specifies that paneling will be handled the way that it has always been handled by traditional ODS RTF. That is, all of the first panel is written, then all of the second panel, and so on, until all of the table information is written."}},{"StatementOptionName":"TABLEROWS=","StatementOptionHelp":{"#cdata":"[Syntax: TABLEROWS= n] \n \nSpecifies the number of rows in each table before ODS inserts a page break. If the \ntable is narrow enough to fit on a page, n lines will be written to the table before \na page break. If the table is too wide for a page, the page is broken into panels. \nIn each panel, n rows will be written. When all the panels for n rows have been \nwritten, a page break is inserted before the next group of panels is written."},"StatementOptionType":"V"},{"StatementOptionName":"UNIFORM","StatementOptionHelp":{"#cdata":"Ensures uniformity from page to page within a single table that requires multiple pages."},"StatementOptionType":"S"}],"#comment":{}}},{"StatementName":"ODS PACKAGE","StatementHelp":{"#cdata":"The ODS PACKAGE statement opens, adds to, publishes, or closes one SAS Output Delivery \nSystem (ODS) package object. \n \nSyntax: \n(1) ODS PACKAGE () OPEN ; \n(2) ODS PACKAGE () ADD FILE=\"file-specification\" | DATA=member-specification \n MIMETYPE=\"string\" ; \n(3) ODS PACKAGE () PUBLISH transport PROPERTIES(transport-property-1=\"value-1\" ... \n transport-property-n=\"value-n\"); \n(4) ODS PACKAGE () CLOSE ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ADD","StatementOptionHelp":{"#cdata":"Adds a file or data set to an ODS package using the specified Multipurpose Internet \nMail Extensions (MIME) type. \n\nRequirement: When using the ADD argument, you must also use the MIMETYPE=, FILE=, or DATA= arguments \nto specify a file or data set and a MIME type. "},"StatementOptionType":"S"},{"StatementOptionName":"OPEN","StatementOptionHelp":{"#cdata":"Syntax: ODS PACKAGE () OPEN ; \n \nCreates the ODS package object to which the ODS destinations can connect. The ODS \npackage object holds the package metadata and tracks the locations of any files that \nare added to the package metadata. \n\nThe options for ODS PACKAGE OPEN statement are basically the metadata for the package: \n\n Description=value \n Specifies a string for the description for the package or file. \n\n Abstract=value \n Specifies a string for the abstract of the package or file. \n\n NameValue=\"\" \n Specifies a string of name/value pairs for the name/value metadata on the package or file. \n\n Template=value \n Specifies the name of a package template to use."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Deletes the package object. As long as you have not closed a package, you can publish \nit as many ways and times as you want. \n\nTip: Use the CLEAR option to remove files that have been added to the package."},"StatementOptionType":"S"},{"StatementOptionName":"PUBLISH EXPIRATION=","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH EXPIRATION=<'expiration-date'> \n \nBuilds the ODS package and sends it to the chosen delivery transport. \n\nexpiration-date \nspecifies an expiration date for the package. The date must be a SAS date value.\n\nRequirement: expiration-date must be enclosed in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"PUBLISH ARCHIVE PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH ARCHIVE PROPERTIES(transport-property-1=\"value-1\"... \n transport-property-n=\"value-n\"\")] \n \nPublishes a package to an archive. For a list of transport properties and their values, see \nthe section on transport properties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"PUBLISH EMAIL PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH EMAIL PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\") \n ADDRESSES(\"e-mail-address-1\" ... \"e-mail-address-n\")] \n \nPublishes a package to one or more e-mail addresses. For a list of transport properties \nand their values, see the section on transport properties in the SAS Publishing Framework: \nDeveloper's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"PUBLISH QUEUE PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH QUEUE PROPERTIES(transport-property-1=\"value-1\" ...\n transport-property-n=\"value-n\") QUEUES(\"queue-1\" ... \"queue-n\")] \n \nPublishes a package to one or more message queues. For a list of transport properties \nand their values, see the section on transport properties in the SAS Publishing Framework: \nDeveloper's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"PUBLISH SUBSCRIBERS PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH SUBSCRIBERS PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\")] \n \nPublishes a package to subscribers who are associated with the specified channel. \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"PUBLISH WEBDAV PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PUBLISH WEBDAV PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\")] \n \nPublishes a package to a WebDAV-compliant server. For a list of transport properties \nand their values, see the section on transport properties in the SAS Publishing Framework: \nDeveloper's Guide."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PACKAGE OPEN","StatementHelp":{"#cdata":"Syntax: ODS PACKAGE () OPEN ;\n \nCreates the ODS package object to which the ODS destinations can connect. The ODS \npackage object holds the package metadata and tracks the locations of any files that \nare added to the package metadata. \n\nThe options for ODS PACKAGE OPEN statement are basically the metadata for the package: \n\n Description=value \n Specifies a string for the description for the package or file. \n\n Abstract=value \n Specifies a string for the abstract of the package or file. \n\n NameValue=\"\" \n Specifies a string of name/value pairs for the name/value metadata on the package or file. \n\n Template=value \n Specifies the name of a package template to use."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ABSTRACT=","StatementOptionHelp":{"#cdata":"[Syntax: ABSTRACT=string] \n \nSpecifies a string for the abstract metadata of the package or file. \n\nRestriction: You can use the ABSTRACT= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"DESCRIPTION=","StatementOptionHelp":{"#cdata":"[Syntax: DESCRIPTION=string] \n \nSpecifies a string for the description metadata for the package or file.\n\nRestriction: You can use the DESCRIPTION= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"NAMEVALUE=","StatementOptionHelp":{"#cdata":"Syntax: NAMEVALUE=\"\" \n \nSpecifies a string of name/value pairs for the name/value metadata on the package or file.\n\nRestriction: The NAMEVALUE= option can be used only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"TEMPLATE=","StatementOptionHelp":{"#cdata":"Specifies the name of a package template to use.\n\nRestriction: You can use the TEMPLATE= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"}]}},{"StatementName":"ODS PACKAGE ADD","StatementHelp":{"#cdata":"Syntax: ODS PACKAGE () ADD FILE=\"file-specification\" | DATA=member-specification \n MIMETYPE=\"string\" ; \n \nAdds a file or data set to an ODS package using the specified Multipurpose Internet \nMail Extensions (MIME) type. \n\nRequirement: When using the ADD argument, you must also use the MIMETYPE=, FILE=, \nor DATA= arguments to specify a file or data set and a MIME type."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ABSTRACT=","StatementOptionHelp":{"#cdata":"[Syntax: ABSTRACT=string] \n \nSpecifies a string for the abstract metadata of the package or file. \n\nRestriction: You can use the ABSTRACT= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"DESCRIPTION=","StatementOptionHelp":{"#cdata":"[Syntax: DESCRIPTION=string] \n \nSpecifies a string for the description metadata for the package or file.\n\nRestriction: You can use the DESCRIPTION= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"NAMEVALUE=","StatementOptionHelp":{"#cdata":"Syntax: NAMEVALUE=\"\" \n \nSpecifies a string of name/value pairs for the name/value metadata on the package or file.\n\nRestriction: The NAMEVALUE= option can be used only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"TEMPLATE=","StatementOptionHelp":{"#cdata":"Specifies the name of a package template to use.\n\nRestriction: You can use the TEMPLATE= option only with the ADD or OPEN arguments."},"StatementOptionType":"V"},{"StatementOptionName":"FILE=","StatementOptionHelp":{"#cdata":"Syntax: FILE=\"file-specification\" \n \nSpecifies the file that you want to add to an ODS package. \n\nfile-specification \nspecifies one of the following:\n\n external-file is the name of an external file to add.\n Requirement: You must enclose external-file in quotation marks. \n \n fileref is a file reference that has been assigned to an external file. Use the \n FILENAME statement to assign a fileref. \n \nTEXT \nspecifies that the file is a text file.\n\nBINARY \nspecifies that the file is a binary file."},"StatementOptionType":"S"},{"StatementOptionName":"DATA=","StatementOptionHelp":{"#cdata":"[Syntax: DATA=member-specification] \n \nSpecifies the data set that you want to add to an ODS package. \n \nmember-specification can be in the form libname.membername or membername. \n\nRestriction: You can use the DATA= argument only with the ADD argument. \nRestriction: You cannot add a file and a data set to an ODS package."},"StatementOptionType":"V"},{"StatementOptionName":"MIMETYPE=","StatementOptionHelp":{"#cdata":"[Syntax: MIMETYPE=''string\"] \n \nSpecifies the Multipurpose Internet Mail Extensions (MIME) type for the file \nor data set that you are adding to an ODS package. \n\nRestriction: You can use the MIMETYPE= argument only with the ADD argument."},"StatementOptionType":"V"},{"StatementOptionName":"PATH=","StatementOptionHelp":{"#cdata":"[Syntax: PATH=\"path-specification\"] \n \nPlaces the file or data set at the specified pathname within an ODS package. \n\nRestriction: You can use the PATH= option only with the ADD argument."},"StatementOptionType":"V"}]}},{"StatementName":"ODS PACKAGE CLOSE","StatementHelp":{"#cdata":"Syntax: ODS PACKAGE () CLOSE ; \n \nCloses and deletes the package object. As long as you have not closed a package, \nyou can publish it as many ways and times as you want. \n\nTip: Use the CLEAR option to remove files that have been added to the package."},"StatementOptions":{"StatementOption":{"StatementOptionName":"CLEAR","StatementOptionHelp":{"#cdata":"Specifies that all files that were automatically added to the package will be removed \nfrom the location to which ODS wrote them. \n\nRestriction: You can use the CLEAR option only with the CLOSE argument."},"StatementOptionType":"S"}}},{"StatementName":"ODS PACKAGE PUBLISH","StatementHelp":{"#cdata":"Syntax: ODS PACKAGE () PUBLISH transport PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\"); \n \nCloses and deletes the package object. As long as you have not closed a package, \nyou can publish it as many ways and times as you want. \n\nTip: Use the CLEAR option to remove files that have been added to the package."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXPIRATION=","StatementOptionHelp":{"#cdata":"Syntax: EXPIRATION=<'expiration-date'> \n \nSpecifies an expiration date for the package. The date must be a SAS date value.\n\nRequirement: expiration-date must be enclosed in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"EMAIL","StatementOptionHelp":{"#cdata":"Specifies an EMAIL deliver transport to use with the PUBLISH action. \n \nSyntax: EMAIL PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\") \n ADDRESSES(\"e-mail-address-1\" ... \"e-mail-address-n\") \n \nPublishes a package to one or more e-mail addresses."},"StatementOptionType":"S"},{"StatementOptionName":"ARCHIVE","StatementOptionHelp":{"#cdata":"Specifies an ARCHIVE deliver transport to use with the PUBLISH action.\n \nSyntax: ARCHIVE PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n\nPublishes a package to an archive."},"StatementOptionType":"S"},{"StatementOptionName":"QUEUE","StatementOptionHelp":{"#cdata":"Specifies a QUEUE deliver transport to use with the PUBLISH action.\n \nSyntax: QUEUE PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\") QUEUES(\"queue-1\" ... \"queue-n\") \n\nPublishes a package to one or more message queues."},"StatementOptionType":"S"},{"StatementOptionName":"SUBSCRIBERS","StatementOptionHelp":{"#cdata":"Specifies a SUBSCRIBERS deliver transport to use with the PUBLISH action.\n \nSyntax: SUBSCRIBERS PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\") \n\nPublishes a package to subscribers who are associated with the specified channel."},"StatementOptionType":"S"},{"StatementOptionName":"WEBDAV","StatementOptionHelp":{"#cdata":"Specifies a WEBDAV deliver transport to use with the PUBLISH action.\n \nSyntax: WEBDAV PROPERTIES(transport-property-1=\"value-1\" ... transport-property-n=\"value-n\") \n\nPublishes a package to a WebDAV-compliant server."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PACKAGE PUBLISH ARCHIVE","StatementHelp":{"#cdata":"Syntax: ARCHIVE PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nPublishes a package to an archive."},"StatementOptions":{"StatementOption":{"StatementOptionName":"PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"}}},{"StatementName":"ODS PACKAGE PUBLISH EMAIL","StatementHelp":{"#cdata":"Syntax: EMAIL PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n ADDRESSES(\"e-mail-address-1\" ... \"e-mail-address-n\") \n \nPublishes a package to one or more e-mail addresses."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"ADDRESSES","StatementOptionHelp":{"#cdata":"Syntax: ADDRESSES(\"e-mail-address-1\" ... \"e-mail-address-n\") \n \nSpecifies one or more email addresses."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PACKAGE PUBLISH QUEUE","StatementHelp":{"#cdata":"Syntax: QUEUE PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n QUEUES(\"queue-1\" ... \"queue-n\") \n \nPublishes a package to one or more message queues."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"},{"StatementOptionName":"QUEUES","StatementOptionHelp":{"#cdata":"Syntax: QUEUES(\"queue-1\" ... \"queue-n\") \n \nList of one or more message queues."},"StatementOptionType":"S"}]}},{"StatementName":"ODS PACKAGE PUBLISH SUBSCRIBERS","StatementHelp":{"#cdata":"Syntax: SUBSCRIBERS PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nPublishes a package to subscribers who are associated with the specified channel."},"StatementOptions":{"StatementOption":{"StatementOptionName":"PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"}}},{"StatementName":"ODS PACKAGE PUBLISH WEBDAV","StatementHelp":{"#cdata":"Syntax: SUBSCRIBERS PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nPublishes a package to a WebDAV-compliant server. "},"StatementOptions":{"StatementOption":{"StatementOptionName":"PROPERTIES","StatementOptionHelp":{"#cdata":"Syntax: PROPERTIES(transport-property-1=\"value-1\"... transport-property-n=\"value-n\"\") \n \nFor a list of transport properties and their values, see the section on transport \nproperties in the SAS Publishing Framework: Developer's Guide."},"StatementOptionType":"S"}}},{"StatementName":"ODS TAGSETS","StatementHelp":{"#cdata":"Opens, manages, or closes the specified tagset destination.\n \nSyntax: \n(1) ODS directory.tagset-name file-specification ; \n(2) ODS directory.tagset-name file-specification action; "},"StatementOptions":null},{"StatementName":"ODS SELECT","StatementHelp":{"#cdata":"Syntax: ODS SELECT selection(s) | ALL | NONE; \n \nSpecifies output objects for ODS destinations. Each selection has the following form: \n\noutput-object <(PERSIST)> \n\noutput-object \nspecifies the output object to select. \n\nTo specify an output object, you need to know which output objects your SAS program \nproduces. The ODS TRACE statement writes to the SAS log a trace record that includes \nthe path, the label, and other information about each output object that your SAS \nprogram produces.\n\n(PERSIST) \nkeeps the output-object that precedes the PERSIST option in the selection list, even \nif the DATA or procedure step ends, until you explicitly modify the list with one of \nthe following:\n\n o any ODS EXCLUDE statement\n o ODS SELECT NONE\n o ODS SELECT ALL\n o an ODS SELECT statement that applies to the same output object but does not \n specify PERSIST\n\nRequirement: You must enclose PERSIST in parentheses."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"Specifies that ODS send all of the output objects to the open destination. \n\nAlias: ODS SELECT DEFAULT \n\nInteraction: If you specify ALL without specifying a destination, ODS sets the overall \nlist to SELECT ALL and sets all other lists to their defaults."},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"Specifies that ODS does not send any output objects to the open destination.\n\nInteraction: If you specify NONE and you do not specify a destination, ODS sets the overall list to \nSELECT NONE and sets all other lists to their defaults. \n\nTip: Using the NONE action is different from closing a destination. The output destination is still \nopen, but ODS restricts the output that it sends to the destination. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want to \nresume sending output to the suspended destination."},"StatementOptionType":"V"},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"V"},{"StatementOptionName":"WHERE=","StatementOptionHelp":{"#cdata":"[Syntax: WHERE=where-expression] \n \nSelects output objects that meet a particular condition. For example, the following \nstatement selects only output objects with the word \"Histogram\" in their name: \n\n ods select where=(_name_ ? 'Histogram');\n\nwhere-expression \nis an arithmetic or logical expression that consists of a sequence of operators \nand operands. where-expression has this form: \n\n(subsetting-variable ) \n\n subsetting-variable \n Subsetting variables are a special kind of WHERE expression operand used by SAS \n to help you find common values in items. For example, this ODS SELECT statement \n selects only output objects with the path City_Pop_90.TestsForLocation : \n\n ods select / where=(_path_ = 'City_Pop_90.TestsForLocation' );\n subsetting-variable is one of the following:\n\n _LABEL_ -- is the label of the output object\n _LABELPATH_ -- is the label path of the output object\n _NAME_ -- is the name of the output object.\n _PATH_ -- is the full or partial path of the output object. \n \noperator \ncompares a variable with a value or with another variable. operator can be AND, OR \nNOT, OR, AND NOT, or a comparison operator (= EQ ^= ~= <> NE > GT < LT >= GE <= LE)."},"StatementOptionType":"V"}]}},{"StatementName":"ODS EXCLUDE","StatementHelp":{"#cdata":"Syntax: ODS EXCLUDE exclusions(s) | ALL | NONE; \n \nSpecifies output objects to exclude from ODS destinations. Each exclusion has the following form: \n\n output-object <(PERSIST)> \n\noutput-object \nspecifies one or more output objects to exclude. To specify an output object, you need to know \nwhich output objects your SAS program produces. The ODS TRACE statement writes to the SAS log a \ntrace record that includes the path, the label, and other information about each output object \nthat is produced.\n\n(PERSIST) \nkeeps the output-object that precedes the PERSIST option in the exclusion list, even until you \nexplicitly modify the list with any of the following ODS statements:\n\n o any ODS SELECT statement\n o ODS EXCLUDE NONE\n o ODS EXCLUDE ALL\n o an ODS EXCLUDE statement that applies to the same output object but does not specify PERSIST\n\nThis action is true even if the DATA or procedure step ends.\n\nRequirement: You must enclose PERSIST in parentheses."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ALL","StatementOptionHelp":{"#cdata":"Specifies that ODS does not send any output objects to the open destination.\n\nAlias: ODS EXCLUDE DEFAULT \n\nInteraction: If you specify ALL without specifying a destination, ODS sets the overall list to \nEXCLUDE ALL and sets all other lists to their defaults. \n\nTip: Using ODS EXCLUDE ALL is different from closing a destination. The destination remains open, \nbut no output objects are sent to it. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want \nto resume sending output to the suspended destination. "},"StatementOptionType":"S"},{"StatementOptionName":"NONE","StatementOptionHelp":{"#cdata":"Specifies that ODS send all of the output objects to the open destination.\n\nInteraction: If you specify the NONE argument without specifying a destination, ODS sets the overall \nlist to EXCLUDE NONE and sets all other lists to their defaults. \n\nTip: ODS EXCLUDE NONE has the same effect as ODS SELECT ALL. \n\nTip: To temporarily suspend a destination, use ODS SELECT NONE. Use ODS SELECT ALL when you want to \nresume sending output to the suspended destination."},"StatementOptionType":"V"},{"StatementOptionName":"NOWARN","StatementOptionHelp":{"#cdata":"Suppresses the warning that an output object was requested but not created."},"StatementOptionType":"V"},{"StatementOptionName":"WHERE=","StatementOptionHelp":{"#cdata":"[Syntax: WHERE=where-expression] \n \nExcludes output objects that meet a particular condition. For example, the following statement \nexcludes only output objects with the word \"Histogram\" in their name: \n\n ods exclude where=(_name_ ? 'Histogram');\n\nwhere-expression \nis an arithmetic or logical expression that consists of a sequence of operators and operands. \n\nwhere-expression has this form: \n\n(subsetting-variable ) \n\n subsetting-variable \n Subsetting variables are a special kind of WHERE expression operand used by SAS to help you find \n common values in items. For example, this EXCLUDE statement excludes only output objects with \n the path City_Pop_90.TestsForLocation : \n\n ods exclude / where=(_path_ = 'City_Pop_90.TestsForLocation' );\n subsetting-variable is one of the following:\n\n _LABEL_ -- is the label of the output object\n _LABELPATH_ -- is the label path of the output object\n _NAME_ -- is the name of the output object.\n _PATH_ -- is the full or partial path of the output object. \n \noperator \ncompares a variable with a value or with another variable. operator can be AND, OR NOT, OR, AND NOT, \nor a comparison operator (= EQ ^= ~= <> NE > GT < LT >= GE <= LE)."},"StatementOptionType":"V"}]}},{"StatementName":"ODS PATH","StatementHelp":{"#cdata":"Syntax: ODS PATH <(APPEND)|(PREPEND)|(REMOVE)> location(s); | ODS PATH path-argument;\n \nSpecifies locations to write to or read from when creating or using PROC TEMPLATE \ndefinitions and the order in which to search for them. \n\nEach location has the following form:\n\n item-store <(READ | UPDATE | WRITE)> \n\nwhere:\n\nitem-store \nidentifies an item store to read from, to write to, or to update. If an item store does not already \nexist, then the ODS PATH statement will create it.\n"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"(APPEND)","StatementOptionHelp":{"#cdata":"Adds one or more locations to the end of a path. When you append a location to a path, \nall duplicate instances (same name and same permissions) of that item store are removed \nfrom the path. Only the last item store with the same name and permissions are kept."},"StatementOptionType":"S"},{"StatementOptionName":"(PREPEND)","StatementOptionHelp":{"#cdata":"Adds one or more locations to the beginning of a path. When you prepend a location with \nupdate permissions to a path, all duplicate instances (same name and same permissions) \nof that item store are removed from the path. Only the first item store with the same \nname and permissions are kept."},"StatementOptionType":"S"},{"StatementOptionName":"(REMOVE)","StatementOptionHelp":{"#cdata":"Removes one or more locations from a path."},"StatementOptionType":"S"},{"StatementOptionName":"RESET","StatementOptionHelp":{"#cdata":"Sets the ODS path to the default settings SASUSER.TEMPLAT (UPDATE) and SASHELP.TMPLMST (READ)."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Displays the current ODS path."},"StatementOptionType":"S"},{"StatementOptionName":"VERIFY","StatementOptionHelp":{"#cdata":"Sets the ODS path to include only templates supplied by SAS. VERIFY is the same as specifying \nODS PATH SASHELP.TMPLMST (READ)."},"StatementOptionType":"S"}]}},{"StatementName":"ODS _ALL_ CLOSE","StatementHelp":{"#cdata":"Syntax: ODS _ALL_ CLOSE; \n \nThe ODS _ALL_ CLOSE statement closes all open ODS output destinations.\n\nNote: Be sure to open one or more ODS destinations before you execute your next program so \nthat you can view or print your output within the same SAS session."},"StatementOptions":null},{"StatementName":"ODS EPUB","StatementHelp":{"#cdata":"Opens, manages, or closes the EPUB and EPUB2 destinations, which generate EPUB e-books. \n \nSyntax: \nODS EPUB <( identifier)> < action> ; \nODS EPUB <( identifier)> ; \nODS EPUB2 <( identifier)> < action> ; \nODS EPUB2 <( identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection list or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies a unique base name for the anchor tag that identifies each output object \nin the current body file."}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"[Syntax: DEVICE= device-driver] \n \nSpecifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"'utf-8'","@Value2":"'utf-16'","@Value3":"'utf-16be'","@Value4":"'utf-16le'"},"StatementOptionToolTips":{"@ToolTip1":"Unicode Transformation Format - 8-bit","@ToolTip2":"Unicode Transformation Format - 16-bit","@ToolTip3":"Unicode Transformation Format - 16-bit Big Endian","@ToolTip4":"Unicode Transformation Format - 16-bit Little Endian"},"StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."}},{"StatementOptionName":"EVENT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: EVENT=event-name (FILE= | FINISH | LABEL= | NAME= | START | STYLE= |TARGET= | TEXT= | URL= )\n \nSpecifies an event and the value for event variables that are associated with the event. \n\n(FILE= BODY | CODE | CONTENTS | DATA | FRAME | PAGES | STYLESHEET);\n triggers one of the known types of output files that correspond to the BODY=, CODE=, CONTENTS=, FRAME=, PAGES=, and STYLESHEET= options.\n(FINISH)\n triggers the finish section of an event.\n(LABEL='variable-value')\n specifies the value for the LABEL event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(NAME='variable-value')\n specifies the value for the NAME event variable.\n Requirement: variable-value must be enclosed in quotation marks. \n(START)\n triggers the start section of an event.\n(STYLE=style-element)\n specifies a style element.\n(TARGET='variable-value')\n specifies the value for the TARGET event variable. \n(TEXT='variable-value')\n specifies the value for the TEXT event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(URL='variable-value')\n specifies the value for the URL event variable.\n Requirement: variable-value must be enclosed in quotation marks."},"SubOptionsKeywords":"FILE=|FINISH|LABEL=|NAME|START|STYLE=|TARGET=|TEXT=|URL="},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution of ODS graphics output. \n \nAlias: DPI=\nDefault: ODS uses the resolution specified in the SAS registry."},"StatementOptionType":"V"},{"StatementOptionName":"NEWCHAPTER=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"NOW","@Value4":"OUTPUT","@Value5":"PAGE","@Value6":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Wtarts a new chapter for the results of each BY group.","@ToolTip2":"Writes all output to the current chapter.","@ToolTip3":"Starts a new chapter and writes all output to that new chapter.","@ToolTip4":"Starts a new chapter for each output object. Alias: TABLE","@ToolTip5":"Starts a new chapter for each page of output. A page break occurs when you start a new procedure, or when a procedure explicitly starts a new page. Default: NONE","@ToolTip6":"Starts a new chapter for each procedure."},"StatementOptionHelp":{"#cdata":"[Syntax: NEWCHAPTER=starting-point] \n \nCreates a new chapter at the specified starting point."}},{"StatementOptionName":"OPTIONS","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS (< suboption(s)>)] \n \nSpecifies destination-specific suboptions with space-delimited name='value' pairs. \n\nsuboption(s) are the following:\n (CONTENTS= 'YES' | 'NO' | 'OFF' | 'ON')\n generates a table of contents \n \n (CONTRIBUTOR='text-string')\n specifies one or more contributor\u2019s names responsible for making contributions to the content of the e-book. \n Delimit multiple contributors with commas.\n (COVER_IMAGE='external-file')\n specifies a cover image for the e-book. \n (COVERAGE='text-string')\n specifies the extent or scope of the content of the e-book.\n (CREATOR='text-string')\n specifies one or more primary creators or authors of the e-book. \n (OPTIMIZE_FOR_IBOOKS= 'YES' | 'NO' | 'OFF' | 'ON')\n optimizes for iBooks e-book reader.\n (PAGEBREAK= 'YES' | 'NO' | 'OFF' | 'ON' | 'AUTO')\n honors explicit page breaks. The default (AUTO) allows ODS and procedures to determine when page breaks occur.\n (PUBLISHER='text-string')\n specifies the publisher of the e-book.\n (RELATION='text-string')\n specifies a reference to a related resource.\n (RIGHTS='text-string')\n specifies information about rights held in and over the e-book.\n (SOURCE='text-string')\n specifies information about a prior resource from which the e-book was derived.\n (START='chapter-number')\n specifies the component (chapter) at which an e-book first opens.\n Default: 1\n (SUBJECT='text-string')\n specifies one or more topics about the content of the e-book. Delimit multiple subjects with commas.\n (TYPE='text-string')\n specifies the nature or genre of the content of the e-book."}},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style template to use in writing the output files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Default: The default style for EPUB is Daisy."}},{"StatementOptionName":"STYLESHEET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLESHEET= ( URL= \u2018external-file(s)\u2019 )] \n \nSpecifies one or more stylesheet files to apply to the output.\n\n(URL= 'external-file(s)\u2019)\n specifies one or more space-delimited external stylesheet filenames."}},{"StatementOptionName":"TITLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='text-string'] \n \nString'inserts the title into the metadata of the e-book. The title also appears as an identifier \nin the e-book reader library. \n\nDefault: 'SAS Output'\nRequirement: Every EPUB e-book must have a title.\n\nNote:\nThis title is the title of the book and not a SAS title."}},{"StatementOptionName":"WORK=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: WORK=directory-name'] \n \nSpecifies a work directory for constructing the e-book. \n\ndirectory-name\n is the name of the directory."}}]}},{"StatementName":"ODS EPUB3","StatementHelp":{"#cdata":"Opens, manages, or closes the EPUB3 destination, which generates EPUB e-books. \n \nSyntax: \nODS EPUB3 <( identifier)> < action> ; \nODS EPUB3 <( identifier)> ; "},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":"Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection list or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies a unique base name for the anchor tag that identifies each output object \nin the current body file."}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionHelp":{"#cdata":"[Syntax: DEVICE= device-driver] \n \nSpecifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"'utf-8'","@Value2":"'utf-16'","@Value3":"'utf-16be'","@Value4":"'utf-16le'"},"StatementOptionToolTips":{"@ToolTip1":"Unicode Transformation Format - 8-bit","@ToolTip2":"Unicode Transformation Format - 16-bit","@ToolTip3":"Unicode Transformation Format - 16-bit Big Endian","@ToolTip4":"Unicode Transformation Format - 16-bit Little Endian"},"StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."}},{"StatementOptionName":"EVENT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: EVENT=event-name (FILE= | FINISH | LABEL= | NAME= | START | STYLE= |TARGET= | TEXT= | URL= )\n \nSpecifies an event and the value for event variables that are associated with the event. \n\n(FILE= BODY | CODE | CONTENTS | DATA | FRAME | PAGES | STYLESHEET);\n triggers one of the known types of output files that correspond to the BODY=, CODE=, CONTENTS=, FRAME=, PAGES=, and STYLESHEET= options.\n(FINISH)\n triggers the finish section of an event.\n(LABEL='variable-value')\n specifies the value for the LABEL event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(NAME='variable-value')\n specifies the value for the NAME event variable.\n Requirement: variable-value must be enclosed in quotation marks. \n(START)\n triggers the start section of an event.\n(STYLE=style-element)\n specifies a style element.\n(TARGET='variable-value')\n specifies the value for the TARGET event variable. \n(TEXT='variable-value')\n specifies the value for the TEXT event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(URL='variable-value')\n specifies the value for the URL event variable.\n Requirement: variable-value must be enclosed in quotation marks."},"SubOptionsKeywords":"FILE=|FINISH|LABEL=|NAME|START|STYLE=|TARGET=|TEXT=|URL="},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionHelp":{"#cdata":"Specifies the image resolution of ODS graphics output. \n \nAlias: DPI=\nDefault: ODS uses the resolution specified in the SAS registry."},"StatementOptionType":"V"},{"StatementOptionName":"NEWCHAPTER=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"NOW","@Value4":"OUTPUT","@Value5":"PAGE","@Value6":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Wtarts a new chapter for the results of each BY group.","@ToolTip2":"Writes all output to the current chapter.","@ToolTip3":"Starts a new chapter and writes all output to that new chapter.","@ToolTip4":"Starts a new chapter for each output object. Alias: TABLE","@ToolTip5":"Starts a new chapter for each page of output. A page break occurs when you start a new procedure, or when a procedure explicitly starts a new page. Default: NONE","@ToolTip6":"Starts a new chapter for each procedure."},"StatementOptionHelp":{"#cdata":"[Syntax: NEWCHAPTER=starting-point] \n \nCreates a new chapter at the specified starting point."}},{"StatementOptionName":"OPTIONS","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS (< suboption(s)>)] \n \nSpecifies destination-specific suboptions with space-delimited name='value' pairs. \n\nsuboption(s) are the following:\n (CONTENTS= 'YES' | 'NO' | 'OFF' | 'ON')\n generates a table of contents \n (CONTRIBUTOR='text-string')\n specifies one or more contributor\u2019s names responsible for making contributions to the content of the e-book. \n Delimit multiple contributors with commas.\n (COVER_IMAGE='external-file')\n specifies a cover image for the e-book. \n (COVERAGE='text-string')\n specifies the extent or scope of the content of the e-book.\n (CREATOR='text-string')\n specifies one or more primary creators or authors of the e-book. \n (DEFEAT_IBOOKS_CACHING= 'YES' | 'NO' | 'OFF' | 'ON')\n defeats iBooks e-book reader's caching of e-books that have the same title.\n (DESCRIPTION='text-string')\n specifies a description of the content of the e-book.\n EMBEDDED_FONTS='fonts') \n specifies a list of fonts to be embedded in the e-book.\n (ISBN='isbn')\n specifies a 13-digit International Standard Book Number (ISBN) for the e-book. If not specified, \n a universal unique identifier (UUID) is generated for the e-book.\n (NONLINEAR= 'NONE' | 'CHAPTER' | 'BATCH' | 'TABLE' | 'ALL')\n specifies output to be written to the non-linear section of the e-book.\n (OPTIMIZE_FOR_IBOOKS= 'YES' | 'NO' | 'OFF' | 'ON')\n optimizes for iBooks e-book reader.\n (PAGEBREAK= 'YES' | 'NO' | 'OFF' | 'ON' | 'AUTO')\n honors explicit page breaks. The default (AUTO) allows ODS and procedures to determine when page breaks occur.\n (PUBLISHER='text-string')\n specifies the publisher of the e-book.\n (RELATION='text-string')\n specifies a reference to a related resource.\n (RIGHTS='text-string')\n specifies information about rights held in and over the e-book.\n (SOURCE='text-string')\n specifies information about a prior resource from which the e-book was derived.\n (START='chapter-number')\n specifies the component (chapter) at which an e-book first opens.\n Default: 1\n (SUBJECT='text-string')\n specifies one or more topics about the content of the e-book. Delimit multiple subjects with commas.\n (TYPE='text-string')\n specifies the nature or genre of the content of the e-book."}},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style template to use in writing the output files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Default: The default style for EPUB is Daisy."}},{"StatementOptionName":"STYLESHEET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLESHEET= ( URL= \u2018external-file(s)\u2019 )] \n \nSpecifies one or more stylesheet files to apply to the output.\n\n(URL= 'external-file(s)\u2019)\n specifies one or more space-delimited external stylesheet filenames."}},{"StatementOptionName":"TITLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='text-string'] \n \nString'inserts the title into the metadata of the e-book. The title also appears as an identifier \nin the e-book reader library. \n\nDefault: 'SAS Output'\nRequirement: Every EPUB e-book must have a title.\n\nNote:\nThis title is the title of the book and not a SAS title."}},{"StatementOptionName":"WORK=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: WORK=directory-name'] \n \nSpecifies a work directory for constructing the e-book. \n\ndirectory-name\n is the name of the directory."}}]}},{"StatementName":"ODS HTML5","StatementHelp":{"#cdata":"Opens, manages, or closes the HTML5 destination, which produces HTML 5.0 output that contains embedded style sheets.\n \nSyntax: \nODS HTML5 <( identifier)> < action> ; \nODS HTML5 <( identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":" Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n \nSpecifies a unique base name for the anchor tag that identifies each output object \nin the current body file."}},{"StatementOptionName":"BASE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BASE= 'base-text'] \n \nSpecifies the text to use as the first part of all links and references that ODS \ncreates in the output files."}},{"StatementOptionName":"BODY=|FILE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BODY= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains the primary \noutput that is created by the ODS statement. \n\n(suboption(s))\n specifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files. \n Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n see your ODS user's guide for more details.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear \n in the browser window title bar.\n (URL= 'Uniform-Resource-Locator' )","SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CHARSET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CHARSET=character-set] \n \nSpecifies the character set to be generated in the META declaration for the \nHTML output."}},{"StatementOptionName":"CODE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CODE= 'file-specification' ] \n \nOpens a MARKUP family destination and specifies the file that contains relevant \nstyle information, such as XSL (Extensible Stylesheet Language). \n\nsuboption(s)\n specifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files. \n Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all the links \n and references that it creates and that point to the file."},"SubOptionsKeywords":"URL=|DYNAMIC"},{"StatementOptionName":"CONTENTS=","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Syntax: CONTENTS= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a table of contents for \nthe output. These files remain open until you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement \n or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first \n file and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for \nwriting the output files. \n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. \n For HTML 4.0, the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in \n the browser window title bar."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DEVICE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the name of a device driver. ODS automatically selects an optimal default \ndevice for each open output destination. \n\nThe following table lists the default devices for the most common ODS output destinations. These default devices \nare used when graphics are created using SAS/GRAPH or ODS Graphics. \n\nOutput Destination Default Device\nEPUB PNG\nHTML PNG\nHTML5 SVG\nLISTING PNG\nMeasured RTF EMF\nRTF EMF\nMarkup Tagsets PNG"}},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"ENCODING=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"warabic","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"StatementOptionToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"},"StatementOptionHelp":{"#cdata":"[Syntax: ENCODING=local-character-set-encoding] \n \nOverrides the encoding for input or output processing (transcodes) of external files."}},{"StatementOptionName":"EVENT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: EVENT=event-name (FILE= | FINISH | LABEL= | NAME= | START | STYLE= |TARGET= | TEXT= | URL= )\n \nSpecifies an event and the value for event variables that are associated with the event. \n\n(FILE= BODY | CODE | CONTENTS | DATA | FRAME | PAGES | STYLESHEET);\n triggers one of the known types of output files that correspond to the BODY=, CODE=, CONTENTS=, FRAME=, PAGES=, and STYLESHEET= options.\n(FINISH)\n triggers the finish section of an event.\n(LABEL='variable-value')\n specifies the value for the LABEL event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(NAME='variable-value')\n specifies the value for the NAME event variable.\n Requirement: variable-value must be enclosed in quotation marks. \n(START)\n triggers the start section of an event.\n(STYLE=style-element)\n specifies a style element.\n(TARGET='variable-value')\n specifies the value for the TARGET event variable. \n(TEXT='variable-value')\n specifies the value for the TEXT event variable.\n Requirement: variable-value must be enclosed in quotation marks.\n(URL='variable-value')\n specifies the value for the URL event variable.\n Requirement: variable-value must be enclosed in quotation marks."},"SubOptionsKeywords":"FILE=|FINISH|LABEL=|NAME|START|STYLE=|TARGET=|TEXT=|URL="},{"StatementOptionName":"FRAME=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: FRAME='file-specification' \n \nOpens a MARKUP family destination and, for HTML output, specifies the file that integrates the table \nof contents, the page contents, and the body file. \n\nsuboption(s)\n specifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files. \n Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. For HTML 4.0, \n the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in the browser \n window title bar.\n title-text\n is the text in the metadata of a file that indicates the title. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all the links \n and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders. If you open the frame file, \nthen you see a table of contents, a table of pages, or both, as well as the body file. For XLM \noutput, FRAME= specifies the file that contains the DTD. These files remain open until you do \none of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"HEADTEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies tags to place between the and tags in all the files that the destination \nwrites to. \n\nSyntax: HEADTEXT= 'markup-document-head' \n\nwhere:\n\n markup-document-head \n specifies the markup tags to place between the and tags.\n\n Requirement: You must enclose markup-document-head in quotation marks."}},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"IMAGE_DPI=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 100. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."}},{"StatementOptionName":"METATEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies HTML code to use as the tag between the and tags of all the HTML \nfiles that the destination writes to. \n\nSyntax: METATEXT= 'metatext-for-document-head' \n\nwhere:\n\n 'metatext-for-document-head' \n specifies the HTML code that provides the browser with information about the document that it is loading. \n For example, this attribute could specify the content type and the character set to use.\n\n Requirement: You must enclose metatext-for-document-head in quotation marks."}},{"StatementOptionName":"NEWFILE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"BYGROUP","@Value2":"NONE","@Value3":"OUTPUT|TABLE","@Value4":"PAGE","@Value5":"PROC"},"StatementOptionToolTips":{"@ToolTip1":"Starts a new file for the results of each BY group.","@ToolTip2":"Writes all output to the body file that is currently open.","@ToolTip3":"Starts a new body file for each output object.","@ToolTip4":"Starts a new body file for each page of output.","@ToolTip5":"Starts a new body file each time that you start a new procedure."},"StatementOptionHelp":{"#cdata":"[Syntax: NEWFILE=starting-point] \n \nCreates a new body file at the specified starting-point."}},{"StatementOptionName":"OPTIONS","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS ( DOC= | )] \n \nSpecifies tagset-specific suboptions and a named value.\n\n(DOC='QUICK' | 'HELP' | 'SETTINGS') \nprovides information about the specified tagset. \n\n QUICK \n describes the options available for this tagset. \n\n HELP \n provides generic help and information with a quick reference.\n\n SETTINGS \n provides the current option settings.\n\nsuboption(s) \nspecifies one or more suboptions that are valid for the specified tagset. Supoptions have the \nfollowing format: \n\n keyword='value' \n You can get information about suboptions for a specific tagset by specifying one of the following \n options when opening an ODS tagset statement or at any time after the destination has been opened. \n \n options(doc='help');\n options(doc='quick'); \n options(doc='settings');"}},{"StatementOptionName":"PACKAGE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: PACKAGE ] \n \nSpecifies that the output from the destination be added to a package."}},{"StatementOptionName":"PAGE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PAGE= 'file-specification' <(suboption(s))> \n \nOpens a markup family destination and specifies the file that contains a description of each \npage of the body file, and contains links to the body file. ODS produces a new page of output \nwhenever a procedure requests a new page. These files remain open until you do one of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or \n ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file \n and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. \n\n file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n Interaction: If you specify an entry name, you must also specify a library and catalog. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for \nwriting the output files. \n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. \n For HTML 4.0, the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in \n the browser window title bar. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all \n the links and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"PARAMETERS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PARAMETERS=(parameter-pair-1 ... parameter-pair-n) \n \nWrites the specified parameters between the tags that generate dynamic graphics output.\n\n parameter-pair \n specifies the name and value of each parameter. parameter-pair has the following form: \n\n 'parameter-name'= 'parameter-value' \n\n where:\n \n parameter-name -- is the name of the parameter.\n\n parameter-value -- is the value of the parameter.\n Requirement: You must enclose parameter-name and parameter-value in quotation marks."}},{"StatementOptionName":"PATH=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: PATH= 'aggregate-file-storage-specification' | fileref | libref.catalog (URL= 'Uniform-Resource-Locator' | NONE) \n \nSpecifies the location of an aggregate storage location or a SAS catalog for all markup files. \nIf the GPATH= option is not specified, all graphics output files are written to the \n\"aggregate-file-storage-specification\" or libref.\n\n 'aggregate-file-storage-location' -- specifies an aggregate storage location such as directory, folder, or partitioned data set.\n Requirement: You must enclose aggregate-file-storage-location in quotation marks. \n\n fileref -- is a file reference that has been assigned to an aggregate storage location. \n Use the FILENAME statement to assign a fileref.\n\n Interaction: If you use a fileref in the PATH= option, then ODS does not use information from \n PATH= when it constructs links. \n\n libref.catalog -- specifies a SAS catalog to write to.\n\n URL= 'Uniform-Resource-Locator' | NONE -- specifies a URL for the file-specification. \n\n Uniform-Resource-Locator \n is the URL you specify. ODS uses this URL instead of the filename in all the links and references that it creates to the file.\n\n NONE \n specifies that no information from the PATH= option appears in the links or references."}},{"StatementOptionName":"RECORD_SEPARATOR=|RECSEP=|RS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: RECORD_SEPARATOR= 'alternative-separator' | NONE \n \nSpecifies an alternative character or string that separates lines in the output files.\n\nDifferent operating environments use different separator characters. If you do not specify a record \nseparator, then the files are formatted for the environment where you run the SAS job. However, \nif you are generating files for viewing in a different operating environment that uses a different \nseparator character, then you can specify a record separator that is appropriate for the target environment.\n\nalternative-separator -- represents one or more characters in hexadecimal or ASCII format. For example, \nthe following option specifies a record separator for a carriage return character and a linefeed character \nfor use with an ASCII file system: \n\n RECORD_SEPARATOR= '0D0A'x\n \nOperating Environment Information: In a mainframe environment, the option that specifies a record \nseparator for a carriage return character and a linefeed character for use with an ASCII file system is: \n\n RECORD_SEPARATOR= '0D25'x\n Requirement: You must enclose alternative-separator in quotation marks. \n\nNONE -- produces the markup language that is appropriate for the environment where you run the SAS job."},"SubOptionsKeywords":"NONE"},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: STYLE= style-definition] \n \nSpecifies the style definition to use in writing the output files. \n\nstyle-definition\n describes how to display the presentation aspects (color, font face, font size, and so on) of your SAS output. \n A style template determines the overall appearance of the documents that use it. Each style template consists \n of style elements.\n\n Interaction:\n The STYLE= option is not valid when you are creating XML output.\n\n For a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template Procedure\u201d \n in SAS 9.4 Output Delivery System: Procedures Guide."}},{"StatementOptionName":"STYLESHEET=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STYLESHEET= 'file-specification' \n \nOpens a markup family destination and places the style information for markup output into an external \nfile, or reads style sheet information from an existing file. These files remain open until you do one \nof the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification -- specifies the file, fileref, or SAS catalog to write to. \n\nfile-specification is one of the following:\n\n external-file \n is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to.\n Interaction: If you specify an entry name, you must also specify a library and catalog. See the discussion \n of the PATH= option. \n\nsuboption(s) -- specifies one or more suboptions in parentheses. Suboptions are instructions for writing the \noutput files. Suboptions can be the following:\n (DYNAMIC)\n enables you to send output directly to a web server instead of writing it to a file. \n (NO_BOTTOM_MATTER)\n specifies that no ending markup language source code be added to the output file.\n (NO_TOP_MATTER)\n specifies that no beginning markup language source code be added to the top of the output file. \n For HTML 4.0, the NO_TOP_MATTER option removes the style sheet.\n (TITLE='title-text')\n inserts into the metadata of a file the text string that you specify as the text to appear in \n the browser window title bar. \n (URL= 'Uniform-Resource-Locator' )\n specifies a URL for the file-specification. ODS uses this URL (instead of the filename) in all \n the links and references that it creates and that point to the file."},"SubOptionsKeywords":"NO_BOTTOM_MATTER|NO_TOP_MATTER|TITLE=|URL=|DYNAMIC"},{"StatementOptionName":"TAGSET=|TYPE=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"CHTML","@Value2":"CORE","@Value3":"CSV","@Value4":"CSVALL","@Value5":"CSVBYLINE","@Value6":"DEFAULT","@Value7":"DOCBOOK","@Value8":"ExcelXP","@Value9":"HTML4","@Value10":"HTMLCSS","@Value11":"HTMLPANEL","@Value12":"IMODE","@Value13":"MSOFFICE2K","@Value14":"MVSHTML","@Value15":"PHTML","@Value16":"PYX","@Value17":"RTF","@Value18":"SASREPORT","@Value19":"WML","@Value20":"WMLOLIST","@Value21":"XHTML","@Value22":"EVENT_MAP","@Value23":"NAMEDHTML","@Value24":"SHORT_MAP","@Value25":"STYLE_DISPLAY","@Value26":"STYLE_POPUP","@Value27":"TEXT_MAP","@Value28":"TPL_STYLE_LIST","@Value29":"TPL_STYLE_MAP"},"StatementOptionToolTips":{"@ToolTip1":"Produces compact, minimal HTML output that does not use style information.","@ToolTip2":"Contains a table of Unicode values and mnemonics.","@ToolTip3":"Produces tabular output that contains columns of data values that are separated by commas.","@ToolTip4":"Produces tabular output with titles that contain columns of data values that are separated by commas.","@ToolTip5":"Produces output with comma-separated values and columns of data that are separated by commas.","@ToolTip6":"Produces XML output.","@ToolTip7":"Produces XML output that conforms to the DocBook DTD by OASIS.","@ToolTip8":"Produces Microsoft's spreadsheetML XML. This tagset is used to import data into XML.","@ToolTip9":"Produces HTML 4.0 embedded style sheets.","@ToolTip10":"Produces HTML output with cascading style sheets that is similar to ODS HTML output.","@ToolTip11":"Creates panels for By-grouped graphs.","@ToolTip12":"Produces HTML output as a column of output that is separated by lines.","@ToolTip13":"Produces HTML code for output generated by ODS for Microsoft Office products.","@ToolTip14":"Produces URLs within HTML files that are used in the z/OS operating environment.","@ToolTip15":"Produces simple HTML output that uses twelve style elements and no class attributes.","@ToolTip16":"Produces PYX, which is a simple, line-oriented notation used by Pyxie to describe the information communicated by an XML parser to an XML application.","@ToolTip17":"Produces measured RTF.","@ToolTip18":"Causes imbedded data to be produced in CSV format.","@ToolTip19":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with a list of URLs as a table of contents.","@ToolTip20":"Uses the Wireless Application Protocol (WAP) to produce a Wireless Markup Language (WML) DTD with an option list for the table of contents.","@ToolTip21":"Produces output in HTML format.","@ToolTip22":"Creates XML output that shows which events are being triggered and which variables are used by an event to send output from a SAS process to an output file.","@ToolTip23":"Creates HTML output similar to STYLE_POPUP, but with all the objects labeled as they are when using ODS TRACE.","@ToolTip24":"Creates a subset of the XML output that is created by the EVENT_MAP tagset.","@ToolTip25":"Creates a sample page of HTML output that is similar to STYLE_POPUP output.","@ToolTip26":"Creates HTML like HTMLCSS, but if you're using Internet Explorer, STYLE_POPUP displays a window that shows the resolved ODS style definition for any item that you select.","@ToolTip27":"Creates text output that shows which events are being triggered as ODS handles the output objects.","@ToolTip28":"Creates HTML output in a bulleted list similar to EVENT_MAP but lists only a subset of the possible attributes.","@ToolTip29":"Creates XML output similar to EVENT_MAP but lists only a subset of the possible attributes."},"StatementOptionHelp":{"#cdata":"Specifies a keyword value for a tagset. A tagset is a template that defines how to create an output \ntype from a SAS format."}},{"StatementOptionName":"TEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TEXT='variable-value'] \n \nInserts text into your document by triggering the paragraph event and specifying \na text string to be assigned to the VALUE event variable."}},{"StatementOptionName":"TRANTAB=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: TRANTAB= 'translation-table' \n \nSpecifies the translation table to use when transcoding a file for output."}},{"StatementOptionName":"ACCESSIBLE_GRAPH","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Adds accessibility metadata to graphs that are created by ODS Graphics. "}},{"StatementOptionName":"TITLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: TITLE=\"text-string\" \n \nInserts into the metadata of a file the text string that you specify as the text to appear in the \nbrowser window title bar."}}],"#comment":{}}},{"StatementName":"ODS POWERPOINT","StatementHelp":{"#cdata":"Opens, manages, or closes the ODS destination for PowerPoint, which produces PowerPoint output.\n \nSyntax: \nODS POWERPOINT <( identifier)> < action> ; \nODS POWERPOINT <( identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":" Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log."},"StatementOptionType":"S"},{"StatementOptionName":"AUTHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='text-string'] \n \nSpecifies the author of the PowerPoint document. This information can be seen in the document properties."}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CATEGORY=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CATEGORY='text-string'] \n \nSpecifies the category of the PowerPoint document. This information can be seen in the \ndocument properties."}},{"StatementOptionName":"COMMENTS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: COMMENTS='text-string'] \n \nAdds comments to the properties of the PowerPoint document. This information can be seen in the \ndocument properties."}},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"FILE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: FILE='file-specification'] \n \nSpecifies the file that contains the PowerPoint created by the destination.\n\n'file-specification'\n specifies the file or fileref to receive output.\n \n file-specification is one of the following:\n external-file\n is the name of an external file to receive output.\n Requirement: You must enclose external-file in quotation marks. \n fileref\n is a file reference that has been assigned to an external file. Use the FILENAME statement \n to assign a fileref.\n \n Default: ODS uses the filename that is specified in the SAS registry. The default filename \n for the ODS destination for PowerPoint is \u201csaspres.pptx\u201d."}},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders. If you open the frame file, \nthen you see a table of contents, a table of pages, or both, as well as the body file. For XLM \noutput, FRAME= specifies the file that contains the DTD. These files remain open until you do \none of the following:\n\n o close the destination with either an ODS markup-family-destination CLOSE statement or ODS _ALL_ CLOSE statement.\n\n o open the same destination with a second markup family statement. This closes the first file and opens the second file.\n\nfile-specification \nspecifies the file, fileref, or SAS catalog to write to. file-specification is one of the following:\n\n external-file -- is the name of an external file to write to.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref -- is a file reference that has been assigned to an external file. Use the FILENAME statement to assign a fileref. \n\n entry.markup -- specifies an entry in a SAS catalog to write to. \n\nsuboption(s) \nspecifies one or more suboptions in parentheses. Suboptions are instructions for writing the output files."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"IMAGE_DPI=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Specifies the image resolution for graphical output. Default: 100. \n \nRestriction: The IMAGE_DPI= option affects template-based graphics only."}},{"StatementOptionName":"KEYWORDS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: KEYWORDS='text-string' \n \nProvides keywords in the PowerPoint document. This information can be seen in the document properties. \n\nNote:The KEYWORDS values are listed next to \u201cTags\u201d in the properties pane."}},{"StatementOptionName":"LAYOUT=","StatementOptionType":"V","StatementOptionValues":{"@Value1":"TITLESLIDE","@Value2":"TITLEANDCONTENT","@Value3":"TWOCONTENT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the layout for the title slide.","@ToolTip2":"Specifies a slide with a title and content.","@ToolTip3":"Specifies slides with a two-column layout."},"StatementOptionHelp":{"#cdata":"[Syntax: LAYOUT=layout-name] \n \nSpecifies a predefined gridded layout."}},{"StatementOptionName":"SASDATE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Inserts the standard SAS date in the document in place of the default PowerPoint date and time field. \nPowerPoint formats this date field using the format specified by PowerPoint\u2019s Header and Footer dialog. \nThe date field is updated whenever you open the presentation. When the SASDATE option is used, instead \nof a date field, the ODS destination for PowerPoint inserts the date and time that you started your SAS \nsession. PowerPoint does not update the date and time."}},{"StatementOptionName":"STATUS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STATUS='text-string' \n \nSpecifies the status of the PowerPoint document. This information can be seen in the \ndocument properties."}},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STYLE= style-definition]\n \nSpecifies the style template to use in writing the output files. \n\nstyle-definition\n must be either PowerPointLight (the default style for PowerPoint documents), PowerPointDark, or a style \n derived from one of these two styles. A style template describes how to display the presentation aspects \n (color, font face, font size, and so on) of your SAS output. A style template determines the overall \n appearance of the documents that use it. Each style template consists of style elements.\n\nDefault: PowerPointLight is the default style. PowerPointDark is another style that was created specifically \nfor the ODS destination for PowerPoint.\n\nSee:\nFor a complete discussion of style templates, see Chapter 15, \u201cTEMPLATE Procedure: Creating a Style Template \nProcedure\u201d in SAS 9.4 Output Delivery System: Procedures Guide."}},{"StatementOptionName":"TITLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='text-string'] \n \nSpecifies a title for the PowerPoint document. This information can be seen in the \ndocument properties."}},{"StatementOptionName":"WORK=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: WORK='fileref' | 'directory-name' \n \nSpecifies an alternate directory for the temporary files. By default. the ODS destination for PowerPoint \nuses the SAS Work library to hold temporary files. The WORK= option specifies an alternate directory for \nthe temporary files. \n\nfileref\n is a file reference that has been assigned to a directory. Use the FILENAME statement to assign a fileref. \ndirectory-name\n is the name of the directory."}}]}},{"StatementName":"ODS EXCEL","StatementHelp":{"#cdata":"Opens, manages, or closes the ODS destination for Excel, which produces Excel spreadsheet files \ncompatible with Microsoft Office 2010 and later versions.\n \nSyntax: \nODS EXCEL <( identifier)> < action> ; \nODS EXCEL <( identifier)> ;"},"StatementOptions":{"StatementOption":[{"StatementOptionName":"EXCLUDE","StatementOptionHelp":{"#cdata":"Syntax: EXCLUDE exclusion(s)| ALL | NONE \n \nExcludes one or more output objects from the destination. \n\nDefault: NONE \nRestriction: A destination must be open for this action to take effect."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE ALL","StatementOptionHelp":{"#cdata":" Excludes all output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"EXCLUDE NONE","StatementOptionHelp":{"#cdata":"Excludes no output objects from the destination."},"StatementOptionType":"S"},{"StatementOptionName":"CLOSE","StatementOptionHelp":{"#cdata":"Closes the destination and any files that are associated with it. \n \nTip: When an ODS destination is closed, ODS does not send output to that destination. Closing an unneeded \ndestination conserves system resources."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT","StatementOptionHelp":{"#cdata":"Syntax: SELECT selection(s) | ALL | NONE \n \nSelects one or more output objects for the specified destination. \n\nDefault: ALL \nRestriction: A destination must be open for this action to take effect."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT ALL","StatementOptionHelp":{"#cdata":"Selects all output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SELECT NONE","StatementOptionHelp":{"#cdata":"Selects no output objects for the specified destination."},"StatementOptionType":"S"},{"StatementOptionName":"SHOW","StatementOptionHelp":{"#cdata":"Writes the current selection or exclusion list for the destination to the SAS log. \n \nRestriction: The destination must be open for this action to take effect. \n\nTip: If the selection or exclusion list is the default list (SELECT ALL), then SHOW also writes the \nentire selection or exclusion list. "},"StatementOptionType":"S"},{"StatementOptionName":"ANCHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: ANCHOR='anchor-name'] \n\nanchor-name\n is the root name for the anchor tag that identifies each output object in the current file. Each \n output object must have an anchor tag for the bookmarks to reference. The references are automatically \n created by ODS. These references, point to the name of an anchor. Therefore, each anchor name in a file \n must be unique. By default IDX is the default name for the first object. \n\n ODS creates unique anchor names by incrementing the name that you specify. For example, if you specify \n ANCHOR='TABULATE', then ODS names the first anchor tabulate. The second anchor is named tabulate1; the \n third is named tabulate2, and so on. ODS Excel uses anchors to name ID selectors when using CSS to style \n worksheets. \n\n Requirement: You must enclose anchor-name in quotation marks.\n\nSpecifies the root name for the anchor tag that identifies each output object in the current file. \n\nThe ANCHOR= option in ODS EXCEL acts like IDs do in CSS. The ANCHOR= option allows you to change \nthe value of the ID= attribute. ID=attributes can be seen when you use the DOM option. The DOM option \nis used when adding the #ID selector for style output when using CSS with the ODS Excel destination. \n\nEach output object must have an anchor tag for the bookmarks to reference. The references are \nautomatically created by ODS. These references, point to the name of an anchor. Therefore, each \nanchor name in a file must be unique."}},{"StatementOptionName":"AUTHOR=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: AUTHOR='text-string']\n\nSpecifies the author of the Excel document. This information can be seen in the document properties."}},{"StatementOptionName":"BOX_SIZING=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: BOX_SIZING=(CONTENT_BOX | BORDER_BOX)] \n \nSpecifies how to measure the width of cells. This option overrides the default value of BOX_SIZING \nfor a destination. The default value can be found in the SAS registry. In the SAS Registry, expand \nthe ODS -> DESTINATION -> SCRIPT folder to locate the box_sizing= default for ODS EPUB destinations. \nFor information about using the SAS Registry, see \u201cChanging SAS Registry Settings for ODS\u201d on page 44.\n\nBOX_SIZING is defined by the WC3 specification, the CSS3 Module. For more information, refer to the \nCSS3 Box Model specification at http://www.w3.org/TR/2002/WD-css3-box-20021024/#box-sizing. "}},{"StatementOptionName":"CATEGORY=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: CATEGORY='text-string'] \n \nSpecifies the category of the Excel document. This information can be seen in the document properties."}},{"StatementOptionName":"COMMENTS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: COMMENTS='text-string'] \n \nAdds comments to the properties of the Excel document. This information can be seen in the \ndocument properties."}},{"StatementOptionName":"CSSSTYLE=","StatementOptionHelp":{"#cdata":"Syntax: CSSSTYLE='file-specification'<(media-type-1 <...media-type-10>)> \n \nSpecifies a cascading style sheet to apply to your output. \n\nfile-specification \nspecifies a file, fileref, or URL that contains CSS code. \n\n file-specification is one of the following:\n\n \"external-file\" \n is the name of the external file.\n Requirement: You must enclose external-file in quotation marks. \n\n fileref \n is a file reference that has been assigned to an external file. Use the FILENAME \n statement to assign a fileref. \n\n \"URL\" \n is a URL to an external file.\n Requirement: You must enclose external-file in quotation marks. \n\n(media-type-1<.. media-type-10>) \nspecifies one or more media blocks that corresponds to the type of media that your output will be \nrendered on. CSS uses media type blocks to specify how a document is to be presented on different \nmedia: on the screen, on paper, with a speech synthesizer, with a braille device, and so on."},"StatementOptionType":"V"},{"StatementOptionName":"DOM","StatementOptionType":"S|V","StatementOptionHelp":{"#cdata":"[Syntax: DOM<=\"external-file\">] \n \nSpecifies that the ODS document object model is written to the SAS log or an external file. \n\nexternal-file\n is the name of an external output file.\n\n Requirement: You must enclose external-file in quotation marks."}},{"StatementOptionName":"DPI=|IMAGE_DPI=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: DPI='number']\n\nSpecifies the image resolution for graphical output. \n\nDefault: 150 \nCaution: When using high DPI= or DPI_IMAGE values (values over 1000), you might need to increase memory \nallocations. To increase memory, set the MEMSIZE= system option to 500M or higher. You can also decrease \nthe DPI= value to ensure that you do not run out of memory."}},{"StatementOptionName":"FILE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: FILE='file-specification'] \n \nSpecifies the file that contains the Excel created by the destination.\n\n'file-specification'\n specifies the file or fileref to receive output.\n \n file-specification is one of the following:\n external-file\n is the name of an external file to receive output.\n Requirement: You must enclose external-file in quotation marks. \n fileref\n is a file reference that has been assigned to an external file. Use the FILENAME statement \n to assign a fileref.\n \n Default: ODS uses the filename that is specified in the SAS registry. The default filename \n for the ODS destination for Excel is \u201csasexcl.xlsx\u201d."}},{"StatementOptionName":"GFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The footnotes appear inside the graph borders.\n\nThis is the default.\n\nRestriction: This option applies only to SAS programs that produce one or more device-based graphics, \nor graphics created by the SGPLOT procedure, the SGPANEL procedure, or the SGSCATTER procedure."}},{"StatementOptionName":"NOGFOOTNOTE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints footnotes that are created by ODS, which appear outside the graph borders."}},{"StatementOptionName":"GTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by SAS/GRAPH, the SGPLOT procedure, the SGPANEL procedure, or the \nSGSCATTER procedure. The title appears inside the graph borders.\n\nThis is the default.\n\nRestriction: This option applies only to SAS programs that produce one or more device-based graphics, \nor graphics created by the SGPLOT procedure, the SGPANEL procedure, or the SGSCATTER procedure."}},{"StatementOptionName":"NOGTITLE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Prints the title that is created by ODS, which appears outside the graph borders."}},{"StatementOptionName":"KEYWORDS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: KEYWORDS='text-string' \n \nProvides keywords in the Excel document. This information can be seen in the document properties. \n\nNote:The KEYWORDS values are listed next to \u201cTags\u201d in the properties pane."}},{"StatementOptionName":"ID=","StatementOptionHelp":{"#cdata":"[Syntax: (ID=identifier)] \n \nEnables you to run multiple instances of the same destination at the same time. \nEach instance can have different options."},"StatementOptionType":"V","SubOptionsKeywords":"ID="},{"StatementOptionName":"OPTIONS","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"[Syntax: OPTIONS (< suboption(s)>)]\n\nSpecifies destination-specific suboptions with space-delimited name='value' pairs.\n\nsuboption(s) are the following: \n\n(ABSOLUTE_COLUMN_WIDTH =\u2019number-list \u2019 | 'NONE') \n Specifies the column widths. Default: None. SAS determines the width. \n(ABSOLUTE_ROW_HEIGHT =\u2019number_list \u2019) \n Specifies the row heights. Default is nil. \n(AUTOFILTER = 'ALL' | 'NONE' | 'range ') \n Turns on filtering for specified columns in the worksheet. \n(BLACKANDWHITE= 'OFF' | 'ON')\n Enables printing of the worksheet in black and white. \n(BLANK_SHEET='string') \n Creates a blank worksheet with the specified name. The string is a string with a length greater than zero. \n(CENTER_HORIZONTAL= 'OFF' | 'ON')\n Centers the worksheet horizontally when printing. \n(CENTER_VERTICAL= 'OFF' | 'ON')\n Specifies if the worksheet is to be centered vertically when printing. \n(COLUMN_REPEAT=\"number '' | \"number-range'' | \"HEADER'') \n Controls how column headings are repeated across pages. \n(CONTENTS= 'OFF' | 'ON')\n Creates a worksheet that contains the table of contents. \n(DPI='number') \n Specifies the dots per inch for print resolution. Numbers allowed are 300, 600, and 1200. Default: 300 DPI \n(DRAFTQUALITY= 'OFF' | 'ON')\n Specifies if draft quality should be used for printing \n(EMBEDDED_FOOTNOTES='OFF' | 'ON')\n Specifies whether footnotes should appear in the worksheet. \n(EMBED_FOOTNOTES_ONCE='OFF' | 'ON')\n Specifies whether embedded footnotes should appear only at the bottom of the worksheet. \n(EMBEDDED_TITLES= 'OFF' | 'ON')\n Specifies whether titles should appear in the worksheet. \n(EMBED_TITLES_ONCE= 'OFF' | 'ON')\n Specifies whether embedded titles should appear at the top of the worksheet only once. \n(FITTOPAGE= 'OFF' | 'ON')\n Specifies that the worksheet should fit on a page when printing. \n(FORMULAS= 'OFF' | 'ON')\n Specifies if data values that begin with an \"=\" become formulas or cell values. \n(FROZEN_HEADERS= 'OFF' | 'ON' | number) \n specifies that headers can scroll or not scroll with the scroll bar. \n(FROZEN_ROWHEADERS= 'OFF' | 'ON' | number) \n Specifies if the row headers on the left scroll when the table data scrolls. \n(GRIDLINES= 'OFF' | 'ON')\n Specifies if grid lines are printed. \n(HIDDEN_COLUMNS =\u2019number_list_range\u2019) \n Specifies the columns to hide. The columns identified are hidden. \n(HIDDEN_ROWS =\u2019number_list_range\u2019) \n Specifies the rows to hide. You can specify a list of rows to hide or a range of rows to hide. \n(INDEX= 'OFF' | 'ON')\n Creates a worksheet that contains an index of all worksheets. \n(MSG_LEVEL='string') \n Suppresses messages from the Excel. Default No. \n(ORIENTATION= 'PORTRAIT' | 'LANDSCAPE'\n Orients the printed page as either portrait or landscape. \n(PAGE_ORDER_ACROSS= 'OFF' | 'ON')\n Specifies that the information across the page is printed first followed by the information that is down the page. \n(PAGES_FITHEIGHT='number') \n Specifies the number of pages down to fit the worksheet when printing. \n(PAGES_FITWIDTH='number') \n Specifies the number of pages to fit the worksheet across when printing. \n(PRINT_AREA= 'item') \n Describes the printed area in terms of the column and row to start and end with. You can use column and row numbers and letters.\n(PRINT_FOOTER='text-string') \n Specifies the text that is placed in the footer when printing. If a footnote is specified, that footnote is used.\n(PRINT_FOOTER_MARGIN='number') \n Specifies the footer margin that is set in the page setup window when printing. This margin is measured in inches. \n(PRINT_HEADER='text-string') \n Specifies the text that is placed in the header when printing.\n(PRINT_HEADER_MARGIN='number') \n Specifies the header margin that is set in the page setup dialog window when printing. This margin is measured in inches. \n(ROWBREAKS_COUNT='number') \n Specifies that for every number data rows, insert a print page for printing. \n(ROWBREAKS_INTERVAL= 'OUTPUT' | 'PROC' | 'NONE')\n Controls the placement of page breaks. This option places a page break after each output object or after each procedure. \n(ROWCOLHEADINGS= 'OFF' | 'ON')\n Specifies if row and column headings should be printed. \n(ROW_HEIGHTS =\u2019number_list \u2019) \n Specifies the height of the row. The measurement is in points and is the positional array of row height values. \n(ROW_REPEAT='NONE' | 'HEADER' | 'number' | number-range') \n Controls how row headings are repeated across pages.\n(SCALE='number') \n Specifies the scale level for printing. Default: 100 \n(SHEET_INTERVAL= 'BYGROUP' | 'PAGE' | 'PROC' | 'NONE' | \u2018TABLE\u2019) \n Specifies the criteria for when a new worksheet is created. \n(SHEET_LABEL='text-string' | 'NONE\u2019) \n Used as the first part of the name in the worksheet label instead of the predefined string. \n(SHEET_NAME='text-string') \n Specifies the name for the next worksheet. This name is used along with the worksheet counter to create a unique name. \n(START_AT='string') \n Specifies a starting cell for the report. The default is to start at column 1 and row 1. Default: 1,1 \n(SUPPRESS_BYLINES= 'OFF' | 'ON')\n Specifies whether to suppress BY lines in the worksheet. \n(TAB_COLOR='string') \n Specifies the color for the next worksheet. \n(TITLE_FOOTNOTE_NOBREAK='number') \n Specifies that titles and footnotes do not wrap across lines. \n(TITLE_FOOTNOTE_WIDTH='number') \n Specifies the number of columns that titles and footnotes should span.\n(ZOOM='number') \n Indicates the initial zoom level on the worksheet. Default: 100"},"SubOptionsKeywords":"\n |ABSOLUTE_COLUMN_WIDTH=|ABSOLUTE_ROW_HEIGHT=|AUTOFILTER=|BLACKANDWHITE=|BLANK_SHEET=|CENTER_HORIZONTAL=|CENTER_VERTICAL=|\n |COLUMN_REPEAT=|CONTENTS=|DPI=|DRAFTQUALITY=|EMBEDDED_FOOTNOTES=|EMBED_FOOTNOTES_ONCE=|EMBEDDED_TITLES=|EMBED_TITLES_ONCE=|\n |FITTOPAGE=|FORMULAS=|FROZEN_HEADERS=|FROZEN_ROWHEADERS=|GRIDLINES=|HIDDEN_COLUMNS=|HIDDEN_ROWS|INDEX=|MSG_LEVEL=|ORIENTATION=|\n |PAGE_ORDER_ACROSS=|PAGES_FITHEIGHT=|PAGES_FITWIDTH=|PRINT_AREA=|PRINT_FOOTER=|PRINT_FOOTER_MARGIN=|PRINT_HEADER=|PRINT_HEADER_MARGIN=|\n |ROWBREAKS_COUNT=|ROWBREAKS_INTERVAL=|ROWCOLHEADINGS=|ROW_HEIGHTS=|ROW_REPEAT=|SCALE=|SHEET_INTERVAL=|SHEET_LABEL=|SHEET_NAME=|\n |START_AT=|SUPPRESS_BYLINES=|TAB_COLOR=|TITLE_FOOTNOTE_NOBREAK=|TITLE_FOOTNOTE_WIDTH=|ZOOM=|\n "},{"StatementOptionName":"SASDATE","StatementOptionType":"S","StatementOptionHelp":{"#cdata":"Inserts the standard SAS date in the document in place of the default Excel date and time field. \nExcel formats this date field using the format specified by the Excel Header and Footer dialog. \nThe date field is updated whenever you open the presentation. When the SASDATE option is used, \ninstead of a date field, the ODS destination for Excel inserts the date and time that you started \nyour SAS session. Excel does not update the date and time."}},{"StatementOptionName":"STATUS=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STATUS='text-string' \n \nSpecifies the status of the Excel document. This information can be seen in the document properties."}},{"StatementOptionName":"STYLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: STYLE= style-override(s)\n \nSpecify one or more style-overides to use when writing output files. \n\nYou can specify a style override in two ways: \n\n\u2022 Specify a style element. A style element is a collection of style attributes that apply to a particular \n part of the output for a SAS program. \n\u2022 Specify a style attribute. A style attribute is a name-value pair that describes a single behavioral or \n visual aspect of a piece of output. This is the most specific method of changing the appearance of your output. \n \nstyle-override has the following form: \n\nstyle-element-name | [style-attribute-name-1=style-attribute-value-1\n] \n\nDefault: Excel is the default style."}},{"StatementOptionName":"TEXT=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TEXT=text-string]\n\nInserts text into your document by triggering the paragraph event and specifying a text string to be assigned to the VALUE event variable. \n\nDefault: By default the TEXT= option is used in a paragraph event."}},{"StatementOptionName":"TITLE=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"[Syntax: TITLE='text-string'] \n \nSpecifies a title for the Excel document. This information can be seen in the document properties."}},{"StatementOptionName":"WORK=","StatementOptionType":"V","StatementOptionHelp":{"#cdata":"Syntax: WORK='fileref' | 'directory-name' \n \nSpecifies an alternate directory for the temporary files. By default. the ODS destination for Excel \nuses the SAS Work library to hold temporary files. The WORK= option specifies an alternate directory for \nthe temporary files. \n\nfileref\n is a file reference that has been assigned to a directory. Use the FILENAME statement to assign a fileref. \ndirectory-name\n is the name of the directory."}}]}}],"#comment":{}}}} ================================================ FILE: server/data/Procedures/STATGRAPH.json ================================================ {"Procedure":{"#comment":{},"Name":"STATGRAPH","ProductGroup":"SAS/GRAPH","ProcedureHelp":{"#cdata":"Syntax: BEGINGRAPH ; \n \n GTL-layout-block\n \n ENDGRAPH ; \n \nDefines the outermost container for a single GTL-layout-block and one or more GTL-global-statements."},"ProcedureOptions":{"ProcedureOption":[{"ProcedureOptionName":"BACKGROUNDCOLOR=","ProcedureOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the graph background."},"ProcedureOptionType":"C"},{"ProcedureOptionName":"BORDER=","ProcedureOptionHelp":{"#cdata":"Specifies whether a border is drawn around the graph."},"ProcedureOptionType":"V","ProcedureOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"ProcedureOptionToolTips":{"@ToolTip1":"Specifies that a border is drawn around the graph. This is the default.","@ToolTip2":"Specifies that a border is not drawn around the graph."}},{"ProcedureOptionName":"BORDERATTRS=","ProcedureOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the graph. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"ProcedureOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"ProcedureOptionName":"DESIGNHEIGHT=DEFAULTDESIGNHEIGHT","ProcedureOptionHelp":{"#cdata":"Specifies the design width of the graph to be obtained from the SAS Registry key Products=> \nGraph=> ODS=>StatGraph=>DefaultDesignWidth when the graph is rendered. The initial value of this registry key is 480px."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"DESIGNHEIGHT=","ProcedureOptionHelp":{"#cdata":"Specifies the design width of the graph."},"ProcedureOptionType":"V"},{"ProcedureOptionName":"PAD=","ProcedureOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the graph border. The default padding for \nall sides is 10. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \n Specifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \n Enables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \n to create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \n as a name=value pair. Sides not assigned padding are padded with the default amount. \n Values without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n TOP=dimension \n specifies the amount of extra space added to the top. \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"ProcedureOptionType":"V"}]},"ProcedureStatements":{"ProcedureStatement":[{"StatementName":"LAYOUT DATALATTICE","StatementHelp":{"#cdata":"Syntax: LAYOUT DATALATTICE argument(s) ;\n graph-prototype-block ;\n \n ENDLAYOUT ; \n\nCreates a grid of graphs based on one or two classification variables and a graphical prototype."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ROWVAR=","StatementOptionHelp":{"#cdata":"[Syntax: ROWVAR=class-var] \n \nSpecifies a single row classification variable."},"StatementOptionType":"RV"},{"StatementOptionName":"COLUMNVAR=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNVAR=class-var] \n \nSpecifies a single column classification variable."},"StatementOptionType":"RV"},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"CELLHEIGHTMIN=","StatementOptionHelp":{"#cdata":"[Syntax: CELLHEIGHTMIN=dimension] \n \nSpecifies the minimum height of a cell in the grid. Default is 100px."},"StatementOptionType":"V"},{"StatementOptionName":"CELLWIDTHMIN=","StatementOptionHelp":{"#cdata":"[Syntax: CELLWIDTHMIN=dimension] \n \nSpecifies the minimum width of a cell in the grid. Default is 100px."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNAXISOPTS=(axis-options)] \n \nSpecifies X-axis options for all columns. Axis options must be enclosed in parentheses and \nseparated by spaces."},"StatementOptionType":"V","SubOptionsKeywords":"\n ALTDISPLAY=|ALTDISPLAYSECONDARY=|DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|\n LABELATTRS=|LINEAROPTS=|LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"COLUMNDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the X-axes of instances of the graph-prototype are scaled. The default is UNIONALL."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIONALL","@Value2":"UNION"},"StatementOptionToolTips":{"@ToolTip1":"Scales the X-axis data ranges across all layout columns and panels (when PANELNUMBER= is in effect).","@ToolTip2":"Scales the X-axis data ranges separately for each column in the layout."}},{"StatementOptionName":"COLUMNGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNGUTTER=dimension] \n \nSpecifies the amount of empty space that is between the columns. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNHEADERS=","StatementOptionHelp":{"#cdata":"Specifies where to position the outside column header."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOP","@Value2":"BOTTOM","@Value3":"BOTH"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that column header text appears at the top of the layout.","@ToolTip2":"Specifies that column header text appears at the bottom of the layout.","@ToolTip3":"Specifies that column header text alternates between the top and bottom of the layout column by column."}},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=integer] \n \nSpecifies the number of columns in the layout. \n\nDefault:\n\n o If this option is not specified, the number of columns is dynamically adjusted to equal the number \n of classifier values for the COLUMVAR= variable. \n o If this option is specified, that many columns will be created. If the number of COLUMNVAR classifier \n values is greater than the specified number of columns, no graph will be created for some classifier \n values. If the number of classifier values is smaller than the specified number of columns, extra empty \n columns will be created. \n\nInteraction: The overall grid size is constrained by the HEIGHT= and WIDTH= options on the \nODS GRAPHICS statement. As the grid size grows, the cell size shrinks. To control the minimum \nsize of a cell use the CELLHEIGHTMIN= and CELLWIDTHMIN= options."},"StatementOptionType":"V"},{"StatementOptionName":"HEADERBACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: HEADERBACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the background color of the cell headers. \n\nstyle-reference \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used."},"StatementOptionType":"C"},{"StatementOptionName":"HEADERLABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: HEADERLABELATTRS=style-element | style-element (text-options) | (text-options))] \n \nSpecifies the color and font attributes of the data labels.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"HEADERLABELDISPLAY=","StatementOptionHelp":{"#cdata":"Indicates whether the automatic cell header text includes variable name and value or just the value. \nThe default is NAMEVALUE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NAMEVALUE","@Value2":"VALUE"},"StatementOptionToolTips":{"@ToolTip1":"The automatic cell header text includes variable name and value.","@ToolTip2":"The automatic cell header text includes just the value."}},{"StatementOptionName":"HEADERLABELLOCATION=","StatementOptionHelp":{"#cdata":"Indicates whether the cell header is placed within each cell (INSIDE) or as row and column headers \nexternal to the lattice (OUTSIDE)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OUTSIDE","@Value2":"INSIDE"},"StatementOptionToolTips":{"@ToolTip1":"The cell header is placed as row and column headers external to the lattice.","@ToolTip2":"The cell header is placed within each cell."}},{"StatementOptionName":"HEADEROPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the background for cell headers is opaque (TRUE) or transparent (FALSE)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"The background for cell headers is opaque. This is the default.","@ToolTip2":"The background for cell headers is transparent."}},{"StatementOptionName":"INSET=","StatementOptionHelp":{"#cdata":"[Syntax: INSET=(variable-list)] \n \nSpecifies what information is displayed in an inset. The variable-list defines one or more\nvariables whose names and values appear as a small table in the data cells. The variables \nmay be either numeric or character. Variable names are separated by spaces."},"StatementOptionType":"V"},{"StatementOptionName":"INSETOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: INSETOPTS=(appearance-options)] \n \nSpecifies location and appearance options for the inset information. The appearance-options can \nbe any one or more of the settings that follow. The options must be enclosed in parentheses, and \neach option is specified as a name=value pair.\n\n AUTOALIGN=NONE | AUTO | (location-list) \n specifies whether the inset is automatically aligned within the layout. \n\n BACKGROUNDCOLOR= style-reference | color \n specifies the color of the inset background. Default is TRANSPARENT.\n\n BORDER=TRUE | FALSE\n specifies whether a border is displayed around the inset. Default is FALSE.\n\n HALIGN=LEFT | CENTER | RIGHT \n specifies the horizontal alignment of the inset. Default is LEFT.\n\n OPAQUE= boolean \n specifies whether the inset background is opaque (TRUE) or transparent (FALSE). Default is FALSE.\n\n TEXTATTRS=style-element | style-element (text-options) | (text-options) \n specifies the text properties of the entire inset.\n\n VALIGN=TOP | CENTER |BOTTOM \n specifies the vertical alignment of the inset. Default is TOP."},"StatementOptionType":"V","SubOptionsKeywords":"AUTOALIGN=|BACKGROUNDCOLOR=|BORDER=|HALIGN=|OPAQUE=|TEXTATTRS=|VALIGN="},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"PANELNUMBER=","StatementOptionHelp":{"#cdata":"[Syntax: PANELNUMBER=positive-integer] \n \nSpecifies the number of the panel to produce. The default is 1."},"StatementOptionType":"V"},{"StatementOptionName":"ROWAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWAXISOPTS=(axis-options)] \n \nSpecifies Y-axis options for all rows."},"StatementOptionType":"V","SubOptionsKeywords":"\n ALTDISPLAY=|ALTDISPLAYSECONDARY=|DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|\n LABELATTRS=|LINEAROPTS=|LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"ROWDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the Y-axes of instances of the graph-prototype are scaled. The default is UNIONALL."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIONALL","@Value2":"UNION"},"StatementOptionToolTips":{"@ToolTip1":"Scales the Y-axis data ranges across all layout rows and panels (when PANELNUMBER= is in effect).","@ToolTip2":"Scales the Y-axis data ranges separately for each row in the layout."}},{"StatementOptionName":"ROWGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: ROWGUTTER=dimension] \n \nSpecifies the amount of empty space between the rows. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"ROWHEADERS=","StatementOptionHelp":{"#cdata":"Specifies where to position the outside row header."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"RIGHT","@Value2":"LEFT","@Value3":"BOTH"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that row header appears at the right of the layout.","@ToolTip2":"Specifies that row header appears at the left of the layout.","@ToolTip3":"Specifies that row header alternates between the right and left of the layout row by row."}},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=integer] \n \nSpecifies the number of rows in the layout."},"StatementOptionType":"V"},{"StatementOptionName":"SKIPEMPTYCELLS=","StatementOptionHelp":{"#cdata":"Specifies whether the external axes skip the empty cells in a partially filled grid. The default \nis false."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"External axes are displayed at their normal locations, even if there are empty cells at one or more of the locations.","@ToolTip2":"External axes skip empty cells and \"snap\" to the nearest data cell, both vertically and horizontally. Though the empty cells are not displayed, the data cells in the grid are not enlarged to fill the area."}},{"StatementOptionName":"START=","StatementOptionHelp":{"#cdata":"Indicates whether to start populating the grid from the top-left or bottom-left corner. The default \nis TOPLEFT."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOPLEFT","@Value2":"BOTTOMLEFT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to start populating the grid from the top-left corner.","@ToolTip2":"Specifies to start populating the grid from the bottom-left corner."}}]}},{"StatementName":"LAYOUT PROTOTYPE","StatementHelp":{"#cdata":"[Syntax: LAYOUT PROTOTYPE ; \n plot-statements;\n\n ; \n block-plot-statement(s); | axis-table statement(s);\n ENDINNERMARGIN;> \n\n <... more-innermargin-blocks ...> > \n ENDLAYOUT; \n \nBuilds a composite from one or more plot-statements. The composite is used as a prototype or \"rubber stamp\" \nthat repeats in each cell of a parent DATALATTICE or DATAPANEL layout."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ASPECTRATIO=","StatementOptionHelp":{"#cdata":"Syntax: ASPECTRATIO=AUTO | positive-number\n\nSpecifies the aspect ratio of the prototype cell. The ratio is expressed as a positive decimal \nfraction representing wall-height divided by wall-width. For example, 0.75 is a 3/4 aspect ratio \nand 1.0 is a square aspect ratio. \n\nDefault: AUTO. The prototype cell is sized to the maximum area that can fill the available space inside the layout cell. \nNote: If AUTO is not used for the aspect ratio, then the entire DATALATTICE or DATAPANEL grid is affected and changes shape."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"CYCLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CYCLEATTRS=boolean \n \nSpecifies whether the default visual attributes of markers, lines, and fills in nested plot\nstatements automatically change from plot to plot. Default: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Does not cycle the default visual attributes of multiple plots.","@ToolTip2":"The system looks at the plots in the layout and tries to use the GraphData1 - GraphDataN style elements to assign different visual properties to applicable plots (scatter plots and series plots and others)."}},{"StatementOptionName":"WALLCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: WALLCOLOR=style-reference | color] \n \nSpecifies the fill color of the plot wall area. \n\nstyle-reference is a reference in the form style-element:style-attribute. \nOnly the style-attribute named COLOR is used. \n\nDefault: The GraphWalls:Color style reference."},"StatementOptionType":"C"},{"StatementOptionName":"WALLDISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: WALLDISPLAY=STANDARD | ALL | NONE | (display-options)] \n \nSpecifies whether the plot wall and wall outline are displayed. \n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a filled wall. The setting of the FRAMEBORDER= ON | OFF attribute of the GraphWalls style element determines whether the wall outline is displayed.","@ToolTip2":"Displays a filled, outlined wall.","@ToolTip3":"Displays no wall, no wall outline.","@ToolTip4":"These options must be enclosed in parentheses and include one of the following: OUTLINE displays the wall outline. FILL displays a filled wall area."}}]}},{"StatementName":"LAYOUT DATAPANEL","StatementHelp":{"#cdata":"Syntax: LAYOUT DATAPANEL CLASSVARS= (class-var1 ... class-varN) ; \n graph-prototype-block ;\n \n ENDLAYOUT ; \n \nCreates a grid of graphs based on one or more classification variables and a graphical prototype. \nBy default, a separate instance of the prototype (a data cell) is created for each actual combination \nof the classification variables."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CLASSVARS=","StatementOptionHelp":{"#cdata":"[Syntax: CLASSVARS=(class-var1 ... class-varN)] \n \nSpecifies a list of classification variables. By default, a data cell is created for each crossing \nof these variables in the input data, and the total number of grid cells created is the result of a \ncross-tabulation table of all the classification variables plus any empty cells needed to complete \nthe last row/column of the grid. You can request that data cells be generated for all possible crossings, \neven when the class variables have no values at those crossings."},"StatementOptionType":"RV"},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"CELLHEIGHTMIN=","StatementOptionHelp":{"#cdata":"[Syntax: CELLHEIGHTMIN=dimension] \n \nSpecifies the minimum height of a cell in the grid. Default is 100px."},"StatementOptionType":"V"},{"StatementOptionName":"CELLWIDTHMIN=","StatementOptionHelp":{"#cdata":"[Syntax: CELLWIDTHMIN=dimension] \n \nSpecifies the minimum width of a cell in the grid. Default is 100px."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNAXISOPTS=(axis-options)] \n \nSpecifies X-axis options for all columns. Axis options must be enclosed in parentheses and \nseparated by spaces."},"StatementOptionType":"V","SubOptionsKeywords":"\n ALTDISPLAY=|ALTDISPLAYSECONDARY=|DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|\n LABELATTRS=|LINEAROPTS=|LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"COLUMNDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the X-axes of instances of the graph-prototype are scaled. The default is UNIONALL."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIONALL","@Value2":"UNION"},"StatementOptionToolTips":{"@ToolTip1":"Scales the X-axis data ranges across all layout columns and panels (when PANELNUMBER= is in effect).","@ToolTip2":"Scales the X-axis data ranges separately for each column in the layout."}},{"StatementOptionName":"COLUMNGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNGUTTER=dimension] \n \nSpecifies the amount of empty space that is between the columns. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=integer] \n \nSpecifies the number of columns in the layout."},"StatementOptionType":"V"},{"StatementOptionName":"HEADERBACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: HEADERBACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the background color of the cell headers. \n\nstyle-reference \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. "},"StatementOptionType":"C"},{"StatementOptionName":"HEADERLABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: HEADERLABELATTRS=style-element | style-element (text-options) | (text-options))] \n \nSpecifies the color and font attributes of the data labels.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"HEADERLABELDISPLAY=","StatementOptionHelp":{"#cdata":"Indicates whether the automatic cell header text includes variable name and value or just the value. \nThe default is NAMEVALUE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NAMEVALUE","@Value2":"VALUE"},"StatementOptionToolTips":{"@ToolTip1":"The automatic cell header text includes variable name and value.","@ToolTip2":"The automatic cell header text includes just the value."}},{"StatementOptionName":"HEADERLABELLOCATION=","StatementOptionHelp":{"#cdata":"Indicates whether the cell header is placed within each cell (INSIDE) or as row and column headers \nexternal to the lattice (OUTSIDE)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OUTSIDE","@Value2":"INSIDE"},"StatementOptionToolTips":{"@ToolTip1":"The cell header is placed as row and column headers external to the lattice.","@ToolTip2":"The cell header is placed within each cell."}},{"StatementOptionName":"HEADEROPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the background for cell headers is opaque (TRUE) or transparent (FALSE)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"The background for cell headers is opaque. This is the default.","@ToolTip2":"The background for cell headers is transparent."}},{"StatementOptionName":"INSET=","StatementOptionHelp":{"#cdata":"[Syntax: INSET=(variable-list)] \n \nSpecifies what information is displayed in an inset. The variable-list defines one or more\nvariables whose names and values appear as a small table in the data cells. The variables \nmay be either numeric or character. Variable names are separated by spaces."},"StatementOptionType":"V"},{"StatementOptionName":"INSETOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: INSETOPTS=(appearance-options)] \n \nSpecifies location and appearance options for the inset information. The appearance-options can \nbe any one or more of the settings that follow. The options must be enclosed in parentheses, and \neach option is specified as a name=value pair.\n\n AUTOALIGN=NONE | AUTO | (location-list) \n specifies whether the inset is automatically aligned within the layout. \n\n BACKGROUNDCOLOR= style-reference | color \n specifies the color of the inset background. Default is TRANSPARENT.\n\n BORDER=TRUE | FALSE\n specifies whether a border is displayed around the inset. Default is FALSE.\n\n HALIGN=LEFT | CENTER | RIGHT \n specifies the horizontal alignment of the inset. Default is LEFT.\n\n OPAQUE= boolean \n specifies whether the inset background is opaque (TRUE) or transparent (FALSE). Default is FALSE.\n\n TEXTATTRS=style-element | style-element (text-options) | (text-options) \n specifies the text properties of the entire inset.\n\n VALIGN=TOP | CENTER |BOTTOM \n specifies the vertical alignment of the inset. Default is TOP."},"StatementOptionType":"V","SubOptionsKeywords":"AUTOALIGN=|BACKGROUNDCOLOR=|BORDER=|HALIGN=|OPAQUE=|TEXTATTRS=|VALIGN="},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"PANELNUMBER=","StatementOptionHelp":{"#cdata":"[Syntax: PANELNUMBER=positive-integer] \n \nSpecifies the number of the panel to produce. The default is 1."},"StatementOptionType":"V"},{"StatementOptionName":"ROWAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWAXISOPTS=(axis-options)] \n \nSpecifies Y-axis options for all rows."},"StatementOptionType":"V","SubOptionsKeywords":"\n ALTDISPLAY=|ALTDISPLAYSECONDARY=|DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|\n LABELATTRS=|LINEAROPTS=|LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"ROWDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the Y-axes of instances of the graph-prototype are scaled. The default is UNIONALL."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIONALL","@Value2":"UNION"},"StatementOptionToolTips":{"@ToolTip1":"Scales the Y-axis data ranges across all layout rows and panels (when PANELNUMBER= is in effect).","@ToolTip2":"Scales the Y-axis data ranges separately for each row in the layout."}},{"StatementOptionName":"ROWGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: ROWGUTTER=dimension] \n \nSpecifies the amount of empty space between the rows. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=integer] \n \nSpecifies the amount of empty space between the rows."},"StatementOptionType":"V"},{"StatementOptionName":"SKIPEMPTYCELLS=","StatementOptionHelp":{"#cdata":"Specifies whether the external axes skip the empty cells in a partially filled grid. The default \nis false."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"External axes are displayed at their normal locations, even if there are empty cells at one or more of the locations.","@ToolTip2":"External axes skip empty cells and \"snap\" to the nearest data cell, both vertically and horizontally. Though the empty cells are not displayed, the data cells in the grid are not enlarged to fill the area."}},{"StatementOptionName":"SPARSE=","StatementOptionHelp":{"#cdata":"Specifies whether crossings of the class variables include only the crossings in the data or all \npossible crossings. Default: FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Data cells are created only for crossings of the class variables that are in the data.","@ToolTip2":"The number of data cells is the product of the unique values for each classification variable."}},{"StatementOptionName":"START=","StatementOptionHelp":{"#cdata":"Indicates whether to start populating the grid cells from the top-left or bottom-left corner. The default \nis TOPLEFT."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOPLEFT","@Value2":"BOTTOMLEFT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to start populating the grid cells from the top-left corner.","@ToolTip2":"Specifies to start populating the grid cells from the bottom-left corner."}}]}},{"StatementName":"LAYOUT GRIDDED","StatementHelp":{"#cdata":"Syntax: LAYOUT GRIDDED ; \n GTL-statements ;\n ENDLAYOUT ; \n \nAssembles the results of nested GTL-statements into a grid."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"AUTOALIGN=","StatementOptionHelp":{"#cdata":"Specifies whether this layout is automatically aligned within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"NONE","@Value3":"<(location-list)>"},"StatementOptionToolTips":{"@ToolTip1":"Available only if the parent layout contains a scatter plot; ignored otherwise. Within the parent layout, attempt to center this layout in the area that is farthest from any surrounding data point markers.","@ToolTip2":"Do not automatically align this layout within its parent layout. This layout's position within its parent layout will be set by the HALIGN= and VALIGN= options.","@ToolTip3":"Within the parent layout, restrict this layout's possible locations to those locations in the specified location-list, and use the location-list position that least collides with the parent layout's other grahpics features. The location-list is blank-separated and can contain any of these locations: TOPLEFT, TOP, TOPRIGHT, LEFT, CENTER, RIGHT, BOTTOMLEFT, BOTTOM, and BOTTOMRIGHT."}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-reference \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"COLUMNGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNGUTTER=dimension] \n \nSpecifies the amount of empty space between the columns. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=integer] \n \nSpecifies the number of columns in the layout. \n\nDefault: If ORDER=ROWMAJOR, the default is 1.\nIf ORDER=COLUMNMAJOR, as many columns are created as needed to satisfy the ROWS= request.\n\nRestriction: Assuming ORDER=ROWMAJOR, if COLUMNS=n and there are m cells defined, and n > m , then \nonly m columns will be created (there are n - m cells with zero size).\n\nTip: This option is used to create a grid with a fixed number of columns, without concern for how many rows."},"StatementOptionType":"V"},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies this layout's horizontal alignment within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"LOCATION=","StatementOptionHelp":{"#cdata":"Specifies whether the legend appears inside or outside the plot area when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend appears inside the plot area when nested within an overlay-type layout.","@ToolTip2":"Specifies that the legend appears outside the plot area when nested within an overlay-type layout."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"ORDER=","StatementOptionHelp":{"#cdata":"Specifies whether cells are populated using column priority or by row priority."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ROWMAJOR","@Value2":"COLUMNMAJOR"},"StatementOptionToolTips":{"@ToolTip1":"Fills all the columns in a row, from left to right, before going to the next row.","@ToolTip2":"Fills all the rows in a column, from top to bottom, before going to the next column."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"ROWGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: ROWGUTTER=dimension] \n \nSpecifies the amount of empty space between the rows. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=integer] \n \nSpecifies the amount of empty space between the rows. \n\nDefault: If ORDER=COLUMNMAJOR, the default is 1.\nIf ORDER=ROWMAJOR, this option is ignored and as many rows are created as needed to satisfy the COLUMNS= request.\n\nRestriction: Assuming ORDER=COLUMNMAJOR, if ROWS=n and there are m cells defined, and n > m , then \nonly m rows will be created (there are n - m cells with zero size).\n\nTip: This option is used to create a grid with a fixed number of rows, without concern for how many columns."},"StatementOptionType":"V"},{"StatementOptionName":"VALIGN=","StatementOptionHelp":{"#cdata":"Specifies this layout's vertical alignment within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"TOP","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered vertical alignment.","@ToolTip2":"Specifies a top-aligned vertical alignment.","@ToolTip3":"Specifies a bottom-aligned vertical alignment."}}]}},{"StatementName":"LAYOUT GLOBALLEGEND","StatementHelp":{"#cdata":"Syntax: LAYOUT GLOBALLEGEND ; \n ; \n ENDLAYOUT; \n \nCreates a compound legend containing multiple discrete legends positioned at the bottom of a graph. \n\nRestrictions: Only one global legend is allowed in a graph. \n\nThe LAYOUT GLOBALLEGEND statement must be placed directly inside the BEGINGRAPH block. It is not valid outside \nof the BEGINGRAPH block. Continuous legends are not supported inside the global legend. \n\nWhen the LAYOUT GLOBALLEGEND block is used, all of the template's legend statements must be specified within \nthe LAYOUT GLOBALLEGEND block. Any legend statements that are specified outside of the LAYOUT GLOBALLEGEND \nblock are ignored."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)\n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DISPLAYCLIPPED=","StatementOptionHelp":{"#cdata":"Specifies whether the global legend is displayed when any portion of its nested legends cannot be fully \nrendered because of space constraints. \n\nDefault: FALSE\n\nInteraction This option overrides any DISPLAYCLIPPED option that is set on its nested legend statements."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend is not displayed when any portion of the nested legend is not entirely rendered.","@ToolTip2":"The legend always appears, even if some parts of the nested legends have been clipped."}},{"StatementOptionName":"GUTTER=","StatementOptionHelp":{"#cdata":"Syntax: GUTTER=dimension\n\nSpecifies the gap between nested layouts.\n\nDefault 0 \nNote The default units for dimension are pixels."},"StatementOptionType":"V"},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the layout\u2019s horizontal alignment within the graph area that is defined by the BEGINGRAPH block.\n\nDefault CENTER \n\nNote When CENTER is in effect and the outermost layout is an overlay-type layout, the global legend is centered \nbelow the wall area if it can fit within the wall width."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"LEGENDTITLEPOSITION=","StatementOptionHelp":{"#cdata":"Syntax: LEGENDTITLEPOSITION=LEFT | TOP\n\nSpecifies the position of each nested legend\u2019s title. Specifying LEFT places each title to the left of the legend \nitems for that legend. Specifying TOP places each title above the legend items for that legend.\n\nDefault LEFT"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LEFT","@Value2":"TOP"},"StatementOptionToolTips":{"@ToolTip1":"Places each title to the left of the legend items for that legend.","@ToolTip2":"Places each title above the legend items for that legend."}},{"StatementOptionName":"OUTERPAD=","StatementOptionHelp":{"#cdata":"Syntax: AUTO | dimension | (pad-options) \n\nSpecifies the amount of extra space to add outside the layout border. \n \nAUTO\n specifies that the default outside padding for this component is used. \n\ndimension\n specifies a dimension to use for the extra space at the left, right, top, and bottom of the legend border.\n\n(pad-options)\n a space-separated list of one or more of the following name-value pair options, enclosed in parentheses:\n\n LEFT=dimension\n specifies the amount of extra space added to the left side.\n RIGHT=dimension\n specifies the amount of extra space added to the right side.\n TOP=dimension\n specifies the amount of extra space added to the top.\n BOTTOM=dimension\n specifies the amount of extra space added to the bottom.\n\n Note: Sides that are not assigned padding are padded with the default amount.\n Tip: Use pad-options to create non-uniform padding.\n Default: No padding"},"StatementOptionType":"V","SubOptionsKeywords":"AUTO|LEFT=|RIGHT=|TOP=|BOTTOM="},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"Syntax: PAD=dimension | (pad-options) \n \nSpecifies the amount of extra space that is added inside the layout border. \n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the border. \n\n(pad-options) \nA space-separated list of one or more of the following name-value-pair options enclosed in parentheses: \n\n LEFT=dimension \n specifies the amount of extra space added to the left side. Default 0 \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. Default 0 \n\n TOP=dimension \n specifies the amount of extra space added to the top. Default 0 \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom. Default 0"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"Syntax: TITLE=\u201cstring\u201d \n\nSpecifies a title for the global legend.\n\nDefault: No title is displayed for the global legend. \n\nRestriction: The string must be enclosed in quotation marks. \n\nTip: The title for the global legend is independent of the titles for its nested legends."},"StatementOptionType":"V"},{"StatementOptionName":"TITLEATTRS=","StatementOptionHelp":{"#cdata":"Syntax: style-element | style-element (text-options) | (text-options) \n \nSpecifies the color and font attributes of the global legend title. \n\nDefault: The GraphLabelText style element.\n\nInteraction: For this option to have any effect, the TITLE= option must also be specified. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"TYPE=ROW | COLUMN\n\nSpecifies whether nested legends are arranged into a single row or column.\n\nDefault ROW \n\nInteraction: When this option is set to ROW, the relative width of each legend is determined by the setting for the WEIGHTS= option. \n"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ROW","@Value2":"COLUMN"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that nested legends are arranged into a single row.","@ToolTip2":"Specifies that nested legends are arranged into a single column."}},{"StatementOptionName":"WEIGHTS=","StatementOptionHelp":{"#cdata":"Syntax: WEIGHTS=UNIFORM | PREFERRED | (weight-list) \n\nSpecifies the preferred space allocation for the nested legends. \n\nDefault: UNIFORM \n\nRestriction: The option is supported only for TYPE=ROW. \n\nTip When a weight-list is specified, all the legends using PREFERRED get their preferred space. \nAny remaining space is divided among the legends, in proportion to the numeric values specified \nin the weight-list."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIFORM","@Value2":"PREFERRED","@Value3":"weight-list)"},"StatementOptionToolTips":{"@ToolTip1":"Allocates an equal amount of space for all nested legends. ","@ToolTip2":"Allocates the preferred amount of space for each nested legend.","@ToolTip3":"A space-separated list of preferred space allocations, enclosed in parentheses. The list can combine numbers with the keyword PREFERRED. Each number is a proportional weight for the corresponding nested legend (the weights do not have to sum to 1.0). Keyword PREFERRED specifies that the corresponding nested legend should be allocated its preferred space. The order of the weights that are specified in the list should correspond to the order of the legend statements that are nested in the GLOBALLEGEND layout."}}]}},{"StatementName":"LAYOUT LATTICE","StatementHelp":{"#cdata":"Syntax: LAYOUT LATTICE ; \n GTL-statement(s) | cell-statement-block(s);\n \n \n \n ENDLAYOUT ; \n \nCreates a grid of graphs that automatically aligns plot areas and tick display areas across grid cells \nto facilitate data comparisons among graphs."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"AUTOALIGN=","StatementOptionHelp":{"#cdata":"Specifies whether this layout is automatically aligned within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"NONE","@Value3":"<(location-list)>"},"StatementOptionToolTips":{"@ToolTip1":"Available only if the parent layout contains a scatter plot; ignored otherwise. Within the parent layout, attempt to center this layout in the area that is farthest from any surrounding data point markers.","@ToolTip2":"Do not automatically align this layout within its parent layout. This layout's position within its parent layout will be set by the HALIGN= and VALIGN= options.","@ToolTip3":"Within the parent layout, restrict this layout's possible locations to those locations in the specified location-list, and use the location-list position that least collides with the parent layout's other grahpics features. The location-list is blank-separated and can contain any of these locations: TOPLEFT, TOP, TOPRIGHT, LEFT, CENTER, RIGHT, BOTTOMLEFT, BOTTOM, and BOTTOMRIGHT."}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"COLUMNDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the X-axes of instances of the graph-prototype are scaled. The default is UNIONALL."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UNIONALL","@Value2":"UNION"},"StatementOptionToolTips":{"@ToolTip1":"Scales the X-axis data ranges across all layout columns and panels (when PANELNUMBER= is in effect).","@ToolTip2":"Scales the X-axis data ranges separately for each column in the layout."}},{"StatementOptionName":"COLUMNGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNGUTTER=dimension] \n \nSpecifies the amount of empty space between the columns. The default is 0."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNS=integer] \n \nSpecifies the number of columns in the layout. \n\nDefault: If ORDER=ROWMAJOR, the default is 1.\nIf ORDER=COLUMNMAJOR, as many columns are created as needed to satisfy the ROWS= request.\n\nRestriction: Assuming ORDER=ROWMAJOR, if COLUMNS=n and there are m cells defined, and n > m , then \nonly m columns will be created (there are n - m cells with zero size).\n\nTip: This option is used to create a grid with a fixed number of columns, without concern for how many rows."},"StatementOptionType":"V"},{"StatementOptionName":"COLUMNWEIGHTS=","StatementOptionHelp":{"#cdata":"[Syntax: COLUMNWEIGHTS= (numeric-list)] \n \nSpecifies the fractional proportion of each cell relative to the overall grid width, not including \nheaders, sidebars, and column axes. \n\nRequirement: numeric-list must be enclosed in parentheses. If there are n columns, then the list \nspecified should contain n values and the sum of the weights should be 1.0."},"StatementOptionType":"V"},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies this layout's horizontal alignment within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"ORDER=","StatementOptionHelp":{"#cdata":"Specifies whether cells are populated using column priority or by row priority."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ROWMAJOR","@Value2":"COLUMNMAJOR"},"StatementOptionToolTips":{"@ToolTip1":"Fills all the columns in a row, from left to right, before going to the next row.","@ToolTip2":"Fills all the rows in a column, from top to bottom, before going to the next column."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"ROWDATARANGE=","StatementOptionHelp":{"#cdata":"Specifies how the Y-axis data ranges of graphs within the layout rows are scaled."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DATA","@Value2":"UNION","@Value3":"UNIONALL"},"StatementOptionToolTips":{"@ToolTip1":"Scales the Y-axis data ranges separately for each cell in the layout.","@ToolTip2":"Scales the Y-axis data ranges separately for each row in the layout. This setting is only supported if all plots down the row can share the same data range and axis type.","@ToolTip3":"Scales the Y-axis data ranges across all rows in the layout. This setting is only supported if all plots down the row can share the same data range and axis type."}},{"StatementOptionName":"ROWGUTTER=","StatementOptionHelp":{"#cdata":"[Syntax: ROWGUTTER=dimension] \n \nSpecifies the amount of empty space between the rows. The default is 0. \n\nTip: If there are n rows, then there are n -1 gutters."},"StatementOptionType":"V"},{"StatementOptionName":"ROWS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWS=integer] \n \nSpecifies the number of rows in the layout. \nDefault: If ORDER=COLUMNMAJOR, the default is 1.\n\nIf ORDER=ROWMAJOR, as many ROWS are created as needed to satisfy the COLUMNS= request.\n\nInteraction: If both ROWS=n and COLUMNS=m is specified, an n by m grid of cells is created. If the \nnumber of statements that define cell contents is greater than n x m , the grid size does not expand \nand some statements will not be displayed. If the number of statements that define cell contents is \nless than n x m , the grid will contain empty cells."},"StatementOptionType":"V"},{"StatementOptionName":"ROWWEIGHTS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWWEIGHTS=(numeric-list)] \n \nSpecifies the fractional proportion of each cell relative to the overall grid height, not including \nheaders, sidebars, and row axes. \n\nRequirement: numeric-list must be enclosed in parentheses. If there are n columns, then the list \nspecified should contain n values and the sum of the weights should be 1.0."},"StatementOptionType":"V"},{"StatementOptionName":"SKIPEMPTYCELLS=","StatementOptionHelp":{"#cdata":"Specifies whether the external axes skip the empty cells in a partially filled grid. The default \nis false."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"External axes are displayed at their normal locations.","@ToolTip2":"Empty cells are skipped by external axes and the axes \"snap\" to the nearest populated cell, both vertically and horizontally."}},{"StatementOptionName":"VALIGN=","StatementOptionHelp":{"#cdata":"Specifies this layout's vertical alignment within its parent when nested within an overlay-type layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"TOP","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered vertical alignment.","@ToolTip2":"Specifies a top-aligned vertical alignment.","@ToolTip3":"Specifies a bottom-aligned vertical alignment."}}]}},{"StatementName":"LAYOUT OVERLAY","StatementHelp":{"#cdata":"Syntax: LAYOUT OVERLAY ; \n GTL-statements ;\n ENDLAYOUT ; \n \nBuilds a composite from one or more GTL-statements. The composite could be an entire graph, or if \nthis layout is nested in a GRIDDED or LATTICE layout, the composite typically provides contents for \none cell in the parent layout."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"CYCLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CYCLEATTRS=boolean] \n \nSpecifies whether the default visual attributes of markers, lines, and fills in nested plot\nstatements automatically change from plot to plot. Default: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Does not cycle the default visual attributes of multiple plots.","@ToolTip2":"The system looks at the plots in the layout and tries to use the GraphData1 - GraphDataN style elements to assign different visual properties to applicable plots (scatter plots and series plots and others)."}},{"StatementOptionName":"WALLCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: WALLCOLOR=style-reference | color] \n \nSpecifies the fill color of the plot wall area. \n\nstyle-reference is a reference in the form style-element:style-attribute. \nOnly the style-attribute named COLOR is used. \n\nDefault: The GraphWalls:Color style reference."},"StatementOptionType":"C"},{"StatementOptionName":"WALLDISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: WALLDISPLAY=STANDARD | ALL | NONE | (display-options)] \n \nSpecifies whether the plot wall and wall outline are displayed. \n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a filled wall. The setting of the FRAMEBORDER= ON | OFF attribute of the GraphWalls style element determines whether the wall outline is displayed.","@ToolTip2":"Displays a filled, outlined wall.","@ToolTip3":"Displays no wall, no wall outline.","@ToolTip4":"These options must be enclosed in parentheses and include one of the following: OUTLINE displays the wall outline. FILL displays a filled wall area."}},{"StatementOptionName":"XAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: XAXISOPTS=(axis-options)] \n \nSpecifies one or more X axis options. \n\nAxis options:\n DISCRETEOPTS=(TICKVALUEFITPOLICY=ROTATE | other-policy) \n where other-policy can be ROTATETHIN|STAGGER|STAGGERROTATE|STAGGERTHIN|STAGGERTRUNCATE|TRUNCATE|\n TRUNCATEROTATE|TRUNCATESTAGGER|TRUNCATETHIN|THIN\n\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n REVERSE=TRUE | FALSE \n\n SHORTLABEL=\"string\" \n\n TICKSTYLE=OUTSIDE | INSIDE | ACROSS \n\n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n\n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | DISCRETE | LINEAR | TIME | LOG"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"X2AXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: X2AXISOPTS=(axis-options)] \n \nSpecifies one or more X2 axis options. \n\nAxis options:\n DISCRETEOPTS=(TICKVALUEFITPOLICY=ROTATE | other-policy) \n where other-policy can be ROTATETHIN|STAGGER|STAGGERROTATE|STAGGERTHIN|STAGGERTRUNCATE|TRUNCATE|\n TRUNCATEROTATE|TRUNCATESTAGGER|TRUNCATETHIN|THIN\n\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n REVERSE=TRUE | FALSE \n\n SHORTLABEL=\"string\" \n\n TICKSTYLE=OUTSIDE | INSIDE | ACROSS \n\n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n\n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | DISCRETE | LINEAR | TIME | LOG"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"YAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: YAXISOPTS=(axis-options)] \n \nSpecifies one or more Y axis options. \n\nAxis options:\n DISCRETEOPTS=(TICKVALUEFITPOLICY=ROTATE | other-policy) \n where other-policy can be ROTATETHIN|STAGGER|STAGGERROTATE|STAGGERTHIN|STAGGERTRUNCATE|TRUNCATE|\n TRUNCATEROTATE|TRUNCATESTAGGER|TRUNCATETHIN|THIN\n\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n REVERSE=TRUE | FALSE \n\n SHORTLABEL=\"string\" \n\n TICKSTYLE=OUTSIDE | INSIDE | ACROSS \n\n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n\n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | DISCRETE | LINEAR | TIME | LOG"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"Y2AXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: Y2AXISOPTS=(axis-options)] \n \nSpecifies one or more Y2 axis options. \n\nAxis options:\n DISCRETEOPTS=(TICKVALUEFITPOLICY=ROTATE | other-policy) \n where other-policy can be ROTATETHIN|STAGGER|STAGGERROTATE|STAGGERTHIN|STAGGERTRUNCATE|TRUNCATE|\n TRUNCATEROTATE|TRUNCATESTAGGER|TRUNCATETHIN|THIN\n\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n REVERSE=TRUE | FALSE \n\n SHORTLABEL=\"string\" \n\n TICKSTYLE=OUTSIDE | INSIDE | ACROSS \n\n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n\n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | DISCRETE | LINEAR | TIME | LOG"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISCRETEOPTS=|DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|REVERSE=|SHORTLABEL=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "}]}},{"StatementName":"LAYOUT OVERLAYEQUATED","StatementHelp":{"#cdata":"Syntax: LAYOUT OVERLAYEQUATED ; \n GTL-statements ;\n ENDLAYOUT ; \n \nBuilds a composite from one or more GTL-statements. The composite could be an entire graph, or if \nthis layout is nested in another layout, such as a GRIDDED layout, the composite typically provides \ncontents for one cell in the parent layout. an OVERLAYEQUATED layout, the display unit of the X axis \nalways equals the display unit of the Y axis."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"COMMONAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: COMMONAXISOPTS= (common-equated-axis-options)] \n \nSpecifies one or more axis options to be applied to all displayed axes.\n\ncommon-equated-axis-options:\n INTEGER=TRUE | FALSE\n\n TICKSTYLE=OUTSIDE | INSIDE | ACROSS \n\n TICKVALUELIST=( numeric-list ) \n\n TICKVALUEPRIORITY=TRUE | FALSE\n\n TICKVALUESEQUENCE=( START=number | END=number | INCREMENT=number)\n\n VIEWMAX= number \n\n VIEWMIN= number"},"StatementOptionType":"V","SubOptionsKeywords":"INTEGER=|TICKSTYLE=|TICKVALUELIST=|TICKVALUEPRIORITY=|TICKVALUESEQUENCE=|VIEWMAX=|VIEWMIN="},{"StatementOptionName":"CYCLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CYCLEATTRS=boolean] \n \nSpecifies whether the default visual attributes of markers, lines, and fills in nested plot\nstatements automatically change from plot to plot. Default: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Does not cycle the default visual attributes of multiple plots.","@ToolTip2":"The system looks at the plots in the layout and tries to use the GraphData1 - GraphDataN style elements to assign different visual properties to applicable plots (scatter plots and series plots and others)."}},{"StatementOptionName":"EQUATETYPE=","StatementOptionHelp":{"#cdata":"[Syntax: EQUATETYPE= FIT | SQUARE | EQUATE] \n \nSpecifies how to draw the axis area."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FIT","@Value2":"SQUARE","@Value3":"EQUATE"},"StatementOptionToolTips":{"@ToolTip1":"X and Y axes have equal increments between tick values. The data ranges of both axes are compared to establish a common increment size. The axes may be of different lengths and have a different number of tick marks.","@ToolTip2":"Both the X and Y axes have the same length and the same major tick values. The axis length and tick values are chosen so that the minimum and maximum of both X and Y appear in the range of values appearing on both axes.","@ToolTip3":"Same as FIT except that neither axis is extended to use available space in the plot area."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"WALLCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: WALLCOLOR=style-reference | color] \n \nSpecifies the fill color of the plot wall area. \n\nstyle-reference is a reference in the form style-element:style-attribute. \nOnly the style-attribute named COLOR is used. \n\nDefault: The GraphWalls:Color style reference."},"StatementOptionType":"C"},{"StatementOptionName":"WALLDISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: WALLDISPLAY=STANDARD | ALL | NONE | (display-options)] \n \nSpecifies whether the plot's wall and wall outline are displayed. \n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a filled wall. The setting of the FRAMEBORDER= ON | OFF attribute of the GraphWalls style element determines whether the wall outline is displayed.","@ToolTip2":"Displays a filled, outlined wall.","@ToolTip3":"Displays no wall, no wall outline.","@ToolTip4":"These options must be enclosed in parentheses and include one of the following: OUTLINE displays the wall outline. FILL displays a filled wall area."}},{"StatementOptionName":"XAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: XAXISOPTS=(equated-axis-options)] \n \nSpecifies one or more X axis options. \n\nequated-axis-options:\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n SHORTLABEL=\"string\" \n \n THRESHOLDMAX= number \n \n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options)\n \n TICKVALUEFITPOLICY=policy \n where policy can be:\n o For Y or Y2 axis: THIN\n o For X or X2: THIN | ROTATE | ROTATETHIN | STAGGER | STAGGERROTATE | STAGGERTHIN\n \n TICKVALUEFORMAT=( format-options ) | DATA | format \n specifies how to format the values for tick marks. \n Default format-options: ( MAXWIDTH=8, MAXDECIMALS=6, PREFERREDDECIMALS=2, EXTRACTSCALE=FALSE )"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|OFFSETMAX=|OFFSETMIN=|\n SHORTLABEL=|THRESHOLDMAX=|THRESHOLDMIN=|TICKVALUEATTRS=|TICKVALUEFITPOLICY=|TICKVALUEFORMAT=\n "},{"StatementOptionName":"YAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: YAXISOPTS=(equated-axis-options)] \n \nSpecifies one or more Y axis options. \n\nequated-axis-options:\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n DISPLAYSECONDARY=NONE | ALL | STANDARD | ( LABEL|LINE|TICKS|TICKVALUES ) \n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n\n SHORTLABEL=\"string\" \n \n THRESHOLDMAX= number \n \n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options)\n \n TICKVALUEFITPOLICY=policy \n where policy can be:\n o For Y or Y2 axis: THIN\n o For X or X2: THIN | ROTATE | ROTATETHIN | STAGGER | STAGGERROTATE | STAGGERTHIN\n \n TICKVALUEFORMAT=( format-options ) | DATA | format \n specifies how to format the values for tick marks. \n Default format-options: ( MAXWIDTH=8, MAXDECIMALS=6, PREFERREDDECIMALS=2, EXTRACTSCALE=FALSE )"},"StatementOptionType":"V","SubOptionsKeywords":"\n DISPLAY=|DISPLAYSECONDARY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|OFFSETMAX=|OFFSETMIN=|\n SHORTLABEL=|THRESHOLDMAX=|THRESHOLDMIN=|TICKVALUEATTRS=|TICKVALUEFITPOLICY=|TICKVALUEFORMAT=\n "}]}},{"StatementName":"LAYOUT OVERLAY3D","StatementHelp":{"#cdata":"Syntax: LAYOUT OVERLAY3D ; \n GTL-statements ;\n ENDLAYOUT ; \n \nBuilds a 3D composite from one or more GTL-statements. The composite could be an entire graph, \nor if this layout is nested in a GRIDDED or LATTICE layout, the composite typically provides \ncontents for one cell in the parent layout."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-element \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"CUBE=","StatementOptionHelp":{"#cdata":"Specifies that the layout displays the lines that indicate the complete bounding cube of the axis planes. \n \nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout does not display the lines that indicate the complete bounding cube of the axis planes.","@ToolTip2":"Specifies that the layout displays the lines that indicate the complete bounding cube of the axis planes."}},{"StatementOptionName":"CYCLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CYCLEATTRS=boolean] \n \nSpecifies whether the default visual attributes of markers, lines, and fills in nested plot\nstatements automatically change from plot to plot. Default: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Does not cycle the default visual attributes of multiple plots.","@ToolTip2":"The system looks at the plots in the layout and tries to use the GraphData1 - GraphDataN style elements to assign different visual properties to applicable plots (scatter plots and series plots and others)."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"ROTATE=","StatementOptionHelp":{"#cdata":"[Syntax: ROTATE=number] \n \nSpecifies the angle of rotation. Rotation is measured in a clockwise direction about a virtual \naxis parallel to the Z axis (vertical) and passing through the center of the bounding cube. \nA counterclockwise rotation can specified with a negative value. \n\nDefault: 54"},"StatementOptionType":"V"},{"StatementOptionName":"TILT=","StatementOptionHelp":{"#cdata":"[Syntax: TILT=number] \n \nSpecifies the angle of tilt in degrees. Tilt is measured in a clockwise direction about a virtual \naxis parallel to the X axis (vertical) and passing through the center of the bounding cube. \nA counterclockwise rotation can specified with a negative value. \n\nDefault: 20"},"StatementOptionType":"V"},{"StatementOptionName":"WALLCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: WALLCOLOR=style-reference | color] \n \nSpecifies the fill color of the plot's walls. \n\nstyle-reference is a reference in the form style-element:style-attribute. \nOnly the style-attribute named COLOR is used. \n\nDefault: The GraphWalls:Color style reference."},"StatementOptionType":"C"},{"StatementOptionName":"WALLDISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: WALLDISPLAY=STANDARD | ALL | NONE | (display-options)] \n \nSpecifies whether the plot's wall and wall outline are displayed. \n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a filled wall. The setting of the FRAMEBORDER= ON | OFF attribute of the GraphWalls style element determines whether the wall outline is displayed.","@ToolTip2":"Displays a filled, outlined wall.","@ToolTip3":"Displays no wall, no wall outline.","@ToolTip4":"These options must be enclosed in parentheses and include one of the following: OUTLINE displays the wall outline. FILL displays a filled wall area."}},{"StatementOptionName":"XAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: XAXISOPTS=(axis-options)] \n \nSpecifies one or more X axis options. \n\naxis-options:\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n \n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n \n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | LINEAR | TIME | LOG \n specifies the type of axis to use."},"StatementOptionType":"V","SubOptionsKeywords":"\n DISPLAY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"YAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: YAXISOPTS=(axis-options)] \n \nSpecifies one or more Y axis options. \n\naxis-options:\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n \n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n \n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | LINEAR | TIME | LOG \n specifies the type of axis to use."},"StatementOptionType":"V","SubOptionsKeywords":"\n DISPLAY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"ZAXISOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: ZAXISOPTS=(axis-options)] \n \nSpecifies one or more Y axis options. \n\naxis-options:\n DISPLAY=STANDARD | ALL | NONE | ( LABEL|LINE|TICKS|TICKVALUES )\n\n GRIDATTRS=style-element | style-element (line-options) | (line-options) \n\n GRIDDISPLAY=AUTO_OFF | AUTO_ON | ON | OFF \n\n LABEL=\"string\" | ( \"string\" ... \"string\" ) \n\n LABELATTRS=style-element | style-element (text-options) | (text-options) \n\n LINEAROPTS=( linear-axis-options ) \n\n LOGOPTS=( log-axis-options ) \n\n OFFSETMAX=AUTO | AUTOCOMPRESS | number \n\n OFFSETMIN=AUTO | AUTOCOMPRESS | number \n \n TICKVALUEATTRS=style-element | style-element (text-options) | (text-options) \n \n TIMEOPTS=( time-axis-options ) \n\n TYPE=AUTO | LINEAR | TIME | LOG \n specifies the type of axis to use."},"StatementOptionType":"V","SubOptionsKeywords":"\n DISPLAY=|GRIDATTRS=|GRIDDISPLAY=|LABEL=|LABELATTRS=|LINEAROPTS=|\n LOGOPTS=|OFFSETMAX=|OFFSETMIN=|TICKVALUEATTRS=|TIMEOPTS=|TYPE=\n "},{"StatementOptionName":"ZOOM=","StatementOptionHelp":{"#cdata":"[Syntax: ZOOM= positive-number] \n \nSpecifies a zoom factor. Factors greater than 1 move closer to the bounding cube, less than 1 move \nfarther away. Default: 1"},"StatementOptionType":"V"}]}},{"StatementName":"LAYOUT REGION","StatementHelp":{"#cdata":"Syntax: LAYOUT REGION ; \n GTL-statements;\n ENDLAYOUT;\n \nCreates the drawing area for a plot that does not use axes."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the layout background. \n\nstyle-reference \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR or CONTRASTCOLOR is used.\n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is drawn around the layout."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is drawn around the layout.","@ToolTip2":"A border is not drawn around the layout. This is the default."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the layout.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE \n\nInteraction: When this option is set to FALSE, the background color is not used."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"OUTERPAD=","StatementOptionHelp":{"#cdata":"[Syntax: AUTO | dimension | (pad-options) \n\nSpecifies the amount of extra space to add outside the layout border. \n \nAUTO\n specifies that the default outside padding for this component is used. \n\ndimension\n specifies a dimension to use for the extra space at the left, right, top, and bottom of the legend border.\n\n(pad-options)\n a space-separated list of one or more of the following name-value pair options, enclosed in parentheses:\n\n LEFT=dimension\n specifies the amount of extra space added to the left side.\n RIGHT=dimension\n specifies the amount of extra space added to the right side.\n TOP=dimension\n specifies the amount of extra space added to the top.\n BOTTOM=dimension\n specifies the amount of extra space added to the bottom.\n\n Note: Sides that are not assigned padding are padded with the default amount.\n Tip: Use pad-options to create non-uniform padding.\n Default: No padding"},"StatementOptionType":"V","SubOptionsKeywords":"AUTO|LEFT=|RIGHT=|TOP=|BOTTOM="},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. \n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the border. \n\n(pad-options) \nA space-separated list of one or more of the following name-value-pair options enclosed in parentheses: \n\n LEFT=dimension \n specifies the amount of extra space added to the left side. Default 0 \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. Default 0 \n\n TOP=dimension \n specifies the amount of extra space added to the top. Default 0 \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom. Default 0"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="}]}},{"StatementName":"BANDPLOT","StatementHelp":{"#cdata":"Syntax: BANDPLOT X = column | expression\n LIMITLOWER = number | numeric-column | expression\n LIMITUPPER = number | numeric-column | expression\n ; \n\n\nBANDPLOT Y = numeric-column | expression\n LIMITLOWER = number | numeric-column | expression\n LIMITUPPER = number | numeric-column | expression\n ; \n\nCreates a band plot that typically shows confidence or prediction limits."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies X values. Numeric or character values may be used."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies Y values. Numeric or character values may be used."},"StatementOptionType":"RV"},{"StatementOptionName":"LIMITLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: LIMITLOWER=number | numeric-column | expression] \n \nSpecifies a constant or column representing the X value(s) (when Y= is used) or Y value(s) (when X= is used) \nof the lower band line. If a constant is specified, a straight line is drawn."},"StatementOptionType":"RV"},{"StatementOptionName":"LIMITUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: LIMITUPPER=number | numeric-column | expression] \n \nSpecifies a constant or column representing the X value(s) (when Y= is used) or Y value(s) (when X= is used) \nof the upper band line. If a constant is specified, a straight line is drawn."},"StatementOptionType":"RV"},{"StatementOptionName":"CONNECTORDER=","StatementOptionHelp":{"#cdata":"Specifies how to connect the data points to form the band lines. Default: VALUES. \n \nTip: Use CONNECTORDER=AXIS to assure the expected connect order for certain kinds of series \nlines (for example, time series ) when the input data may not be sorted by the X variable \n(or Y variable)."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VALUES","@Value2":"AXIS"},"StatementOptionToolTips":{"@ToolTip1":"Connects data points in the order read from the X variable (or Y variable).","@ToolTip2":"Connects data points as they occur left-to-right along the X axis (or bottom-to-top along the Y axis)."}},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the band labels.\nDefault:\n o For non-grouped data, the GraphValueText style element. \n o For grouped data, text color is derived from the GraphData1:ContrastColor - GraphDataN:ContrastColor \n style references. The font is derived from the GraphValueText style element. \n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELLOWER= \"string\" | column] \n \nSpecifies a label for the lower band limit. \nDefault: no default\n\nInteraction: For non-grouped data, use \"string\".\n\nInteraction: For grouped data, use a column to define the lower band labels for each group value. \nAll of the labels for a specific group value must be the same; otherwise, the results are unpredictable.\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the band labels relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the BANDPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the band labels appear."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the band label inside the plot area","@ToolTip2":"Places the band label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the band labels relative to the curve line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the band labels appear."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELLOCATION=OUTSIDE. Band labels will be positioned automatically near the band boundary along unused axes whenever possible (typically Y2 and X2).","@ToolTip2":"Forces the band labels to appear near maximum band values (maximum-values for horizontal curves, and maximum Y-values for vertical curves).","@ToolTip3":"Forces the band label to appear near minimum band values (minimum X-values for horizontal curves, and minimum Y-values for vertical curves)","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces band labels to appear near the beginning of the curve. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces band labels to appear near the end of the curve. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the band. This option affects both the fill and outline. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display an outlined band area, a filled band area, or an outlined and filled \nband area. \n\nDefault: The value of the DisplayOpts attribute of the GraphBand style element, which is \nDisplayOpts=\"FILL\" by default."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an un-outlined, filled band","@ToolTip2":"Displays an outlined, filled band","@ToolTip3":"A parenthesized list of space-delimited options that must include one of the following: OUTLINE displays an outlined band FILL displays a filled band"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"EXTEND=","StatementOptionHelp":{"#cdata":"Specifies whether the constant or \"step\" band is to be drawn to the area bounded by the axes. \n\nDefault: FALSE\n\nRequirement: When this option is used for a constant band, constants must be specified for the upper \nand lower band limits. This requirement does not apply to \"step\" bands.\n\nRestriction: This option is ignored if the X or Y value is character.\n\nTip: If this option is not specified, then there can be a small gap between the line and the axis. \nThe gap is controlled by the axis offset. If the offset is set to 0, then there is no gap."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the constant or \"step\" band is not to be drawn to the area bounded by the axes.","@ToolTip2":"Specifies whether the constant or \"step\" band is to be drawn to the area bounded by the axes."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the filled band area. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault:\n o For non-grouped data, the GraphDataDefault:Color style reference. \n o For grouped data, the Color attribute of GraphData1 - GraphDataN style elements. \n\nInteraction: Interaction: For this option to have any effect, the fill must be enabled by the \nODS style or the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate band plot for each unique group value of the specified column. \nDefault:\n\n o If the band outline is enabled by the ODS style or the DISPLAY= option, each distinct group value \n is represented in the graph by a different combination of outline color (defined by the \n GraphData1:ContrastColor - GraphDataN:ContrastColor style references) and outline pattern \n (defined by the attribute of the GraphData1:LineStyle - GraphDataN:LineStyle style references). \n o If the band fill is enabled by the ODS style or the DISPLAY= option, each distinct group value \n is represented in the graph by a different fill color (defined by the GraphData1:Color - GraphDataN:Color \n style references). \n\nRestriction: This option can only be used when a numeric column is specified for the upper limit \nor the lower limit of the band plot (the other limit could be a contant, if desired).\n\nInteraction: To label grouped band plots, you must specify CURVELABELLOWER=column and CURVELABELUPPER=column .\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of colors and line patterns.\n\nTip: The representations that are used to identify the groups can be overridden individually. For example, \neach distinct group value is represented by a different line pattern for the band lines, but the PATTERN= \nsuboption of the OUTLINEATTRS= option could be used to assign the same line pattern to all band outlines."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the GraphData1 - GranphDataN \nstyle elements. \n\nDefault: no default\n\nRestriction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: The index values are 1-based indices. For the style definitions in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style to use."},"StatementOptionType":"V"},{"StatementOptionName":"JUSTIFY=","StatementOptionHelp":{"#cdata":"Specifies the location of the data point relative to the step. \n \nDefault: LEFT\n\nRequirement: TYPE=STEP must also be specified for this option to have any effect.\n\nInteraction: If the MODELNAME= option is specified, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LEFT","@Value2":"CENTER","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a LEFT location of the data point relative to the step.","@ToolTip2":"Specifies a CENTER location of the data point relative to the step.","@ToolTip3":"Specifies a RIGHT location of the data point relative to the step."}},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies the label of the legends. \nDefault: The string specified on the NAME= option.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"MODELNAME=","StatementOptionHelp":{"#cdata":"[Syntax: MODELNAME= \"plot-name\"] \n \nSpecifies the name of the plot from which to derive the interpolation for the band. \n\nDefault: no default\n\nRequirement: plot-name must be the name that has been assigned on the associated plot's NAME= option.\n\nInteraction: This option overrides the JUSTIFY= and TYPE= options.\n\nTip: If this option is not specified, then the interpolation is set by the TYPE= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the band outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor and LineStyle attributes of the GraphData1 - GraphDataN \n style elements. \n\nInteraction: For this option to have any effect, the outline must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of role-name = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined \nroles X, Y, LIMITUPPER, LIMITLOWER, GROUP, CURVELABELUPPER, and CURVELABELLOWER.\n\nTip: This option provides a way to add to the data columns that appear in tool tips \nspecified by the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over the band plot. \nIf this option is used, it replaces all the information displayed by default. Roles for \ncolumns that do not contribute to the band plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tool tip \ninformation: X, Y, LIMITUPPER, LIMITLOWER, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique BANDPLOT and user-defined roles. \nBANDPLOT roles include X, Y, LIMITUPPER, LIMITLOWER, GROUP, INDEX, CURVELABELUPPER,\nand CURVELABELLOWER. User-defined roles are defined with the ROLENAME= option.\n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the \nTIPLABEL= and TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is \nassigned to a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X LIMITUPPER LIMITLOWER) \n TIPFORMAT=( LIMITUPPER= 5.3 LIMITLOWER= 5.3 )\n \nRequirement: This option provides a way to control the formats of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X LIMITUPPER LIMITLOWER) \n TIPLABEL=( LIMITUPPER=\"90% CLU\" \n LIMITLOWER=\"90% CLL\" ) \n\nRequirement: This option provides a way to control the labels of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies how the data points for lower and upper band boundaries are interpolated. \n\nDefault: SERIES \n\nInteraction: TYPE=STEP must be specified to enable the JUSTIFY= option.\n\nInteraction: If the MODELNAME= option is specified, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"SERIES","@Value2":"STEP"},"StatementOptionToolTips":{"@ToolTip1":"The data points are joined directly using line segements (as in a SeriesPlot).","@ToolTip2":"The data points are connected using a step function (as in a StepPlot)."}},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (left) axis or to the secondary X2 (right) axis. \n\nDefault: X\n\nInteraction: This option is ignored if the X= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (left) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (right) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (bottom) axis or to the secondary Y2 (top) axis. \n\nDefault: Y\n\nInteraction: This option is ignored if the Y= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (bottom) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (top) axis."}}]}},{"StatementName":"BARCHART","StatementHelp":{"#cdata":"Syntax: BARCHART X= column | expression ; \n \nThe following syntax creates a bar chart with bars representing summarized values of Y categorized by X:\n\n BARCHART X= column | expression Y= numeric-column | expression ; \n \nCreates a barchart computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column or expression for the category values. This argument is required."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies the numeric column or expression for the response values. This argument is optional."},"StatementOptionType":"RV"},{"StatementOptionName":"BARLABEL=","StatementOptionHelp":{"#cdata":"Specifies whether the bar statistic value is displayed at the end of the bar. \n\nDefault: FALSE\n\nTIP: The font and color attributes for the label are specified by the BARLABELATTRS= option. \nThe text format is specified by the BARLABELFORMAT= option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the bar statistic value is not displayed at the end of the bar.","@ToolTip2":"Specifies that the bar statistic value is displayed at the end of the bar."}},{"StatementOptionName":"BARLABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BARLABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the text properties of the bar label text.\nDefault: The GraphDataText style element.\nInteraction: For this option to take effect, BARLABEL=TRUE must be specified.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"BARLABELFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: BARLABELFORMAT=format] \n \nSpecifies the text format used to display the bar label. \n\nDefault: The column format assigned to the Y= variable or BEST6.2 if no format is assigned.\n\nInteraction: For this option to take effect, BARLABEL=TRUE must be specified."},"StatementOptionType":"V"},{"StatementOptionName":"BARWIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: BARWIDTH=number] \n \nSpecifies the width of a bar as a ratio of the maximum possible width. \n\nDefault: .85. By default, the bar width automatically adjusts based on the number of bars \nto be displayed and the wall width.\n\nRange: 0 (narrowest) to 1 (widest)\n\nTip: This option is needed only to change the default behavior. For example, to remove any \ninter-bar gap, set BARWIDTH=1."},"StatementOptionType":"V"},{"StatementOptionName":"CONNECTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CONNECTATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the bar connect lines. \nDefault: The GraphConnectLine style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the bar fill, bar outline, and connectline, if displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies which bar features to display. \n\nDefault: STANDARD \n\nRestriction: Connect lines are not drawn for grouped data.\n\nTip: Use the OUTLINEATTRS= and FILLATTRS= options to control the appearance of the bars. \nUse CONNECTATTRS= to control the appearance of the connect lines."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an un-outlined, filled bar.","@ToolTip2":"Displays an outlined, filled bar.","@ToolTip3":"A parenthesized list of space-delimited options that must include one of the following: OUTLINE displays outlined bars FILL displays filled bars"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the filled bar area. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault:\n o For non-grouped data, the GraphDataDefault:Color style reference. \n o For grouped data, the Color attribute of GraphData1 - GraphDataN style elements."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate bar segment for each unique group value of the specified column.\n\nDefault:\n o If bar fills are enabled by the ODS style or the DISPLAY= option, each distinct group value is \n represented in the graph by a different fill color defined by the GraphData1:Color - GraphDataN:Color \n style references. \n o If bar outlines are enabled by the ODS style or the DISPLAY= option, each distinct group value \n is represented in the graph by a different outlined color defined by the \n GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n \nInteraction: Connect lines are not drawn for grouped data.\n\nInteraction: By default, the group values are mapped in the order of the data. The GROUPORDER= \noption can be used to control the sorting order of the grouped bar segments. The INDEX= option \ncan be used to alter the default sequence of colors and line patterns.\n\nTip: The representations that are used to identify the groups can be overridden individually. \nFor example, each distinct group value is represented by a different line pattern for the bar\noutlines, but the PATTERN= setting on the OUTLINEATTRS= option could be used to assign the same \nline pattern to all bar outlines and connect lines."},"StatementOptionType":"V"},{"StatementOptionName":"GROUPORDER=","StatementOptionHelp":{"#cdata":"Specifies the ordering of bars within a group and within the legend. \n\nDefault: DATA \n\nInteraction: This option is ignored unless GROUP= is specified."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DATA","@Value2":"ASCENDING","@Value3":"DESCENDING"},"StatementOptionToolTips":{"@ToolTip1":"Shows each group of bars in data order of the group column.","@ToolTip2":"Shows each group of bars in ascending order.","@ToolTip3":"Shows each group of bars in descending order."}},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the GraphData1 - GranphDataN \nstyle elements. \n\nDefault: no default\n\nRestriction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: The index values are 1-based indices. For the style definitions in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and the bars. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and the bars.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and the bars."}},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the bar outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the ContrastColor and LineThickness attributes of the GraphOutlines style element. \n o For grouped data, the ContrastColor and LineThickness attribute of the GraphData1 - GraphDataN style elements. \n\nInteraction: For this option to have any effect, outlines must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"STAT=","StatementOptionHelp":{"#cdata":"Specifies the statistic to be computed for the Y-axis. \n\nDefault: FREQ for bar charts with no Y=column. SUM for bar charts with a Y= column"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FREQ","@Value2":"PCT","@Value3":"SUM","@Value4":"MEAN"},"StatementOptionToolTips":{"@ToolTip1":"[For bar charts with no Y= column]--Frequency count","@ToolTip2":"[For bar charts with no Y= column]--Percent","@ToolTip3":"[For bar charts with a Y= column]--Sum","@ToolTip4":"For bar charts with a Y= column]--Mean"}},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a bar. \nIf this option is used, it replaces all the information displayed by default.\n\nDefault: The columns assigned to these roles are automatically included in the tool tip \ninformation: X, Y, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique BARCHART roles. BARCHART roles include X, Y, INDEX, \nand GROUP. The following example displays tooltips for the columns assigned to the roles X and Y only.\n \n TIP= (X Y)\n \nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= \nand TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is \nassigned to a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIP=(Y) \n TIPFORMAT=( Y=DOLLAR12.)\n \nRequirement: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIP=(Y) \n TIPLABEL=(Y=\"Average Sales\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when the bar is selected. \nDefault: no default\n\ncharacter-column \neach value of the column should be a valid HTML page reference (HREF).\nExample: http://www.sas.com/technologies/analytics/index.html . \n\nRequirement: To generate selectable bars, you must include an ODS GRAPHICS ON statement that has \nthe IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: For non-grouped data, the values of the column are expected to be same for each unique X value. \nIf they are not, the results may be unpredictable. The URL value may be blank for some X values,\nmeaning that no action is taken when the bars for those X values are selected. The URL value may \nbe the same for different X values, meaning that the same action is taken when the bars for those \nX values are selected.\n\nTip: For grouped data, the values of the column are expected to be the same for each unique X and \nGROUP combination."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"BARCHARTPARM","StatementHelp":{"#cdata":"Syntax: BARCHARTPARM X= column | expression\n Y= numeric-column | expression ; \n \nCreates a barchart specified by pre-summarized data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column for the unique category values. All values are treated as discrete."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies the column for the response values."},"StatementOptionType":"RV"},{"StatementOptionName":"BARLABEL=","StatementOptionHelp":{"#cdata":"Specifies whether the bar statistic value is displayed at the end of the bar. \n\nDefault: FALSE\n\nTIP: The font and color attributes for the label are specified by the BARLABELATTRS= option. \nThe text format is specified by the BARLABELFORMAT= option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the bar statistic value is not displayed at the end of the bar.","@ToolTip2":"Specifies that the bar statistic value is displayed at the end of the bar."}},{"StatementOptionName":"BARLABELFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: BARLABELFORMAT=format] \n \nSpecifies the text format used to display the bar label. \n\nDefault: The column format assigned to the Y= variable or BEST6.2 if no format is assigned.\n\nInteraction: For this option to take effect, BARLABEL=TRUE must be specified."},"StatementOptionType":"V"},{"StatementOptionName":"BARWIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: BARWIDTH=number] \n \nSpecifies the width of a bar as a ratio of the maximum possible width. \n\nDefault: .85. By default, the bar width automatically adjusts based on the number of bars \nto be displayed and the wall width.\n\nRange: 0 (narrowest) to 1 (widest)\n\nTip: This option is needed only to change the default behavior. For example, to remove any \ninter-bar gap, set BARWIDTH=1."},"StatementOptionType":"V"},{"StatementOptionName":"CONNECTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CONNECTATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the bar connect lines. \nDefault: The GraphConnectLine style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the bar fill, bar outline, error bars, and \nconnectline, if displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies which bar features to display. \n\nDefault: STANDARD \n\nRestriction: Connect lines are not drawn for grouped data.\n\nTip: Use the OUTLINEATTRS= and FILLATTRS= options to control the appearance of the bars. \nUse CONNECTATTRS= to control the appearance of the connect lines."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an outlined, filled bars.","@ToolTip2":"Displays an outlined, filled bars and also connect lines.","@ToolTip3":"A parenthesized list of options that must include one of the following: OUTLINE displays outlined bars FILL displays filled bars CONNECT Displays line segments connecting adjacent midpoints at the end of each bar."},"SubOptionsKeywords":"OUTLINE|FILL|CONNECT"},{"StatementOptionName":"ERRORBARATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORBARATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the error bars associated with the bars. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the GraphError style element. \n o For grouped data, the LineStyle and LineThickness attributes of the GraphError style element \n and the ContrastColor attribute of the GraphData1 - GraphDataN style elements."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"ERRORLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORLOWER=numeric-column | expression] \n \nSpecifies the values of the lower endpoints on the Y error bars. \nDefault: The lower segment of the error bars is not drawn.\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nTip: The errorbar values must be absolute data values, not data values relative to the value of the bar.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"ERRORUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORUPPER=numeric-column | expression] \n \nSpecifies the values of the upper endpoints on the Y error bars. \nDefault: The upper segment of the error bars is not drawn.\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nTip: The errorbar values must be absolute data values, not data values relative to the value of the bar.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the filled bar area. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault:\n o For non-grouped data, the GraphDataDefault:Color style reference. \n o For grouped data, the Color attribute of GraphData1 - GraphDataN style elements."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate bar segment for each unique group value of the specified column.\n\nDefault:\n o If bar fills are enabled by the ODS style or the DISPLAY= option, each distinct group value is \n represented in the graph by a different fill color defined by the GraphData1:Color - GraphDataN:Color \n style references. \n o If bar outlines are enabled by the ODS style or the DISPLAY= option, each distinct group value \n is represented in the graph by a different outlined color defined by the \n GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n \nInteraction: Connect lines are not drawn for grouped data.\n\nInteraction: By default, the group values are mapped in the order of the data. The GROUPORDER= \noption can be used to control the sorting order of the grouped bar segments. The INDEX= option \ncan be used to alter the default sequence of colors and line patterns.\n\nTip: The representations that are used to identify the groups can be overridden individually. \nFor example, each distinct group value is represented by a different line pattern for the bar\noutlines, but the PATTERN= setting on the OUTLINEATTRS= option could be used to assign the same \nline pattern to all bar outlines and connect lines."},"StatementOptionType":"V"},{"StatementOptionName":"GROUPORDER=","StatementOptionHelp":{"#cdata":"Specifies the ordering of bars within a group and within the legend. \n\nDefault: DATA \n\nInteraction: This option is ignored unless GROUP= is specified."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DATA","@Value2":"ASCENDING","@Value3":"DESCENDING"},"StatementOptionToolTips":{"@ToolTip1":"Shows each group of bars in data order of the group column.","@ToolTip2":"Shows each group of bars in ascending order.","@ToolTip3":"Shows each group of bars in descending order."}},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the GraphData1 - GranphDataN \nstyle elements. \n\nDefault: no default\n\nRestriction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: The index values are 1-based indices. For the style definitions in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and the bars. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and the bars.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and the bars."}},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the bar outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the ContrastColor and LineThickness attributes of the GraphOutlines style element. \n o For grouped data, the ContrastColor and LineThickness attribute of the GraphData1 - GraphDataN style elements. \n\nInteraction: For this option to have any effect, outlines must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this chart be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this chart and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this chart and the plot type be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of role-name = column pairs. \nFor example, ROLENAME= ( TIP1=PCT ) assigns the column PCT to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, \nY, ERRORUPPER, ERRORLOWER, and GROUP.\n\nTip: This option provides a way to add to the data columns that appear in tool tips specified \nby the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a bar. \nIf this option is used, it replaces all the information displayed by default.\n\nDefault: The columns assigned to these roles are automatically included in the tool tip \ninformation: X, Y, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique BARCHARTPARM and user-defined roles. BARCHARTPARM roles \ninclude X, Y, ERRORUPPER, ERRORLOWER, INDEX, and GROUP. User-defined roles are defined with the \nROLENAME= option.\n\nThe following example displays tool tips for the columns assigned to the roles X and Y as well \nas the column PCT which is not assigned to any pre-defined bar chart role. The PCT column must \nfirst be assigned a role.\n \n ROLENAME=(TIP1=PCT) \n TIP= (TIP1 X Y) \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= \nand TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is \nassigned to a numeric column.\n\nrole-format-list) \na list of role-name = format pairs separated by blanks. \n \n ROLENAME=(TIP1=PCT) \n TIP=(TIP1 X Y) \n TIPFORMAT=( TIP1=PERCENT7.2) \n\nRequirement: This option provides a way to control the formats of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIP=(Y) \n TIPLABEL=(Y=\"Average Sales\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when the bar is selected. \nDefault: no default\n\ncharacter-column \neach value of the column should be a valid HTML page reference (HREF).\nExample: http://www.sas.com/technologies/analytics/index.html . \n\nRequirement: To generate selectable bars, you must include an ODS GRAPHICS ON statement that has \nthe IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: For non-grouped data, the values of the column are expected to be same for each unique X value. \nIf they are not, the results may be unpredictable. The URL value may be blank for some X values,\nmeaning that no action is taken when the bars for those X values are selected. The URL value may \nbe the same for different X values, meaning that the same action is taken when the bars for those \nX values are selected.\n\nTip: For grouped data, the values of the column are expected to be the same for each unique X and \nGROUP combination."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"BIHISTOGRAM3DPARM","StatementHelp":{"#cdata":"Syntax: BIHISTOGRAM3DPARM X= numeric-column | expression\n Y= numeric-column | expression\n Z= non-negative-numeric-column | expression ; \n \nCreates a 3D bivariate histogram of three variables X, Y, and Z, where values of X and Y have \nbeen gridded and the Z variable represents a response value for the frequency, percentage counts, \nor densities of each bin combination."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the bin location of the numeric X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the bin location of the numeric Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"Z=","StatementOptionHelp":{"#cdata":"[Syntax: Z=numeric-column | expression] \n \nSpecifies the response values, such as the frequency counts, percentages, or densities."},"StatementOptionType":"RV"},{"StatementOptionName":"BINAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether to use bins as the basis for the X and Y axis tick marks. \n\nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Standard axes are used, ignoring bin boundaries and midpoints set by the ENDLABELS= option.","@ToolTip2":"The ENDLABELS= option determines how the axis ticks and value labels are displayed. Some axis options for the X- and Y-axes may not apply."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the bins. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display outlined bins, filled bins, or outlined and filled bins.\n\nDefault: STANDARD \n\nTip: Use the OUTLINEATTRS= and FILLATTRS= options to control the appearance of the bins."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays filled bins with no outlines.","@ToolTip2":"Displays outlined, filled bins.","@ToolTip3":"A parenthesized list of options that must include at least one of the following: OUTLINE displays outlined bins. FILL displays filled bins."},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"ENDLABELS=","StatementOptionHelp":{"#cdata":"Specifies whether labels are drawn at the endpoints of the X bins and Y bins. \n \nDefault: FALSE. Labels are drawn at the X bin and Y bin midpoints.\n\nInteraction: For this option to take effect, this plot must be the primary plot in the parent \nOVERLAY3D layout.\n\nInteraction: This option is ignored if BINAXIS=FALSE. By default, BINAXIS=TRUE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that labels are not drawn at the endpoints of the X bins and Y bins.","@ToolTip2":"Specifies that labels are drawn at the endpoints of the X bins and Y bins."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the filled bins. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for the legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the bin outlines.\nDefault: The GraphOutlines style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"XVALUES=","StatementOptionHelp":{"#cdata":"Specifies whether the input X values represent midpoints, lower endpoints, or upper endpoints \nof the bins. \n\nDefault: MIDPOINTS"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MIDPOINTS","@Value2":"LEFTPOINTS","@Value3":"RIGHTPOINTS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the input X values represent midpoints of the bins.","@ToolTip2":"Specifies that the input X values represent lower endpoints of the bins.","@ToolTip3":"Specifies that the input X values represent upper endpoints of the bins."}},{"StatementOptionName":"YVALUES=","StatementOptionHelp":{"#cdata":"Specifies whether the input Y values represent midpoints, lower endpoints, or upper endpoints \nof the bins. \n\nDefault: MIDPOINTS"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MIDPOINTS","@Value2":"LEFTPOINTS","@Value3":"RIGHTPOINTS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the input Y values represent midpoints of the bins.","@ToolTip2":"Specifies that the input Y values represent lower endpoints of the bins.","@ToolTip3":"Specifies that the input Y values represent upper endpoints of the bins."}}]}},{"StatementName":"BLOCKPLOT","StatementHelp":{"#cdata":"Syntax: BLOCKPLOT X = column | expression\n BLOCK = column | expression ; \n \nCreates one or more strips of rectangular blocks containing text values. The width of each block \ncorresponds to specified numeric intervals."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies numeric X axis positions. When the X-axis is numeric and the specified column is numeric, \nvalues are expected to be in sorted, ascending order. If the X-axis is discrete and the specified \ncolumn is numeric, values are treated as numeric-discrete."},"StatementOptionType":"RV"},{"StatementOptionName":"BLOCK=","StatementOptionHelp":{"#cdata":"[Syntax: BLOCK=column | expression] \n \nSpecifies a value for each X position. Numeric values are converted to text strings according \nto an assigned format or BEST6."},"StatementOptionType":"RV"},{"StatementOptionName":"ALTFILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: ALTFILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of alternate fills. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphWalls style element.\n\nRequirement: FILLTYPE=ALTERNATE must set for this option to have any effect.\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style \nor the DISPLAY= option.\n\nInteraction: The FILLATTRS= option controls the fill color.\n\nTip: To make all block fill areas the same color, set the FILLATTRS= and ALTFILLATTRS= options \nto the same value."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"BLOCKINDEX=","StatementOptionHelp":{"#cdata":"[Syntax: BLOCKINDEX=positive-integer-column | expression] \n \nSpecifies indices for remapping the assignment of the color of the block fills. \nDefault: no default\n\nRequirement: FILLTYPE=MULTICOLOR must set for this option to have any effect.\n\nInteraction: All of the indexes for a specific block value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: The index values are 1-based indices. For the style definitions in \nGraphData1 - GraphDataN, if the index value is greater than N, then a modulo operation remaps \nthat index value to a number less than N to determine which style element to use.\n\nInteraction: If this option is not used, then the color values are mapped in the order of \nGraphData1 - GraphDataN."},"StatementOptionType":"V"},{"StatementOptionName":"CLASS=","StatementOptionHelp":{"#cdata":"[Syntax: CLASS=column | expression] \n \nCreates a separate block plot for each unique value of the specified column or expression. \nEach block plot is labeled externally by the class value. \n\nDefault: no default\n\nInteraction: The DISPLAY= option must include LABEL for any external labels to appear.\n\nInteraction: This option overrides the LABEL= option.\n\nTip: The font and color attributes for the external labels are specified by the LABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the block fill and outline. It does not affect block \nvalues or label. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display an outlined, a filled, or an outlined and filled block area. \nValues and a label can also be added or suppressed. \n\nDefault: STANDARD \n\nTip: Use the OUTLINEATTRS=, FILLATTRS=, ALTFILLATTRS=, and BLOCKINDEX= options to control the appearance of the blocks.\n\nUse the VALUELATTRS= and LABELATTRS= options to control the text appearance."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"(1) Displays an outlined, filled block without text values or a label when used inside an overlay-type layout (OUTLINE FILL). (2) displays an outlined, filled block with text values and a label when used as a stand-alone plot inside a LATTICE or GRIDDED layout (OUTLINE FILL VALUES LABEL).","@ToolTip2":"Displays all possible features.","@ToolTip3":"A parenthesized list of options that must include at least one of the following: OUTLINE displays an outlined, non-filled block. FILL displays a filled, non-outlined block. VALUES displays internal block values. LABEL displays external block label(s)."},"SubOptionsKeywords":"OUTLINE|FILL|VALUES|LABEL"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the block fills. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphData1 style element.\n\nRequirement: FILLTYPE=ALTERNATE must set for this option to have any effect.\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style \nor the DISPLAY= option.\n\nInteraction: The ALTFILLATTRS= option controls the alternating fill color.\n\nTip: To make all block fill areas the same color, set the FILLATTRS= and ALTFILLATTRS= options \nto the same value."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"FILLTYPE=","StatementOptionHelp":{"#cdata":"Specifies how the blocks are filled. \n\nDefault: MULTICOLOR\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style \nor the DISPLAY= option.\n\nInteraction: When this option is set to ALTERNATE, the blockplot does not support a discretelend entry."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MULTICOLOR","@Value2":"ALTERNATE"},"StatementOptionToolTips":{"@ToolTip1":"Blocks are filled with the COLOR attribute of the style elements GraphData1 - GraphDataN or the style elements indicated by the BLOCKINDEX= column.","@ToolTip2":"Blocks are filled alternating between the colors specified by the FILLATTRS= and ALTFILLATTRS= options."}},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LABEL=\"string\"] \n \nSpecifies an external label for a single block plot. \nDefault:\n\n o The variable label of the BLOCK= column. \n o The variable name of the BLOCK= column, if there is no variable label. \n\nInteraction: If the CLASS= option is specified, this option is ignored.\n\nInteraction: The DISPLAY= option must include LABEL for any external label(s) to appear.\n\nTip: The font and color attributes for the external label are specified by the LABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"LABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the external block label(s). \nDefault: The GraphLabelText style element. \n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"LABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the alignment of BLOCK label. \n\nDefault: LEFT"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LEFT","@Value2":"RIGHT","@Value3":"TOP","@Value4":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Places the label to the left of the strip of block values.","@ToolTip2":"Places the label to the right of the strip of block values.","@ToolTip3":"Places the label above the strip of block values.","@ToolTip4":"Places the label below the strip of block values."}},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the block outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphOutlines style element.\n\nInteraction: For this option to have any effect, the outlines must be enabled by the ODS style\nor the DISPLAY= option.\n\nInteraction: If labels are displayed in the TOP or BOTTOM position, they will be outlined also."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"REPEATEDVALUES=","StatementOptionHelp":{"#cdata":"Specifies whether contiguous block values that are identical create separate blocks. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"If two or more identical block values appear consecutively, only one block is created for them.","@ToolTip2":"If two or more identical block values appear consecutively, a separate block is created for each of them."}},{"StatementOptionName":"VALUEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: VALUEATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the appearance of the text values. \n\nDefault: The GraphValueText style element.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"VALUEFITPOLICY=","StatementOptionHelp":{"#cdata":"Specifies how text values are adjusted to fit within the containing block. \n\nDefault: TRUNCATE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUNCATE","@Value2":"SHRINK"},"StatementOptionToolTips":{"@ToolTip1":"Any value that does not fit is truncated. For a numeric column, an asterisk (*) is substituted for the entire value whenever truncation occurs. For a character column, the truncated portion of the text is replaced by an ellipsis (...).","@ToolTip2":"All values are reduced in font size until they all fit."}},{"StatementOptionName":"VALUEHALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of the text within the blocks. \n\nDefault: LEFT \n\nInteraction: For this option to have any effect, the DISPLAY= option must include VALUE.\n\nInteraction: When REPEATEDVALUES=TRUE and X values are numeric, only CENTER and START can be used \nfor a discrete axis, and only LEFT and START can be used for a linear or log axis. For example, \nif REPEATEDVALUES=TRUE and the axis is discrete, a setting of RIGHT for this option will be ignored \nand LEFT will be used instead."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LEFT","@Value2":"CENTER","@Value3":"RIGHT","@Value4":"START"},"StatementOptionToolTips":{"@ToolTip1":"Left-aligned within the block.","@ToolTip2":"Center-aligned within the block.","@ToolTip3":"Right-aligned within the block.","@ToolTip4":"Center-aligned at the starting value of the block."}},{"StatementOptionName":"VALUEVALIGN=","StatementOptionHelp":{"#cdata":"Specifies the vertical alignment of the text within the blocks. \n\nDefault: CENTER\n\nInteraction: For this option to have any effect, the DISPLAY= option must include VALUE.\n\nTip: If the DISPLAY= option also includes LABEL, the label has the same vertical alignment."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOP","@Value2":"CENTER","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Top-aligned within the block","@ToolTip2":"Center-aligned within the block","@ToolTip3":"Bottom-aligned within the block"}},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that data are mapped to the primary X (bottom) axis.","@ToolTip2":"Specifies that data are mapped to the secondary X2 (top) axis."}}]}},{"StatementName":"BOXPLOT","StatementHelp":{"#cdata":"Syntax: BOXPLOT Y= numeric-column | expression < / option(s)> ; \n\nBOXPLOT X= column | expression\n Y= numeric-column | expression < / option(s)> ; \n\nCreates box-and-whisker plot(s) computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the column for the X values. This column is used to create a boxplot for each unique \nX value and is optional."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the column for the Y values. This argument is required."},"StatementOptionType":"RV"},{"StatementOptionName":"BOXWIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: BOXWIDTH=number] \n \nSpecifies the width of a box as a ratio of the maximum possible width. \nDefault: .4\n\nRange: 0 (narrowest) to 1 (widest)"},"StatementOptionType":"V"},{"StatementOptionName":"CAPSHAPE=","StatementOptionHelp":{"#cdata":"Specifies the shape at the ends of the whiskers. \n\nDefault: The GraphBox:CapStyle style reference. \n\nInteraction: The cap color and the thickness are specified by the WHISKERATTRS= option. \nThe cap pattern is always solid.\n\nInteraction: The DISPLAY= option must include CAPS for cap lines to be shown."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"SERIF","@Value2":"LINE","@Value3":"BRACKET"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a short line perpendicular to the whisker.","@ToolTip2":"Specifies a line perpendicular to whisker extending the width of the box.","@ToolTip3":"Specifies a line perpendicular to the whisker extending the width of the box with short extensions at the ends drawn in the direction of the box."}},{"StatementOptionName":"CONNECT=","StatementOptionHelp":{"#cdata":"Specifies that a connect line joins a statistic from box to box. \n\nDefault: The GraphBox:Connect style reference.\n\nRequirement: The DISPLAY= option must contain the CONNECT suboption for the connect line to be displayed.\n\nInteraction: This option only applies when the X argument is used to generate multiple boxes."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MEAN","@Value2":"MEDIAN","@Value3":"Q1","@Value4":"Q3","@Value5":"MIN","@Value6":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that a connect line joins mean statistic from box to box.","@ToolTip2":"Specifies that a connect line joins median statistic from box to box.","@ToolTip3":"Specifies that a connect line joins lower quartile statistic from box to box.","@ToolTip4":"Specifies that a connect line joins upper quartile statistic from box to box.","@ToolTip5":"Specifies that a connect line joins min statistic from box to box.","@ToolTip6":"Specifies that a connect line joins max statistic from box to box."}},{"StatementOptionName":"CONNECTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CONNECTATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the lines connecting multiple boxes. \nDefault: The GraphConnectLine style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nInteraction: If there is only one box, this option is ignored."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the box outlines, box fill, whiskers, mean, median, \ncaps, connect lines, and outliers, if displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies which additional features of the box plot to display. \n\nDefault: The GraphBox:DisplayOpts style reference. If this style element does not exist, the default is STANDARD."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays this combination of features (CAPS FILL MEAN MEDIAN OUTLIERS).","@ToolTip2":"Displays all features.","@ToolTip3":"A parenthesized list of features to be displayed. The list may include any of the following: CAPS displays caps at the ends of the whiskers CONNECT displays the line connecting multiple boxes FILL displays filled boxes MEAN displays the mean symbol within the box MEDIAN displays the median line within the box NOTCHES displays notched boxes OUTLIERS displays markers for the outliers"},"SubOptionsKeywords":"OUTLINE|FILL|CONNECT|MEAN|MEDIAN|NOTCHES|OUTLIERS"},{"StatementOptionName":"EXTREME=","StatementOptionHelp":{"#cdata":"Specifies whether the whiskers can extend beyond the fences. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that whiskers be drawn from the upper edge of the box to the largest value within the upper fence, and from the lower edge of the box to the smallest value within the lower fence. This representation is sometime called a schematic box and whisker plot or Tukey box and whisker plot.","@ToolTip2":"Specifies that whiskers be drawn to the largest and smallest data values, whether these values are inside or outside the fences. The outliers and far outliers are not displayed and are not labeled. This representation is sometime called a skeletal box and whisker plot."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the boxes. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the \nDISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a numeric column that provides frequencies for each observation read. If n is the \nvalue of the numeric-column for a given observation, then that observation is used n times \nfor any statistical computation. \n\nDefault: Each observation is counted once.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation \nis not used in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"LABELFAR=","StatementOptionHelp":{"#cdata":"Specifies whether all outliers or only far outliers are labeled. \n\nDefault: FALSE \n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The labels specified by the DATALABEL= option apply to both outliers and far outliers.","@ToolTip2":"The labels specified by the DATALABEL= option only apply to far outliers."}},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"MEANATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MEANATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the appearance of the marker representing the mean within the box. \n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight.\n\nDefault: The GraphBoxMean style element.\n\nInteraction: This option is ignored if the DISPLAY= option does not display the median."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"MEDIANATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MEDIANATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the line representing the median within the box. \nDefault: The GraphBoxMedian style element.\n\nInteraction: This option is ignored if the DISPLAY= option does not display the median. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nInteraction: If there is only one box, this option is ignored."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and of the boxes. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and of the boxes.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and of the boxes."}},{"StatementOptionName":"OUTLIERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLIERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the markers representing the outliers. \n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight.\n\nDefault: The GraphOutlier style element.\n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the box outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphOutlines style element."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PERCENTILE=","StatementOptionHelp":{"#cdata":"Specifies one of five definitions used to calculate percentiles. \n\nDefault: 5 (empirical distribution function with averaging)\n\nTip: The percentile definitions and default are the same as used by PCTLDEF= option of PROC UNIVARIATE \nor the QNTLDEF= option of PROC SUMMARY."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"1","@Value2":"2","@Value3":"3","@Value4":"4","@Value5":"5"},"StatementOptionToolTips":{"@ToolTip1":"Calculates the percentiles with a weighted average at Xnp.","@ToolTip2":"Calculates the percentiles with observation numbered closest to np.","@ToolTip3":"Calculates the percentiles with an empirical distribution function.","@ToolTip4":"Calculates the percentiles with a weighted average aimed at X(n+1)p","@ToolTip5":"Calculates the percentiles with an empirical distribution function with averaging."}},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"SPREAD=","StatementOptionHelp":{"#cdata":"Specifies whether outliers with the same value are spread out to avoid overlap. For vertical boxplots \nthis means offsetting the outliers horizontally. If this option is false, outliers with the same value \nare plotted in the same position; thus, only one is visible \n\nDefault: FALSE \n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that outliers with the same value are not spread out.","@ToolTip2":"Specifies that outliers with the same value are spread out to avoid overlap."}},{"StatementOptionName":"WHISKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: WHISKERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the line properties of the whiskers and caps. \nDefault: The GraphBoxWhisker style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"BOXPLOTPARM","StatementHelp":{"#cdata":"Syntax: BOXPLOTPARM Y= numeric-column | expression\n STAT= string-column ; \n\nBOXPLOTPARM X= column | expression\n Y= numeric-column | expression\n STAT= string-column ; \n\nCreates side-by-side box-and-whisker plots specified by parameters."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column for the Y values. The Y values must be the statistical values needed for the \nbox plot. At a minimum, there must be non-missing values for the 25th and 75th percentiles."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies the column for the X values. The X values must qualify or classify the values in the \nY column. This optional argument is used to create a plot box for each classifier."},"StatementOptionType":"RV"},{"StatementOptionName":"STAT=","StatementOptionHelp":{"#cdata":"Specifies the statistic that is represented by the value in the Y column."},"StatementOptionType":"RV","StatementOptionValues":{"@Value1":"Q1","@Value2":"Q3","@Value3":"MAX","@Value4":"MIN","@Value5":"MEAN","@Value6":"MEDIAN","@Value7":"OUTLIER","@Value8":"FAROUTLIER","@Value9":"N","@Value10":"STD"},"StatementOptionToolTips":{"@ToolTip1":"1st quartile (25th percentile). The data must contain a non-missing value for this quartile.","@ToolTip2":"3rd quartile (75th percentile). The data must contain a non-missing value for this quartile.","@ToolTip3":"Maximum data value less than or equal to the upper fence.","@ToolTip4":"Minimum data value greater than or equal to the lower fence.","@ToolTip5":"Data mean.","@ToolTip6":"Data median.","@ToolTip7":"An observation outside the lower and upper fences. The fences are located at a distance 1.5 times the Interquartile Range (IQR = Q3 - Q1) above and below the box. The outliers are labeled when the DATALABEL= option is used.","@ToolTip8":"An observation outside the lower and upper far fences. The far fences are located at a distance 3 times the Interquartile Range (IQR = Q3 - Q1) above and below the box. The far outliers are labeled when the DATALABEL= option is used. Specify that LABELFAR=TRUE to label only the far outliers but not the outliers.","@ToolTip9":"Subgroup sample size. The N value is not shown in the plot but is used to calculate notch locations when the DISPLAY= option displays notches.","@ToolTip10":"Data standard deviation."}},{"StatementOptionName":"BOXWIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: BOXWIDTH=number] \n \nSpecifies the width of a box as a ratio of the maximum possible width. \nDefault: .4\n\nRange: 0 (narrowest) to 1 (widest)"},"StatementOptionType":"V"},{"StatementOptionName":"CAPSHAPE=","StatementOptionHelp":{"#cdata":"Specifies the shape at the ends of the whiskers. \n\nDefault: The GraphBox:CapStyle style reference. \n\nInteraction: The cap color and the thickness are specified by the WHISKERATTRS= option. \nThe cap pattern is always solid.\n\nInteraction: The DISPLAY= option must include CAPS for cap lines to be shown."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"SERIF","@Value2":"LINE","@Value3":"BRACKET"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a short line perpendicular to the whisker.","@ToolTip2":"Specifies a line perpendicular to whisker extending the width of the box.","@ToolTip3":"Specifies a line perpendicular to the whisker extending the width of the box with short extensions at the ends drawn in the direction of the box."}},{"StatementOptionName":"CONNECT=","StatementOptionHelp":{"#cdata":"Specifies that a connect line joins a statistic from box to box. \n\nDefault: The GraphBox:Connect style reference.\n\nRequirement: The DISPLAY= option must contain the CONNECT suboption for the connect line to be displayed.\n\nInteraction: This option only applies when the X argument is used to generate multiple boxes."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MEAN","@Value2":"MEDIAN","@Value3":"Q1","@Value4":"Q3","@Value5":"MIN","@Value6":"MAX"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that a connect line joins mean statistic from box to box.","@ToolTip2":"Specifies that a connect line joins median statistic from box to box.","@ToolTip3":"Specifies that a connect line joins lower quartile statistic from box to box.","@ToolTip4":"Specifies that a connect line joins upper quartile statistic from box to box.","@ToolTip5":"Specifies that a connect line joins min statistic from box to box.","@ToolTip6":"Specifies that a connect line joins max statistic from box to box."}},{"StatementOptionName":"CONNECTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CONNECTATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the lines connecting multiple boxes. \nDefault: The GraphConnectLine style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nInteraction: If there is only one box, this option is ignored."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies the labels of the values that are identified as outlier or faroutlier by the \nSTAT= column. Either a numeric or a character column can be used. \n\nDefault: no default\n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not \ndisplay the outliers."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the outlier labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault: The GraphDataText style element.\n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers.\n\nInteraction: If one or more label options are specified and they do not include all the font properties \n(color, family, size, weight, style), non-specified properties will be derived from the GraphDataText style element."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the box outlines, box fill, whiskers, mean, median, \ncaps, connect lines, and outliers, if displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies which additional features of the box plot to display. \n\nDefault: The GraphBox:DisplayOpts style reference. If this style element does not exist, the \ndefault is STANDARD. \n\nRestriction: The display features requested can only be displayed if the input data includes this information.\n\nInteraction: If EXTREME=TRUE, then the OUTLIERS feature is ignored"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays this combination of features (CAPS FILL MEAN MEDIAN OUTLIERS).","@ToolTip2":"Displays all features.","@ToolTip3":"A parenthesized list of features to be displayed. The list may include any of the following: CAPS displays caps at the ends of the whiskers CONNECT displays the line connecting multiple boxes FILL displays filled boxes MEAN displays the mean symbol within the box MEDIAN displays the median line within the box NOTCHES displays notched boxes OUTLIERS displays markers for the outliers"},"SubOptionsKeywords":"OUTLINE|FILL|CONNECT|MEAN|MEDIAN|NOTCHES|OUTLIERS"},{"StatementOptionName":"EXTREME=","StatementOptionHelp":{"#cdata":"Specifies whether the whiskers can extend beyond the fences. \n\nDefault: FALSE \n\nInteraction: This option overides the DATALABEL=, DATALABELATTRS=, LABELFAR=, OUTLIERATTRS=, and \nSPREAD= options.\n\nTip: Fences are locations above and below the box. The upper and lower fences are located at a \ndistance 1.5 times the Interquartile Range (IQR) ( IQR = Q3 - Q1 ). The upper and lower far fences \nare located at a distance 3 times the IQR."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that whiskers be drawn from the upper edge of the box to the largest value within the upper fence, and from the lower edge of the box to the smallest value within the lower fence. This representation is sometime called a schematic box and whisker plot or Tukey box and whisker plot.","@ToolTip2":"Specifies that whiskers be drawn to the largest and smallest data values, whether these values are inside or outside the fences. The outliers and far outliers are not displayed and are not labeled. This representation is sometime called a skeletal box and whisker plot."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the boxes. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the \nDISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"LABELFAR=","StatementOptionHelp":{"#cdata":"Specifies whether all outliers or only far outliers are labeled. \n\nDefault: FALSE \n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The labels specified by the DATALABEL= option apply to both outliers and far outliers.","@ToolTip2":"The labels specified by the DATALABEL= option only apply to far outliers."}},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"MEANATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MEANATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the appearance of the marker representing the mean within the box. \n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight.\n\nDefault: The GraphBoxMean style element.\n\nInteraction: This option is ignored if the DISPLAY= option does not display the median."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"MEDIANATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MEDIANATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the line representing the median within the box. \nDefault: The GraphBoxMedian style element.\n\nInteraction: This option is ignored if the DISPLAY= option does not display the median. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nInteraction: If there is only one box, this option is ignored."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and the boxes. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and the boxes.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and the boxes."}},{"StatementOptionName":"OUTLIERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLIERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the markers representing the outliers. \n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight.\n\nDefault: The GraphOutlier style element.\n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the appearance of the box outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphOutlines style element."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PERCENTILE=","StatementOptionHelp":{"#cdata":"Specifies one of five definitions used to calculate percentiles. \n\nDefault: 5 (empirical distribution function with averaging)\n\nTip: The percentile definitions and default are the same as used by PCTLDEF= option of PROC UNIVARIATE \nor the QNTLDEF= option of PROC SUMMARY."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"1","@Value2":"2","@Value3":"3","@Value4":"4","@Value5":"5"},"StatementOptionToolTips":{"@ToolTip1":"Calculates the percentiles with a weighted average at Xnp.","@ToolTip2":"Calculates the percentiles with observation numbered closest to np.","@ToolTip3":"Calculates the percentiles with an empirical distribution function.","@ToolTip4":"Calculates the percentiles with a weighted average aimed at X(n+1)p","@ToolTip5":"Calculates the percentiles with an empirical distribution function with averaging."}},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"SPREAD=","StatementOptionHelp":{"#cdata":"Specifies whether outliers with the same value are spread out to avoid overlap. For vertical boxplots \nthis means offsetting the outliers horizontally. If this option is false, outliers with the same value \nare plotted in the same position; thus, only one is visible \n\nDefault: FALSE \n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that outliers with the same value are not spread out.","@ToolTip2":"Specifies that outliers with the same value are spread out to avoid overlap."}},{"StatementOptionName":"WHISKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: WHISKERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the line properties of the whiskers and caps. \nDefault: The GraphBoxWhisker style element. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"CONTOURPLOTPARM","StatementHelp":{"#cdata":"Syntax: CONTOURPLOTPARM X= numeric-column | expression\n Y= numeric-column | expression\n Z= numeric-column | expression < / option(s)> ; \n\nCreates a contour plot representing a response variable evaluated over a grid of X and Y values."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the X coordinates for the grid."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the Y coordinates for the grid."},"StatementOptionType":"RV"},{"StatementOptionName":"Z=","StatementOptionHelp":{"#cdata":"[Syntax: Z=numeric-column | expression] \n \nSpecifies the contour response values."},"StatementOptionType":"RV"},{"StatementOptionName":"COLORMODEL=","StatementOptionHelp":{"#cdata":"[Syntax: COLORMODEL=style-element] \n \nSpecifies a style element that is used to determine the colors of filled or gradient contours. \nDefault: The ThreeColorRamp style element.\n\nstyle-element \nName of a style element. The style element can contain these style attributes: \n\n STARTCOLOR \n Specifies a color for the smallest data value of the Z variable. \n \n NEUTRALCOLOR \n Specifies a color for the midpoint of the range of the Z variable. \n \n ENDCOLOR \n Specifies a color for the highest data value of the Z variable. \n \nInteraction: The REVERSECOLORMODEL= option can be used to reverse the start and end colors of the ramp \nassigned to the colormodel.\n\nInteraction: The NEUTRALCOLOR attribute is not used for two-color ramps."},"StatementOptionType":"V","SubOptionsKeywords":"STARTCOLOR|NEUTRALCOLOR|ENDCOLOR"},{"StatementOptionName":"CONTOURTYPE=","StatementOptionHelp":{"#cdata":"Specifies how the contour is displayed. \n \nDefault: The GraphContour:DisplayOpts style reference. \n\nInteraction: The fill colors of the types that enable FILL or GRADIENT are controlled by the \nCOLORMODEL= option.\n\nInteraction: The line properties of the types that enable LINE or LABELEDLINE are controlled \nby the LINEATTRS= option.\n\nInteraction: The label properties of the types that enable LABELEDLINE are controlled by the \nLINELABELATTRS= and LINELABELBASELINE= options.\n\nInteraction: If a DISCRETELEGEND statement is associated with the contour, the legend will \nNOT be displayed if CONTOURTYPE= is set to FILL or GRADIENT.\n\nInteraction: If a CONTINUOUSLEGEND statement is associated with the contour, the legend will \nNOT be displayed if CONTOURTYPE is set to LINE or LABELEDLINE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LINE","@Value2":"LABELEDLINE","@Value3":"FILL","@Value4":"GRADIENT","@Value5":"LINEFILL","@Value6":"LINEGRADIENT","@Value7":"LABELEDLINEFILL","@Value8":"LABELEDLINEGRADIENT"},"StatementOptionToolTips":{"@ToolTip1":"Displays contour levels as unlabeled lines.","@ToolTip2":"Displays the area between the contour levels as filled. Each contour interval is filled with one color.","@ToolTip3":"Displays a smooth gradient of color to represent contour levels.","@ToolTip4":"Combines the LINE and FILL types. Each contour interval is filled with one color. Displays contour levels as unlabeled lines.","@ToolTip5":"Combines the LINE and GRADIENT types. Displays contour levels as unlabeled lines.","@ToolTip6":"Adds labels to the LINE type, displaying contour levels as labeled lines.","@ToolTip7":"Adds labels to the LINEFILL type. Each contour interval is filled with one color. Displays contour levels as lines with labels showing contour level values.","@ToolTip8":"Adds labels to the LINEGRADIENT type. Displays contour levels as lines with labels showing contour level values."}},{"StatementOptionName":"GRIDDED=","StatementOptionHelp":{"#cdata":"Specifies whether the grid formed by the X and Y values is complete. \n\nDefault: TRUE\n\nTip: If set to FALSE, then additional calculations are performed.\n\nTip: For information on the algorithm used to calculate the grid, see Barnes, Stanley L., \n\"Mesoscale Objective Map Analysis Using Weighted Time-Series Observations\", United States National \nOceanic and Atmospheric Administration, Environmental Research Labs, Norman, OK, Technical Memorandum \n(NOAA TM ERLNSSL-62) , March 1973."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the grid formed by the X and Y values is not complete.","@ToolTip2":"Specifies whether the grid formed by the X and Y values is complete."}},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The Z-variable label. If a label is not defined, the Z-variable name.\n\nInteraction: This option applies only to an associated DISCRETELEGEND statement."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the color and font attributes of the contour line labels. \nDefault: The GraphValueText style element.\n\nInteraction: This option is honored only if the CONTOURTYPE displays labels.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"LINELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the contour line labels. \nDefault: The GraphValueText style element.\n\nInteraction: This option is honored only if the CONTOURTYPE displays labels.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"LINELABELBASELINE=","StatementOptionHelp":{"#cdata":"Specifies the text alignment of the contour line labels. Each contour line has a precomputed label point. \n\nDefault: HORIZONTAL \n\nInteraction: This option is honored only if the CONTOURTYPE displays labels."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"HORIZONTAL","@Value2":"TANGENT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that each label is parallel to the X-axis. The label intersects its contour line and is centered at the label point.","@ToolTip2":"Specifies that each label is drawn tangent to the contour line at the label point. This reduces intersection with the contour line and causes labels to be tilted at various angles in relation to the X-axis."}},{"StatementOptionName":"LINELABELFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: LINELABELFORMAT=format] \n \nSpecifies the format to use for the contour line labels. \n\nDefault: The format associated with the Z variable or BEST6. if no format is assigned.\n\nInteraction: This option is honored only if the CONTOURTYPE displays labels."},"StatementOptionType":"V"},{"StatementOptionName":"LINELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position for the contour line labels. \n\nDefault: MIDDLE\n\nInteraction: This option is honored only if the CONTOURTYPE displays labels."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MIDDLE","@Value2":"BEGIN","@Value3":"END"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the middle as the position for the contour line labels.","@ToolTip2":"Specifies the beginning as the position for the contour line labels.","@ToolTip3":"Specifies the end as the position for the contour line labels."}},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nTip: The specified name is used primarily in legend statements to indicate the colors associated \nwith the Z values."},"StatementOptionType":"V"},{"StatementOptionName":"NHINT=","StatementOptionHelp":{"#cdata":"[Syntax: NHINT=integer] \n \nSpecifies the suggested number of contour levels for the Z variable. \nDefault: 7\n\nTip: The actual number of levels is adjusted to provide an appropriate number of levels for the data.\n\nInteraction: This option is ignored if NLEVELS= is specified."},"StatementOptionType":"V"},{"StatementOptionName":"NLEVELS=","StatementOptionHelp":{"#cdata":"[Syntax: NLEVELS=integer] \n \nSpecifies the actual number of contour levels for the Z variable. \nDefault: The number of levels is determined internally, using the NHINT= value.\n\nInteraction: This option overrides the NHINT= option.\n\nInteraction: This option is ignored if CONTOURTYPE=GRADIENT."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"REVERSECOLORMODEL=","StatementOptionHelp":{"#cdata":"Specifies whether to reverse the gradient (color ramp) defined by the COLORMODEL= option. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to reverse the gradient (color ramp) defined by the COLORMODEL= option.","@ToolTip2":"Specifies to reverse the gradient (color ramp) defined by the COLORMODEL= option."}},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"DENSITYPLOT","StatementHelp":{"#cdata":"Syntax: DENSITYPLOT numeric-column | expression > ; \n \nCreates a univariate probability density curve computed from input data"},"StatementOptions":{"#comment":[{},{}],"StatementOption":[{"StatementOptionName":"KERNEL()","StatementOptionHelp":{"#cdata":"[Syntax: KERNEL (< C= number > \n < WEIGHT= NORMAL | QUADRATIC | TRIANGULAR >\n < MAXPOINTS= number > )] \n \nSpecifies a nonparametric kernel density estimate. \n\n C= \n specifies a positive number (0 < number <= 100) that represents the standardized bandwidth . \n Default: Calculated from the data as the bandwidth that minimizes the approximate mean integrated \n square error (MISE).\n\n WEIGHT= \n specifies one of the weight functions NORMAL, QUADRATIC, or TRIANGULAR. \n Default: NORMAL\n\n MAXPOINTS= \n specifies the maximum number of points generated for the curve. \n Default: 512"},"StatementOptionType":"S","SubOptionsKeywords":"C=|WEIGHT=|MAXPOINTS=|KERNEL"},{"StatementOptionName":"NORMAL()","StatementOptionHelp":{"#cdata":"[Syntax: NORMAL ( < MU= number > < SIGMA= number > < MAXPOINTS= number > )] \n \nSpecifies a normal density estimate, with mean and standard deviation. \n\n MU= \n specifies the mean. If not specified, it is calculated from the data. \n\n SIGMA= \n specifies the standard deviation. If not specified, it is calculated from the data. \n\n MAXPOINTS= \n specifies the maximum number of points generated for the curve. \n Default: 200"},"StatementOptionType":"S","SubOptionsKeywords":"MU=|SIGMA=|MAXPOINTS=|NORMAL"},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the density curve. \n\nDefault: no default\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the density curve labels.\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABEL=curvelabel option must also be used.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the density curve label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the DENSITYPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the density curve label inside the plot area","@ToolTip2":"Places the density curve label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the density curve label relative to the curve line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the density label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELPOSITION=OUTSIDE. The density label will be positioned automatically near the end of the density curve along unused axes whenever possible (typically Y2 or X2) to avoid collision with tick values.","@ToolTip2":"Forces the density label to appear near maximum density X- values (typically, to the right).","@ToolTip3":"Forces the density label to appear near minimum density X- values (typically, to the left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces density label to appear near the beginning of the curve. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces density label to appear near the end of the curve. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the density curve. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a numeric column that provides frequencies for each observation read. If n is the \nvalue of the numeric-column for a given observation, then that observation is used n times \nfor any statistical computation. \n\nDefault: Each observation is counted once.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation \nis not used in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the density curve.\nDefault: The GraphFitLine style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis ","@ToolTip2":"Specifies a horizontal orientation for the Y axis."}},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for the tooltips that are displayed when the cursor is positioned \nover the density curve. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is \nassigned to a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIPFORMAT=(Y=6.2) \n\nRequirement: This option provides a way to control the formats of columns that appear in tootips."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for the tool tips that are displayed when the cursor is positioned \nover the density curve. \n\nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIP=(X Y) \n TIPLABEL=(Y=\"Normal Approximation\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tootips."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"DROPLINE","StatementHelp":{"#cdata":"Syntax: DROPLINE X= x-axis-value | column | expression\n Y= y-axis-value | column | expression ; \n \nCreates a horizontal or vertical drop line from a point to an axis."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=x-axis-value | column | expression] \n \nSpecifies the X coordinate of the drop line(s). \n\nRequirement: Values must agree in type with the X-axis data type. For example, you should use \nnumeric SAS date or time values (or SAS date/time constants) for a time axis.\n\nTip: By default, if a specified value is outside of the X-axis data range, then the data range \nis extended to include the value. This behavior can be changed with the CLIP= option."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=y-axis-value | column | expression] \n \nSpecifies the Y coordinate of the drop line(s). \n\nRequirement: Values must agree in type with the Y-axis data type.\n\nTip: By default, if a specified value is outside of the Y-axis data range, then the data range \nis extended to include the value. This behavior can be changed with the CLIP= option."},"StatementOptionType":"RV"},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the data for the line are considered when determining the data ranges for the axes. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The data for the line contribute to the data range for each axis. Each axis may be extended to force the display of the line.","@ToolTip2":"The data for the line are ignored when establishing axis scales. Each axis scale is determined by the other plots in the parent layout. This may result in the line not being displayed if its data range is not within the data ranges of the other plots."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the drop line. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DROPTO=","StatementOptionHelp":{"#cdata":"Specifies the axis to which the line is dropped. \n\nDefault: X"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"Y"},"StatementOptionToolTips":{"@ToolTip1":"Draws dropline(s) to an X axis. The XAXIS= option determines whether the X or X2 axis is the endpoint for the line.","@ToolTip2":"Draws dropline(s) to a Y axis. The YAXIS= option determines whether the Y or Y2 axis is the endpoint for the line."}},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LABEL=\"string\" | column] \n \nSpecifies a label for the point(s) indicated by the X= and Y= arguments. \nDefault: no default\n\nInteraction: If drawing multiple droplines using X=column or Y=column, you can assign corresponding \nlabels by using a column to define the labels.\n\nTip: The font and color attributes for the label are specified by the LABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"LABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the drop line label(s). \n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n \nDefault: The GraphValueText style element.\n\nInteraction: For this option to have any effect, the LABEL= option must also be specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the color and font attributes of the drop line. \nDDefault: The GraphReference style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"ELLIPSE","StatementHelp":{"#cdata":"Syntax: ELLIPSE X= numeric-column | expression\n Y= numeric-column | expression ; \n \nCreates a confidence ellipse computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the numeric column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the numeric column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"ALPHA=","StatementOptionHelp":{"#cdata":"[Syntax: ALPHA=positive-number] \n \nSets a significance value for the confidence level to compute for the ellipse. \nDefault: .05\n\nRange: 0 < number < 1\n\nTip: ALPHA=.05 represents a 95% confidence level."},"StatementOptionType":"V"},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the data for the ellipse are considered when determining the data ranges for the axes. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The data for the ellipse contribute to the data range for each axis. Each axis may be extended to force the display of the entire ellipse.","@ToolTip2":"The data for the ellipse are ignored when establishing axis scales. Each axis scale is determined by the other plots in the parent layout. This may result in the ellipse not being entirely displayed (clipped) if its data range is not within the data ranges of the other plots."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the ellipse fill color and outline. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display an outlined ellipse, a filled ellipse, or an outlined and filled ellipse. \n\nDefault: GraphEllipse:DisplayOpts style reference."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an outlined, unfilled ellipse.","@ToolTip2":"Displays an outlined, filled ellipse.","@ToolTip3":"A parenthesized list of features to be displayed. The list must include one of the following: OUTLINE displays an outlined ellipse FILL displays a filled ellipse "},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the ellipse. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or \nthe DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a numeric column that provides frequencies for each observation read. If n is the value \nof the FREQ variable for a given observation, then that observation is counted n times in computing \nthe ellipse. \n\nDefault: Each observation is counted once.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation is \nnot used in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies the legend label. \nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the ellipse outline. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the outlines must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the type of ellipse. \n\nDefault: MEAN"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MEAN","@Value2":"PREDICTED"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a confidence ellipse of the mean.","@ToolTip2":"Specifies a prediction ellipse for a new observation."}},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"ELLIPSEPARM","StatementHelp":{"#cdata":"Syntax: ELLIPSEPARM SEMIMAJOR= number | numeric-column | expression\n SEMIMINOR= number | numeric-column | expression\n SLOPE = number | numeric-column | expression\n XORIGIN = number | numeric-column | expression\n YORIGIN = number | numeric-column | expression ; \n\nCreates an ellipse specified by slope, axis, and origin parameters."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"SEMIMAJOR=","StatementOptionHelp":{"#cdata":"[Syntax: SEMIMAJOR=number | numeric-column | expression] \n \nSpecifies half the length of the major axis for the ellipse. \n\nRequirement: The semimajor value must be positive.\n\nTip: Values are in the units of the data. The semimajor value may be greater, smaller or equal \nto semiminor value.\n\nInteraction: If a numeric column is specified and the column contains missing or negative values, \nno ellipse is drawn."},"StatementOptionType":"RV"},{"StatementOptionName":"SEMIMINOR=","StatementOptionHelp":{"#cdata":"[Syntax: SEMIMINOR=number | numeric-column | expression] \n \nSpecifies half the length of the minor axis for the ellipse. \nRequirement: The semimajor value must be positive.\n\nTip: Values are in the units of the data. The semiminor value may be smaller, greater or equal \nto semimajor value.\n\nInteraction: If a numeric column is specified and the column contains missing or negative values, \nno ellipse is drawn."},"StatementOptionType":"RV"},{"StatementOptionName":"SLOPE=","StatementOptionHelp":{"#cdata":"[Syntax: SLOPE=number | numeric-column | expression] \n \nSpecifies the slope of the major axis for the ellipse. \nTip: Slope may be positive or negative.\n\nTip: Setting SLOPE= 0 creates a major axis parallel to the X-axis.\nSetting SLOPE=. (missing value) creates a major axis parallel to the Y-axis.\n\nTip: The slope value is in the data space and may or may not be maintained in the screen space. \nThus, setting SLOPE=1 does not always generate a 45 degree line on the screen."},"StatementOptionType":"RV"},{"StatementOptionName":"XORIGIN=","StatementOptionHelp":{"#cdata":"[Syntax: XORIGIN=number | numeric-column | expression] \n \nSpecifies the X coordinate of the center of the ellipse. \nTip: Values are in the units of the data.\n\nTip: By default, if the value specified for the XORIGIN= option is outside of the X-axis data \nrange, then the data range is extended to include the specified point. This behavior can be \nchanged with the CLIP= option."},"StatementOptionType":"RV"},{"StatementOptionName":"YORIGIN=","StatementOptionHelp":{"#cdata":"[Syntax: YORIGIN=number | numeric-column | expression] \n \nSpecifies the Y coordinate of the center of the ellipse. \nTip: Values are in the units of the data.\n\nTip: By default, if the value specified for the YORIGIN= option is outside of the Y-axis data range, \nthen the data range is extended to include the specified point. This behavior can be changed with \nthe CLIP= option."},"StatementOptionType":"RV"},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the data for the ellipse are considered when determining the data ranges for the axes. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The data for the ellipse contribute to the data range for each axis. Each axis may be extended to force the display of the entire ellipse.","@ToolTip2":"The data for the ellipse are ignored when establishing axis scales. Each axis scale is determined by the other plots in the parent layout. This may result in the ellipse not being entirely displayed (clipped) if its data range is not within the data ranges of the other plots."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the ellipse fill color and outline. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display an outlined ellipse, a filled ellipse, or an outlined and filled ellipse. \n\nDefault: GraphEllipse:DisplayOpts style reference."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an outlined, unfilled ellipse.","@ToolTip2":"Displays an outlined, filled ellipse.","@ToolTip3":"A parenthesized list of features to be displayed. The list must include one of the following: OUTLINE displays an outlined ellipse FILL displays a filled ellipse"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the ellipse. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the GraphData1 - GraphDataN style elements. \n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or \nthe DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate ellipse for each unique group value of the specified column. \nDefault:\n o If DISPLAY=(OUTLINE), each distinct group value may be represented in the graph by a different \n combination of outline color and line pattern. Line color and pattern vary according to the \n ContrastColor and LineStyle attributes of the GraphData1 - GraphDataN style elements. Line \n thickness (for grouped and un-grouped data) is controlled by the OUTLINEATTRS= option. \n o If DISPLAY=(FILL), each distinct group value may be represented in the graph by a different \n fill color defined by the GraphData1:Color - GraphDataN:Color style references. \n o If DISPLAY=(FILL OUTLINE), each distinct group value may be represented in the graph by \n a different fill color, outline color, and outline pattern. \n\nTip: The representations that are used to identify the groups can be overridden individually. \nFor example, each distinct group value may be represented by a different line pattern for the \nellipses, but the PATTERN= suboption of the OUTLINEATTRS= option could be used to assign the \nsame line pattern to all ellipse outlines, letting outline color distinguish group values.\n\nRestriction: This option can only be used when a numeric column is specified for the SLOPE=, \nSEMIMAJOR=, and SEMIMINOR= arguments."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) and fill attributes to one \nof the GraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to have any effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the \nresults are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number \nless than N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies the legend label. \nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the ellipse outline. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\no For non-grouped data, the GraphDataDefault style element. \no For grouped data, the GraphData1 - GraphDataN style elements."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nRestriction: Another plot that establishes a data range for the designed axis must be included.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nRestriction: Another plot that establishes a data range for the designed axis must be included.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"FRINGEPLOT","StatementHelp":{"#cdata":"Syntax: FRINGEPLOT numeric-column | expression ; \n \nCreates a fringe plot on the X axis of an X-Y plot."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the fringe. \nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"FRINGEHEIGHT=","StatementOptionHelp":{"#cdata":"[Syntax: FRINGEHEIGHT=dimension] \n \nSpecifies the height of the fringe lines. \n\nDefault: 10 px"},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend.\n\nDefault: The X-variable label. If a label is not defined, the X-variable name."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the fringe lines for the data points. \nDefault: The GraphDataDefault style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\nrole-name-list \na blank-separated list of rolename = column pairs. \nFor example, ROLENAME= ( TIP1=PCT ) assigns the column PCT to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined \nroles X and GROUP (reserved for future use).\n\nTip: This option provides a way to add to the data columns that appear in tooltips specified \nby the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a fringe line. If this \nption is used, it replaces all the information displayed by default. Roles for columns that do \nnot contribute to the fringe plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip \ninformation: X and GROUP (reserved for future use).\n\nrole-list \nan ordered, blank-separated list of unique FRINGEPLOT and user-defined roles. The FRINGEPLOT role is X. \nUser-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X and Y, as well \nas the column PCT, which is not assigned to any pre-defined FringePlot role. The PCT column \nshould appear first in the tooltip.\n\n ROLENAME=(TIP1=PCT) \n TIP=(X TIP1) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= \nand TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is \nassigned to a numeric column.\n\nrole-format-list \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=PCT) \n TIP=(X TIP1) \n TIPFORMAT=( TIP1= PERCENT7.2 ) \n\nRequirement: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-format-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\nrole-label-list \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=PCT) \n TIP=(X TIP1) \n TIPLABEL=( TIP1=\"Percent\" )\n \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}}]}},{"StatementName":"HISTOGRAM","StatementHelp":{"#cdata":"Syntax: HISTOGRAM numeric-column | expression ; \n \nCreates a univariate histogram computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BINAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether to use bins as the basis for the axis tick marks. \n\nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The ENDLABELS= option is ignored. A standard axis is used, ignoring bin boundaries and midpoints.","@ToolTip2":"The ENDLABELS= option determines how the axis ticks and value labels are displayed. The axis ticks are in predetermined locations and cannot be changed with axis suboptions such TICKVALUELIST= and TICKVALUESEQUENCE=."}},{"StatementOptionName":"BINSTART=","StatementOptionHelp":{"#cdata":"[Syntax: BINSTART=number] \n \nSpecifies the X coordinate of the first bin. Use this option in conjunction with the BINWIDTH= \nor NBINS= options to specify bins. If neither BINWIDTH= nor the NBINS= option is specified, the \nsystem determines the number of bins. If the BINSTART value results in excluding the entire range \nof data, it is ignored and the default BINSTART value is used. \n\nDefault: Determined by the system."},"StatementOptionType":"V"},{"StatementOptionName":"BINVALUES=","StatementOptionHelp":{"#cdata":"Specifies whether the X values represent lower endpoints, midpoints, or upper endpoints of the bins. \n\nDefault: MIDPOINTS"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MIDPOINTS","@Value2":"LEFTPOINTS","@Value3":"RIGHTPOINTS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the X values represent midpoints of the bins.","@ToolTip2":"Specifies that the X values represent lower endpoints of the bins.","@ToolTip3":"Specifies that the X values represent upper endpoints of the bins."}},{"StatementOptionName":"BINWIDTH=","StatementOptionHelp":{"#cdata":"[Syntax: BINWIDTH=number] \n \nSpecifies the bin width. The system determines the number of bins. The bins always span the \nrange of the data. \n\nDefault: Determined by the system.\n\nInteraction: This option is ignored if the NBINS= option is also specified."},"StatementOptionType":"V"},{"StatementOptionName":"BOUNDARY=","StatementOptionHelp":{"#cdata":"Specifies how a boundary is counted when it lies on the endpoint of a bin. If this option is set to \nUPPER, then the value is counted as one of the values in the upper bin (the bin to the right); \notherwise, it is counted in the lower bin. \n\nDefault: UPPER"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"UPPER","@Value2":"LOWER"},"StatementOptionToolTips":{"@ToolTip1":"A boundary is counted as one of the values in the upper bin (the bin to the right).","@ToolTip2":"A boundary is counted as one of the values in the lower bin (the bin to the left)."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the bars (outline and fill). \nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display outlined bars, filled bars, or outlined and filled bars. \n\nDefault: The GraphHistogram:DisplayOpts style reference.\n\nTip: Use the OUTLINEATTRS= and FILLATTRS= options to control the appearance of the bars."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays outlined, filled bars.","@ToolTip2":"Displays outlined, filled bars.","@ToolTip3":"A parenthesized list of comma-separated options. Any of the options from the OUTLINEATTRS= and FILLATTRS= options can be used. The specified list must include one of the following: OUTLINE displays outlined bars FILL displays filled bars"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"ENDLABELS=","StatementOptionHelp":{"#cdata":"Specifies whether the axis ticks and value labels are drawn at the bin endpoints or bin midpoints. \n\nDefault: FALSE\n\nInteraction: If this option is set to FALSE, then the axis ticks and value labels are drawn at the \nbin midpoints, whether the BINVALUES= option identifies the X data as endpoint values or midpoint values.\n\nInteraction: If BINAXIS=FALSE or this HISTOGRAM is not the primary plot, then this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the axis ticks and value labels are drawn at the bin midpoints.","@ToolTip2":"Specifies that the axis ticks and value labels are drawn at the bin endpoints."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the bars. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element. \n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the DISPLAY= option"},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a column that indicates a frequency count for each observation of the input data object. \nIf n is the value of the FREQ variable for a given observation, then that observation is plotted n times. \n\nDefault: Each observation has a frequency count of 1.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation is not \nused in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for the legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"NBINS=","StatementOptionHelp":{"#cdata":"[Syntax: NBINS=integer] \n \nSpecifies the number of bins. The system determines the BINWIDTH= value. The bins always \nspan the range of the data. \n\nDefault: Determined by the system."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and the bars. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and the bars.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and the bars."}},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the line properties of the bar outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the outlines must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot be used for determining default axis features."}},{"StatementOptionName":"SCALE=","StatementOptionHelp":{"#cdata":"Specifies whether the Y axis will display the percentages between 0 and 100, or the frequency counts, \nor the proportions between 0 and 1. \n\nDefault: PERCENT"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"PERCENT","@Value2":"COUNT","@Value3":"PROPORTION"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the Y axis will display the percentages between 0 and 100.","@ToolTip2":"Specifies that the Y axis will display the the frequency counts.","@ToolTip3":"Specifies that the Y axis will display the proportions between 0 and 1."}},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column. The X role represents the binned value. The Y role represents the computed amount\nof X in the units specified by the SCALE= option.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n TIPFORMAT=( Y=PERCENT7.2) \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role. The X role \nrepresents the binned value. The Y role represents the computed amount of X in the units \nspecified by the SCALE= option.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n TIPLABEL=( Y=\"Percent\") \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"HISTOGRAMPARM","StatementHelp":{"#cdata":"Syntax: HISTOGRAMPARM X = numeric-column | expression\n Y = non-negative-numeric-column | expression ; \n \nCreates a univariate histogram for specified values of bin midpoints and bin frequencies."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the column for the midpoint values. \nRequirement: The X values must be uniformly spaced."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=non-negative-numeric-column | expression] \n \nSpecifies the column for the frequency values. These values can be frequency counts, percentages, \nor proportions between 0 and 1. \n\nRequirement: The Y values cannot be negative."},"StatementOptionType":"RV"},{"StatementOptionName":"BINAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether to use bins as the basis for the axis tick marks. \n\nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The ENDLABELS= option is ignored. A standard axis is used, ignoring bin boundaries and midpoints.","@ToolTip2":"The ENDLABELS= option determines how the axis ticks and value labels are displayed. The axis ticks are in predetermined locations and cannot be changed with axis suboptions such TICKVALUELIST= and TICKVALUESEQUENCE=."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the bars (outline and fill). \nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display outlined bars, filled bars, or outlined and filled bars. \n\nDefault: The GraphHistogram:DisplayOpts style reference.\n\nTip: Use the OUTLINEATTRS= and FILLATTRS= options to control the appearance of the bars."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays outlined, filled bars.","@ToolTip2":"Displays outlined, filled bars.","@ToolTip3":"A parenthesized list of comma-separated options. Any of the options from the OUTLINEATTRS= and FILLATTRS= options can be used. The specified list must include one of the following: OUTLINE displays outlined bars FILL displays filled bars"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"ENDLABELS=","StatementOptionHelp":{"#cdata":"Specifies whether the axis ticks and value labels are drawn at the bin endpoints or bin midpoints. \n\nDefault: FALSE\n\nInteraction: If this option is set to FALSE, then the axis ticks and value labels are drawn at the \nbin midpoints, whether the BINVALUES= option identifies the X data as endpoint values or midpoint values.\n\nInteraction: If BINAXIS=FALSE or this HISTOGRAM is not the primary plot, then this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the axis ticks and value labels are drawn at the bin midpoints.","@ToolTip2":"Specifies that the axis ticks and value labels are drawn at the bin endpoints."}},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the appearance of the interior fill area of the bars. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault style element. \n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the DISPLAY= option"},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis and the bars. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the Y axis and the bars.","@ToolTip2":"Specifies a horizontal orientation for the Y axis and the bars."}},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the line properties of the bar outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault: The GraphDataDefault style element.\n\nInteraction: For this option to have any effect, the outlines must be enabled by the ODS style \nor the DISPLAY= option."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of role-name = column pairs. \nFor example, ROLENAME= ( TIP1=PCT ) assigns the column PCT to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X and Y.\n\nTip: This option provides a way to add to the data columns that appear in tooltips specified by \nthe TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a histogram bin. If this \noption is used, it replaces all the information displayed by default. Roles for columns that do \nnot contribute to the histogram may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: X and Y.\n\n(role-list) \nan ordered, blank-separated list of unique HISTOGRAMPARM and user-defined roles. HISTOGRAMPARM roles \ninclude X and Y. User-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X and Y, as well as \nthe column PCT which is not assigned to any pre-defined HISTOGRAMPARM role. The PCT column must \nfirst be assigned a role.:\n \n ROLENAME=(TIP1=PCT) \n TIP= (X Y TIP1) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= and \nTIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned to a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=PCT) \n TIP=(X Y TIP1) \n TIPFORMAT=( TIP1=PERCENT7.2) \n\nRequirement: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n TROLENAME=(TIP1=PCT) \n TIP=(X Y TIP1) \n TIPLABEL=( TIP1=\"Percent\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"XVALUES=","StatementOptionHelp":{"#cdata":"Specifies whether the input X values represent midpoints, lower endpoints, or upper endpoints \nof the bins. \n\nDefault: MIDPOINTS"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"MIDPOINTS","@Value2":"LEFTPOINTS","@Value3":"RIGHTPOINTS"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the X values represent midpoints of the bins.","@ToolTip2":"Specifies that the X values represent lower endpoints of the bins.","@ToolTip3":"Specifies that the X values represent upper endpoints of the bins."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"LINECHART","StatementHelp":{"#cdata":"Syntax: LINECHART CATEGORY=column | expression ; \n\nLINECHART CATEGORY=column | expression \nRESPONSE=numeric-column | expression ; \n\nCreates a line chart that is computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CATEGORY=","StatementOptionHelp":{"#cdata":"Syntax: CATEGORY=column | expression \n\nSpecifies the column or expression for the category values. Duplicated category values are summarized \ninto a unique value. All values are treated as discrete."},"StatementOptionType":"RV"},{"StatementOptionName":"BASELINEINTERCEPT=","StatementOptionHelp":{"#cdata":"Syntax: BASELINEINTERCEPT=number | AUTO | AXISMIN | AXISMINEXTEND | AXISMAX | AXISMAXEXTEND \n\nSpecifies the Y-intercept for the baseline. \n\nDefault: AUTO \nInteractions: When GROUPDISPLAY= STACK is in effect, this option is ignored, and the plot is drawn as if BASELINEINTERCEPT=0. \nWhen DISPLAY= includes FILL, the fill extends to the baseline that is specified by the BASELINEINTERCEPT= option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"AUTO","@Value3":"AXISMIN","@Value4":"AXISMINEXTEND","@Value5":"AXISMAX","@Value6":"AXISMAXEXTEND"},"StatementOptionToolTips":{"@ToolTip1":"Specifies the Y coordinate of the baseline. This value is included in the data range that is reported by the line chart. ","@ToolTip2":"Bases the intercept on the response axis range in the following ways: \u2022 If the response axis range has both positive and negative values or contains 0, then the intercept is 0. \u2022 If the response axis range contains all positive values, then AUTO is interpreted as AXISMINEXTEND. \u2022 If the response axis range contains only negative values, then AUTO is interpreted as AXISMAXEXTEND.","@ToolTip3":"Places the baseline at the minimum value of the axis range. ","@ToolTip4":"Places the baseline at the start of the minimum offset in the wall. This location corresponds to the bottom edge of the wall when there is no inner margin plot and the axis is not reversed. If there is an inner margin plot at the bottom, then the baseline is placed at the boundary of the inner margin and the minimum offset. ","@ToolTip5":"Places the baseline at the maximum value of the axis range. ","@ToolTip6":"Places the baseline at the start of the maximum offset in the wall. This location corresponds to the top edge of the wall when there is no inner margin plot, and the axis is not reversed. If there is an inner margin plot at the top, then the baseline is placed at the boundary of the inner margin and the maximum offset. "}},{"StatementOptionName":"BREAK=","StatementOptionHelp":{"#cdata":"Breaks the line at missing values of the RESPONSE variable. \n\nDefault: FALSE \nNote: If BREAK=FALSE, then missing values are skipped and a continuous line is drawn."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to break the line at missing values of the RESPONSE variable.","@ToolTip2":"Missing values are skipped and a continuous line is drawn."}},{"StatementOptionName":"DATASKIN=","StatementOptionHelp":{"#cdata":"Syntax: DATASKIN= NONE | CRISP | GLOSS | MATTE | PRESSED | SHEEN \n \nEnhances the visual appearance of the lines and markers. \n\nDefault: The DATASKIN= option value that is specified in the BEGINGRAPH statement. If not specified, then the \n GraphSkins:DataSkin style element value is used. \n\nRestriction: Starting with the first maintenance release of SAS 9.4, the maximum number of skinned graphical \nelements is limited to 200 per plot in an overlay or prototype layout. When this limit is exceeded for a plot, \nthe specified data skin is not applied to that plot. In that case, use the DATASKINMAX= option in your ODS GRAPHICS \nstatement to increase the maximum limit. \n\nInteractions: This option overrides the BEGINGRAPH statement DATASKIN= option. The skin appearance is based \non the color that is in effect for the lines and markers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NONE","@Value2":"CRISP","@Value3":"GLOSS","@Value4":"MATTE","@Value5":"PRESSED","@Value6":"SHEEN"},"StatementOptionToolTips":{"@ToolTip1":"Specifies no data skin.","@ToolTip2":"Specifies a crisp data skin.","@ToolTip3":"Specifies a glossy data skin.","@ToolTip4":"Specifies a matte data skin.","@ToolTip5":"Specifies a pressed data skin.","@ToolTip6":"Specifies a sheen data skin."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"Syntax: DATATRANSPARENCY=number\n\nSpecifies the degree of the transparency of the line, markers, and vertex labels, if displayed. \n\nDefault: 0 \n\nRange: 0\u20131, where 0 is opaque and 1 is entirely transparent \n\nTip: The FILLATTRS= option can be used to set transparency for just the fills. You can combine \nthis option with FILLATTRS= to set one transparency for the lines but a different transparency \nfor the fills. For example:datatransparency=0.2 fillattrs=(transparency=0.6)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies which graphical features to display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a line with no markers and no fill under the line to the baseline.","@ToolTip2":"Displays a line with markers and the fill under the line to the baseline.","@ToolTip3":"A space-separated list of one or more of the following options enclosed in parentheses: FILL displays a filled area between the line and the baseline. Interaction When GROUPDISPLAY=STACK, DISPLAY=FILL fills between adjacent group lines except for the first group, which fills to the baseline. LINE displays line segments that join the vertices. MARKERS displays markers at each vertex."},"SubOptionsKeywords":"FILL|LINE|MARKERS"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | (fill-options)] \n \nSpecifies the appearance of the filled area.\n\nDefault: For non-grouped data, the COLOR attribute of GraphDataDefault style element. \nFor grouped data, the COLOR attribute of GraphData1\u2013GraphDataN style elements is used. \n \nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the DISPLAY= option. \n\nNote: When style-element is specified, only the style element\u2019s COLOR attribute is used. \nTip: The DATATRANSPARENCY= option sets the transparency for the fills and the lines. You can combine \nthis option with DATATRANSPARENCY= to set one transparency for the lines but a different transparency \nfor the fills. For example: datatransparency=0.2 fillattrs=(transparency=0.6)"},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"FILLEDOUTLINEDMARKERS=","StatementOptionHelp":{"#cdata":"Syntax: FILLEDOUTLINEDMARKERS=TRUE | FALSE\n\nSpecifies whether markers are drawn with both fill and an outline. \n\nDefault: FALSE \n\nTip: To specify the marker fill and outline colors for a non-grouped plot, set this option to TRUE, and then \nuse the MARKERFILLATTRS= and MARKEROUTLINEATTRS= options to specify the colors."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Draws filled markers (marker symbols with the suffix FILLED) using both fill and an outline. When this option is TRUE, the fill color and outline color for filled markers are determined in the following ways: \u2022 If the GROUP= option is specified, then by default, the fill color is derived from the GraphData1\u2013GraphDataN style elements Color attribute, and the marker outlined color is derived from the GraphData1\u2013GraphDataN style elements ContrastColor attribute. \u2022 If the GROUP= option is not specified, then by default, the fill color is derived from the GraphDataDefault style elements Color attribute, and the marker outlined color is derived from the GraphOutline style elements ContrastColor attribute.","@ToolTip2":"Draws the markers using fill or an outline, but not both. "}},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a numeric column that provides frequencies for each observation that is read.\n\nDefault: All observations have a frequency count of 1. \n\nRestriction: If the value of the numeric-column is missing or is less than 1, then the observation is not used \nin the analysis. If the value is not an integer, then only the integer portion is used. \n\nNote: If n is the value of the numeric column for a given observation, then that observation is used n times \nfor the purposes of any statistical computation."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"Syntax: GROUP=column | discrete-attr-var | expression \n\nCreates a separate line for each unique group value of the specified column. \n\ndiscrete-attr-var\n specifies a discrete attribute map variable that is defined in a DISCRETEATTRVAR statement.\n\n Restriction: A discrete attribute map variable specification must be a direct reference to the attribute map variable. It cannot be set by a dynamic variable. \n\nDefault: Each distinct group value is represented in the plot by a different combination of color, \nline pattern, and marker symbol. Lines and markers vary according to the ContrastColor, LineStyle, \nand MarkerSymbol attributes of the GraphData1\u2013GraphDataN and GraphMissing style elements. \n\nTip: The representations that are used to identify the groups can be overridden individually. \nFor example, each distinct group value is represented by a different line pattern for the lines, \nbut you can use the PATTERN= suboption of the LINEATTRS= option to assign the same line pattern \nto all lines."},"StatementOptionType":"V"},{"StatementOptionName":"GROUPDISPLAY=","StatementOptionHelp":{"#cdata":"Syntax: GROUPDISPLAY= OVERLAY | STACK \n \nSpecifies how to display grouped lines. \n\nDefault: OVERLAY\n\nRestriction: When STACK is in effect, if any response value is negative or if any crossing of the group \nvalue with the category is absent or is a missing value, then the chart is not drawn and a warning message \nis written to the SAS log. \n\nInteraction: When STACK is in effect, the BASELINEINTERCEPT= option is treated as if it is set to zero. \n\nTip: When the response axis is linear, STAT=MEAN or STAT=PCT, and GROUPDISPLAY=STACK, the axis tick values \nmight be displayed as integer values. When the response axis is linear, STAT=MEAN or STAT=PCT, and \nGROUPDISPLAY=OVERLAY, the axis tick values might be displayed as decimal values. To keep the integer \naxis values for both cases, you can specify the INTEGER=TRUE option for the response axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OVERLAY","@Value2":"STACK"},"StatementOptionToolTips":{"@ToolTip1":"Displays group values overlaid on top of each other. ","@ToolTip2":"Displays group values as stacked lines. "}},{"StatementOptionName":"GROUPORDER=","StatementOptionHelp":{"#cdata":"Syntax: GROUPORDER=DATA | REVERSEDATA | ASCENDING | DESCENDING\n\nSpecifies the ordering of the groups within a category.\n\nDefault: DATA \n\nInteractions: This option is ignored if the GROUP= option is not also specified. \nBy default, the groups in the legend are shown in the order that is specified in GROUPORDER. \n \nNotes: Attributes such as color, symbol, and pattern are assigned to each group in the DATA order by \ndefault, regardless of the GROUPORDER= option setting. \n\nThe ASCENDING and DESCENDING settings linguistically sort the group values within each category (or X value) \nfor display position purposes only. For numeric data, the order is based on the unformatted values. For \ncharacter data, the order is based on the formatted values. The data order of the observations and the \nvisual attributes that are assigned to the group values remain unchanged."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DATA","@Value2":"REVERSEDATA","@Value3":"ASCENDING","@Value4":"DESCENDING"},"StatementOptionToolTips":{"@ToolTip1":"Orders the groups within a category in the group-column data order. ","@ToolTip2":"Orders the groups within a category in the reverse group-column data order. Note: This feature applies to the second maintenance release of SAS 9.4 and to later releases. Tip: This option is useful when you want to reverse the category axis.","@ToolTip3":"Orders the groups within a category in ascending order. ","@ToolTip4":"Orders the groups within a category in descending order. "}},{"StatementOptionName":"INCLUDEMISSINGGROUP=","StatementOptionHelp":{"#cdata":"Syntax: INCLUDEMISSINGGROUP=TRUE | FALSE\n\nSpecifies whether missing values of the group variable are included in the plot.\n\nDefault: TRUE \n\nInteraction: For this option to take effect, the GROUP= option must also be specified. \n\nTip: The attributes of the missing group value are determined by the GraphMissing style element \nunless a discrete attribute map is in effect, the INDEX= option is used, the MISSING= system option \nchanges the default missing character, or a user-defined format is applied to the group value. \nIn those cases, the attributes of the missing group value are determined by a GraphData1\u2013GraphDataN \nstyle element instead of by the the GraphMissing style element."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that missing values of the group variable are included in the plot.","@ToolTip2":"Specifies that missing values of the group variable are not included in the plot."}},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=integer-column | expression \n\nSpecifies indices for mapping line attributes such as color and pattern to one of the GraphData1\u2013GranphDataN style elements.\n\nRestriction: If the value of the integer column is missing or is less than 1, then the entire column \nis invalidated and this option is ignored. If the value is not an integer, then only the integer \nportion is used. \n\nInteractions: This option is ignored unless the GROUP= option is specified. \nThe index values are 1-based indices. For the style attributes in GraphData1\u2013GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to \na number less than N in order to determine which style to use. \n\nIf the INDEX= option is not used, then the group values are mapped in the order of the data. \nAll of the indexes for a specific group value must be the same. Otherwise, the results are unpredictable. \n\nTip: Indexing can be used to collapse the number of groups that are represented in a graph."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label to be used in a discrete legend for this plot.\n\nDefault: If the RESPONSE= option is specified, then the response variable label is used. Otherwise, \nthe CATEGORY= variable label is used. If a label is not assigned to the response variable or category \nvariable, then the variable name is used. \n\nRestriction: This option applies only to an associated DISCRETELEGEND statement. \n\nInteraction: If the GROUP= option is specified, then this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | (line-options) \n\nSpecifies the appearance of the line.\n\nDefault For non-grouped data, the GraphDataDefault style element. \nFor grouped data, the LineThickness attributes of the GraphDataDefault style element, and the ContrastColor \nand LineStyle attributes of the GraphData1\u2013GraphDataN style elements. \n\nNote: When style-element is specified, only the style element\u2019s CONTRASTCOLOR, LINESTYLE, and LINETHICKNESS \nattributes are used. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options) \n\nSpecifies the attributes of the data markers. \n\nDefault For non-grouped data, GraphDataDefault style element. For grouped data, the MarkerSymbol \nand ContrastColor attributes of the GraphData1\u2013GraphDataN style elements, and the GraphDataDefault:MarkerSize \nstyle reference. \n\nInteractions: If FILLEDOUTLINEDMARKERS=TRUE, then this option\u2019s COLOR= suboption is ignored. In that case, \nto specify the marker fill color, use the MARKERFILLATTRS= option instead. \nThis option\u2019s COLOR= suboption overrides the default behavior for grouped data. When the COLOR= suboption \nis specified in that case, all markers have the same color, and the marker symbol alone distinguishes the markers. \n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"MARKERFILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERFILLATTRS=style-element | (fill-options) \n\nSpecifies the appearance of the filled markers.\n\nDefault: For non-grouped data, the COLOR attribute of the GraphDataDefault style element \nFor grouped data, the COLOR attribute of a GraphData1\u2013GraphDataN style element \n\nRestriction: The TRANSPARENCY= fill option is ignored. Use the MARKERATTRS= option to set the marker transparency. \nInteraction: This option is in effect only when FILLEDOUTLINEDMARKERS=TRUE and the DISPLAY= option enables fill display. \nNote: When style-element is specified, only the style element\u2019s COLOR attribute is used."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"MARKEROUTLINEATTRS=","StatementOptionHelp":{"#cdata":"Syntax: MARKEROUTLINEATTRS=style-element | (line-options) \n\nSpecifies the appearance of the marker outlines.\n\nDefault: For non-grouped data, the GraphOutlines style element. \nFor grouped data, the LineThickness attritube of the GraphOutlines style element and the ContrastColor \nattribute of a GraphData1\u2013GraphDataN style element. \n\nRestriction: The line style of the marker outline is always solid. \nInteraction: This option is ignored when a data skin is applied by the current style or by the DATASKIN= option. \nIn the latter case, the outline is set by the data skin. \n\nNote: When style-element is specified, only the style element\u2019s CONTRASTCOLOR and LINETHICKNESS attributes are used. \n\nline-options can be one or more of the following attributes.\nCOLOR= color\n specifies the color of the line. You can specify colors using the same color schemes that are \n supported by SAS/GRAPH software. \nPATTERN= line-pattern\n specifies the line pattern for the line. Line patterns can be specified as a pattern name \n or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\nTHICKNESS= n \n specifies the thickness of the line. You can also specify the unit of measurement. The default \n unit is pixels."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"Syntax: NAME=\"string\" \n\nAssigns a name to this plot statement for reference in other template statements. This option \nis used mostly in the CONTINUOUSLEGEND statement in order to coordinate the use of colors and \nline patterns between the plot and the legend.\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name within the template. \n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used."},"StatementOptionType":"V"},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the Y axis. \n\nDefault: VERTICAL"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation of the Y axis.","@ToolTip2":"Specifies a horizontal orientation of the Y axis."}},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default axis \nfeatures. This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis.\n\nDefault: FALSE \n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block. \nNote: In an OVERLAY layout, only one plot in an overlay can be the primary plot on a per-axis basis. \nWhen no plot is designated as the primary plot, the first plot that can be a primary plot is considered \nthe primary plot. If multiple plots specify PRIMARY=TRUE for the same axis, then the last such plot \nencountered is considered the primary plot."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"Syntax: ROLENAME=(role-name-list) \n\nSpecifies user-defined roles that can be used to display information in the data tips. This option \nprovides a way to add to the data columns that appear in data tips that are specified by the TIP= option. \n \n(role-name-list) \n a space-separated list of role-name = column pairs. \n\n Example The following example assigns the column Obs to the user-defined role TIP:ROLENAME=(TIP1=OBS)\n \nDefault: No user-defined roles \nRequirement: The role names that you choose must be unique and different from the predefined roles CATEGORY, \nRESPONSE, DATALABEL, and GROUP."},"StatementOptionType":"RV"},{"StatementOptionName":"SMOOTHCONNECT=","StatementOptionHelp":{"#cdata":"Syntax: SMOOTHCONNECT=TRUE | FALSE\n\nSpecifies that a smoothed line passes through all vertices.\n\nDefault: FALSE. Straight line segments are used if the vertices are to be connected. \n\nInteraction: This option is ignored when GROUPDISPLAY=STACK."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that a smoothed line passes through all vertices.","@ToolTip2":"Specifies that straight line segments are used if the vertices are to be connected."}},{"StatementOptionName":"STAT=","StatementOptionHelp":{"#cdata":"Specifies the statistic to be computed for the Y-axis. \n\nDefault: SUM for line charts that specify the RESPONSE= argument. \n\nDefault: FREQ for line charts that do not specify the RESPONSE= argument."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FREQ","@Value2":"PCT","@Value3":"SUM","@Value4":"MEAN","@Value5":"PROPORTION"},"StatementOptionToolTips":{"@ToolTip1":"[For line charts with no RESPONSE= column]--Frequency count","@ToolTip2":"[For line charts with no RESPONSE= column]--Percentages between 0 and 100 inclusive.","@ToolTip3":"[For line charts with a RESPONSE= column]--Sum","@ToolTip4":"[For line charts with a RESPONSE= column]--Mean","@ToolTip5":"[For line charts with no RESPONSE= column]--Proportions between 0 and 1 inclusive"}},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"Syntax: TIP=(role-list) | NONE \n\nSpecifies the information to display when the cursor is positioned over a line. If this option is used, \nthen all of the information that is displayed is replaced by default. You can specify roles for columns \nthat do not contribute to the line chart along with roles that do. \n \n(role-list) \nan ordered, space-separated list of unique LINECHART and user-defined roles. LINECHART roles include \nCATEGORY, RESPONSE, DATALABEL, and GROUP. User-defined roles are defined with the ROLENAME= option.\n\nNONE\n suppresses data tips and URLs (if requested) from the plot. \n\nDefault: The columns assigned to the following roles are automatically included in the data tip information: \nCATEGORY, RESPONSE, and GROUP. \n\nRestriction: Data tips are available only for graphs that are written to the ODS HTML destination. \n\nRequirement: To generate data tips, include an ODS GRAPHICS ON statement that specifies the IMAGEMAP option. \nInteraction: This option is ignored when the plot statement is in an OVERLAY or PROTOTYPE layout and the \nINCLUDERANGES= option is specified in the LINEAROPTS= or TIMEOPTS= option for either axis. \n\nNote: The RESPONSE role represents the computed values for the CATEGORY role (and RESPONSE= role), based on the STAT= option. \nTip: The labels and formats for the TIP roles can be controlled with the TIPLABEL= and TIPFORMAT= options. \nExample: To display data tips for the columns assigned to the roles X and Y as well as the user-defined role TIP1:\n\n ROLENAME=(TIP1=OBS"},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. This option provides a way to control the formats of columns \nthat appear in data tips.\n \n(role-format-list) \n a space-separated list of role-name = format pairs. \n\n Example: ROLENAME=(TIP1=SALARY)\n TIP=(TIP1)\n TIPFORMAT=(TIP1=DOLLAR12.)\n \nDefault: The column format of the column assigned to the role or BEST6 if no format is assigned to a numeric column. \n\nRestriction: Only the roles that appear in the TIP= option are used. \n\nRequirement: A column must be assigned to each of the specified roles. (See the ROLENAME= option.)"},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. This option provides a way to control the labels of columns \nthat appear in data tips. \n \nrole-label-list \na space-separated list of rolename =\"string\" pairs. \n\nExample: ROLENAME=(TIP1=PCT)\n TIP=(TIP1)\n TIPLABEL=(TIP1=\"Percent\")\n \nDefault: The column label or column name of the column assigned to the role. \nRestriction: Only the roles that appear in the TIP= option are used. \nRequirement: A column must be assigned to each of the specified roles."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=string-column \n\nSpecifies an HTML page to display when a line segment, marker, or fill area is selected. \n\nstring-column\n specifies a column that contains a valid HTML page reference (HREF) for each line that is to have an active link. \n\nExample http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate selectable line segments, markers, and fill areas, you must include an ODS GRAPHICS ON \nstatement that specifies the IMAGEMAP option, and you must write the output to the ODS HTML destination. \n\nInteractions: This option has no effect when TIP=NONE. \nThis option is ignored when the plot statement is in an OVERLAY or PROTOTYPE layout and the INCLUDERANGES= option \nis specified in the LINEAROPTS= or TIMEOPTS= option for either axis. \n\nNotes: For non-grouped data, the values of the column are expected to be same for each unique X value. If they are \nnot, then the results might be unpredictable. \n\nFor grouped data, the values of the column are expected to be the same for each unique X and GROUP combination. \n\nTips: The URL value can be blank for some X values, meaning that no action is taken when the line segments \nfor those X values are selected. \n\nThe URL value can be the same for different X values, meaning that the same action is taken when the line segments \nfor those X values are selected."},"StatementOptionType":"V"},{"StatementOptionName":"VERTEXLABEL=","StatementOptionHelp":{"#cdata":"Syntax: VERTEXLABEL=TRUE | FALSE \n \nSpecifies whether to label the vertices with their response value (or statistic). \n\nDefault: FALSE \n\nInteraction: When GROUPDISPLAY=STACK is in effect, vertex labeling displays the sum of the vertex responses per category. \n\nTips: You can modify the visual attributes for the label by using the VERTEXLABELATTRS= option. \nYou can modify the text format by using the VERTEXTLABELFORMAT= option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to label the vertices with their response value (or statistic). ","@ToolTip2":"Specifies not to label the vertices with their response value (or statistic)."}},{"StatementOptionName":"VERTEXLABELATTRS=","StatementOptionHelp":{"#cdata":"Syntax: VERTEXLABELATTRS=style-element | style-element (text-options) | (text-options) \n\nSpecifies the color and font attributes of the vertex labels. \n\nDefault: The GraphDataText style element. \n\nRequirement: VERTEXLABEL=TRUE must be in effect for this option to have any effect. \n\nInteraction: If one or more text options are specified and they do not include all the font properties \n(color, family, size, weight, style), then non-specified properties are derived from the GraphDataText style element. \n\nNote: When style-element is specified, only the style element\u2019s COLOR, FONTFAMILY, FONTSIZE, FONTSTYLE, \nand FONTWEIGHT attributes are used."},"StatementOptionType":"V"},{"StatementOptionName":"VERTEXLABELFORMAT=","StatementOptionHelp":{"#cdata":"Syntax: VERTEXLABELFORMAT=format \n\nSpecifies the format used to display the vertex label response or statistic.\n\nDefault The column format assigned to the response variable, or BEST6.2 if the column does not have an associated format. \n\nRequirement VERTEXLABEL=TRUE must be in effect for this option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}},{"StatementOptionName":"RESPONSE=","StatementOptionHelp":{"#cdata":"Syntax: RESPONSE=numeric-column | expression \n\n\nSpecifies the numeric column or expression for the response values."},"StatementOptionType":"V"}]}},{"StatementName":"LINEPARM","StatementHelp":{"#cdata":"Syntax: LINEPARM X = number | numeric-column | expression\n Y = number | numeric-column | expression\n SLOPE = number | numeric-column | expression ; \n\nCreates a straight line specified by a point and a slope."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=number | numeric-column | expression] \n \nSpecifies the X coordinate of a point. \nTip: By default, if the specified value is outside of the data range, then the data range \nis extended to include the specified intercept. This behavior can be changed with the CLIP= \noption. If a numeric-column is specified and the column contains missing values, no line is \ndrawn for the missing values.\n\nTip: Values are displayed in the units of the data."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=number | numeric-column | expression] \n \nspecifies the Y coordinate of a point. \nTip: By default, if the specified value is outside of the data range, then the data range \nis extended to include the specified intercept. This behavior can be changed with the CLIP= \noption. If a numeric-column is specified and the column contains missing values, no line is \ndrawn for the missing values.\n\nTip: Values are displayed in the units of the data."},"StatementOptionType":"RV"},{"StatementOptionName":"SLOPE=","StatementOptionHelp":{"#cdata":"[Syntax: SLOPE=number | numeric-column | expression] \n \nSpecifies the slope of the line. \nTip: Slope may be positive or negative.\n\nTip: SLOPE= 0 creates a line parallel to the X-axis.\nSLOPE= . (missing value) creates a line parallel to the Y-axis."},"StatementOptionType":"RV"},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the data for the line are considered when determining the data ranges for the axes. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The data for the line contribute to the data range for each axis. Each axis may be extended to force the display of the line.","@ToolTip2":"The data for the line are ignored when establishing axis scales. Each axis scale is determined by the other plots in the parent layout. This may result in the line not being displayed if its data range is not within the data ranges of the other plots."}},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"| column | expression] \n \nSpecifies a label for the line. \n\nDefault: no default\n\nInteraction:\n o For a single line, use \"string.\" \n o For multiple lines, use a column to define the labels for each unique value. \n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the line label.\nDefault:\n o For non-grouped data, the GraphValueText style element. \n o For grouped data, text color is derived from the GraphData1:ContrastColor - GraphDataN:ContrastColor \n style references. The font is derived from the GraphValueText style element. \n\nInteraction: For this option to take effect, the CURVELABEL= option must also be used.\n\nInteraction: This option's COLOR= setting overrides the colors indicated by the GROUP= option.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the line label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the DENSITYPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the line label inside the plot area","@ToolTip2":"Places the line label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the line label relative to the line end points. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. MAX when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the density label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELLOCATION=OUTSIDE. The line label will be positioned automatically near the line boundary along unused axes whenever possible (typically Y2 and X2) to avoid collision with tick values.","@ToolTip2":"Forces the line label to appear near maximum line values (typically, upper right).","@ToolTip3":"Forces the line label to appear near minimum line values (typically, lower left)."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the line. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"EXTEND=","StatementOptionHelp":{"#cdata":"Specifies whether the line is to be drawn to the area bounded by the axes. \n\nDefault: FALSE\n\nTip: If this option is not specified, then there can be a small gap between the line and the axis. \nThe gap is controlled by the axis offset. If the offset is set to 0, then there is no gap."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the constant or \"step\" band is not to be drawn to the area bounded by the axes.","@ToolTip2":"Specifies whether the constant or \"step\" band is to be drawn to the area bounded by the axes."}},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate parameterized line plot for each unique group value of the specified column. \nDefault: Each distinct group value may be represented in the graph by a different combination of \nline color and line pattern. Line colors vary according to the GraphData1:ContrastColor - \nGraphDataN:ContrastColor style references, and line patterns vary according to the \nGraphData1:LineStyle - GraphDataN:LineStyle style references.\n\nRestriction: When this option is used, the X, Y, and SLOPE arguments must specify numeric columns.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of line colors and line patterns.\n\nTip: The LINEATTRS= option can be used to override the representations that are used to identify the \ngroups. For example, LINEATTRS=(PATTERN=SOLID) can be used to assign the same pattern to all of the \nlines, letting the line color distinguish group values. Likewise, LINEATTRS=(COLOR=BLACK) can be used \nto assign the same color to all of the lines, letting the line pattern distinguish group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number \nless than N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \nDefault: The string specified on the NAME= option.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the color and font attributes of the line. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor, LineStyle, and LineThickness attributes of the \n GraphData1- GraphDataN style elements.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors and \nline patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nRestriction: Another plot that establishes a data range for the designed axis must be included.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nRestriction: Another plot that establishes a data range for the designed axis must be included.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"LOESSPLOT","StatementHelp":{"#cdata":"Syntax: LOESSPLOT X = numeric-column | expression\n Y = numeric-column | expression > ; \n \nCreates a fitted loess curve computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"ALPHA=","StatementOptionHelp":{"#cdata":"[Syntax: ALPHA= positive-number] \n \nSpecifies the confidence level to compute. \n\nDefault: .05\n\nRange: 0 < number < 1\n\nTip: ALPHA=.05 represents a 95% confidence level."},"StatementOptionType":"V"},{"StatementOptionName":"CLM=","StatementOptionHelp":{"#cdata":"[Syntax: CLM=\"name\"] \n \nProduces confidence limits for a mean predicted value for each observation. The confidence \nlevel is set by the ALPHA= option. \n\nDefault: no default\n\nInteraction: \"name\" is a unique name within the template that is case sensitive and cannot contain \nspaces. It must be assigned in order for the confidence limits to be computed. To display confidence \nlimits, you must use this name as the required argument of a MODELBAND statement."},"StatementOptionType":"V"},{"StatementOptionName":"DEGREE=","StatementOptionHelp":{"#cdata":"Specifies the degree of the local polynomials to use for each local regression.\n\nDefault: 1"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"1","@Value2":"2"},"StatementOptionToolTips":{"@ToolTip1":"For local linear fitting.","@ToolTip2":"For local quadratic fitting."}},{"StatementOptionName":"INTERPOLATION=","StatementOptionHelp":{"#cdata":"Specifies the degree of the interpolating polynomials used for blending local polynomial fits at \nthe kd tree vertices. \n\nDefault: LINEAR"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LINEAR","@Value2":"CUBIC"},"StatementOptionToolTips":{"@ToolTip1":"Cubic polynomials","@ToolTip2":"Linear polynomials"}},{"StatementOptionName":"MAXPOINTS=","StatementOptionHelp":{"#cdata":"[Syntax: MAXPOINTS=positive-integer] \n \nSpecifies the maximum number of predicted points generated for the loess curve as well as \nconfidence limits. \n\nDefault: 201"},"StatementOptionType":"V"},{"StatementOptionName":"SMOOTH=","StatementOptionHelp":{"#cdata":"Specifies a regression parameter value. \n\nDefault: AUTO"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":""},"StatementOptionToolTips":{"@ToolTip1":"A regression parameter is automatically selected that minimizes a lack-of-smoothness penalty.","@ToolTip2":"Specifies a regression parameter value."}},{"StatementOptionName":"REWEIGHT=","StatementOptionHelp":{"#cdata":"Specifies the number of iterative reweighting steps to be done. Such iterations are appropriate when \nthere are outliers in the data or when the error distribution is a symmetric long-tailed distribution. \n\nDefault: NONE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NONE","@Value2":""},"StatementOptionToolTips":{"@ToolTip1":"Specifies that no iterative reweighting steps are to be done.","@ToolTip2":"Specifies the number of iterative reweighting steps to be done."}},{"StatementOptionName":"WEIGHT=","StatementOptionHelp":{"#cdata":"[Syntax: WEIGHT= numeric-column] \n \nSpecifies a variable in the input data set that contains values to be used as a priori weights \nfor a loess fit. The values of the weight variable must be nonnegative. If an observation's weight \nis zero, negative, or missing, the observation is deleted from the analysis. \n\nDefault: no default"},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the loess curve. \n\nDefault: no default\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the curve labels.\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the density curve label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the DENSITYPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the curve label inside the plot area","@ToolTip2":"Places the curve label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the curve label relative to the curve line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the density label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELPOSITION=OUTSIDE. The curve label will be positioned automatically near the end of the density curve along unused axes whenever possible (typically Y2 or X2) to avoid collision with tick values.","@ToolTip2":"Forces the curve label to appear near maximum curve values (typically, upper right).","@ToolTip3":"Forces the curve label to appear near minimum curve values (typically, lower left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the curve label to appear near the beginning of the curve. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the curve label to appear near the end of the curve. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the loess curve. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of curves from just the observations that correspond to each unique group \nvalue of the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of \ncolor and line pattern. Line colors vary according to the GraphData1:ContrastColor - GraphDataN:ContrastColor \nstyle references, and line patterns vary according to the GraphData1:LineStyle - GraphDataN:LineStyle \nstyle references.\n\nRestriction: The input data must be sorted by the GROUP= column.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of line colors and line patterns.\n\nTip: The LINEATTRS= option can be used to override the representations that are used to identify the \ngroups. For example, LINEATTRS=(PATTERN=SOLID) can be used to assign the same pattern to all of the \nloess curves, letting the line color distinguish group values. Likewise, LINEATTRS=(COLOR=BLACK) can \nbe used to assign the same color to all of the curves, letting the line pattern distinguish group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the GraphData1 - GranphDataN style elements. \nDefault no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the results \nare unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label to be used in a legend. \nDefault: The string specified on the NAME= option.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the loess curve. \nDefault: The GraphFit style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format \nis assigned to a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIPFORMAT=(Y=6.2) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the X, Y, and GROUP (if assigned) roles are automatically included \nin the tooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIPLABEL=(Y=\"Loess Fit\") \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the X, Y, and GROUP (if assigned) roles are automatically included \nin the tooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}],"#comment":[{},{}]}},{"StatementName":"MODELBAND","StatementHelp":{"#cdata":"Syntax: MODELBAND \"confidence-name\" ; \n \nCreates a band showing confidence limits for an associated smoother plot."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the upper and lower band labels.\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABELLOWER= or CURVELABELUPPER= option must \nalso be specified.\n\nInteraction: If the smoother statement's GROUP= option is specified, this option is ignored.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELLOWER=\"string\"] \n \nSpecifies a label for the lower band limit. \nDefault: no default\n\nInteraction: If the smoother statement's GROUP= option is specified, this option is ignored.\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELUPPER=\"string\"] \n \nSpecifies a label for the upper band limit. \nDefault: no default\n\nInteraction: If the smoother statement's GROUP= option is specified, this option is ignored.\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the band labels relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the MODELBAND is used in multicell layouts such as \nLATTICE, DATAPANEL, or DATALATTICE, where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSTION= option to determine \nwhere the band labels appear. For more information, see \"Location and Position of Curve Labels\".\n\nInteraction: For this option to take effect, the CURVELABELLOWER= or CURVELABELUPPER= option \nmust also be specified."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the band label inside the plot area","@ToolTip2":"Places the band label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the band labels relative to the band line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the band labels appear."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELPOSITION=OUTSIDE. Band labels will be positioned automatically near the band boundary along unused axes whenever possible (typically Y2 and X2).","@ToolTip2":"Forces the band label to appear near maximum band values (typically, upper right)","@ToolTip3":"Forces the band label to appear near minimum band values (typically, lower left) ","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the band label to appear near the beginning of the band. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the band label to appear near the end of the band. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the band. This option affects both the fill and outline. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display an outlined area, a filled area, or an outlined and filled modelband area. \n\nDefault: The GraphBand:DisplayOpts style reference."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays an un-outlined, filled band","@ToolTip2":"Displays an outlined, filled band","@ToolTip3":"A parenthesized list of options that must include one of the following: OUTLINE displays an outlined band FILL displays a filled band"},"SubOptionsKeywords":"OUTLINE|FILL"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label to be used in a legend. \nDefault: The string specified on the NAME= option.\n\nInteraction: The smoother statement's GROUP= option overrides this option."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors and \nline patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the modelband outlines. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names. \n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the GraphConfidence style element. \n o For grouped data, the GraphData1: ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: If DISPLAY=(FILL), this option has no effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIPFORMAT=(LIMITUPPER=5.3 \n LIMITLOWER=5.3) \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIPLABEL=(LIMITUPPER=\"90% CLM\" \n LIMITLOWER=\"90% CLM\") \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display. \n\nTip: The setting for this option should be the same as for the smoother statement referenced by \"confidence-name\" "},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display. \n\nTip: The setting for this option should be the same as for the smoother statement referenced by \"confidence-name\" "},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"NEEDLEPLOT","StatementHelp":{"#cdata":"Syntax: NEEDLEPLOT X = column | expression\n Y = numeric-column | expression ; \n \nCreates a plot of observations as points connected to a baseline by vertical line segments."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies a column or expression for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies a numeric column or numeric expression for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"BASELINEINTERCEPT=","StatementOptionHelp":{"#cdata":"Specifies the Y-intercept for the baseline. \n\nDefault: 0"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"","@Value2":"RELATIVE"},"StatementOptionToolTips":{"@ToolTip1":"Replace with the Y-intercept value to use for the baseline.","@ToolTip2":"The baseline is placed at the Y-axis tick mark closest to the minimum of the range for the needle data points."}},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies labels at the data points. \nDefault: no default\n\nTip: The position of the labels is adjusted to prevent the labels from overlapping."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphValueText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to have any effect, the DATALABEL= option must also be specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the needles and markers, if displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display needle lines with or without markers. \n\nDefault: STANDARD \n\nTip: Use the MARKERATTRS= and LINEATTRS= options to control the appearance of the line and markers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays needle lines without markers.","@ToolTip2":"Displays needle lines with markers.","@ToolTip3":"A parenthesized list of options that must include the following: MARKERS displays needle lines with markers "},"SubOptionsKeywords":"MARKERS"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of needles, markers, and data labels for each unique group value of the \nspecified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination \nof color, line pattern and marker symbol. These vary according to the ContrastColor, LineStyle, \nand MarkerSymbol attributes of the GraphData1 - GraphDataN style elements.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of marker symbols, colors, and line patterns.\n\nInteraction: The marker size is set by the MARKERATTRS= option.\n\nTip: The representations that are used to identify the groups can be overridden. For example, each \ndistinct group value may be represented by a different line pattern, but the LINEATTRS=(PATTERN=pattern) \noption could be used to assign the same line pattern to all of the plot's line patterns, letting line \ncolor indicate group values. Likewise, LINEATTRS= ( COLOR= color ) could be used to assign the same \ncolor to all lines, letting line pattern indicate group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column] \n \nSpecifies indices for mapping needle attributes (color, marker symbol, and line pattern) to one \nof the GraphData1 - GranphDataN style elements. \nDefault: no default\n\nInteraction: For this option to have any effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the results \nare unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the needles for the data points. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor, LineStyle and LineThickness attributes of the \n GraphData1 - GraphDataN style elements.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the data markers. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the MarkerSymbol, Markersize, and ContrastColor attributes of the \n GraphData1 - GraphDataN style elements. \n\nInteraction: The DISPLAY= option must display markers for this option to have any effect.\n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of role-name = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined \nroles X, Y, DATALABEL, and GROUP.\n\nTip: This option provides a way to add to the data columns that appear in tool tips \nspecified by the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a needle line or marker. \nIf this option is used, it replaces all the information displayed by default. Roles for columns \nthat do not contribute to the needle plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: \nX, Y, DATALABEL, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique NEEDLEPLOT and user-defined roles. NEEDLEPLOT roles \ninclude X, Y, DATALABEL, and GROUP. User-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X and Y as well \nas the column OBS which is not assigned to any pre-defined NeedlePlot role. The OBS column must \nfirst be assigned a role.\n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X Y) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= \nand TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y) \n TIPFORMAT=(TIP1=4.) \n\nRequirement: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y) \n TIPLABEL=(TIP1=\"Observation #\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when a needle or marker is selected. \nDefault: no default\n\ncharacter-column \neach value of the column must be a valid HTML page reference (HREF). \nFor example, http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate selectable needles, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The URL value may be blank for some X and Y pairs, meaning that no action is taken when the \ncorresponding needle or marker is selected. The URL value may be the same for any X and Y pairs, \nmeaning that the same action is taken when the needle or marker for those X and Y pairs are selected."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"PBSPLINEPLOT","StatementHelp":{"#cdata":"Syntax: PBSPLINEPLOT X = numeric-column | expression\n Y = numeric-column | expression > ; \n \nCreates a fitted penalized B-spline curve computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"ALPHA=","StatementOptionHelp":{"#cdata":"[Syntax: ALPHA= positive-number] \n \nSpecifies the confidence level to compute. \n\nDefault: .05\n\nRange: 0 < number < 1\n\nTip: ALPHA=.05 represents a 95% confidence level."},"StatementOptionType":"V"},{"StatementOptionName":"CLI=","StatementOptionHelp":{"#cdata":"[Syntax: CLI=\"name\"] \n \nProduces confidence limits for individual predicted values for each observation. \nDefault: no default\n\nInteraction: \"name\" is a unique name within the template that is case sensitive and cannot contain \nspaces. It must be assigned in order for the confidence limits to be computed. To display confidence \nlimits, you must use this name as the required argument of a MODELBAND statement."},"StatementOptionType":"V"},{"StatementOptionName":"CLM=","StatementOptionHelp":{"#cdata":"[Syntax: CLM=\"name\"] \n \nProduces confidence limits for a mean predicted value for each observation. The confidence \nlevel is set by the ALPHA= option. \n\nDefault: no default\n\nInteraction: \"name\" is a unique name within the template that is case sensitive and cannot contain \nspaces. It must be assigned in order for the confidence limits to be computed. To display confidence \nlimits, you must use this name as the required argument of a MODELBAND statement."},"StatementOptionType":"V"},{"StatementOptionName":"DEGREE=","StatementOptionHelp":{"#cdata":"[Syntax: DEGREE= non-negative-integer] \n \nSpecifies the degree of B-spline. \n\nDefault: 3"},"StatementOptionType":"V"},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column] \n \nSpecifies a variable in the input data set that represents the frequency of occurrence of the current \nobservation, essentially treating the data set as if each observation appeared n times, where n is the \nvalue of the FREQ variable for the observation. Noninteger values of the FREQ variable are truncated to \nthe largest integer less than the FREQ value. The observation is used in the analysis only if the value \nof the FREQ variable is greater than or equal to 1. \n\nDefault: no default"},"StatementOptionType":"V"},{"StatementOptionName":"MAXPOINTS=","StatementOptionHelp":{"#cdata":"[Syntax: MAXPOINTS=positive-integer] \n \nSpecifies the maximum number of predicted points generated for the spline curve as well as any \nconfidence limits. \n\nDefault: 201"},"StatementOptionType":"V"},{"StatementOptionName":"NKNOTS=","StatementOptionHelp":{"#cdata":"[Syntax: NKNOTS=non-negative-integer] \n \nSpecifies the number of evenly spaced internal knots. \n\nDefault: 100\n\nTip: By default, a large number of knots (100) is specified, which allows for an extreme lack of \nsmoothness in the results. However, the final function will typically be much smoother due to the \npenalty. See \"Penalized B-Splines\" and the \"Penalized B-Spline\" example in PROC TRANSREG. When SMOOTH=0 \nis specified, you should typically ask for many fewer knots than the default, since there is no penalty \nfor lack of smoothness. For example, ten or fewer knots will usually be enough to follow the functional \nform found in most data."},"StatementOptionType":"V"},{"StatementOptionName":"SMOOTH=","StatementOptionHelp":{"#cdata":"Specifies a regression parameter value. \n\nDefault: AUTO \n\nTip: With SMOOTH=AUTO, a regression parameter is automatically selected that minimizes a lack-of-smoothness penalty.\n\nTip: You can specify SMOOTH=0 to get an ordinary B-spline fit."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":""},"StatementOptionToolTips":{"@ToolTip1":"A regression parameter is automatically selected that minimizes a lack-of-smoothness penalty.","@ToolTip2":"Specifies a regression parameter value."}},{"StatementOptionName":"WEIGHT=","StatementOptionHelp":{"#cdata":"[Syntax: WEIGHT= numeric-column] \n \nSpecifies a variable in the input data set that contains values to be used as a priori weights for \na penalized B-spline fit. If an observation's weight is zero, negative, or missing, the observation \nis deleted from the analysis. \n\nDefault: no default"},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the regression curve. \n\nDefault: no default\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the regression curve labels.\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABEL=curvelabel option must also be used.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the regression curve label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the PBSPLINEPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the regression curve label inside the plot area","@ToolTip2":"Places the regression curve label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the regression curve label relative to the curve line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine where \nthe regression curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELPOSITION=OUTSIDE. The regression curve label will be positioned automatically near the curve boundary along unused axes whenever possible (typically Y2 and X2) to avoid collision with tick values.","@ToolTip2":"Forces the regression curve label to appear near maximum curve values (typically, upper right).","@ToolTip3":"Forces the regression curve label to appear near minimum curve values (typically, lower left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the regression curve label to appear near the beginning of the curve. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the regression curve label to appear near the end of the curve. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the curve. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of curves from just the observations that correspond to each unique group \nvalue of the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of \ncolor and line pattern. Line colors vary according to the GraphData1:ContrastColor - GraphDataN:ContrastColor \nstyle references, and line patterns vary according to the GraphData1:LineStyle - GraphDataN:LineStyle \nstyle references.\n\nRestriction: The input data must be sorted by the GROUP= column.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of line colors and line patterns.\n\nTip: The LINEATTRS= option can be used to override the representations that are used to identify the \ngroups. For example, LINEATTRS=(PATTERN=SOLID) can be used to assign the same pattern to all of the \nloess curves, letting the line color distinguish group values. Likewise, LINEATTRS=(COLOR=BLACK) can \nbe used to assign the same color to all of the curves, letting the line pattern distinguish group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the results \nare unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \nThe string specified on the NAME= option.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the regression curve.\nDefault: The GraphFitLine style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIPFORMAT=(Y=6.2) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the X, Y, and GROUP (if assigned) roles are automatically included in the \ntooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIPLABEL=(Y=\"Spline Regression\") \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the X, Y, and GROUP (if assigned) roles are automatically included in \nthe tooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}],"#comment":[{},{}]}},{"StatementName":"REFERENCELINE","StatementHelp":{"#cdata":"Syntax: REFERENCELINE X= x-axis-value | column | expression ; \n \nSyntax for creating a line perpendicular to the Y-axis at a Y-intercept:\n\n REFERENCELINE Y= y-axis-value | column | expression ; \n\nCreates a horizontal or vertical reference line."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=x-axis-value | column | expression] \n \nSpecifies the X intercept of the reference line(s). \nRequirement: If not specified, then Y must be specified.\n\nTip: By default, if the value specified for the X= argument is outside of the data range, then the \ndata range is extended to include the specified intercept. This behavior can be changed with the CLIP= option\n\nTip: Values must agree in type with the data type of the X axis. For example, you should use numeric SAS \ndate or time values (or SAS date/time constants) for a time axis."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=y-axis-value | column | expression] \n \nSpecifies the Y intercept of the reference line(s). \nRequirement: If not specified, then X must be specified.\n\nTip: By default, if the value specified for the Y= argument is outside of the data range, then \nthe data range is extended to include the specified intercept. This behavior can be changed with \nthe CLIP= option.\n\nTip: Values must agree in type with the data type of the Y axis."},"StatementOptionType":"RV"},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the data for the line are considered when determining the data ranges for the axes. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"The data for the line contribute to the data range for each axis. Each axis may be extended to force the display of the line.","@ToolTip2":"The data for the line are ignored when establishing axis scales. Each axis scale is determined by the other plots in the parent layout. This may result in the line not being displayed if its data range is not within the data ranges of the other plots."}},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"| column | expression] \n \nSpecifies a label for the reference line(s). \n\nDefault: no default\n\nInteraction:\n o If the X or Y argument specifies a value, use \"string .\" \n o If the X or Y argument specifies a column, use a column to define the label for each value. \n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the reference line label(s).\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be used.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the reference line label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the DENSITYPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the reference line label inside the plot area","@ToolTip2":"Places the reference line label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the reference line label relative to the line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. MAX when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the density label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELLOCATION=OUTSIDE. The line label will be positioned automatically near the line boundary along unused axes whenever possible (typically Y2 and X2) to avoid collision with tick values.","@ToolTip2":"Forces the line label to appear near maximum line values (typically, the top or right).","@ToolTip3":"Forces the line label to appear near minimum line values (typically, the bottom or left)."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the reference line. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the reference line. \nDefault: The GraphReference style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors and \nline patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nRestriction: Another plot that establishes a data range for the axis must be included.\n\nInteraction: This option is ignored if the X= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nRestriction: Another plot that establishes a data range for the axis must be included.\n\nInteraction: This option is ignored if the Y= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"REGRESSIONPLOT","StatementHelp":{"#cdata":"Syntax: REGRESSIONPLOT X = numeric-column | expression\n Y = numeric-column | expression > ; \n \nCreates a fitted regression line or curve computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the numeric column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the numeric column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"ALPHA=","StatementOptionHelp":{"#cdata":"[Syntax: ALPHA= positive-number] \n \nSpecifies the confidence level to compute. \n\nDefault: .05\n\nRange: 0 - 1\n\nTip: ALPHA=.05 represents a 95% confidence level."},"StatementOptionType":"V"},{"StatementOptionName":"CLI=","StatementOptionHelp":{"#cdata":"[Syntax: CLI=\"name\"] \n \nProduces confidence limits for individual predicted values for each observation. The confidence \nlevel is set by the ALPHA= option.\n\nDefault: no default\n\nInteraction: \"name\" is a unique name within the template that is case sensitive and cannot contain \nspaces. It must be assigned in order for the confidence limits to be computed. To display confidence \nlimits, you must use this name as the required argument of a MODELBAND statement."},"StatementOptionType":"V"},{"StatementOptionName":"CLM=","StatementOptionHelp":{"#cdata":"[Syntax: CLM=\"name\"] \n \nProduces confidence limits for a mean predicted value for each observation. The confidence \nlevel is set by the ALPHA= option. \n\nDefault: no default\n\nInteraction: \"name\" is a unique name within the template that is case sensitive and cannot contain \nspaces. It must be assigned in order for the confidence limits to be computed. To display confidence \nlimits, you must use this name as the required argument of a MODELBAND statement."},"StatementOptionType":"V"},{"StatementOptionName":"DEGREE=","StatementOptionHelp":{"#cdata":"[Syntax: DEGREE= non-negative-integer] \n \nSpecifies the degree of the polynomial. \nDefault: 1\n\nTip: DEGREE=1 produces a linear fit,\nDEGREE=2 produces a quadratic fit,\nDEGREE=3 produces a cubic fit, and so on.\n\nTip: The value of the DEGREE= d option corresponds to either of the following PROC TRANSREG specifications \nfor the independent variable: SPLINE(X / DEGREE=d ) or PBSPLINE(X / DEGREE=d LAMBDA=0)."},"StatementOptionType":"V"},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column] \n \nSpecifies a variable in the input data set that represents the frequency of occurrence of the current \nobservation, essentially treating the data set as if each observation appeared n times, where n is the \nvalue of the FREQ variable for the observation. Noninteger values of the FREQ variable are truncated to \nthe largest integer less than the FREQ value. The observation is used in the analysis only if the value \nof the FREQ variable is greater than or equal to 1. \n\nDefault: no default"},"StatementOptionType":"V"},{"StatementOptionName":"MAXPOINTS=","StatementOptionHelp":{"#cdata":"[Syntax: MAXPOINTS=positive-integer] \n \nSpecifies the maximum number of predicted points generated for the regression curve as well as any \nconfidence limits. \n\nDefault: 201"},"StatementOptionType":"V"},{"StatementOptionName":"WEIGHT=","StatementOptionHelp":{"#cdata":"[Syntax: WEIGHT= numeric-column] \n \nSpecifies a variable in the input data set that contains values to be used as a priori weights for \na regression fit. If an observation's weight is zero, negative, or missing, the observation is deleted \nfrom the analysis. \n\nDefault: no default"},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the regression line. \nDefault: no default\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the regression line labels.\nDefault: The GraphValueText style element.\n\nInteraction: For this option to take effect, the CURVELABEL=curvelabel option must also be used.\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the regression line label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the REGRESSIONPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL or DATALATTICE where axes may be external to the grid.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the regression line label inside the plot area","@ToolTip2":"Places the regression line label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the regression line label relative to the regression line. \n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. The START \nand END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the line label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELLOCATION=OUTSIDE. The line label will be positioned automatically near the line boundary along unused axes whenever possible (typically Y2 and X2) to avoid collision with tick values.","@ToolTip2":"Forces the line label to appear near maximum line values (typically, upper right).","@ToolTip3":"Forces the line label to appear near minimum line values (typically, lower left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the line label to appear near the beginning of the regression line. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the line label to appear near the end of the regression line. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the regression line. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of regression lines from just the observations that correspond to each \nunique group value of the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of \nline color and line pattern. Line colors vary according to the GraphData1:ContrastColor - \nGraphDataN:ContrastColor style references, and line patterns vary according to the \nGraphData1:LineStyle - GraphDataN:LineStyle style references.\n\nRestriction: The input data must be sorted by the GROUP= column.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is \nused to alter the default sequence of line colors and line patterns.\n\nTip: The LINEATTRS= option can be used to override the representations that are used to identify \nthe groups. For example, LINEATTRS=(PATTERN=SOLID) can be used to assign the same pattern to all \nof the lines, letting the line color distinguish group values. Likewise, LINEATTRS=(COLOR=BLACK) \ncan be used to assign the same color to all of the lines, letting the line pattern distinguish \ngroup values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the \nresults are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The string specified on the NAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the regression line.\nDefault: The GraphFit style element.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default axis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout \ncontribute to a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of role-name = format pairs separated by blanks. \n \n TIPFORMAT=(Y=6.2) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the roles X, Y, and GROUP (if assigned) are automatically included \nin the tooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \n\nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of role-name = \"string\" pairs separated by blanks. \n \n TIPLABEL=(Y=\"Regression Fit\") \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The columns assigned to the roles X, Y, and GROUP (if assigned) are automatically included \nin the tooltip information."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}],"#comment":[{},{}]}},{"StatementName":"SCATTERPLOT","StatementHelp":{"#cdata":"Syntax: SCATTERPLOT X= column | expression\n Y= column | expression ; \n \nCreates a scatter plot of input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies the column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"COLORMODEL=","StatementOptionHelp":{"#cdata":"[Syntax: COLORMODEL=style-element] \n \nSpecifies a style element to be used with the MARKERCOLORGRADIENT= option. \nDefault: The ThreeColorAltRamp style element.\n\nstyle-element \nName of a style element. The style element should contain these style attributes: \n\n STARTCOLOR \n color for the smallest data value of the column that is specified on the MARKERCOLORGRADIENT= option \n \n NEUTRALCOLOR \n color for the midpoint of the range of the column that is specified on the MARKERCOLORGRADIENT= option \n \n ENDCOLOR \n color for the highest data value of the column that is specified on the MARKERCOLORGRADIENT= option \n\nInteraction: For this option to take effect, the MARKERCOLORGRADIENT= option must also be specified.\n\nTip: The REVERSECOLORMODEL= option can be used to reverse the start and end colors of the ramp assigned \nto the colormodel."},"StatementOptionType":"V","SubOptionsKeywords":"STARTCOLOR|NEUTRALCOLOR|ENDCOLOR"},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies a column for marker labels. The position of the labels are adjusted to prevent them from overlapping.\n\nDefault: no default\n\nInteraction: If a numeric column is specified and the column has no format, a BEST6. format is applied.\n\nInteraction: This option is ignored if the MARKERCHARACTER= option is used, which displays labels \ninstead of the markers."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the DATALABEL= option must also be specified.\n\nInteraction: This option is ignored if the MARKERCHARACTER= option is specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the markers, data labels, and errorbars, when displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"ERRORBARATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORBARATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the error bars associated with the data points. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the GraphError style element. \n o For grouped data, the LineStyle and LineThickness attributes of the GraphError style element and \n the ContrastColor attribute of the GraphData1 - GraphDataN style elements. (The LineStyle does not \n apply to the \"serif\" parts of the error bars.) \n \nInteraction: For this option to take effect, error bars must be displayd by the XERRORLOWER=, \nXERRORUPPER=, YERRORLOWER=, or YERRORUPPER= options."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a column that indicates a frequency count for each observation of the input data object. \nIf n is the value of the FREQ variable for a given observation, then that observation is plotted n times. \n\nDefault: Each observation is plotted once.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation is not \nused in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate marker type for each unique group value of the specified column. \nDefault: Each distinct group value may be represented in the graph by a different combination of \ncolor and marker symbol. Markers vary according to the ContrastColor and MarkerSymbol attributes \nof the GraphData1 - GraphDataN style elements.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is \nused to alter the default sequence of markers and colors.\n\nInteraction: The marker size is set by the MARKERATTRS= option.\n\nInteraction: If the MARKERCHARACTER= and MARKERCOLORGRADIENT= options are used, their settings \noverride the group settings for marker symbol and marker color.\n\nInteraction: The representations that are used to identify the groups can be overridden. For example, \neach distinct group value is represented by a different marker symbol, but the MARKERATTRS= ( SYMBOL=marker) \noption could be used to assign the same symbol to all of the plot's marker symbols, letting marker color \nindicate group values. Likewise, MARKERATTRS= ( COLOR= color ) could be used to assign the same color to \nall markers, letting marker symbol indicate group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping marker attributes (color and symbol) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: If the MARKERCHARACTER= and MARKERCOLORGRADIENT= options are used, their settings \noverride the group settings for marker symbol and marker color.\n\nInteraction: The index values are 1-based indices. For the style elements GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number \nless than N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the data markers. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the MarkerSymbol and ContrastColor attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:MarkerSize style reference. \n\nInteraction: If the MARKERCOLORGRADIENT= option is specified, this option's COLOR= setting is ignored.\nInteraction: If the MARKERCHARACTER= option is specified, its SYMBOL= and WEIGHT= settings are ignored.\n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"MARKERCHARACTER=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCHARACTER=column | expression] \n \nSpecifies a column that defines strings to be used instead of marker symbols. \n\nDefault: no default\n\nInteraction: This option overrides the DATALABEL= option.\n\nInteraction: If the GROUP= option is also used, color will be displayed for a DISCRETE legend, but \nthe character will not be displayed in the legend.\n\nTip: If the GROUP= option is also specified, the same colors are applied to the text strings as would \nhave been applied to markers.\n\nTip: If a numeric column is used, its values are converted to strings using the format associated with \nthe column or BEST6. if no format is defined.\n\nTip: Each string is centered horizontally and vertically at the data point. The data point positions \nare not adjusted to prevent text overlap."},"StatementOptionType":"V"},{"StatementOptionName":"MARKERCHARACTERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCHARACTERATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the marker character specified on the MARKERCHARACTER= option. \n\nWhen specifying the attributes for text, the available text-options can be any one or more of the following \nsettings. The options must be enclosed in parentheses, and each option is specified as a name=value pair. \nIn all cases, the value may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text. \n If you use a color , SAS/GRAPH accepts color names, such as RED, or color codes, such as CXFF0000 or #FF0000. \n Color names must not exceed 64 characters. Color codes must not exceed 8 characters and must be in a valid \n SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n \nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the MARKERCHARACTER= option must also be used."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"MARKERCOLORGRADIENT=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCOLORGRADIENT=numeric-column | expression] \n \nSpecifies the column that is used to map marker colors to a continuous gradient. \nDefault: no default\n\nRestriction: To display a legend with this option in effect, you must use a CONTINUOUSLEGEND statement, \nnot a DISCRETELEGEND statement.\n\nInteraction: This option overrides the COLOR= setting of the MARKERATTRS= or MARKERCHARACTERATTRS= option.\n\nTip: This option can be used to add a second response variable to an analysis. For example, in an analysis \nof weight by height, an age column might be specified by the MARKERCOLORGRADIENT= option so that the change \nin the gradient color of the markers reflects the change in age."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors and \nmarker symbols between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"REVERSECOLORMODEL=","StatementOptionHelp":{"#cdata":"Specifies whether to reverse the gradient (color ramp) defined by the COLORMODEL= option. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to reverse the gradient (color ramp) defined by the COLORMODEL= option.","@ToolTip2":"Specifies to reverse the gradient (color ramp) defined by the COLORMODEL= option."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of role-name = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, Y, \nDATALABEL, MARKERCHARACTER, MARKERCOLORGRADIENT, XERRORLOWER, XERRORUPPER, YERRORLOWER, YERRORUPPER, \nGROUP, and INDEX.\n\nInteraction: For this option to take effect, the TIP= option must also be used.\n\nTip: This option provides a way to add to the data columns that appear in tool tips specified by \nthe TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over the scatter points. If this \noption is used, it replaces all the information displayed by default. Roles for columns that do not \ncontribute to the scatter plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tool tip information: \nX, Y, DATALABEL, MARKERCHARACTER, MARKERCOLORGRADIENT, XERRORLOWER, XERRORUPPER, YERRORLOWER, YERRORUPPER, \nFREQ, GROUP, and INDEX.\n\n(role-list) \nan ordered, blank-separated list of unique SCATTERPLOT and user-defined roles. SCATTERPLOT roles include \nX, Y, DATALABEL, MARKERCHARACTER, MARKERCOLORGRADIENT, XERRORLOWER, XERRORUPPER, YERRORLOWER, YERRORUPPER, \nGROUP, and INDEX. User-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tool tips for the columns assigned to the roles X and Y as well as the \ncolumn OBS which is not assigned to any pre-defined ScatterPlot role. The OBS column must first be \nassigned a role.\n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X XERRORUPPER XERRORLOWER) \n\nRequirement: To generate tool tips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The labels and formats for the TIP variables can be controlled with the TIPLABEL= and \nTIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X XERRORUPPER XERRORLOWER) \n TIPFORMAT=(XERRORUPPER=5.3 XERRORLOWER=5.3) \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the formats of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=PCT) \n TIP=(TIP1 X XERRORUPPER XERRORLOWER) \n TIPLABEL=(XERRORUPPER=\"1 STD ERROR\" \n XERRPRLOWER=\"-1 STD ERROR\") \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the labels of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when a point is selected. \nDefault: no default\n\ncharacter-column \neach value of the column must be a valid HTML page reference (HREF). \nFor example, http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate selectable markers, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The URL value may be blank for some X and Y pairs, meaning that no action is taken when the \ncorresponding point is selected. The URL value may be the same for any X and Y pairs, meaning that \nthe same action is taken when the points for those X and Y pairs are selected."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: This option is ignored if the X= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display for the specified axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: This option is ignored if the Y= argument is not specified.\n\nInteraction: The overall plot specification and the layout type determine the axis display for the specified axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}},{"StatementOptionName":"XERRORLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: XERRORLOWER=numeric-column | expression] \n \nSpecifies values for the lower endpoints on the X error bars. \nDefault: The lower segment of the error bars is not drawn.\n\nTip: The values are actual values, not relative values.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"YERRORLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: YERRORLOWER=numeric-column | expression] \n \nSpecifies values for the lower endpoints on the Y error bars. \nDefault: The lower segment of the error bars is not drawn.\n\nTip: The values are actual values, not relative values.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"XERRORUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: XERRORUPPER=numeric-column | expression] \n \nSpecifies values for the upper endpoints on the X error bars. \nDefault: The upper segment of the error bars is not drawn.\n\nTip: The values are actual values, not relative values.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"YERRORUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: YERRORUPPER=numeric-column | expression] \n \nSpecifies values for the upper endpoints on the Y error bars. \nDefault: The upper segment of the error bars is not drawn.\n\nTip: The values are actual values, not relative values.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"}]}},{"StatementName":"SCATTERPLOTMATRIX","StatementHelp":{"#cdata":"Syntax: SCATTERPLOTMATRIX numeric-column-list ; \n\nCreates a matrix of all pairwise scatter plots of the specified variables."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"COLORMODEL=","StatementOptionHelp":{"#cdata":"[Syntax: COLORMODEL=style-element] \n \nSpecifies a style element to be used with the MARKERCOLORGRADIENT= option. \nDefault: The ThreeColorAltRamp style element.\n\nstyle-element \nName of a style element. The style element should contain these style attributes: \n\n STARTCOLOR \n color for the smallest data value of the column that is specified on the MARKERCOLORGRADIENT= option \n \n NEUTRALCOLOR \n color for the midpoint of the range of the column that is specified on the MARKERCOLORGRADIENT= option \n \n ENDCOLOR \n color for the highest data value of the column that is specified on the MARKERCOLORGRADIENT= option \n\nInteraction: For this option to take effect, the MARKERCOLORGRADIENT= option must also be specified.\n\nTip: The REVERSECOLORMODEL= option can be used to reverse the start and end colors of the ramp assigned \nto the colormodel."},"StatementOptionType":"V","SubOptionsKeywords":"STARTCOLOR|NEUTRALCOLOR|ENDCOLOR"},{"StatementOptionName":"CORROPTS=","StatementOptionHelp":{"#cdata":"[Syntax: CORROPTS=(correlation-options)] \n \nSpecifies options for computing measures of association between pairs of variables. \nThe following correlation-options are available:\n\n EXCLNPWGT = FALSE | TRUE \n specifies whether observations with non-positive weight values are excluded (TRUE) from the analysis. \n Default: FALSE (observations with negative weights are treated like those with zero weights and counted \n in the total number of observations).\n\n NOMISS = FALSE | TRUE \n specifies whether observations with missing values are excluded (TRUE) from the analysis. \n Default: FALSE (correlation statistics are computed using all of the nonmissing pairs of variables).\n\n Tip: Using NOMISS=TRUE is computationally more efficient.\n\n WEIGHT = numeric-column \n specifies a weighting variable to use in the calculation of Pearson weighted product-moment correlation. \n The observations with missing weights are excluded from the analysis. \n Default: For observations with nonpositive weights, weights are set to zero and the observations are \n included in the analysis.\n\n Tip: You can include EXCLNPWGT among the correlation-options to exclude observations with negative or \n zero weights from the analysis. If you use this WEIGHT correlation-option , consider which value of the \n VARDEF= correlation-option is appropriate.\n\n DF | N | WDF | WEIGHT \n specifies the variance divisor in the calculation of variances and covariances. \n Default: DF\n\n DF Degrees of Freedom (N - 1) \n N number of observations \n WDF sum of weights minus 1 (WEIGHT - 1) \n WEIGHT sum of weights \n\nInteraction: This option has effect only when the INSET= option is also used.\n\nTip: See PROC CORR in the for statistical and computational details of these options."},"StatementOptionType":"V","SubOptionsKeywords":"EXCLNPWGT=|NOMISS=|WEIGHT=|VARDEF="},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies a column for marker labels. The position of the labels are adjusted to prevent them from overlapping.\n\nDefault: no default\n\nInteraction: If a numeric column is specified and the column has no format, a BEST6. format is applied.\n\nInteraction: This option is ignored if the MARKERCHARACTER= option is used, which displays labels \ninstead of the markers."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the DATALABEL= option must also be specified.\n\nInteraction: This option is ignored if the MARKERCHARACTER= option is specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the markers. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"DIAGONAL=","StatementOptionHelp":{"#cdata":"Specifies whether the diagonal cells of the matrix are labeled with the labels (names) of the required \narguments, or with a graph. The graph for each diagonal cell consists of an overlay combination of a \nhistogram, normal, or kernel curves. \n\nDefault: Variable labels (or names) are displayed in the diagonal cells."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LABEL","@Value2":"<(graph-list)>"},"StatementOptionToolTips":{"@ToolTip1":"The diagonal cells of the matrix are labeled with the labels (names) of the required arguments.","@ToolTip2":"The diagonal cells of the matrix are labeled with a graph. The graph for each diagonal cell consists of an overlay combination of a histogram, normal, or kernel curves. The graph-list can specify one or more of the following: HISTOGRAM specifies a histogram NORMAL specifies a normal density curve KERNEL specifies a kernel density estimate. Requirement: When specifying multiple graphs in the graph-list , you must separate the values with a space. For example, the following specification requests both a histogram and a normal density curve in each diagonal cell: DIAGONAL=(HISTOGRAM NORMAL) Interaction: The computation for HISTOGRAM, NORMAL, and KERNEL is always computed on all the data for the current variable (including the FREQ= variable, if used). The GROUP= option is not considered in any of these computations. Interaction: This option is ignored if the ROWVARS= option is used. Tip: When this option is specified, the labels are drawn around the outside of the matrix, and the matrix axes are dropped."}},{"StatementOptionName":"ELLIPSE=","StatementOptionHelp":{"#cdata":"[Syntax: ELLIPSE=()] \n \nSpecifies that a confidence ellipse be included in each cell containing a scatter plot. The ellipse \nis always drawn behind the scatter points. The ellipse-suboptions include the following:\n\n TYPE=MEAN | PREDICTED \n specifies the type of ellipse. \n Default: MEAN\n\n MEAN specifies a confidence ellipse of the mean \n PREDICTED specifies a prediction ellipse of the data \n\n ALPHA=positive-number \n specifies the confidence level to compute for each ellipse. \n Default: .05; Range: 0 < number < 1\n\n Tip: ALPHA=.05 represents a 95% confidence level.\n Default: TYPE=MEAN ALPHA=.05\n You can set defaults by specifying the option without arguments: ELLIPSE=( ).\n\n Interaction: The ellipse may be clipped by the data range for the scatter points.\n\n Interaction: The ellipse is always computed on all the data for the current pair of X and Y variables \n (including the FREQ= variable, if used). The GROUP= option is not considered when computed the ellipse.\n\n Tip: The display properties of each ellipse are controlled by the style elements:\n\n o The GraphDataDefault element controls the outline and fill properties. \n o The GraphEllipse element controls the whether the outline, fill, or both are shown. "},"StatementOptionType":"V","SubOptionsKeywords":"TYPE=|MEAN|ALPHA="},{"StatementOptionName":"FREQ=","StatementOptionHelp":{"#cdata":"[Syntax: FREQ=numeric-column | expression] \n \nSpecifies a column that indicates a frequency count for each observation of the input data object. \nIf n is the value of the FREQ variable for a given observation, then that observation is plotted n times. \n\nDefault: Each observation is plotted once.\n\nRestriction: If the value of the numeric-column is missing or is less than 1, the observation is not \nused in the analysis. If the value is not an integer, only the integer portion is used."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of scatter markers, error bars, and data labels for each unique group value \nof the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of color \nand marker symbol. Markers vary according to the ContrastColor and MarkerSymbol attributes of the \nGraphData1 - GraphDataN style elements.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used \nto alter the default sequence of markers and colors.\n\nInteraction: The marker size is set by the MARKERATTRS= option.\n\nInteraction: If the MARKERCHARACTER= and MARKERCOLORGRADIENT= options are used, their settings override \nthe group settings for marker symbol and marker color.\n\nInteraction: The representations that are used to identify the groups can be overridden. For example, \neach distinct group value is represented by a different marker symbol, but the MARKERATTRS=(SYMBOL=marker) \noption could be used to assign the same symbol to all of the plot's marker symbols, letting marker color \nindicate group values. Likewise, MARKERATTRS=(COLOR=color) could be used to assign the same color to all \nmarkers, letting marker symbol indicate group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column | expression] \n \nSpecifies indices for mapping marker attributes (color and symbol) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: If the MARKERCHARACTER= and MARKERCOLORGRADIENT= options are used, their settings \noverride the group settings for marker symbol and marker color.\n\nInteraction: The index values are 1-based indices. For the style elements GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number \nless than N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"INSET=","StatementOptionHelp":{"#cdata":"[Syntax: INSET=(info-options)] \n \nSpecifies what information is displayed in an inset. Insets appear in all cells of the matrix except \nthe diagonal and are displayed as a small table of name-value pairs. \n\nDefault: no default\n\nThe following info-options are available:\n\n NOBS Total number of observations where both the X and Y variables have non-missing values. If the \n FREQ= is used this number is adjusted accordingly. The value of NOBS may be further adjusted by the \n use of the NOMISS=, WEIGHT=, and EXCLNPWGT= suboptions of the CORROPTS= option. \n \n PEARSON The Pearson product-moment correlation. The computation of the correlation is affected by \n the FREQ= and CORROPTS= options. The computation is not done on a per group value when GROUP= is used. \n \n PEARSONPVAL The probability value for the Pearson product-moment correlation. \n\nTip: The location and appearance of the inset is controlled by the INSETOPTS= option.\n\nDiscussion: A typical inset looks like this:\n \n N 150 \n r 0.96287 \n p(r) <.0001 \n\nIn this example,\n\nNOBS is represented by N \nPEARSON is represented by r \nPEARSONPVAL is represented by p(r)"},"StatementOptionType":"V","SubOptionsKeywords":"NOBS|PEARSON|PEARSONPVAL"},{"StatementOptionName":"INSETOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: INSETOPTS=(appearance-options)] \n \nSpecifies location and appearance options for the inset information. The appearance-options can \nbe any one or more of the settings that follow. The options must be enclosed in parentheses, and \neach option is specified as a name=value pair.\n\n AUTOALIGN=NONE | AUTO | (location-list) \n specifies whether the inset is automatically aligned within the layout. \n\n BACKGROUNDCOLOR= style-reference | color \n specifies the color of the inset background. Default is TRANSPARENT.\n\n BORDER=TRUE | FALSE\n specifies whether a border is displayed around the inset. Default is FALSE.\n\n HALIGN=LEFT | CENTER | RIGHT \n specifies the horizontal alignment of the inset. Default is LEFT.\n\n OPAQUE= boolean \n specifies whether the inset background is opaque (TRUE) or transparent (FALSE). Default is FALSE.\n\n TEXTATTRS=style-element | style-element (text-options) | (text-options) \n specifies the text properties of the entire inset.\n\n VALIGN=TOP | CENTER |BOTTOM \n specifies the vertical alignment of the inset. Default is TOP."},"StatementOptionType":"V","SubOptionsKeywords":"AUTOALIGN=|BACKGROUNDCOLOR=|BORDER=|HALIGN=|OPAQUE=|TEXTATTRS=|VALIGN="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the data markers. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the MarkerSymbol and ContrastColor attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:MarkerSize style reference. \n\nInteraction: If the MARKERCOLORGRADIENT= option is specified, this option's COLOR= setting is ignored.\nInteraction: If the MARKERCHARACTER= option is specified, its SYMBOL= and WEIGHT= settings are ignored.\n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"MARKERCHARACTER=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCHARACTER=column | expression] \n \nSpecifies a column that defines strings to be used instead of marker symbols. \n\nDefault: no default\n\nInteraction: This option overrides the DATALABEL= option.\n\nInteraction: If the GROUP= option is also used, color will be displayed for a DISCRETE legend, but \nthe character will not be displayed in the legend.\n\nTip: If the GROUP= option is also specified, the same colors are applied to the text strings as would \nhave been applied to markers.\n\nTip: If a numeric column is used, its values are converted to strings using the format associated with \nthe column or BEST6. if no format is defined.\n\nTip: Each string is centered horizontally and vertically at the data point. The data point positions \nare not adjusted to prevent text overlap."},"StatementOptionType":"V"},{"StatementOptionName":"MARKERCHARACTERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCHARACTERATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the marker characters. \n\nWhen specifying the attributes for text, the available text-options can be any one or more of the following \nsettings. The options must be enclosed in parentheses, and each option is specified as a name=value pair. \nIn all cases, the value may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text. \n If you use a color , SAS/GRAPH accepts color names, such as RED, or color codes, such as CXFF0000 or #FF0000. \n Color names must not exceed 64 characters. Color codes must not exceed 8 characters and must be in a valid \n SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n \nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the MARKERCHARACTER= option must also be used. \n\nTip: When the GROUP= option is also specified, each distinct group value may be represented by a different \ncolor (depending on the ODS style setting or the setting on the INDEX= option). The marker character that is \nassociated with the group is assigned the group color. This option's COLOR= suboption can be used to specify \na single color for all marker characters in a graph, without affecting items that have the group color, such \nas error bars and marker symbols."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"MARKERCOLORGRADIENT=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERCOLORGRADIENT=numeric-column | expression] \n \nSpecifies the column that is used to map marker colors to a continuous gradient. \nDefault: no default\n\nRestriction: To display a legend with this option in effect, you must use a CONTINUOUSLEGEND statement, \nnot a DISCRETELEGEND statement.\n\nInteraction: This option overrides the COLOR= setting of the MARKERATTRS= or MARKERCHARACTERATTRS= option.\n\nTip: This option can be used to add a second response variable to an analysis. For example, in an analysis \nof weight by height, an age column might be specified by the MARKERCOLORGRADIENT= option so that the change \nin the gradient color of the markers reflects the change in age. \n\nTip: By default, the color range is determined by the ThreeColorAltRamp style element. The COLORMODEL= \noption allows a different color range to be used."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \n\nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors and \nmarker symbols between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"REVERSECOLORMODEL=","StatementOptionHelp":{"#cdata":"Specifies whether to reverse the gradient (color ramp) defined by the COLORMODEL= option. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to reverse the gradient (color ramp) defined by the COLORMODEL= option.","@ToolTip2":"Specifies to reverse the gradient (color ramp) defined by the COLORMODEL= option."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of rolename = column pairs. \nThe following example assigns column ID to the user-defined role TIP1, and columns AGE, HEIGHT, WEIGHT \nto the user-defined roles TIP2, TIP3, and TIP4.\n \n ROLENAME=(TIP1=ID TIP2=AGE TIP3=HEIGHT TIP4=WEIGHT) \n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, Y, \nDATALABEL, MARKERCHARACTER, MARKERCOLORGRADIENT, GROUP, and INDEX.\n\nInteraction: For this option to take effect, the TIP= option must also be used.\n\nTip: This option provides a way to add to the data columns that appear in tooltips specified by the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"ROWVARS=","StatementOptionHelp":{"#cdata":"[Syntax: ROWVARS=(column-list)] \n \nSpecifies a secondary list of columns to be paired with the required column list that is specified \nby the SCATTERPLOTMATRIX statement. \n\nDefault: no default\n\nInteraction: When this option is specified, the DIAGONAL= option is ignored.\n\nTip: The labels for the variables appear vertically on the left side of the matrix."},"StatementOptionType":"V"},{"StatementOptionName":"START=","StatementOptionHelp":{"#cdata":"Indicates whether to start populating the matrix from the top-left or bottom-left corner. \n \nDefault: TOPLEFT."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOPLEFT","@Value2":"BOTTOMLEFT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to start populating the matrix from the top-left corner.","@ToolTip2":"Specifies to start populating the matrix from the bottom-left corner."}},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over the scatter points. If this \noption is used, it replaces all the information displayed by default. Roles for columns that do not \ncontribute to the scatter plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: \ncurrent X, current Y, DATALABEL, MARKERCHARACTER, MARKERCOLORGRADIENT, GROUP, and INDEX.\n\n(role-list) \nan ordered, blank-separated list of unique SCATTERPLOTMATRIX and user-defined roles. SCATTERPLOT roles \ninclude: X, Y, GROUP, DATALABEL, MARKERCHARACTER, and MARKERCOLORGRADIENT. \nUser-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles TIP1, TIP2, TIP3, and TIP4.\n \n ROLENAME=(TIP1=ID TIP2=AGE TIP3=HEIGHT TIP4=WEIGHT) \n TIP= (TIP1 TIP2 TIP3 TIP4) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= and \nTIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=ID TIP2=AGE TIP3=HEIGHT TIP4=WEIGHT) \n TIP=(TIP1 TIP2 TIP3 TIP4) \n TIPFORMAT=(TIP3= 4.1) \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \n\nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=ID TIP2=AGE TIP3=HEIGHT TIP4=WEIGHT) \n TIP=(TIP1 TIP2 TIP3 TIP4) \n TIPLABEL=(TIP3=\"Height in Inches\" \n TIP4=\"Weight in Pounds\") \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"WALLCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: WALLCOLOR=style-reference | color] \n \nSpecifies the fill color of the plot wall area. \n\nDefault: The GraphWalls:Color style reference.\n\nstyle-reference \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: This option is ignored if WALLDISPLAY=NONE or WALLDISPLAY=(OUTLINE)."},"StatementOptionType":"C"},{"StatementOptionName":"WALLDISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: WALLDISPLAY=STANDARD | ALL | NONE | (display-options)] \n \nSpecifies whether the plot's wall and wall outline are displayed. \n\nDefault: STANDARD \n\nTip: Use the WALLCOLOR= option to control the fill color of the wall.\n\nTip: The appearance attributes of the wall outline are set by the GraphAxisLine style element."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a filled wall. The setting of the FRAMEBORDER= ON | OFF attribute of the GraphWalls style element determines whether the wall outline is displayed.","@ToolTip2":"Displays a filled, outlined wall.","@ToolTip3":"Displays no wall, no wall outline.","@ToolTip4":"These options must be enclosed in parentheses and include one of the following: OUTLINE displays the wall outline. FILL displays a filled wall area."}}]}},{"StatementName":"SERIESPLOT","StatementHelp":{"#cdata":"Syntax: SERIESPLOT X= column | expression\n Y= column | expression ; \n \nDisplays a series of line segments that connect observations of input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column for the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=column | expression] \n \nSpecifies the column for the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"BREAK=","StatementOptionHelp":{"#cdata":"Breaks the plot line at missing values of the X or Y variable. \n\nDefault: FALSE\n\nTip: When this options is set to FALSE, missing values are skipped and a continuous line is drawn."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to break the plot line at missing values of the X or Y variable.","@ToolTip2":"Specifies to break the plot line at missing values of the X or Y variable."}},{"StatementOptionName":"CONNECTORDER=","StatementOptionHelp":{"#cdata":"Specifies how to connect the data points to form the series line. \n\nDefault: XVALUES \n\nTip: For certain kinds of series lines (for example, time series) when the input data may not be \nsorted by the X variable, set this option to XAXIS to assure the expected connect order."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"XVALUES","@Value2":"XAXIS"},"StatementOptionToolTips":{"@ToolTip1":"Connects data points in the order read from the X variable.","@ToolTip2":"Connects data points as they occur min-to-max along the X axis."}},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the series line. \n\nDefault: no default\n\nInteraction:\n o For non-grouped data, use \"string.\" \n o For grouped data, use a column to define the labels for each group value. \n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the series line labels.\nDefault:\n o For non-grouped data, the GraphValueText style element. \n o For grouped data, text color is derived from the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. The font is derived from the GraphValueText style element. \n\nInteraction: For this option to take effect, the CURVELABEL=curvelabel option must also be used.\n\nInteraction: This option's COLOR= setting overrides the colors indicated by the GROUP= option.\n\nTip: When the GROUP= option is used, each distinct group value may be represented by a different color. The series label that is associated with the group is assigned the group color. This option can be used to specify a single color for all series labels in a graph, without affecting items that have the group color, such as lines and marker symbols.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the series line label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the SERIESPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL, or DATALATTICE, where axes may be external to the grid.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve labels appear."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the series line label inside the plot area","@ToolTip2":"Places the series line label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the series label relative to the series line.\n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION=INSIDE is specified. \nThe START and END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the series label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELLOCATION=OUTSIDE. The series label will be positioned automatically near the end series line along unused axes whenever possible (typically Y2 or X2) to avoid collision with tick values.","@ToolTip2":"Forces the series label to appear near maximum series values (typically, to the right).","@ToolTip3":"Forces the series label to appear near minimum series values (typically, to the left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the series label to appear near the beginning of the curve. Particularly useful when the curve line has a spiral shape.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the series label to appear near the end of the curve. Particularly useful when the curve line has a spiral shape."}},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies a column that will supply values for the data point labels. \nDefault: no default\n\nTip: The position of the labels are adjusted to prevent the labels from overlapping."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the DATALABEL= option must also be specified.\n\nInteraction: This option's COLOR= setting overrides the colors indicated by the GROUP= option.\n\nTip: When the GROUP= option is used, each distinct group value may be represented by a different color. \nThe data label that is associated with the group is assigned the group color. This option can be used \nto specify a single color for all data labels in a graph, without affecting items that have the group \ncolor, such as error bars and marker symbols."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the line and markers, when displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies additional feature to display with the series line. \n\nDefault: STANDARD \n\nTip: Use the MARKERATTRS= and LINEATTRS= options to control the appearance of the line and markers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a series line without markers.","@ToolTip2":"Displays a series line with markers.","@ToolTip3":"A parenthesized list of options that must include the following: MARKERS displays a series line with markers "},"SubOptionsKeywords":"MARKERS"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a separate series plot for each unique group value of the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of color, \nline pattern, and marker symbol. Lines and markers vary according to the ContrastColor, LineStyle and \nMarkerSymbol attributes of the GraphData1 - GraphDataN style elements. Line thickness (for grouped and \nun-grouped data) is controlled by the LINEATTRS= option.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used to \nalter the default sequence of marker symbols, colors, and line patterns.\n\nInteraction: The marker size is set by the MARKERATTRS= option.\n\nTip: The representations that are used to identify the groups can be overridden. For example, each \ndistinct group value is often represented by a different line pattern, but the LINEATTRS=(PATTERN=pattern) \noption could be used to assign the same line pattern to all of the plot's line patterns, letting line color \nindicate group values. Likewise, LINEATTRS= ( COLOR= color ) could be used to assign the same color to all \nlines, letting line pattern indicate group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column] \n \nSpecifies indices for mapping series-line attributes (color, marker symbol, and line pattern) to one \nof the GraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the results \nare unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label to be used in a legend. \nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the series line. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor and LineStyle attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:LineThickness style reference.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the data markers. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the MarkerSymbol and ContrastColor attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:MarkerSize style reference. \n\nInteraction: DISPLAY=ALL or DISPLAY=(MARKERS) must be set for this option to have any effect.\n\nInteraction: This option's COLOR= suboption overrides the default behavior for grouped data: all \nmarkers the same color and the marker symbol alone distinguishes the markers.\n\nInteraction: This option's SYMBOL= suboption overrides the default behavior for grouped data: it \nholds the marker constant across group values and marker color alone distinguishes the markers.\n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \n\nDefault: no default\n\n(role-name-list) \na blank-separated list of rolename = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, \nY, CURVELABEL, DATALABEL, and GROUP.\n\nInteraction: For this option to take effect, the TIP= option must also be used.\n\nTip: This option provides a way to add to the data columns that appear in tool tips specified \nby the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a needle line or marker. \nIf this option is used, it replaces all the information displayed by default. Roles for columns \nthat do not contribute to the needle plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: \nX, Y, DATALABEL, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique NEEDLEPLOT and user-defined roles. NEEDLEPLOT roles \ninclude X, Y, DATALABEL, and GROUP. User-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X and Y as well \nas the column OBS which is not assigned to any pre-defined NeedlePlot role. The OBS column must \nfirst be assigned a role.\n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X Y) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the \nIMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= \nand TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y) \n TIPFORMAT=(TIP1=4.) \n\nRequirement: This option provides a way to control the formats of columns that appear in tool tips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y) \n TIPLABEL=(TIP1=\"Observation #\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect. See the ROLENAME= option."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when a point or a segment of the curve is selected. \n\nDefault: no default\n\ncharacter-column \neach value of the column must be a valid HTML page reference (HREF). \nFor example, http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate selectable bars, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination.\n\nTip: The URL value may be blank for some X and Y pairs, meaning that no action is taken when the \ncorresponding needle or marker is selected. The URL value may be the same for any X and Y pairs, \nmeaning that the same action is taken when the needle or marker for those X and Y pairs are selected."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"STEPPLOT","StatementHelp":{"#cdata":"Syntax: STEPPLOT X= column | expression\n Y= numeric-column | expression ; \n \nDisplays a series of horizontal and vertical line segments that connect observations of input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=column | expression] \n \nSpecifies the column of the X values."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the numeric column of the Y values."},"StatementOptionType":"RV"},{"StatementOptionName":"BREAK=","StatementOptionHelp":{"#cdata":"Breaks the plot line at missing values of the X or Y variable. \n\nDefault: FALSE\n\nTip: When this options is set to FALSE, missing values are skipped and a continuous line is drawn."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to break the plot line at missing values of the X or Y variable.","@ToolTip2":"Specifies to break the plot line at missing values of the X or Y variable."}},{"StatementOptionName":"CONNECTORDER=","StatementOptionHelp":{"#cdata":"Specifies how to connect the data points to form the step line. \n\nDefault: XVALUES \n\nTip: For certain kinds of series lines (for example, time series) when the input data may not be \nsorted by the X variable, set this option to XAXIS to assure the expected connect order."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"XVALUES","@Value2":"XAXIS"},"StatementOptionToolTips":{"@ToolTip1":"Connects data points in the order read from the X variable.","@ToolTip2":"Connects data points as they occur min-to-max along the X axis."}},{"StatementOptionName":"CURVELABEL=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABEL=\"string\"] \n \nSpecifies a label for the step line. \n\nDefault: no default\n\nInteraction:\n o For non-grouped data, use \"string.\" \n o For grouped data, use a column to define the labels for each group value. \n\nTip: The font and color attributes for the label are specified by the CURVELABELATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"CURVELABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: CURVELABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the step line labels.\nDefault:\n o For non-grouped data, the GraphValueText style element. \n o For grouped data, text color is derived from the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. The font is derived from the GraphValueText style element. \n\nInteraction: For this option to take effect, the CURVELABEL=curvelabel option must also be used.\n\nInteraction: This option's COLOR= setting overrides the colors indicated by the GROUP= option.\n\nTip: When the GROUP= option is used, each distinct group value may be represented by a different color. The series label that is associated with the group is assigned the group color. This option can be used to specify a single color for all series labels in a graph, without affecting items that have the group color, such as lines and marker symbols.\n\nThe available text-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair. In all cases, the \nvalue may be a style-reference in the form style-element:style-attribute .\n\n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR \n for text. If you use a color, SAS/GRAPH accepts color names, such as RED, or color codes, such as \n CXFF0000 or #FF0000. Color names must not exceed 64 characters. Color codes must not exceed 8 characters \n and must be in a valid SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY. \n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"CURVELABELLOCATION=","StatementOptionHelp":{"#cdata":"Specifies the location of the step label relative to the plot area. \n\nDefault: INSIDE \n\nRestriction: OUTSIDE cannot be used when the STEPPLOT is used in multicell layouts such as LATTICE, \nDATAPANEL, or DATALATTICE, where axes may be external to the grid.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELPOSITION= option to determine \nwhere the curve labels appear."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Places the step label inside the plot area","@ToolTip2":"Places the step label outside the plot area"}},{"StatementOptionName":"CURVELABELPOSITION=","StatementOptionHelp":{"#cdata":"Specifies the position of the step line labels relative to the step line.\n\nDefault: AUTO when CUVELABELLOCATION=OUTSIDE. END when CURVELABELLOCATION=INSIDE. \n\nRestriction: The AUTO setting is not supported if CURVELABELLOCATION= INSIDE is specified. \nThe START and END settings are not supported if CURVELABELLOCATION=OUTSIDE is specified.\n\nInteraction: For this option to take effect, the CURVELABEL= option must also be specified.\n\nInteraction: This option is used in conjunction with the CURVELABELLOCATION= option to determine \nwhere the series label appears."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"MAX","@Value3":"MIN","@Value4":"START","@Value5":"END"},"StatementOptionToolTips":{"@ToolTip1":"Only used when CURVELABELPOSITION=OUTSIDE. The step label is positioned automatically near the step boundary along unused axes whenever possible (typically Y2 and X2) to avoid collision with tick values.","@ToolTip2":"Forces the step label to appear near maximum step values (typically, upper right).","@ToolTip3":"Forces the step label to appear near minimum step values (typically, lower left).","@ToolTip4":"Only used when CURVELABELLOCATION=INSIDE. Forces the step label to appear near the beginning of the steps. Particularly useful when the step line \"spirals\" around.","@ToolTip5":"Only used when CURVELABELLOCATION=INSIDE. Forces the step label to appear near the end of the steps. Particularly useful when the step line \"spirals\" around."}},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies a column that will supply values for the data point labels. \nDefault: no default\n\nTip: The position of the labels are adjusted to prevent the labels from overlapping."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the DATALABEL= option must also be specified.\n\nInteraction: This option's COLOR= setting overrides the colors indicated by the GROUP= option.\n\nTip: When the GROUP= option is used, each distinct group value may be represented by a different color. \nThe data label that is associated with the group is assigned the group color. This option can be used \nto specify a single color for all data labels in a graph, without affecting items that have the group \ncolor, such as error bars and marker symbols."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the step lines, markers, and error bars, when displayed. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display markers on the step line. \n\nDefault: STANDARD \n\nTip: Use the MARKERATTRS= and LINEATTRS= options to control the appearance of the line and markers."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays a step line without markers.","@ToolTip2":"Displays a step line with markers.","@ToolTip3":"A parenthesized list of options that must include the following: MARKERS displays a step line with markers "},"SubOptionsKeywords":"MARKERS"},{"StatementOptionName":"ERRORBARATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORBARATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the error bars that are associated with the data points. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be \n specified as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), \n 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) \n 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). \n Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS.\n\nDefault:\n o For non-grouped data, the GraphError style element. \n o For grouped data, the LineStyle and LineThickness attributes of the GraphError style element and \n the ContrastColor attribute of the GraphData1 - GraphDataN style elements. (The LineStyle does not \n apply to the \"serif\" parts of the error bars.) \n\nInteraction: For this option to take effect, error bars must be displayd by the ERRORLOWER= or \nERRORUPPER= options."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"ERRORLOWER=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORLOWER=numeric-column | expression] \n \nSpecifies the values of the lower endpoints on the Y error bars. \nDefault: The lower segment of the error bars is not drawn.\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nTip: The errorbar values must be absolute data values, not data values relative to the value of the bar.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"ERRORUPPER=","StatementOptionHelp":{"#cdata":"[Syntax: ERRORUPPER=numeric-column | expression] \n \nSpecifies the values of the upper endpoints on the Y error bars. \nDefault: The upper segment of the error bars is not drawn.\n\nInteraction: If the GROUP= option is specified, this option is ignored.\n\nTip: The errorbar values must be absolute data values, not data values relative to the value of the bar.\n\nTip: The appearance of the error bars is controlled by the ERRORBARATTRS= option."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of lines, markers, and data labels for each unique group value of the specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination of color, \nline pattern, and marker symbol. Lines and markers vary according to the ContrastColor, LineStyle and \nMarkerSymbol attributes of the GraphData1 - GraphDataN style elements. Line thickness (for grouped and \nun-grouped data) is controlled by the LINEATTRS= option.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option is used to \nalter the default sequence of marker symbols, colors, and line patterns.\n\nInteraction: The marker size is set by the MARKERATTRS= option.\n\nTip: The representations that are used to identify the groups can be overridden. For example, each \ndistinct group value is often represented by a different line pattern, but the LINEATTRS=(PATTERN=pattern) \noption could be used to assign the same line pattern to all of the plot's line patterns, letting line color \nindicate group values. Likewise, LINEATTRS= ( COLOR= color ) could be used to assign the same color to all \nlines, letting line pattern indicate group values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column] \n \nSpecifies indices for mapping step-line attributes (color, marker symbol, and line pattern) to one \nof the GraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, the results \nare unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements in GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number less \nthan N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"JOIN=","StatementOptionHelp":{"#cdata":"Specifies whether the steps are connected. \n\nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the steps are not connected.","@ToolTip2":"Specifies that the steps are connected."}},{"StatementOptionName":"JUSTIFY=","StatementOptionHelp":{"#cdata":"Specifies the location of the data point relative to the step. \n \nDefault: LEFT"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"LEFT","@Value2":"CENTER","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a LEFT location of the data point relative to the step.","@ToolTip2":"Specifies a CENTER location of the data point relative to the step.","@ToolTip3":"Specifies a RIGHT location of the data point relative to the step."}},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \nDefault: The Y-variable label. If a label is not defined, the Y-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the step line connecting the data points. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor and LineStyle attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:LineThickness style reference.\n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options)] \n \nSpecifies the attributes of the data markers. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the MarkerSymbol and ContrastColor attributes of the \n GraphData1 - GraphDataN style elements, and the GraphDataDefault:MarkerSize style reference. \n\nInteraction: DISPLAY=ALL or DISPLAY=(MARKERS) must be set for this option to have any effect.\n\nInteraction: This option's COLOR= suboption overrides the default behavior for grouped data: all \nmarkers the same color and the marker symbol alone distinguishes the markers.\n\nInteraction: This option's SYMBOL= suboption overrides the default behavior for grouped data: it \nholds the marker constant across group values and marker color alone distinguishes the markers.\n\nWhen specifying the attributes for a data marker, the available marker-options can be any one \nor more of the following settings. The options must be enclosed in parentheses, and each option \nis specified as a name=value pair. In all cases, the value may be a style-reference in the form \nstyle-element:style-attribute:\n\n COLOR=style-reference | color \n specifies the color of the marker. If you use a style-reference, the style-attribute should be a \n valid attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to \n use CONTRASTCOLOR for markers. For grouped data, this option keeps all markers the same color and \n the marker symbol alone distinguishes the group values. If you use a color, SAS/GRAPH accepts color \n names, such as RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such as RGB, \n CMYK, HLS, or HSV (HSB).\n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). If you use a style-reference, the style-attribute \n should be MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|WEIGHT="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \n\nDefault: no default\n\n(role-name-list) \na blank-separated list of rolename = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, \nY, CURVELABEL, DATALABEL, and GROUP.\n\nInteraction: For this option to take effect, the TIP= option must also be used.\n\nTip: This option provides a way to add to the data columns that appear in tool tips specified \nby the TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over the step line. If this \noption is used, it replaces all the information displayed by default. Roles for columns that do \nnot contribute to the step plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: \nX, Y, CURVELABEL, DATALABEL, ERRORLOWER, ERRORUPPER, and GROUP.\n\n(role-list) \nan ordered, blank-separated list of unique STEPPLOT and user-defined roles. STEPPLOT roles include \nX, Y, CURVELABEL, DATALABEL, ERRORLOWER, ERRORUPPER, and GROUP. User-defined roles are defined with \nthe ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X and Y as well as the column \nOBS which is not assigned to any pre-defined StepPlot role. The OBS column must first be assigned a role.\n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X Y) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= and \nTIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role or BEST6. if no format is assigned \nto a numeric column.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X ERRORUPPER ERRORLOWER) \n TIPFORMAT=(ERRORUPPER=5.3 ERRORLOWER=5.3) \n\nRequirement: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X ERRORUPPER ERRORLOWER) \n TIPLABEL=(ERRORUPPER=\"1 STD ERROR\" \n ERRORLOWER=\"-1 STD ERROR\") \n\nRequirement: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used. Columns must be assigned to the roles for \nthis option to have any effect."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"[Syntax: URL=character-column] \n \nSpecifies an HTML page to display when a step line segment is selected. \n\nDefault: no default\n\ncharacter-column \neach value of the column must be a valid HTML page reference (HREF). \nFor example, http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate selectable bars, you must include an ODS GRAPHICS ON statement that \nhas the IMAGEMAP option specified, and write the graphs to the ODS HTML destination."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"SURFACEPLOTPARM","StatementHelp":{"#cdata":"Syntax: SURFACEPLOTPARM X= numeric-column | expression\n Y= numeric-column | expression\n Z= numeric-column | expression ; \n \nCreates a three-dimensional surface representing a response variable evaluated over a grid \nof X and Y values."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the X coordinates of the grid."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the Y coordinates of the grid."},"StatementOptionType":"RV"},{"StatementOptionName":"Z=","StatementOptionHelp":{"#cdata":"[Syntax: Z=numeric-column | expression] \n \nSpecifies the height of response values. \n\nNote: The input data should be sorted by both 1) the Y column and 2) the X column. The sort direction \nfor Y should be ascending. The sort direction of X be either ascending or descending."},"StatementOptionType":"RV"},{"StatementOptionName":"COLORMODEL=","StatementOptionHelp":{"#cdata":"[Syntax: COLORMODEL=style-element] \n \nSpecifies a style element that is used to determine the gradient surface colors. \nDefault: The ThreeColorRamp style element.\n\nstyle-element \nName of a style element. The style element can contain these style attributes: \n\n STARTCOLOR \n Specifies a color for the smallest data value of the SURFACECOLORGRADIENT variable. \n \n NEUTRALCOLOR \n Specifies a color for the midpoint of the range Of the SURFACECOLORGRADIENT variable. \n \n ENDCOLOR \n Specifies a color for the highest data value of the SURFACECOLORGRADIENT variable. \n \nInteraction: For this option to have any effect, the SURFACECOLORGRADIENT= option must also be used.\n\nTip: The REVERSECOLORMODEL= option can be used to reverse the start and end colors of the ramp assigned \nto the colormodel."},"StatementOptionType":"V","SubOptionsKeywords":"STARTCOLOR|NEUTRALCOLOR|ENDCOLOR"},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the surface. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)"},"StatementOptionType":"V"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n \nSpecifies the color of the filled surface or the wireframe mesh. \n\nWhen specifying the attributes for an area fill, the COLOR fill-option is the only option that \nis currently available. The option must be enclosed in parentheses and specified as a name=value \npair. The value may be a style-reference in the form style-element:style-attribute.\n\n COLOR=style-reference | color \n specifies the fill color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n the COLOR attribute for fill areas. If you use a color, SAS/GRAPH accepts color names, such as \n RED, or color codes, such as CXFF0000 or #FF0000. Color names must not exceed 64 characters. \n Color codes must not exceed 8 characters and must be in a valid SAS color-naming scheme, such \n as RGB, CMYK, HLS, or HSV (HSB).\n\nDefault: The GraphDataDefault:Color style reference.\n\nInteraction: The SURFACECOLORGRADIENT= option is ignored if this option is specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL= \"string\"] \n \nSpecifies a label for use in a legend. \n\nDefault: The Z-variable label. If a label is not defined, the Z-variable name.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot type be used for determining default \naxis features. \n\nDefault: FALSE\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot and the plot type not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot and the plot type be used for determining default axis features."}},{"StatementOptionName":"REVERSECOLORMODEL=","StatementOptionHelp":{"#cdata":"Specifies whether to reverse a gradient (color ramp) defined by the COLORMODEL= option. \n\nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies not to reverse the gradient (color ramp) defined by the COLORMODEL= option.","@ToolTip2":"Specifies to reverse the gradient (color ramp) defined by the COLORMODEL= option."}},{"StatementOptionName":"SURFACECOLORGRADIENT=","StatementOptionHelp":{"#cdata":"[Syntax: SURFACECOLORGRADIENT=numeric-column] \n \nSpecifies a column that is used to map surface colors to a continuous gradient.\n\nDefault: no default\n\nInteraction: This options is ignored if the FILLATTRS= option is specified."},"StatementOptionType":"V"},{"StatementOptionName":"SURFACETYPE=","StatementOptionHelp":{"#cdata":"Specifies how the surface is displayed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FILLGRID","@Value2":"FILL","@Value3":"WIREFRAME"},"StatementOptionToolTips":{"@ToolTip1":"Surface is displayed as a filled surface with superimposed grid lines.","@ToolTip2":"Surface is displayed as a filled surface without grid lines.","@ToolTip3":"Surface is displayed as an unfilled surface with grid lines."}}]}},{"StatementName":"VECTORPLOT","StatementHelp":{"#cdata":"Syntax: VECTORPLOT X= numeric-column | expression\n Y= numeric-column | expression\n XORIGIN= numeric-constant | numeric-column | expression\n YORIGIN= numeric-constant | numeric-column | expression ; \n \nCreates a plot of vectors (directed line segments)."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"X=","StatementOptionHelp":{"#cdata":"[Syntax: X=numeric-column | expression] \n \nSpecifies the column for the X values of the vector endpoints."},"StatementOptionType":"RV"},{"StatementOptionName":"Y=","StatementOptionHelp":{"#cdata":"[Syntax: Y=numeric-column | expression] \n \nSpecifies the column for the Y values of the vector endpoints."},"StatementOptionType":"RV"},{"StatementOptionName":"XORIGIN=","StatementOptionHelp":{"#cdata":"[Syntax: XORIGIN=numeric-constant | numeric-column | expression] \n \nSpecifies the X data coordinate of the vector origin."},"StatementOptionType":"RV"},{"StatementOptionName":"YORIGIN=","StatementOptionHelp":{"#cdata":"[Syntax: YORIGIN=number | numeric-column | expression] \n \nSpecifies the Y data coordinate of the vector origin."},"StatementOptionType":"RV"},{"StatementOptionName":"ARROWDIRECTION=","StatementOptionHelp":{"#cdata":"Specifies the placement of the arrowhead(s) at the end of the vector. \n\nDefault: OUT"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OUT","@Value2":"IN","@Value3":"BOTH"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a single arrowhead, pointing away from the origin, at the end of the vector away from the origin.","@ToolTip2":"Specifies a single arrowhead, pointing toward the origin, at the end of the vector near the origin.","@ToolTip3":"Specifies two arrowheads, one pointing away from the origin, at the end of the vector away from the origin and the other pointing toward the origin, at the end of the vector near the origin."}},{"StatementOptionName":"ARROWHEADS=","StatementOptionHelp":{"#cdata":"Specifies whether arrowheads are displayed on the vectors. \n\nDefault: TRUE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that arrowheads are not displayed on the vectors.","@ToolTip2":"Specifies that arrowheads are displayed on the vectors."}},{"StatementOptionName":"ARROWHEADSHAPE=","StatementOptionHelp":{"#cdata":"Specifies the shape of the arrowheads. \n \nDefault: OPEN\n\nInteraction: This option is ignored if ARROWHEADS=FALSE.\n\nTip: Use the ARROWDIRECTION= option to control arrow direction."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OPEN","@Value2":"CLOSED","@Value3":"FILLED","@Value4":"BARBED"},"StatementOptionToolTips":{"@ToolTip1":"Open arrow head.","@ToolTip2":"Closed arrow head.","@ToolTip3":"Filled arrow head.","@ToolTip4":"Barbed arrow head."}},{"StatementOptionName":"CLIP=","StatementOptionHelp":{"#cdata":"Specifies whether the origin is considered when determining the data ranges for the axes. \n\nDefault: FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the origin is not considered when determining the data ranges for the axes.","@ToolTip2":"Specifies that the origin is considered when determining the data ranges for the axes."}},{"StatementOptionName":"DATALABEL=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABEL=column] \n \nSpecifies labels at the ends of the vectors. \nDefault: no default\n\nTip: The position of the labels are automatically adjusted to prevent the labels from colliding \nwith other labels and other arrows."},"StatementOptionType":"V"},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the data labels. \n\n style-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\n style-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n (text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault:\n o For non-grouped data, the GraphDataText style element. \n o For grouped data, the GraphData1:ContrastColor - GraphDataN:ContrastColor style references. \n\nInteraction: For this option to take effect, the DATALABEL= option must also be specified."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"[Syntax: DATATRANSPARENCY=number] \n \nSpecifies the degree of the transparency of the vector line and arrow. \n\nDefault: 0\n\nRange: 0 (opaque) to 1 (entirely transparent)."},"StatementOptionType":"V"},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"[Syntax: GROUP=column | expression] \n \nCreates a distinct set of vector lines and data label colors for each unique group value of \nthe specified column. \n\nDefault: Each distinct group value may be represented in the graph by a different combination \nof color and line pattern. Lines vary according to the ContrastColor and LineStyle attributes \nof the GraphData1 - GraphDataN style elements.\n\nInteraction: The group values are mapped in the order of the data, unless the INDEX= option \nis used to alter thedefault sequence of line patterns and colors.\n\nTip: The LINEATTRS= option can be used to override the representations that are used to identify \nthe groups. For example, LINEATTRS=(PATTERN=SOLID) can be used to assign the same pattern to all \nof the lines, letting the line color distinguish group values. Likewise, LINEATTRS=(COLOR=BLACK) \ncan be used to assign the same color to all of the lines, letting the line pattern distinguish \ngroup values."},"StatementOptionType":"V"},{"StatementOptionName":"INDEX=","StatementOptionHelp":{"#cdata":"[Syntax: INDEX=positive-integer-column] \n \nSpecifies indices for mapping line attributes (color and pattern) to one of the \nGraphData1 - GranphDataN style elements. \n\nDefault: no default\n\nInteraction: For this option to take effect, the GROUP= option must also be specified.\n\nInteraction: All of the indexes for a specific group value must be the same; otherwise, \nthe results are unpredictable.\n\nInteraction: If this option is not used, then the group values are mapped in the order of the data.\n\nInteraction: The index values are 1-based indices. For the style elements GraphData1 - GraphDataN, \nif the index value is greater than N, then a modulo operation remaps that index value to a number \nless than N to determine which style element to use."},"StatementOptionType":"V"},{"StatementOptionName":"LEGENDLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LEGENDLABEL=\"string\"] \n \nSpecifies a label for use in a legend. \nDefault: The string specified on the NAME= option.\n\nInteraction: If the GROUP= option is specified, this option is ignored."},"StatementOptionType":"V"},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the vector line and arrowhead. \nDefault:\n o For non-grouped data, the GraphDataDefault style element. \n o For grouped data, the ContrastColor, LineStyle, and LineThickness attributes of the \n GraphData1 - GraphDataN style elements. \n\nThe available line-options can be any one or more of the following settings. The options must be \nenclosed in parentheses, and each option is specified as a name=value pair:\n\n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid \n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use \n CONTRASTCOLOR for lines. If you specify a style element that does not have a CONTRASTCOLOR attribute, \n the element's COLOR attribute is used. If you use a color, SAS/GRAPH accepts color names, such \n as RED, or color codes, such as CXFF0000 or #FF0000.\n\n PATTERN=style-reference | line-pattern-name | line-pattern-number specifies the line pattern. \n If you use a style-reference, the style-attribute should be LINESTYLE. Line patterns can be specified \n as a pattern name or pattern number. Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), \n 5 (LongDash) 8 (MediumDashShortDash) 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) \n 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"[Syntax: NAME=\"string\"] \n \nAssigns a name to a plot statement for reference in other template statements. \nDefault: no default\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique \nname within the template.\n\nInteraction: The string is used as the default legend label if the LEGENDLABEL= option is not used.\n\nTip: The specified name is used primarily in legend statements to coordinate the use of colors \nand line patterns between the graph and the legend."},"StatementOptionType":"V"},{"StatementOptionName":"PRIMARY=","StatementOptionHelp":{"#cdata":"Specifies that the data columns for this plot and the plot typme be used for determining default \naxis features. \n\nDefault: FALSE\n\nRestriction: This option is ignored if the plot is placed under a GRIDDED or LATTICE layout block.\n\nDetails: This option is needed only when two or more plots within an overlay-type layout contribute \nto a common axis."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the data columns for this plot not be used for determining default axis features.","@ToolTip2":"Specifies that the data columns for this plot be used for determining default axis features."}},{"StatementOptionName":"ROLENAME=","StatementOptionHelp":{"#cdata":"[Syntax: ROLENAME=( role-name-list )] \n \nSpecifies user-defined roles for information contained in data columns. \nDefault: no default\n\n(role-name-list) \na blank-separated list of rolename = column pairs. \nFor example, ROLENAME= ( TIP1=OBS ) assigns the column OBS to the user-defined role TIP1.\n\nRequirement: The role names you choose must be unique and different from the pre-defined roles X, \nY, DATALABEL, XORIGIN, YORIGIN, GROUP, and INDEX.\n\nInteraction: For this option to take effect, the TIP= option must also be used.\n\nTip: This option provides a way to add to the data columns that appear in tooltips specified by \nthe TIP= option."},"StatementOptionType":"V"},{"StatementOptionName":"SCALE=","StatementOptionHelp":{"#cdata":"[Syntax: SCALE=number] \n \nSpecifies the scale factor of the vector length. \n\nDefault: 1.0\n\nRestriction: The number specified must be greater than 0."},"StatementOptionType":"V"},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"[Syntax: TIP=(role-list)] \n \nSpecifies the information to display when the cursor is positioned over a vector line. If this \noption is used, it replaces all the information displayed by default. Roles for columns that do \nnot contribute to the vector plot may be specfied along with roles that do. \n\nDefault: The columns assigned to these roles are automatically included in the tooltip information: \nX, Y, DATALABEL, XORIGIN, YORIGIN, GROUP, and INDEX.\n\n(role-list) \nan ordered, blank-separated list of unique VECTORPLOT and user-defined roles. VECTORPLOT roles include \nX, Y, DATALABEL, XORIGIN, YORIGIN, GROUP, and INDEX. User-defined roles are defined with the ROLENAME= option.\n\nThe following example displays tooltips for the columns assigned to the roles X, Y, GROUP, and the column \nOBS, which is not assigned to any pre-defined VectorPlot role. The OBS column must first be assigned a role.\n \n ROLENAME=(TIP1=OBS) \n TIP= (TIP1 X Y GROUP) \n\nRequirement: To generate tooltips, you must include an ODS GRAPHICS ON statement that has the IMAGEMAP \noption specified, and write the graphs to the ODS HTML destination.\n\nInteraction: The labels and formats for the TIP variables can be controlled with the TIPLABEL= and \nTIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. \n\nDefault: The column format of the variable assigned to the role.\n\n(role-format-list) \na list of rolename = format pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y GROUP) \n TIPFORMAT=(TIP1=3.) \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the formats of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. \n\nDefault: The column label or column name of the variable assigned to the role.\n\n(role-label-list) \na list of rolename = \"string\" pairs separated by blanks. \n \n ROLENAME=(TIP1=OBS) \n TIP=(TIP1 X Y GROUP) \n TIPLABEL=(TIP1=\"Observation #\") \n\nRequirement: Columns must be assigned to the roles for this option to have any effect. \nSee the ROLENAME= option.\n\nTip: This option provides a way to control the labels of columns that appear in tooltips. \nOnly the roles that appear in the TIP= option are used."},"StatementOptionType":"V"},{"StatementOptionName":"XAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary X (bottom) axis or to the secondary X2 (top) axis. \n\nDefault: X\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"X","@Value2":"X2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary X (bottom) axis.","@ToolTip2":"Data are mapped to the the secondary X2 (top) axis."}},{"StatementOptionName":"YAXIS=","StatementOptionHelp":{"#cdata":"Specifies whether data are mapped to the primary Y (left) axis or to the secondary Y2 (right) axis. \n\nDefault: Y\n\nInteraction: The overall plot specification and the layout type determine the axis display."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"Y","@Value2":"Y2"},"StatementOptionToolTips":{"@ToolTip1":"Data are mapped to the primary Y (left) axis.","@ToolTip2":"Data are mapped to the secondary Y2 (right) axis."}}]}},{"StatementName":"PIECHART","StatementHelp":{"#cdata":"Syntax: PIECHART CATEGORY=column | discrete-attr-var | expression ; \n\nPIECHART CATEGORY=column | discrete-attr-var | expression\nRESPONSE=numeric-column | expression ; \n\nCreates a pie chart that is computed from input data."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"CATEGORY=","StatementOptionHelp":{"#cdata":"Syntax: CATEGORY=column | discrete-attr-var | expression\n\nSpecifies the column for the category values. Duplicated values of CATEGORY are summarized into a unique value. \nAll values are treated as discrete. \n\ndiscrete-attr-var\n specifies a discrete attribute map variable that is defined in a DISCRETEATTRVAR statement.\n\nRestriction: A discrete attribute map variable specification must be a direct reference to the attribute \nmap variable. It cannot be set by a dynamic variable."},"StatementOptionType":"RV"},{"StatementOptionName":"CATEGORYDIRECTION=","StatementOptionHelp":{"#cdata":"Syntax: CATEGORYDIRECTION=COUNTERCLOCKWISE | CLOCKWISE \n\nSpecifies whether to display the pie slices in counterclockwise or clockwise sequence.\n\nDefault: COUNTERCLOCKWISE \nTip: The START= option controls the starting angle for the first pie slice."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"COUNTERCLOCKWISE","@Value2":"CLOCKWISE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies to display the pie slices in counterclockwise sequence.","@ToolTip2":"Specifies to display the pie slices in clockwise sequence."}},{"StatementOptionName":"CENTERFIRSTSLICE=","StatementOptionHelp":{"#cdata":"Syntax: CENTERFIRSTSLICE=TRUE | FALSE\n\nSpecifies whether the first pie slice is centered on the starting angle or starts on the starting angle.\n\nDefault: FALSE \n\nTips: Use the START= option to change the starting angle. \nUse the CATEGORYDIRECTION= option to change the category direction."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that arrowheads are displayed on the vectors.","@ToolTip2":"Specifies that arrowheads are not displayed on the vectors."}},{"StatementOptionName":"DATALABELATTRS=","StatementOptionHelp":{"#cdata":"Syntax: DATALABELATTRS=style-element | style-element (text-options) | (text-options) \n\nSpecifies the color and font attributes of the slice labels.\n\nDefault: The GraphValueText style element. \n\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \n COLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\n FAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\n SIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\n STYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\n WEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT. \n\nDefault: The GraphDataText style element.\n\nInteraction: This option is ignored if EXTREME=TRUE or the DISPLAY= option does not display the outliers.\n\nInteraction: If one or more label options are specified and they do not include all the font properties \n(color, family, size, weight, style), non-specified properties will be derived from the GraphDataText style element."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"DATALABELCONTENT=","StatementOptionHelp":{"#cdata":"Syntax: DATALABELCONTENT=ALL | STANDARD | NONE | (content-options) \n\nSpecifies the information to display in the slice labels."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ALL","@Value2":"STANDARD","@Value3":"NONE","@Value4":"(content-options)"},"StatementOptionToolTips":{"@ToolTip1":"Displays all available information.","@ToolTip2":"Equivalent to specifying the two content-options CATEGORY and RESPONSE.","@ToolTip3":"Does not display slice labels.","@ToolTip4":"A space-separated list of one or more of the following options enclosed in parentheses: CATEGORY - displays the CATEGORY value PERCENT - displays the following based on the setting for the STAT= option: \u2022 when STAT=FREQ or STAT=PCT, the PERCENT value \u2022 when STAT=MEAN or STAT=SUM, nothing RESPONSE - displays the statistic that is requested in the STAT= option."}},{"StatementOptionName":"DATALABELLOCATION=","StatementOptionHelp":{"#cdata":"Syntax: DATALABELLOCATION=AUTO | INSIDE | OUTSIDE | CALLOUT \n\nSpecifies whether to display the slice labels within the pie slices or outside of the pie circumference. \n\nDefault: AUTO"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"INSIDE","@Value3":"OUTSIDE","@Value4":"CALLOUT"},"StatementOptionToolTips":{"@ToolTip1":"Automatically selects either INSIDE, OUTSIDE, or CALLOUT to optimize the label position ","@ToolTip2":"Locates the slice labels inside the pie slices. Note: If a particular label does not fit within the pie slice, then the fit policy takes effect (set by the LABELFITPOLICY= option).","@ToolTip3":"Locates the slice labels outside of the pie circumference. ","@ToolTip4":"Locates the slice labels outside of the pie circumference and draws a line from the label to its slice. "}},{"StatementOptionName":"DATASKIN=","StatementOptionHelp":{"#cdata":"Syntax: DATASKIN= NONE | CRISP | GLOSS | MATTE | PRESSED | SHEEN \n \nEnhances the visual appearance of filled pie slices. \n\nDefault: The DATASKIN= option value that is specified in the BEGINGRAPH statement. If not specified, then the \n GraphSkins:DataSkin style element value is used. \n\nRestriction: Starting with the first maintenance release of SAS 9.4, the maximum number of skinned graphical \nelements is limited to 200 per plot in an overlay or prototype layout. When this limit is exceeded for a plot, \nthe specified data skin is not applied to that plot. In that case, use the DATASKINMAX= option in your ODS GRAPHICS \nstatement to increase the maximum limit. \n\nRequirement: For this option to have any effect, DISPLAY=FILL must be in effect. Otherwise, this option is ignored. \n\nInteractions: This option overrides the BEGINGRAPH statement DATASKIN= option. \nThe appearance of the data skin is based on the FILLATTRS= color. \nWhen a data skin is applied, all slice outlines are set by the skin, and the OUTLINEATTRS= option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"NONE","@Value2":"CRISP","@Value3":"GLOSS","@Value4":"MATTE","@Value5":"PRESSED","@Value6":"SHEEN"},"StatementOptionToolTips":{"@ToolTip1":"Specifies no data skin.","@ToolTip2":"Specifies a crisp data skin.","@ToolTip3":"Specifies a glossy data skin.","@ToolTip4":"Specifies a matte data skin.","@ToolTip5":"Specifies a pressed data skin.","@ToolTip6":"Specifies a sheen data skin."}},{"StatementOptionName":"DATATRANSPARENCY=","StatementOptionHelp":{"#cdata":"Syntax: DATATRANSPARENCY=number\n\nSpecifies the degree of the transparency of all pie slices, outlines, and text.\n\nDefault: 0 \n\nRange: 0\u20131, where 0 is opaque and 1 is entirely transparent \n\nTip: The FILLATTRS= option can be used to set transparency for just the pie slices. The OTHERSLICEOPTS= \noption can be used to specify transparency for the \u201cother\u201d slice. You can combine this option with \nFILLATTRS= and with OTHERSLICEOPTS= to set one transparency for the outlines and text but a different \ntransparency for the pie slices. Example:datatransparency=0.2 fillattrs=(transparency=0.6)."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Specifies whether to display outlined pie slices, filled pie slices, or outlined and filled pie slices."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Displays outlined, filled pie slices ","@ToolTip2":"A space-separated list of one or more of the following options enclosed in parentheses: OUTLINE displays outlined pie slices. The default outline properties are set by the GraphOutline style element. FILL displays filled pie slices with each slice a different color. The default colors are set by the Color attribute of the GraphData1\u2013GraphDataN style elements. The fill color of the \u201cother\u201d slice (if shown) is from the color attribute of the GraphOther style element. If FILL is not specified, then an opaque pie is drawn using the background color of the containing layout."},"SubOptionsKeywords":"FILL|OUTLINE"},{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options) \n\nSpecifies the appearance of the filled pie slices, excluding the \u201cother\u201d slice.\n\nDefault: The GraphDataDefault:Color style reference. \n\nInteraction: For this option to have any effect, the fill must be enabled by the ODS style or the DISPLAY= option. \n\nTips: The FILLATTRS= suboption of the OTHERSLICEOPTS= option controls the visual properties of the \u201cother\u201d slice. \nThe DATATRANSPARENCY= option sets the transparency for all pie slices, outlines, and text. You can combine this \noption with DATATRANSPARENCY= to set one transparency for the outlines and text but a different transparency for \nthe pie slices. Example: datatransparency=0.2 fillattrs=(transparency=0.6)."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR="},{"StatementOptionName":"GROUP=","StatementOptionHelp":{"#cdata":"Syntax: GROUP=column | expression\n\nCreates a separate concentric annulus (or stacked cylinders) for each unique group value of the specified column. \nThe grouped rings are displayed in data order.\n\nInteractions: When this option is used, the unique column values are found and then the slice colors are taken \nfrom the GraphData1\u2013GraphDataN style elements. \n\nMissing values in the data can affect the group order. You can use the INCLUDEMISSINGGROUP= option to manage \nmissing group values. In addition, you can use INCLUDEMISSINGDISCRETE=TRUE in the BEGINGRAPH statement to \ncreate pie slices for missing CATEGORY values. \n\nTip: This option creates only rings of pies. To create a grid of pies, specify the PIECHART statement within \na LAYOUT LATTICE, LAYOUT DATALATTICE, or LAYOUT DATAPANEL statements."},"StatementOptionType":"V"},{"StatementOptionName":"GROUPGAP=","StatementOptionHelp":{"#cdata":"Syntax: GROUPGAP=dimension\n\nSpecifies a dimension for the optional gap that can be displayed between each annulus of a grouped pie.\n\nDefault: 0 \n\nRestriction: For this option to take effect, the GROUP= option must also be specified. \n\nInteraction: If the specified dimension is too large for the area that is available to the pie chart, then \nthe results might be unexpected. \n\nNote: The size of the inner pie remains the same regardless of the GROUPGAP= value."},"StatementOptionType":"V"},{"StatementOptionName":"GROUPLABELOPTS=","StatementOptionHelp":{"#cdata":"Syntax: GROUPLABELOPTS=(grouplabel-options) \n\nSpecifies text attributes, location, and other options for displaying group labels. The following \ngrouplabel-options are available. One or more options can be specified as space-separated name = value pairs.\n \nLABEL=AUTO | NONE | \"string\" \n specifies a descriptive label for the Group column \n\n\n AUTO specifies the column label of the GROUP= column or the column name of the GROUP= column, if no column label exists. \n NONE specifies that no label is displayed \n \"string\" specifies a string to use as the label \n\n Default AUTO \n\nLABELATTRS=style-element | style-element (text-options) | (text-options) \n specifies the text properties of the group label. \n\n Default The GraphLabelText style element. \n\nLOCATION=RIGHT | LEFT\n specifies whether the block of text for group labeling appears to the right or left of the pie. \n\n Default RIGHT \n\nVALUEATTRS=style-element | style-element (text-options) | (text-options) \n specifies the text properties of the group values. \n\n Default The GraphValueText style element."},"StatementOptionType":"V","SubOptionsKeywords":"LABEL=|LABELATTRS=|LOCATION=|VALUEATTRS="},{"StatementOptionName":"INCLUDEMISSINGGROUP=","StatementOptionHelp":{"#cdata":"Syntax: INCLUDEMISSINGGROUP=TRUE | FALSE\n\nSpecifies whether missing values of the Group column are included in the pie.\n\nDefault: TRUE \nRestriction: For this option to take effect, the GROUP= option must also be specified."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that missing values of the Group column are included in the pie.","@ToolTip2":"Specifies missing values of the Group column are not included in the pie."}},{"StatementOptionName":"LABELFITPOLICY=","StatementOptionHelp":{"#cdata":"Syntax: LABELFITPOLICY=NONE | DROP \n\nSpecifies the label fitting policy to be used if a particular label does not fit within the pie slice. \n\nDefault: NONE \n\nTip: This option determines how labels are managed when DATALABELLOCATION=INSIDE and a particular label does \nnot fit within the pie slice."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DROP","@Value2":"NONE"},"StatementOptionToolTips":{"@ToolTip1":"Draws each label regardless of whether it fits within the slice region. ","@ToolTip2":"Drops labels that do not fit within the slice region, but draws labels that do fit."}},{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"Syntax: NAME=\"string\" \n\nAssigns a name to this plot statement for reference in other template statements. The specified \nname is used primarily in legend statements to coordinate the use of colors and line patterns \nbetween the plot and the legend.\n\nRestriction: The string is case sensitive, cannot contain spaces, and must define a unique name \nwithin the template."},"StatementOptionType":"V"},{"StatementOptionName":"OTHERSLICE=","StatementOptionHelp":{"#cdata":"Syntax: OTHERSLICE=TRUE | FALSE \n\nSpecifies whether to consolidate smaller pie slices into a single slice that represents \n\u201cother\u201d values that are in the data, or whether to display those smaller slices as separate \npie slices. If this option is set to FALSE, then all unique category values appear as slices. \nIf this option is set to TRUE, then some of the smaller slices might be combined into a \nsingle slice, referred to as the \u201cother\u201d slice.\n\nDefault: TRUE \n\nTip: To set the properties of the \u201cother\u201d slice, use the OTHERSLICEOPTS= option."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that some of the smaller slices might be combined into a single slice, referred to as the \u201cother\u201d slice.","@ToolTip2":"Specifies that all unique category values appear as slices."}},{"StatementOptionName":"OTHERSLICEOPTS=","StatementOptionHelp":{"#cdata":"Syntax: OTHERSLICEOPTS=(other-slice-options) \n\nSpecifies the properties of the \u201cother\u201d slice. Example: \n\n piechart category=region / name=\"p\"\n datalabelcontent=(percent) datalabellocation=inside\n otherslice=true\n othersliceopts=(type=percent percent=11 label=\"Other Regions\") ;\n \nThe following other-slice-options are available. One or more options can be specified as space-separated name = value pairs. \n\nTYPE=PERCENT | MAXSLICES\n specifies which method to use to determine the size of the \u201cother\u201d slice. \n\n PERCENT uses the percentage that is set by the PERCENT= suboption. \n MAXSLICES uses the count that is set by the MAXSLICES= suboption. \n\n Default PERCENT \n\n MAXSLICES=positive-integer\n specifies the maximum number of category values to represent with pie slices. Any remaining values are consolidated \n into the \u201cother\u201d slice. Default: 10 \n\n PERCENT=percent-of-total\n collects all category values with response values less than or equal to the specified percent-of-total into the \u201cother\u201d slice. \n\n Default 4. Any original slice that represents 4% or less of the total is put in the \u201cother\u201d category. \n Range 0 to 100 \n\nLABEL=\"string\" \n specifies a label for the \u201cother\u201d slice. Default \"OTHER\" \n\nFILLATTRS=style-element | style-element (fill-options) | (fill-options) \n specifies the appearance of the \u201cother\u201d slice's area fill. Default: The GraphOther style element."},"StatementOptionType":"V","SubOptionsKeywords":"TYPE=|LABEL=|FILLATTRS="},{"StatementOptionName":"OUTLINEATTRS=","StatementOptionHelp":{"#cdata":"Syntax: OUTLINEATTRS=style-element | style-element (line-options) | (line-options) \n\nSpecifies the properties of the pie and slice outlines. \n\nDefault The GraphOutlines style element. \nInteractions For this option to have any effect, outlines must be enabled by the ODS style or the DISPLAY= option. \nIf the DATASKIN= option applies a data skin, then this option is ignored. \n"},"StatementOptionType":"V"},{"StatementOptionName":"START=","StatementOptionHelp":{"#cdata":"Syntax: START=degrees\n\nSpecifies which degree between 0 and 360 serves as the starting position for the first pie slice. \nA value of 0 degrees corresponds to the three o'clock position. Degrees can be either positive or \nnegative. Positive values move the starting position counterclockwise, and negative values move the \nstarting position clockwise. From the starting point specified by this option, the slices are drawn \nin the direction specified by the CATEGORYDIRECTION= option.\n\nDefault: 0 \nRange: 0 to 360"},"StatementOptionType":"V"},{"StatementOptionName":"STAT=","StatementOptionHelp":{"#cdata":"Specifies the statistic to be computed. \n\nDefault: SUM for pie charts that specify the RESPONSE= argument.\nDefault: FREQ for pie charts that do not specify the RESPONSE= argument."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FREQ","@Value2":"PCT","@Value3":"SUM","@Value4":"MEAN"},"StatementOptionToolTips":{"@ToolTip1":"[For pie charts with no RESPONSE= argument]--Frequency count","@ToolTip2":"[For pie charts with no RESPONSE= argument]--Percent","@ToolTip3":"[For pie charts with a RESPONSE= argument]--Sum","@ToolTip4":"[For pie charts with a RESPONSE= argument]--Mean"}},{"StatementOptionName":"TIP=","StatementOptionHelp":{"#cdata":"Syntax: =(role-list) | NONE \n\nSpecifies the information to display when the cursor is positioned over a pie slice. If this option is used, \nthen it replaces all of the information that is displayed by default.\n \n(role-list) \n an ordered, space-separated list of unique PIECHART roles. PIECHART roles include CATEGORY, RESPONSE, \n and GROUP. The RESPONSE role represents the computed statistic for the CATEGORY value, based on the \n statistic that is set by the STAT= option. \n\n Example The following example displays data tips for the columns assigned to the roles CATEGORY and RESPONSE.\n \n TIP=(CATEGORY RESPONSE)\n \nNONE\n suppresses data tips and URLs (if requested) from the plot. \n\n Default: The columns assigned to these roles are automatically included in the data tip \n information: CATEGORY and RESPONSE. \n \n Requirement: To generate data tips in the output, you must include an ODS GRAPHICS ON statement \n that has the IMAGEMAP option specified, and you must write the output to the ODS HTML destination. \n \n Tip: The labels and formats for the TIP roles can be controlled with theTIPLABEL= and TIPFORMAT= options."},"StatementOptionType":"V"},{"StatementOptionName":"TIPFORMAT=","StatementOptionHelp":{"#cdata":"[Syntax: TIPFORMAT=(role-format-list)] \n \nSpecifies display formats for tip columns. This option provides a way to control the formats of columns \nthat appear in data tips.\n \n(role-format-list) \n a space-separated list of role-name = format pairs. \n\n Example: TIP=(RESPONSE)\n TIPFORMAT=(RESPONSE=DOLLAR12.)\n \n\nDefault: The column format of the column assigned to the role or BEST6 if no format is assigned to a numeric column. \nRestriction: Only the roles that appear in the TIP= option are used. \nRequirement: A column must be assigned to each of the specified roles."},"StatementOptionType":"V"},{"StatementOptionName":"TIPLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: TIPLABEL=(role-label-list)] \n \nSpecifies display labels for tip columns. This option provides a way to control the labels of columns \nthat appear in data tips. \n \nrole-label-list \n a space-separated list of rolename =\"string\" pairs. \n\n Example: TIP=(RESPONSE)\n TIPLABEL=(RESPONSE=\"Average Sales\")\n \nDefault: The column label or column name of the column assigned to the role. \n\nRestriction: Only the roles that appear in the TIP= option are used. \n\nRequirement: A column must be assigned to each of the specified roles."},"StatementOptionType":"V"},{"StatementOptionName":"URL=","StatementOptionHelp":{"#cdata":"Syntax: URL=string-column \n\nSpecifies an HTML page to display when a pie slice is selected. \n\nstring-column \n specifies a column that contains a valid HTML page reference (HREF) for each pie slice that is to have an active link. \n\n Example http://www.sas.com/technologies/analytics/index.html \n\nRequirement: To generate a plot with selectable pie slices, you must include an ODS GRAPHICS ON statement \n that has the IMAGEMAP option specified, and you must write the output to the ODS HTML destination. \n \nInteraction: This option has no effect when TIP=NONE. \nTips: The URL value can be blank for some pie slices, meaning that no action is taken when the corresponding \nslice is selected. \n\nThe URL value can be the same for any CATEGORY and RESPONSE pairs. In that case, the same action is taken \nwhen the pie slices for those pairs are selected."},"StatementOptionType":"V"},{"StatementOptionName":"RESPONSE=","StatementOptionHelp":{"#cdata":"[Syntax: RESPONSE=numeric-column | expression\n\nSpecifies response values that are read from a numeric column or an expression."},"StatementOptionType":"V"}]}},{"StatementName":"ENDGRAPH","StatementHelp":{"#cdata":"Syntax: ENDGRAPH;\n \nMarks the end of the outermost container for a single GTL-layout-block and one or more \nGTL-global-statements."},"StatementOptions":null},{"StatementName":"ENDLAYOUT","StatementHelp":{"#cdata":"Syntax: ENDLAYOUT;\n \nMarks the end of a GTL-layout-block."},"StatementOptions":null},{"StatementName":"CONTINUOUSLEGEND","StatementHelp":{"#cdata":"Syntax: CONTINUOUSLEGEND \"graph-name\" ; \n \nCreates a legend with a color ramp corresponding to a range of values."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"AUTOALIGN=","StatementOptionHelp":{"#cdata":"Specifies whether the legend is automatically aligned within its parent when nested within an \noverlay-type layout. \n\nInteraction: This option has no effect unless LOCATION=INSIDE.\n\nInteraction: If LOCATION=INSIDE, this option overrides HALIGN= and VALIGN=."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"NONE","@Value3":"<(location-list)>"},"StatementOptionToolTips":{"@ToolTip1":"Available only if the parent layout contains a scatter plot; ignored otherwise. Within the parent layout, attempt to center the legend in the area that is farthest from any surrounding data point markers.","@ToolTip2":"Do not automatically align the legend within its parent layout. The legend's position within its parent layout will be set by the HALIGN= and VALIGN= options.","@ToolTip3":"Within the parent layout, restrict the legend's possible locations to those locations in the specified location-list, and use the location-list position that least collides with the parent layout's other grahpics features. The location-list is blank-separated and can contain any of these locations: TOPLEFT, TOP, TOPRIGHT, LEFT, CENTER, RIGHT, BOTTOMLEFT, BOTTOM, and BOTTOMRIGHT."}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the legend background. \n\nstyle-element \nA reference in the form style-element:style-attribute . Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is displayed around the legend. \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is displayed around the legend.","@ToolTip2":"A border is not displayed around the legend."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the legend.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nDefault: The GraphBorderLines style element.\n\nInteraction: BORDER=TRUE must be set for this option to have any effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of the legend within its parent when nested within an overlay-type \nlayout. \n\nDefault: RIGHT if LOCATION=OUTSIDE\nCENTER if LOCATION=INSIDE\n\nRestriction: If LOCATION=OUTSIDE, the HALIGN= and VALIGN= options cannot both be set to CENTER.\n\nRestriction: This option is only available when this statement is nested within an overlay-type \nlayout. It is ignored if the parent layout is not an overlay-type layout.\n\nInteraction: If LOCATION=INSIDE and the AUTOALIGN= option is enabled, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"LOCATION=","StatementOptionHelp":{"#cdata":"Specifies whether the legend appears inside or outside the plot area."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend appears inside the plot area.","@ToolTip2":"Specifies that the legend appears outside the plot area."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the legend background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend background is transparent.","@ToolTip2":"Specifies that the legend background is opaque."}},{"StatementOptionName":"ORIENT=","StatementOptionHelp":{"#cdata":"Specifies the orientation of the legend."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"VERTICAL","@Value2":"HORIZONTAL"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a vertical orientation for the legend.","@ToolTip2":"Specifies a horizontal orientation for the legend."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is reserved inside the legend perimeter. \n\nDefault: The default padding for all sides is 0. Values without units are in pixels (px). \nA unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the legend perimeter. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \nto create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \nas a name = value pair. Sides not assigned padding are padded with the default amount. \nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n \n TOP=dimension \n specifies the amount of extra space added to the top. \n \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE=\"string\"] \n \nSpecifies the title of the legend. \nDefault: no default\n\nRequirement: string must be enclosed in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the legend title. See \"General Syntax for Attribute Options\" \nfor the syntax on using a style-element and \"Text Options\" for available text-options . \nDefault: The GraphLabelText style element.\n\nInteraction: For this option to have any effect, the TITLE= option must also be specified. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"VALIGN=","StatementOptionHelp":{"#cdata":"Specifies the vertical alignment of the legend within its parent when nested within an overlay-type \nlayout. \n\nDefault: CENTER\n\nRestriction: If LOCATION=OUTSIDE, the VALIGN= and HALIGN= options cannot both be set to CENTER.\n\nRestriction: This option is only available when this statement is nested within an overlay-type layout. \nIt is ignored if the parent layout is not an overlay-type layout.\n\nInteraction: If LOCATION=INSIDE and the AUTOALIGN= option is enabled, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"TOP","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered vertical alignment.","@ToolTip2":"Specifies a top-aligned vertical alignment.","@ToolTip3":"Specifies a bottom-aligned vertical alignment."}},{"StatementOptionName":"VALUEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: VALUEATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the legend values. \n\nDefault: The GraphValueText style element.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"VALUECOUNT=","StatementOptionHelp":{"#cdata":"[Syntax: VALUECOUNT=positive-integer] \n \nSpecifies the number of values that the continuous legend must use to label the data range. \nDefault: The VALUECOUNTHINT= setting is used.\n\nRestriction: The associated plot must be displayed with smooth gradient for this option to have any \neffect. For example, in a contour plot, CONTOURTYPE must be set to GRADIENT or LINEGRADIENT.\n\nTip: The legend uses even intervals to label the range."},"StatementOptionType":"V"},{"StatementOptionName":"VALUECOUNTHINT=","StatementOptionHelp":{"#cdata":"[Syntax: VALUECOUNTHINT=positive-integer] \n \nRecommends a number of values for the continuous legend to use to label the data range. \n\nDefault: 6\n\nRestriction: The associated plot must be displayed with smooth gradient for this option to have any \neffect. For example, in a contour plot, CONTOURTYPE must be set to GRADIENT or LINEGRADIENT.\n\nTip: The legend uses even intervals to label the range."},"StatementOptionType":"V"}]}},{"StatementName":"DISCRETELEGEND","StatementHelp":{"#cdata":"Syntax: DISCRETELEGEND \"graph-name\" <... \"graph-name-n\" > ; \n \nCreates a legend with entries that refer to plots and/or group values."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ACROSS=","StatementOptionHelp":{"#cdata":"[Syntax: ACROSS=positive-integer] \n \nSpecifies the number of legend entries that are placed horizontally before the next row begins. \n\nDefault: The entries are placed to best fit the available area. This \"best fit\" approach only works \nwhen the legend is nested in the template's outermost layout.\n\nRestriction: This option is ignored if ORDER=COLUMNMAJOR\n\nTip: A legend entry typically consists of two parts, such as a marker symbol and an associated value."},"StatementOptionType":"V"},{"StatementOptionName":"AUTOALIGN=","StatementOptionHelp":{"#cdata":"Specifies whether the legend is automatically aligned within its parent when nested within an \noverlay-type layout. \n\nInteraction: This option has no effect unless LOCATION=INSIDE.\n\nInteraction: If LOCATION=INSIDE, this option overrides HALIGN= and VALIGN=."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"NONE","@Value3":"<(location-list)>"},"StatementOptionToolTips":{"@ToolTip1":"Available only if the parent layout contains a scatter plot; ignored otherwise. Within the parent layout, attempt to center the legend in the area that is farthest from any surrounding data point markers.","@ToolTip2":"Do not automatically align the legend within its parent layout. The legend's position within its parent layout will be set by the HALIGN= and VALIGN= options.","@ToolTip3":"Within the parent layout, restrict the legend's possible locations to those locations in the specified location-list, and use the location-list position that least collides with the parent layout's other grahpics features. The location-list is blank-separated and can contain any of these locations: TOPLEFT, TOP, TOPRIGHT, LEFT, CENTER, RIGHT, BOTTOMLEFT, BOTTOM, and BOTTOMRIGHT."}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the legend background. \n\nstyle-element \nA reference of the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is displayed around the entry. \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is displayed around the entry.","@ToolTip2":"A border is not displayed around the entry."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the text.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nDefault: The GraphBorderLines style element.\n\nInteraction: BORDER=TRUE must be set for this option to have any effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"DISPLAYCLIPPED=","StatementOptionHelp":{"#cdata":"Specifies whether the legend is displayed when any portion of the legend is not entirely rendered. \n\nDefault: FALSE\n\nTip: When the graph size is reduced, parts of the legend (title, legend symbol, or legend value) may \nbe clipped (truncated). When clipping does take place and when DISPLAYCLIPPED is FALSE, the entire \nlegend is removed from the graph and the space for it is reclaimed by the remainder of the graph. \nWhen DISPLAYCLIPPED is TRUE, the legend always appears, even if some parts of have been clipped."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend is not displayed when any portion of the legend is not entirely rendered.","@ToolTip2":"The legend always appears, even if some parts of have been clipped."}},{"StatementOptionName":"DOWN=","StatementOptionHelp":{"#cdata":"[Syntax: DOWN=positive-integer] \n \nSpecifies the number of legend entries that are placed vertically before the next column begins. \n\nDefault: The entries are placed to best fit the available area. This \"best fit\" approach only works \nwhen the legend is nested in the template's outermost layout.\n\nRestriction: This option is ignored if ORDER=ROWMAJOR\n\nTip: A legend entry typically consists of two parts, such as a marker symbol and an associated value."},"StatementOptionType":"V"},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of the legend within its parent when nested within an overlay-type \nlayout. \n\nDefault: RIGHT if LOCATION=OUTSIDE\nCENTER if LOCATION=INSIDE\n\nRestriction: If LOCATION=OUTSIDE, the HALIGN= and VALIGN= options cannot both be set to CENTER.\n\nRestriction: This option is only available when this statement is nested within an overlay-type \nlayout. It is ignored if the parent layout is not an overlay-type layout.\n\nInteraction: If LOCATION=INSIDE and the AUTOALIGN= option is enabled, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"LOCATION=","StatementOptionHelp":{"#cdata":"Specifies whether the legend appears inside or outside the plot area. \n\nDefault: OUTSIDE\n\nRestriction: This option has effect only when the DISCRETELEGEND statement appears within an \noverlay-type layout and there is at least one stand-alone plot statement with XY axes that is \nreferenced by the legend. \n\nInteraction: The actual position is determined by the settings for the LOCATION=, AUTOALIGN=, \nHALIGN=, and VALIGN= options."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"INSIDE","@Value2":"OUTSIDE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend appears inside the plot area.","@ToolTip2":"Specifies that the legend appears outside the plot area."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the legend background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend background is transparent.","@ToolTip2":"Specifies that the legend background is opaque."}},{"StatementOptionName":"ORDER=","StatementOptionHelp":{"#cdata":"Specifies whether legend entries are added as rows or as columns. \n\nDefault: ROWMAJOR\n\nInteraction: If ORDER=ROWMAJOR, use the ACROSS= option to limit the number of entries in a row. \nIf ORDER=COLUMNMAJOR, use the DOWN= option to limit the number of entries in a column."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ROWMAJOR","@Value2":"COLUMNMAJOR"},"StatementOptionToolTips":{"@ToolTip1":"Fills all the columns in a row, from left to right, before going to the next row.","@ToolTip2":"Fills all the rows in a column, from top to bottom, before going to the next column."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is reserved inside the legend perimeter. \n\nDefault: The default padding for all sides is 0. Values without units are in pixels (px). \nA unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the legend perimeter. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \nto create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \nas a name = value pair. Sides not assigned padding are padded with the default amount. \nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n \n TOP=dimension \n specifies the amount of extra space added to the top. \n \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"TITLE=","StatementOptionHelp":{"#cdata":"[Syntax: TITLE=\"string\"] \n \nSpecifies the title of the legend. \nDefault: no default\n\nRequirement: string must be enclosed in quotation marks."},"StatementOptionType":"V"},{"StatementOptionName":"TITLEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the legend title. See \"General Syntax for Attribute Options\" \nfor the syntax on using a style-element and \"Text Options\" for available text-options . \nDefault: The GraphLabelText style element.\n\nInteraction: For this option to have any effect, the TITLE= option must also be specified. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TITLEBORDER=","StatementOptionHelp":{"#cdata":"Specifies a border around the legend title that separates it from the legend body. \n\nDefault: FALSE\n\nInteraction: For this option to have any effect, the TITLE= option must also be specified.\n\nTip: The line attributes of the title border are set by the BORDERATTRS= options."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies no border around the legend title.","@ToolTip2":"Specifies a border around the legend title that separates it from the legend body."}},{"StatementOptionName":"VALIGN=","StatementOptionHelp":{"#cdata":"Specifies the vertical alignment of the legend within its parent when nested within an overlay-type \nlayout. \n\nDefault: CENTER\n\nRestriction: If LOCATION=OUTSIDE, the VALIGN= and HALIGN= options cannot both be set to CENTER.\n\nRestriction: This option is only available when this statement is nested within an overlay-type layout. \nIt is ignored if the parent layout is not an overlay-type layout.\n\nInteraction: If LOCATION=INSIDE and the AUTOALIGN= option is enabled, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"TOP","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered vertical alignment.","@ToolTip2":"Specifies a top-aligned vertical alignment.","@ToolTip3":"Specifies a bottom-aligned vertical alignment."}},{"StatementOptionName":"VALUEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: VALUEATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the legend values. \n\nDefault: The GraphValueText style element.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="}]}},{"StatementName":"DISCRETEATTRMAP","StatementHelp":{"#cdata":"Syntax: DISCRETEATTRMAP NAME=\"string\" ; \n VALUE value-spec ; \n <... more VALUE statements ...>\n ENDDISCRETEATTRMAP;\n \nDefines a set of graphical properties that can be associated with user-defined sets of values."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"NAME=","StatementOptionHelp":{"#cdata":"Syntax: NAME=\"string\" \n \nAssigns a name to the attribute definition."},"StatementOptionType":"RV"},{"StatementOptionName":"DISCRETELEGENDENTRYPOLICY=","StatementOptionHelp":{"#cdata":"Syntax: DISCRETELEGENDENTRYPOLICY=DATA | ATTRMAP\n\nSpecifies whether the items that are contributed to a discrete legend by the plot associated \nwith this attribute map are only items that appear in the data or only items that are defined \nin the attribute map."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"DATA","@Value2":"ATTRMAP"},"StatementOptionToolTips":{"@ToolTip1":"The associated plot contributes to a discrete legend only items that appear in the data.","@ToolTip2":"the associated plot contributes to a discrete legend only items that are defined in the discrete attribute map."}},{"StatementOptionName":"IGNORECASE=","StatementOptionHelp":{"#cdata":"Syntax: IGNORECASE=TRUE | FALSE\n \nSpecifies whether case is ignored when comparing the values that are specified in the attribute map \nwith values from an input data column.\n\nDefault: FALSE. Value comparisons are case-sensitive."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that case is ignored when comparing the values that are specified in the attribute map with values from an input data column.","@ToolTip2":"Specifies that case is not ignored when comparing the values that are specified in the attribute map with values from an input data column."}},{"StatementOptionName":"TRIMLEADING=","StatementOptionHelp":{"#cdata":"Syntax: TRIMLEADING=TRUE | FALSE\n \nSpecifies whether leading blanks are trimmed (removed) from both the attribute map values and the \ninput data values before those values are compared. Trailing blanks are always trimmed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that leading blanks are trimmed (removed).","@ToolTip2":"Specifies that leading blanks are not trimmed (not removed)."}}]}},{"StatementName":"ENDDISCRETEATTRMAP","StatementHelp":{"#cdata":"Syntax: ENDDISCRETEATTRMAP;\n \nEnds a DISCRETEATTRMAP block."},"StatementOptions":null},{"StatementName":"VALUE","StatementHelp":{"#cdata":"Syntax: VALUE value-spec ; \n \nA VALUE statement within the DISCRETEATTRMAP block associates graphical properties with a discrete \nvalue in the attribute map."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"FILLATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: FILLATTRS=style-element | style-element (fill-options) | (fill-options)] \n\nThe fill attributes to be used when an attribute map is applied to filled areas in a graph. \n\nUse one or more of the following options to specify fill-color attributes. The options must be enclosed \nin parentheses and specified as a space-delimited list of name = value pairs. \n\n COLOR=style-reference | color \n specifies the fill color. Style-reference must specify a valid style attribute such as COLOR, \n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, or ENDCOLOR in the form style-element-name:attribute-name. \n If style-reference is not defined in the active ODS style, the COLOR= option is ignored and the \n default color is used. Color must be a valid color name, such as RED, or a color code, such as \n CXFF0000 or #FF0000. The color name must not exceed 64 characters. A color code must be a valid \n code for a SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB). \n\n TRANSPARENCY=number\n specifies the degree of the transparency of the filled area."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|TRANSPARENCY="},{"StatementOptionName":"LINEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the line attributes to be used when an attribute map is applied to lines in a graph.\n\nUse one or more of the following options to specify line attributes. The options must be enclosed \nin parentheses and specified as a space-delimited list of name = value pairs. \n\n COLOR=style-reference | color \n specifies the line color. Style-reference must specify a valid style attribute such as COLOR, \n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, or ENDCOLOR in the form style-element-name:attribute-name. \n If style-reference is not defined in the active ODS style, the COLOR= option is ignored and the \n default color is used. Color must be a valid color name, such as RED, or a color code, such as \n CXFF0000 or #FF0000. The color name must not exceed 64 characters. A color code must be a valid \n code for a SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB). \n\n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. Style-reference must specify a LINESTYLE attribute in the form \n style-element-name:LINESTYLE. Line patterns can be specified as a pattern name or pattern number. \n Some valid pattern numbers: 1 (Solid), 2 (ShortDash), 4 (MediumDash), 5 (LongDash) 8 (MediumDashShortDash) \n 14 (DashDashDot) 15 (DashDotDot) 20 (Dash) 26 (LongDashShortDash) 34 (Dot) 35 (ThinDot) 41 (ShortDashDot) \n 42 (MediumDashDotDot). Not all pattern numbers have names.\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. Style-reference must specify a LINETHICKNESS attribute in the form \n style-element-name:LINETHICKNESS."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"MARKERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: MARKERATTRS=style-element | style-element (marker-options) | (marker-options) \n\nSpecifies the marker attributes to be used when an attribute map is applied to marker symbols in a graph. \n\nUse one or more of the following options to specify marker-options. You must enclose the options \nin parentheses and specify the options as a space-delimited list of name = value pairs.\n\n COLOR=style-reference | color \n specifies the line color. Style-reference must specify a valid style attribute such as COLOR, \n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, or ENDCOLOR in the form style-element-name:attribute-name. \n If style-reference is not defined in the active ODS style, the COLOR= option is ignored and the \n default color is used. Color must be a valid color name, such as RED, or a color code, such as \n CXFF0000 or #FF0000. The color name must not exceed 64 characters. A color code must be a valid \n code for a SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB). \n\n SIZE=style-reference | dimension \n specifies the marker size (both width and height). Style-reference must specify a MARKERSIZE \n attribute in the form style-element-name:MARKERSIZE. \n\n SYMBOL=style-reference | marker-name \n specifies the name of the marker. If you use a style-reference, the style-attribute should be MARKERSYMBOL.\n\n TRANSPARENCY=number\n specifies the degree of transparency for the plot markers. Range: 0\u20131, where 0 is opaque and 1 is entirely transparent\n WEIGHT=NORMAL | BOLD \n specifies the marker weight."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|SIZE=|SYMBOL=|TRANSPARENCY=|WEIGHT="},{"StatementOptionName":"TEXTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: TEXTATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the text attributes to use when an attribute map is applied to text in a graph. \n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. Style-reference must specify a valid style attribute such as COLOR, \n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, or ENDCOLOR in the form style-element-name:attribute-name. \n If style-reference is not defined in the active ODS style, the COLOR= option is ignored and the \n default color is used. Color must be a valid color name, such as RED, or a color code, such as \n CXFF0000 or #FF0000. The color name must not exceed 64 characters. A color code must be a valid \n code for a SAS color-naming scheme, such as RGB, CMYK, HLS, or HSV (HSB).\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. IStyle-reference must specify a FONTFAMILY attribute in the form \n style-element-name:FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. Style-reference must specify a FONTSIZE attribute in the form \n style-element-name:FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. Style-reference must specify a FONTSTYLE attribute in the form \n style-element-name:FONTSTYLE.\n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. Style-reference must specify a FONTWEIGHT attribute in the form \n style-element-name:FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="}]}},{"StatementName":"DISCRETEATTRVAR","StatementHelp":{"#cdata":"Syntax: DISCRETEATTRVAR ATTRVAR=attrvar-name\n VAR=data-column | expression | dynamic \n ATTRMAP=\"attrmap-name\"; \n \nCreates a named association between a user-defined discrete attribute map and an input data column."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ATTRVAR=","StatementOptionHelp":{"#cdata":"Syntax: ATTRVAR=attrvar-name\n \nSpecifies a SAS name for this association between the attribute map and the input column. \nThis name must be unique within the template and can be referenced by other statements that \ncan be associated with the attribute map."},"StatementOptionType":"V"},{"StatementOptionName":"VAR=","StatementOptionHelp":{"#cdata":"Syntax: VAR=data-column | expression | dynamic\n \nSpecifies an input data column to be associated with an attribute map at run time. If an expression \nis used, a new column of transformed values is created and then matched with the attribute map."},"StatementOptionType":"V"},{"StatementOptionName":"ATTRMAP=","StatementOptionHelp":{"#cdata":"Syntax: ATTRMAP=\"attrmap-name\"\n \nSpecifies the name of an existing discrete attribute map."},"StatementOptionType":"V"}]}},{"StatementName":"ENTRY","StatementHelp":{"#cdata":"Syntax: ENTRY text-item <... > ; \n\nDisplays a line of text in the plot area."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"AUTOALIGN=","StatementOptionHelp":{"#cdata":"Specifies whether the entry is automatically aligned within its parent when nested within an \noverlay-type layout. \n\nDefault: NONE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"NONE","@Value3":"<(location-list)>"},"StatementOptionToolTips":{"@ToolTip1":"Available only if the parent layout contains a scatter plot; ignored otherwise. Within the parent layout, attempt to center the entry in the area that is farthest from any surrounding data point markers.","@ToolTip2":"Do not automatically align the entry within the area. Alignment is set with HALIGN= and VALIGN= options.","@ToolTip3":"Within the available area, restrict the entry's possible locations to those locations in the specified location-list, and use the location-list position that least collides with the other grahpics features in the area. The location-list is blank-separated and can contain any of these locations: TOPLEFT, TOP, TOPRIGHT, LEFT, CENTER, RIGHT, BOTTOMLEFT, BOTTOM, and BOTTOMRIGHT. Example: (TOPRIGHT TOPLEFT)"}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the entry background. \n\nstyle-element \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is displayed around the legend. \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is displayed around the legend.","@ToolTip2":"A border is not displayed around the legend."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the text.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nDefault: The GraphBorderLines style element.\n\nInteraction: BORDER=TRUE must be set for this option to have any effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of the text-item.\n\nDefault: CENTER\n\nTip: Each text-item has a horizontal alignment, and text-items with the same alignment are always \ngrouped together."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the entry background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE \n\nInteraction: When this option is set to FALSE, the background color is not used."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend background is transparent.","@ToolTip2":"Specifies that the legend background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is reserved inside the entry border. \n\nDefault: (LEFT=3 RIGHT=3 TOP=0 BOTTOM=0)\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the entry border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \nto create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \nas a name = value pair. Sides not assigned padding are padded with the default amount. \nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n \n TOP=dimension \n specifies the amount of extra space added to the top. \n \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"ROTATE=","StatementOptionHelp":{"#cdata":"Specifies the angle of text rotation measured in degrees. The angle is measured from a horizontal \nline passing through the middle of the bounding box of the text, counter-clockwise starting at \nthe center of the bounding box. \n\nDefault: 0. No rotation is performed.\n\nRestriction: Only angles of 0, 90, 180, or 270 degrees are allowed.\n\nInteraction: The bounding box is the determined by the size of the text in the current font plus \nany horizontal and vertical padding."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"0","@Value2":"90","@Value3":"180","@Value4":"270"},"StatementOptionToolTips":{"@ToolTip1":"0 degress text rotation","@ToolTip2":"90 degrees text rotation","@ToolTip3":"180 degrees text rotation","@ToolTip4":"270 degrees text rotation"}},{"StatementOptionName":"SUB","StatementOptionHelp":{"#cdata":"[Syntax: { SUB \"string\" | dynamic }] \n \nText-command that specifies that the string or dynamic is to appear as subscript text. \nDefault: no default\n\nExample: entry \"y = \" b{sub \"0\"} \" + b\" {sub \"1\"} \"x\";"},"StatementOptionType":"RS"},{"StatementOptionName":"SUP","StatementOptionHelp":{"#cdata":"[Syntax: { SUP \"string\" | dynamic }] \n \nText-command that specifies that the string or dynamic is to appear as superscript text. \nDefault: no default\n\nExample: entry \"R\" {sup \"2\"} \" = \" {format (6.4) RSQUARED} ;"},"StatementOptionType":"RS"},{"StatementOptionName":"TEXTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: TEXTATTRS=style-element | style-element (text-options) | (text-options)] \n \nAs a statement option, specifies the text properties of the entire entry text. As a prefix-option, \nspecifies the text properties of individual text-items. \n\nDefault: The GraphValueText style element.\nTip: This option can be used as both a prefix option and a statement option. When used as a prefix option, \nit overrides the statement option.\n\nTip: When used as a prefix option, TEXTATTRS=( ) cancels the last used TEXTATTRS= prefix option and \nresets all text options to those set by 1) the TEXTATTRS= statement option or 2) the default style \nelement for the statement (GraphValueText) if no TEXTATTRS= statement option is used. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"UNICODE","StatementOptionHelp":{"#cdata":"[Syntax: { UNICODE \"hex-string\"x | keyword | dynamic }] \n \nText-command that specifies a glyph (character) to be displayed using its unicode specification or \nkeyword equivalent. Default: no default\n\n\"hex-string\"x \nA four-byte hexadecimal constant that represents a UNICODE character in the current font. \nFor a complete listing, see http://www.unicode.org/charts/charindex.html. \n\nkeyword \nA SAS keyword for a UNICODE character. For a listing of SAS-supplied keywords, \nsee \"Reserved Keywords and Unicode Values\". \n\ndynamic \nThe dynamic must resolve to either \"hex-string\"x or a keyword for a UNICODE character. \nExamples:\n \n entry {unicode alpha} \"=\" CONF; \n entry {unicode \"03B1\"x} \"=\" CONF; \n\nTip: This text command attempts to access a UNICODE value in the current font. Not all fonts \nsupport accessing characters via their UNICODE value. Some fonts only support a limited set \nof UNICODE values. If the UNICODE value is not accessible, the command may be ignored or an \nunprintable character may be substituted."},"StatementOptionType":"RS"},{"StatementOptionName":"VALIGN=","StatementOptionHelp":{"#cdata":"Specifies the vertical alignment of the legend within its parent when nested within an overlay-type \nlayout. \n\nDefault: CENTER\n\nRestriction: If LOCATION=OUTSIDE, the VALIGN= and HALIGN= options cannot both be set to CENTER.\n\nRestriction: This option is only available when this statement is nested within an overlay-type layout. \nIt is ignored if the parent layout is not an overlay-type layout.\n\nInteraction: If LOCATION=INSIDE and the AUTOALIGN= option is enabled, this option is ignored."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"TOP","@Value3":"BOTTOM"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered vertical alignment.","@ToolTip2":"Specifies a top-aligned vertical alignment.","@ToolTip3":"Specifies a bottom-aligned vertical alignment."}}]}},{"StatementName":"ENTRYFOOTNOTE","StatementHelp":{"#cdata":"Syntax: ENTRYFOOTNOTE text-item <... > ; \n \nDisplays a footnote."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the footnote background. \n\nstyle-element \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is displayed around the footnote. \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is displayed around the footnote.","@ToolTip2":"A border is not displayed around the footnote."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the footnote.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nDefault: The GraphBorderLines style element.\n\nInteraction: BORDER=TRUE must be set for this option to have any effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of the text-item.\n\nDefault: CENTER\n\nTip: Each text-item has a horizontal alignment, and text-items with the same alignment are always \nconcatenated together."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the footnote background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE \n\nInteraction: When this option is set to FALSE, the background color is not used."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the legend background is transparent.","@ToolTip2":"Specifies that the legend background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is reserved inside the footnote border. \n\nDefault: (LEFT=3 RIGHT=3 TOP=0 BOTTOM=0)\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the footnote border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \nto create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \nas a name = value pair. Sides not assigned padding are padded with the default amount. \nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n \n TOP=dimension \n specifies the amount of extra space added to the top. \n \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"SHORTTEXT=","StatementOptionHelp":{"#cdata":"[Syntax: SHORTTEXT=(text-item <... )] \n \nSpecifies an alternate footnote to use if the specified footnote is too long for the output width. \nIf the shortened text is itself too long, it will be truncated. \nDefault: no default\n\nInteraction: This option has no effect unless TEXTFITPOLICY=SHORT.\n\nInteraction: This option is ignored if any text-items include an HALIGN= prefix option.\n\nInteraction: The horizontal alignment of the shortened text is derived from the horizontal alignment \nof the footnote to be shortened."},"StatementOptionType":"V"},{"StatementOptionName":"SUB","StatementOptionHelp":{"#cdata":"[Syntax: { SUB \"string\" | dynamic }] \n Text-command that specifies that the string or dynamic is to appear as subscript text. \nDefault: no default\n\nExample: entryfootnote \"y = \" b{sub \"0\"} \" + b\" {sub \"1\"} \"x\";"},"StatementOptionType":"RS"},{"StatementOptionName":"SUP","StatementOptionHelp":{"#cdata":"[Syntax: { SUP \"string\" | dynamic }] \n \nText-command that specifies that the string or dynamic is to appear as superscript text. \nDefault: no default\n\nExample: entryfootnote \"R\" {sup \"2\"} \" = \" {format (6.4) RSQUARED} ;"},"StatementOptionType":"RS"},{"StatementOptionName":"TEXTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: TEXTATTRS=style-element | style-element (text-options) | (text-options)] \n \nAs a statement option, specifies the text properties of the entire entry text. As a prefix-option, \nspecifies the text properties of individual text-items. \n\nDefault: The GraphFootnoteText style element.\n\nTip: This option can be used as both a prefix option and a statement option. When used as a prefix \noption, it overrides the statement option.\n\nTip: When used as a prefix option, TEXTATTRS=( ) cancels the last used TEXTATTRS= prefix option and \nresets all text options to those set by 1) the TEXTATTRS= statement option or 2) the default style \nelement for the statement (GraphFootnoteText) if no TEXTATTRS= statement option is used.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TEXTFITPOLICY=","StatementOptionHelp":{"#cdata":"Specifies how to handle a footnote that is too long to fit in the output width. \n\nDefault: WRAP \n\nInteraction: If you specify SHORT for this option, you should assign a shortened version of the footnote \nwith the SHORTTEXT= option. If the shortened footnote is itself too long, it will be truncated."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"WRAP","@Value2":"SHORT","@Value3":"TRUNCATE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the text wraps to the next line(s).","@ToolTip2":"Specifies that the text indictated by the SHORTTEXT= option be substituted when the title will not fit.","@ToolTip3":"Specifies that the text is truncated to make it fit."}},{"StatementOptionName":"UNICODE","StatementOptionHelp":{"#cdata":"[Syntax: { UNICODE \"hex-string\"x | keyword | dynamic }] \n \nText-command that specifies a glyph (character) to be displayed using its unicode specification or \nkeyword equivalent. Default: no default\n\n\"hex-string\"x \nA four-byte hexadecimal constant that represents a UNICODE character in the current font. \nFor a complete listing, see http://www.unicode.org/charts/charindex.html. \n\nkeyword \nA SAS keyword for a UNICODE character. For a listing of SAS-supplied keywords, \nsee \"Reserved Keywords and Unicode Values\". \n\ndynamic \nThe dynamic must resolve to either \"hex-string\"x or a keyword for a UNICODE character. \nExamples:\n \n entryfootnote {unicode alpha} \"=\" CONF; \n entryfootnote {unicode \"03B1\"x} \"=\" CONF; \n\nTip: This text command attempts to access a UNICODE value in the current font. Not all fonts \nsupport accessing characters via their UNICODE value. Some fonts only support a limited set \nof UNICODE values. If the UNICODE value is not accessible, the command may be ignored or an \nunprintable character may be substituted."},"StatementOptionType":"RS"}]}},{"StatementName":"ENTRYTITLE","StatementHelp":{"#cdata":"Syntax: ENTRYTITLE text-item <... > ; \n \nDisplays a title."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the title background. \n\nstyle-element \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR is used. \n\nInteraction: OPAQUE=TRUE must be in effect for the color to be seen. By default, OPAQUE=FALSE."},"StatementOptionType":"C"},{"StatementOptionName":"BORDER=","StatementOptionHelp":{"#cdata":"Specifies whether a border is displayed around the title. \n \nDefault: FALSE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"A border is displayed around the legend.","@ToolTip2":"A border is not displayed around the legend."}},{"StatementOptionName":"BORDERATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: BORDERATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the border line around the title.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (line-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(line-options) \n COLOR=style-reference | color \n specifies the line color. If you use a style-reference, the style-attribute should be a valid attribute such as COLOR,\n CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use CONTRASTCOLOR for lines.\n \n PATTERN=style-reference | line-pattern-name | line-pattern-number \n specifies the line pattern. If you use a style-reference, the style-attribute should be LINESTYLE. \n Line patterns can be specified as a pattern name or pattern number (1 = Solid, 2-42 Dash/Dot).\n\n THICKNESS=style-reference | dimension \n specifies the line thickness. If you use a style-reference, the style-attribute should be LINETHICKNESS. \n \nDefault: The GraphBorderLines style element.\n\nInteraction: BORDER=TRUE must be set for this option to have any effect."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|PATTERN=|THICKNESS="},{"StatementOptionName":"HALIGN=","StatementOptionHelp":{"#cdata":"Specifies the horizontal alignment of a text-item.\n\nDefault: CENTER\n\nTip: Each text-item has a horizontal alignment, and text-items with the same alignment are always \nconcatenated together."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"CENTER","@Value2":"LEFT","@Value3":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Specifies a centered horizontal alignment.","@ToolTip2":"Specifies a left-aligned horizontal alignment.","@ToolTip3":"Specifies a right-aligned horizontal alignment."}},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the title background is opaque (TRUE) or transparent (FALSE). \n \nDefault: FALSE \n\nInteraction: When this option is set to FALSE, the background color is not used."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the title background is transparent.","@ToolTip2":"Specifies that the title background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is reserved inside the title border. \n\nDefault: (LEFT=3 RIGHT=3 TOP=0 BOTTOM=0)\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the title border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options \nto create non-uniform padding. These options must be enclosed in parentheses. Each option is specified \nas a name = value pair. Sides not assigned padding are padded with the default amount. \nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n \n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n \n TOP=dimension \n specifies the amount of extra space added to the top. \n \n BOTTOM=dimension \n specifies the amount of extra space added to the bottom"},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"SHORTTEXT=","StatementOptionHelp":{"#cdata":"[Syntax: SHORTTEXT=(text-item <... )] \n \nSpecifies an alternate footnote to use if the specified title is too long for the output width. \nIf the shortened text is itself too long, it will be truncated. \nDefault: no default\n\nInteraction: This option has no effect unless TEXTFITPOLICY=SHORT.\n\nInteraction: This option is ignored if any text-items include an HALIGN= prefix option.\n\nInteraction: The horizontal alignment of the shortened text is derived from the horizontal alignment \nof the title to be shortened."},"StatementOptionType":"V"},{"StatementOptionName":"SUB","StatementOptionHelp":{"#cdata":"[Syntax: { SUB \"string\" | dynamic }] \n Text-command that specifies that the string or dynamic is to appear as subscript text. \nDefault: no default\n\nExample: entrytitle \"y = \" b{sub \"0\"} \" + b\" {sub \"1\"} \"x\";"},"StatementOptionType":"RS"},{"StatementOptionName":"SUP","StatementOptionHelp":{"#cdata":"[Syntax: { SUP \"string\" | dynamic }] \n \nText-command that specifies that the string or dynamic is to appear as superscript text. \nDefault: no default\n\nExample: entrytitle \"R\" {sup \"2\"} \" = \" {format (6.4) RSQUARED} ;"},"StatementOptionType":"RS"},{"StatementOptionName":"TEXTATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: TEXTATTRS=style-element | style-element (text-options) | (text-options)] \n \nAs a statement option, specifies the text properties of the entire entry text. As a prefix-option, \nspecifies the text properties of individual text-items. \n\nDefault: The GraphValueText style element.\nTip: This option can be used as both a prefix option and a statement option. When used as a prefix option, \nit overrides the statement option.\n\nTip: When used as a prefix option, TEXTATTRS=( ) cancels the last used TEXTATTRS= prefix option and \nresets all text options to those set by 1) the TEXTATTRS= statement option or 2) the default style \nelement for the statement (GraphValueText) if no TEXTATTRS= statement option is used. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TEXTFITPOLICY=","StatementOptionHelp":{"#cdata":"Specifies how to handle a footnote that is too long to fit in the output width. \n\nDefault: WRAP \n\nInteraction: If you specify SHORT for this option, you should assign a shortened version of the footnote \nwith the SHORTTEXT= option. If the shortened footnote is itself too long, it will be truncated."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"WRAP","@Value2":"SHORT","@Value3":"TRUNCATE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the text wraps to the next line(s).","@ToolTip2":"Specifies that the text indictated by the SHORTTEXT= option be substituted when the title will not fit.","@ToolTip3":"Specifies that the text is truncated to make it fit."}},{"StatementOptionName":"UNICODE","StatementOptionHelp":{"#cdata":"[Syntax: { UNICODE \"hex-string\"x | keyword | dynamic }] \n \nText-command that specifies a glyph (character) to be displayed using its unicode specification or \nkeyword equivalent. Default: no default\n\n\"hex-string\"x \nA four-byte hexadecimal constant that represents a UNICODE character in the current font. \nFor a complete listing, see http://www.unicode.org/charts/charindex.html. \n\nkeyword \nA SAS keyword for a UNICODE character. For a listing of SAS-supplied keywords, \nsee \"Reserved Keywords and Unicode Values\". \n\ndynamic \nThe dynamic must resolve to either \"hex-string\"x or a keyword for a UNICODE character. \nExamples:\n \n entrytitle {unicode alpha} \"=\" CONF; \n entrytitle {unicode \"03B1\"x} \"=\" CONF; \n\nTip: This text command attempts to access a UNICODE value in the current font. Not all fonts \nsupport accessing characters via their UNICODE value. Some fonts only support a limited set \nof UNICODE values. If the UNICODE value is not accessible, the command may be ignored or an \nunprintable character may be substituted."},"StatementOptionType":"RS"}]}},{"StatementName":"COLUMNAXES","StatementHelp":{"#cdata":"Syntax: COLUMNAXES ; \n AXISCOMP axis-option(s); \n ENDCOLUMNAXES; \n\nSpecifies the primary (bottom) axes for the columns:\n\nRequirement: You must specify an ENDCOLUMNAXES statement to complete the COLUMNAXES \nstatement block."},"StatementOptions":null},{"StatementName":"ENDCOLUMNAXES","StatementHelp":{"#cdata":"Syntax: ENDCOLUMNAXES ;\n \nSignals the end of a COLUMNAXES block."},"StatementOptions":null},{"StatementName":"COLUMN2AXES","StatementHelp":{"#cdata":"Syntax: COLUMN2AXES ; \n AXISCOMP axis-option(s); \n ENDCOLUMN2AXES; \n \nSpecifies the secondary (top) axes for the columns.\n\nRequirement: You must specify an ENDCOLUMN2AXES statement to complete the COLUMN2AXES \nstatement block."},"StatementOptions":null},{"StatementName":"ENDCOLUMN2AXES","StatementHelp":{"#cdata":"Syntax: ENDCOLUMN2AXES ;\n \nSignals the end of a COLUMN2AXES block."},"StatementOptions":null},{"StatementName":"COLUMNAXIS","StatementHelp":{"#cdata":"Syntax: COLUMNAXIS / external-axis-options \n \nCOLUMNAXIS statements can be used to simplify and clarify the layout by displaying \nonly the external X axes in the resulting graph."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DISCRETEOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: DISCRETEOPTS=( discrete-axis-options )] \n \nSpecifies one or more options for a discrete X or X2 axis."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: DISPLAY= STANDARD | ALL | NONE | (display-options)] \n \nControls which axis features are displayed on the primary axis.\n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip2":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip3":"Specifies that no axis features are displayed.","@ToolTip4":"A parenthesized list of space-delimited options. The list must include one or more of the following: LABEL displays the axis label LINE displays the axis line TICKS displays the tick marks TICKVALUES displays the values that are represented by the major tick marks Tip: The default line attributes for the axis line and axis tick marks are defined in the GraphAxisLine style element."}},{"StatementOptionName":"DISPLAYSECONDARY=","StatementOptionHelp":{"#cdata":"[Syntax: DISPLAYSECONDARY= STANDARD | ALL | NONE | (display-options)] \n \nControls which axis features are displayed on the secondary axis. \n\nDefault: NONE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip2":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip3":"Specifies that no axis features are displayed.","@ToolTip4":"A parenthesized list of space-delimited options. The list must include one or more of the following: LABEL displays the axis label LINE displays the axis line TICKS displays the tick marks TICKVALUES displays the values that are represented by the major tick marks Tip: The secondary axis is a duplicate of the primary axis (the axis to which the data are mapped). It is on the opposite side of the lattice from the primary axis."}},{"StatementOptionName":"GRIDATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: GRIDATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the grid lines. \n\nDefault: The GraphGridLines style element.\n\nInteraction: This option is ignored if the GRIDDISPLAY= option does not display \nthe grid lines."},"StatementOptionType":"V"},{"StatementOptionName":"GRIDDISPLAY=","StatementOptionHelp":{"#cdata":"Specifies how the grid lines are to be displayed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO_OFF","@Value2":"AUTO_ON","@Value3":"ON","@Value4":"OFF"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that grid lines will not be displayed unless the GraphGridLines element in the current style contains DisplayOpts=\"ON\".","@ToolTip2":"Specifies that grid lines will be displayed unless the GraphGridLines element in the current style contains DisplayOpts=\"OFF\".","@ToolTip3":"Specifies that grid lines will always be displayed. The current style has no override.","@ToolTip4":"Specifies that grid lines will never be displayed. The current style has no override."}},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LABEL=\"string\" | ( \"string\" ... \"string\" )] \n \nSpecifies the axis label. The \"string\" may be either a string literal or a dynamic. \nThe list form implies that all included string literals or dynamics will be concatenated \n\nDefault: The default label is derived from the primary plot in the layout."},"StatementOptionType":"V"},{"StatementOptionName":"LABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the axis label. \n\nDefault: The GraphLabelText style element.\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"LINEAROPTS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEAROPTS=( linear-axis-options )] \n \nSpecifies one or more linear-axis-options for a numeric interval axis."},"StatementOptionType":"V"},{"StatementOptionName":"LOGOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: LOGOPTS=( log-axis-options )] \n \nSpecifies one or more log-axis-options for a log axis."},"StatementOptionType":"V"},{"StatementOptionName":"OFFSETMAX=","StatementOptionHelp":{"#cdata":"Reserves an area at the maximum end of the axis. No tick marks are displayed in the \nreserved area.\n\nDefault: AUTO\n\nRange: 0 - 1. The sum of OFFSETMAX= and OFFSETMIN= should not be more than 1."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"AUTOCOMPRESS","@Value3":""},"StatementOptionToolTips":{"@ToolTip1":"Reserves just enough area to fully display markers and other graphical features near the maximum end of an axis.","@ToolTip2":"Automatic offset applied that prevents axis labels and tick values from extending beyond the axis length.","@ToolTip3":"The offset is expressed as a decimal proportion of the full axis length. Replace with an actual value."}},{"StatementOptionName":"OFFSETMIN=","StatementOptionHelp":{"#cdata":"Reserves an area at the mimimum end of the axis. No tick marks are displayed in the \nreserved area.\n\nDefault: AUTO\n\nRange: 0 - 1. The sum of OFFSETMAX= and OFFSETMIN= should not be more than 1."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"AUTOCOMPRESS","@Value3":""},"StatementOptionToolTips":{"@ToolTip1":"Reserves just enough area to fully display markers and other graphical features near the minimum end of an axis.","@ToolTip2":"Automatic offset applied that prevents axis labels and tick values from extending beyond the axis length.","@ToolTip3":"The offset is expressed as a decimal proportion of the full axis length. Replace with an actual value."}},{"StatementOptionName":"SHORTLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: SHORTLABEL=\"string\"] \n \nSpecifies an alternate axis label. This label is used when the default axis label \nor label specified by the LABEL= option is too long for the axis length. \n\nDefault: no default\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label.\n\nTip: If the specified label is itself too long for the axis, it is truncated in the display."},"StatementOptionType":"V"},{"StatementOptionName":"TICKVALUEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: style-element | style-element (text-options) | (text-options)] \n \nspecifies the color and font attributes of the axis tick values. \nDefault: The GraphValueText style element.\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TIMEOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: TIMEOPTS=( time-axis-options )] \n \nSpecifies one or more time-axis-options for a time axis."},"StatementOptionType":"V"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the type of axis to use."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"DISCRETE","@Value3":"LINEAR","@Value4":"TIME","@Value5":"LOG"},"StatementOptionToolTips":{"@ToolTip1":"Requests that the axis type be automatically determined, based on the overlay contents.","@ToolTip2":"Use a DISCRETE X or X2 axis if possible. This setting is not available on a ROWAXIS statement. The data for discrete axes can be character or numeric. For a column axis, you can add a DISCRETEOPTS=( ) option list to customize this axis type.","@ToolTip3":"Use a LINEAR axis if possible. You can add a LINEAROPTS=( ) option list to customize this axis type.","@ToolTip4":"Use a TIME axis if possible. Data for this axis must be SAS time, SAS date, or SAS datetime values. You can add a TIMEOPTS=( ) option list to customize this axis type.","@ToolTip5":"Use a LOG axis if possible. You can add a LOGOPTS=( ) option list to customize this axis type."}}]}},{"StatementName":"ROWAXIS","StatementHelp":{"#cdata":"Syntax: ROWAXIS / external-axis-options \n \nROWAXIS statements can be used to simplify and clarify the layout by displaying \nonly the external Y axes in the resulting graph."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DISCRETEOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: DISCRETEOPTS=( discrete-axis-options )] \n \nSpecifies one or more options for a discrete X or X2 axis."},"StatementOptionType":"V"},{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"[Syntax: DISPLAY= STANDARD | ALL | NONE | (display-options)] \n \nControls which axis features are displayed on the primary axis.\n\nDefault: STANDARD"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip2":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip3":"Specifies that no axis features are displayed.","@ToolTip4":"A parenthesized list of space-delimited options. The list must include one or more of the following: LABEL displays the axis label LINE displays the axis line TICKS displays the tick marks TICKVALUES displays the values that are represented by the major tick marks Tip: The default line attributes for the axis line and axis tick marks are defined in the GraphAxisLine style element."}},{"StatementOptionName":"DISPLAYSECONDARY=","StatementOptionHelp":{"#cdata":"[Syntax: DISPLAYSECONDARY= STANDARD | ALL | NONE | (display-options)] \n \nControls which axis features are displayed on the secondary axis. \n\nDefault: NONE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"STANDARD","@Value2":"ALL","@Value3":"NONE","@Value4":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip2":"Specifies that the LABEL, LINE, TICKS, and TICKVALUES are displayed.","@ToolTip3":"Specifies that no axis features are displayed.","@ToolTip4":"A parenthesized list of space-delimited options. The list must include one or more of the following: LABEL displays the axis label LINE displays the axis line TICKS displays the tick marks TICKVALUES displays the values that are represented by the major tick marks Tip: The secondary axis is a duplicate of the primary axis (the axis to which the data are mapped). It is on the opposite side of the lattice from the primary axis."}},{"StatementOptionName":"GRIDATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: GRIDATTRS=style-element | style-element (line-options) | (line-options)] \n \nSpecifies the attributes of the grid lines. \n\nDefault: The GraphGridLines style element.\n\nInteraction: This option is ignored if the GRIDDISPLAY= option does not display \nthe grid lines."},"StatementOptionType":"V"},{"StatementOptionName":"GRIDDISPLAY=","StatementOptionHelp":{"#cdata":"Specifies how the grid lines are to be displayed."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO_OFF","@Value2":"AUTO_ON","@Value3":"ON","@Value4":"OFF"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that grid lines will not be displayed unless the GraphGridLines element in the current style contains DisplayOpts=\"ON\".","@ToolTip2":"Specifies that grid lines will be displayed unless the GraphGridLines element in the current style contains DisplayOpts=\"OFF\".","@ToolTip3":"Specifies that grid lines will always be displayed. The current style has no override.","@ToolTip4":"Specifies that grid lines will never be displayed. The current style has no override."}},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LABEL=\"string\" | ( \"string\" ... \"string\" )] \n \nSpecifies the axis label. The \"string\" may be either a string literal or a dynamic. \nThe list form implies that all included string literals or dynamics will be concatenated \n\nDefault: The default label is derived from the primary plot in the layout."},"StatementOptionType":"V"},{"StatementOptionName":"LABELATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: LABELATTRS=style-element | style-element (text-options) | (text-options)] \n \nSpecifies the color and font attributes of the axis label. \n\nDefault: The GraphLabelText style element.\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label. \n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"LINEAROPTS=","StatementOptionHelp":{"#cdata":"[Syntax: LINEAROPTS=( linear-axis-options )] \n \nSpecifies one or more linear-axis-options for a numeric interval axis."},"StatementOptionType":"V"},{"StatementOptionName":"LOGOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: LOGOPTS=( log-axis-options )] \n \nSpecifies one or more log-axis-options for a log axis."},"StatementOptionType":"V"},{"StatementOptionName":"OFFSETMAX=","StatementOptionHelp":{"#cdata":"Reserves an area at the maximum end of the axis. No tick marks are displayed in the \nreserved area.\n\nDefault: AUTO\n\nRange: 0 - 1. The sum of OFFSETMAX= and OFFSETMIN= should not be more than 1."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"AUTOCOMPRESS","@Value3":""},"StatementOptionToolTips":{"@ToolTip1":"Reserves just enough area to fully display markers and other graphical features near the maximum end of an axis.","@ToolTip2":"Automatic offset applied that prevents axis labels and tick values from extending beyond the axis length.","@ToolTip3":"The offset is expressed as a decimal proportion of the full axis length. Replace with an actual value."}},{"StatementOptionName":"OFFSETMIN=","StatementOptionHelp":{"#cdata":"Reserves an area at the mimimum end of the axis. No tick marks are displayed in the \nreserved area.\n\nDefault: AUTO\n\nRange: 0 - 1. The sum of OFFSETMAX= and OFFSETMIN= should not be more than 1."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"AUTOCOMPRESS","@Value3":""},"StatementOptionToolTips":{"@ToolTip1":"Reserves just enough area to fully display markers and other graphical features near the minimum end of an axis.","@ToolTip2":"Automatic offset applied that prevents axis labels and tick values from extending beyond the axis length.","@ToolTip3":"The offset is expressed as a decimal proportion of the full axis length. Replace with an actual value."}},{"StatementOptionName":"SHORTLABEL=","StatementOptionHelp":{"#cdata":"[Syntax: SHORTLABEL=\"string\"] \n \nSpecifies an alternate axis label. This label is used when the default axis label \nor label specified by the LABEL= option is too long for the axis length. \n\nDefault: no default\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label.\n\nTip: If the specified label is itself too long for the axis, it is truncated in the display."},"StatementOptionType":"V"},{"StatementOptionName":"TICKVALUEATTRS=","StatementOptionHelp":{"#cdata":"[Syntax: style-element | style-element (text-options) | (text-options)] \n \nspecifies the color and font attributes of the axis tick values. \nDefault: The GraphValueText style element.\n\nInteraction: This option is ignored if the DISPLAY= or DISPLAYSECONDARY= option does \nnot display the axis label.\n\nstyle-element \n Name of a style element. Only style attributes relevant for rendering the fill, line, data marker, or text will be used.\n\nstyle-element (text-options) \n Name of a style element, plus individual options to be used as style overrides. Any options not specified are derived\n from the specified style-element.\n\n(text-options) \nCOLOR=style-reference | color \n specifies the color of the text. If you use a style-reference, the style-attribute should be a valid\n attribute such as COLOR, CONTRASTCOLOR, STARTCOLOR, NEUTRAL, ENDCOLOR. The convention is to use COLOR for text.\n\nFAMILY =style-reference | \"string\" \n specifies the font family of the text. If you use a style-reference, the style-attribute should be FONTFAMILY.\n\nSIZE=style-reference | dimension \n specifies the font size of the text. If you use a style-reference, the style-attribute should be FONTSIZE. \n\nSTYLE=style-reference | NORMAL | ITALIC \n specifies the font style of the text. If you use a style-reference, the style-attribute should be FONTSTYLE. \n\nWEIGHT=style-reference | NORMAL | BOLD \n specifies the font weight of the text. If you use a style-reference, the style-attribute should be FONTWEIGHT."},"StatementOptionType":"V","SubOptionsKeywords":"COLOR=|FAMILY=|SIZE=|STYLE=|WEIGHT="},{"StatementOptionName":"TIMEOPTS=","StatementOptionHelp":{"#cdata":"[Syntax: TIMEOPTS=( time-axis-options )] \n \nSpecifies one or more time-axis-options for a time axis."},"StatementOptionType":"V"},{"StatementOptionName":"TYPE=","StatementOptionHelp":{"#cdata":"Specifies the type of axis to use."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"AUTO","@Value2":"DISCRETE","@Value3":"LINEAR","@Value4":"TIME","@Value5":"LOG"},"StatementOptionToolTips":{"@ToolTip1":"Requests that the axis type be automatically determined, based on the overlay contents.","@ToolTip2":"Use a DISCRETE X or X2 axis if possible. This setting is not available on a ROWAXIS statement. The data for discrete axes can be character or numeric. For a column axis, you can add a DISCRETEOPTS=( ) option list to customize this axis type.","@ToolTip3":"Use a LINEAR axis if possible. You can add a LINEAROPTS=( ) option list to customize this axis type.","@ToolTip4":"Use a TIME axis if possible. Data for this axis must be SAS time, SAS date, or SAS datetime values. You can add a TIMEOPTS=( ) option list to customize this axis type.","@ToolTip5":"Use a LOG axis if possible. You can add a LOGOPTS=( ) option list to customize this axis type."}}]}},{"StatementName":"ROWAXES","StatementHelp":{"#cdata":"Syntax: ROWAXES ; \n AXISCOMP axis-option(s); \n ENDROWAXES; \n \nSpecifies the primary (left) axes for the rows.\n\nRequirement: You must specify an ENDROWAXES statement to complete the ROWAXES statement block."},"StatementOptions":null},{"StatementName":"ENDROWAXES","StatementHelp":{"#cdata":"Syntax: ENDROWAXES ; \n \nSignals the end of a ROWAXES block."},"StatementOptions":null},{"StatementName":"ROW2AXES","StatementHelp":{"#cdata":"Syntax: ROW2AXES ; \n AXISCOMP axis-option(s); \n ENDROW2AXES; \n \nSpecifies the secondary (right) axes for the rows.\n\nRequirement: You must specify an ENDROW2AXES statement to complete the ROW2AXES statement block."},"StatementOptions":null},{"StatementName":"ENDROW2AXES","StatementHelp":{"#cdata":"Syntax: ENDROW2AXES ;\n \nSignals the end of a ROW2AXES block."},"StatementOptions":null},{"StatementName":"COLUMNHEADERS","StatementHelp":{"#cdata":"Syntax: COLUMNHEADERS ;\n \nSpecifies a header for the primary (bottom) column-header position."},"StatementOptions":null},{"StatementName":"COLUMN2HEADERS","StatementHelp":{"#cdata":"Syntax: COLUMN2HEADERS ; \n \nSpecifies a header for the secondary (top) column-header position."},"StatementOptions":null},{"StatementName":"ROWHEADERS","StatementHelp":{"#cdata":"Syntax: ROWHEADERS ; \n \nSpecifies a header for the primary (left) row-header position. ENTRY statements \ncan be used to specify rotated text."},"StatementOptions":null},{"StatementName":"ROW2HEADERS","StatementHelp":{"#cdata":"Syntax: ROW2HEADERS ; \n \nSpecifies a header for the secondary (right) row-header position. ENTRY statements \ncan be used to specify rotated text."},"StatementOptions":null},{"StatementName":"ENDCOLUMNHEADERS","StatementHelp":{"#cdata":"Syntax: ENDCOLUMNHEADERS ; \n \nSignals the end of a header block."},"StatementOptions":null},{"StatementName":"CELL","StatementHelp":{"#cdata":"Syntax: CELL; \n \n ODS-Graph-statement(s); \n ENDCELL; \n \nSignals the beginning of a CELL block; \n\nRequirement: You must specify an ENDCELL statement to complete the CELL statement block. \n\nTip: If a CELLHEADER statement block is not specified inside of a CELL statement block, then \nthe enclosed ODS-Graph-statement(s) produces the same results as if the ODS-Graph-statement(s) \nwere specified outside of the CELL statement block."},"StatementOptions":null},{"StatementName":"ENDCELL","StatementHelp":{"#cdata":"Syntax: ENDCELL ; \n \nSignals the end of a CELL block;"},"StatementOptions":null},{"StatementName":"CELLHEADER","StatementHelp":{"#cdata":"Syntax: CELLHEADER ; \n \nSignals the beginning of a CELLHEADER block; \n\nWithin a CELL block, a CELLHEADER block can be used to generate one or more header \nlines within the cell. Each header line is specified on a separate GTL-statement \nwithin the CELLHEADER block. The header block is typically used to specify one or \nmore text statements, but other statements are allowed within the block. \n\nRequirement: You must specify an ENDCELLHEADER statement to complete the CELLHEADER \nstatement block. \n\nTip: You can generate multiple headings by specifying multiple ODS-Graph-statement(s) \nwithin a CELLHEADER statement block."},"StatementOptions":null},{"StatementName":"ENDCELLHEADER","StatementHelp":{"#cdata":"Syntax: ENDCELLHEADER ; \n \nSignals the end of a CELLHEADER block."},"StatementOptions":null},{"StatementName":"SIDEBAR","StatementHelp":{"#cdata":"Syntax: SIDEBAR ; \n \nSignals the beginning of a SIDEBAR block; \n\nFour sidebar areas are available: two that span all columns (one on the TOP and one \non the BOTTOM), and two that span all rows (one on the RIGHT and one on the LEFT)."},"StatementOptions":{"StatementOption":{"StatementOptionName":"ALIGN=","StatementOptionHelp":{"#cdata":"[Syntax: ALIGN= TOP | BOTTOM | LEFT | RIGHT ] \n \nSpecifies the location of the sidebar block."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOP","@Value2":"BOTTOM","@Value3":"LEFT","@Value4":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Sidebar block spans across all columns on the top.","@ToolTip2":"Sidebar block spans across all columns on the bottom.","@ToolTip3":"Sidebar block spans across all row on the left.","@ToolTip4":"Sidebar block spans across all row on the right."}}}},{"StatementName":"ENDSIDEBAR","StatementHelp":{"#cdata":"Syntax: ENDSIDEBAR ; \n \nSignals the end of a SIDEBAR block."},"StatementOptions":null},{"StatementName":"INNERMARGIN","StatementHelp":{"#cdata":"Syntax: INNERMARGIN < /option(s)>; \n block-plot-statement(s); | axis-table statement(s);\n\n ENDINNERMARGIN;\n \nProvides a nested region in a LAYOUT OVERLAY or LAYOUT PROTOTYPE container in which a block plot \nor axis table can be placed."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"ALIGN=","StatementOptionHelp":{"#cdata":"[Syntax: ALIGN= TOP | BOTTOM | LEFT | RIGHT ] \n \nSpecifies the location of the sidebar block."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TOP","@Value2":"BOTTOM","@Value3":"LEFT","@Value4":"RIGHT"},"StatementOptionToolTips":{"@ToolTip1":"Sidebar block spans across all columns on the top.","@ToolTip2":"Sidebar block spans across all columns on the bottom.","@ToolTip3":"Sidebar block spans across all row on the left.","@ToolTip4":"Sidebar block spans across all row on the right."}},{"StatementOptionName":"BACKGROUNDCOLOR=","StatementOptionHelp":{"#cdata":"[Syntax: BACKGROUNDCOLOR=style-reference | color] \n \nSpecifies the color of the inner margin background. \n\nstyle-reference \nA reference in the form style-element:style-attribute. Only the style-attribute named COLOR or CONTRASTCOLOR are used. \n\ncolor\nspecifies a color. \n\nDefault: The graph wall color. \nInteraction: For this option to have any effect, the OPAQUE= option must be set to TRUE. \nNote: The inner margin background is set to the wall color even when WALLDISPLAY= NONE."},"StatementOptionType":"C"},{"StatementOptionName":"GUTTER=","StatementOptionHelp":{"#cdata":"Syntax: GUTTER=dimension\n\nSpecifies the gap between nested layouts.\n\nDefault 0 \nNote The default units for dimension are pixels."},"StatementOptionType":"V"},{"StatementOptionName":"OPAQUE=","StatementOptionHelp":{"#cdata":"Specifies whether the layout background is opaque (TRUE) or transparent (FALSE). The default \nis FALSE."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"FALSE","@Value2":"TRUE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the layout background is transparent.","@ToolTip2":"Specifies that the layout background is opaque."}},{"StatementOptionName":"PAD=","StatementOptionHelp":{"#cdata":"[Syntax: PAD=dimension | (pad-options)] \n \nSpecifies the amount of extra space that is added inside the layout border. The default padding \nfor all sides is 0. Values without units are in pixels (px). A unit must be provided if other than pixels.\n\ndimension \nSpecifies a dimension to use for the extra space at the left, right, top, and bottom of the layout border. \n\n(pad-options) \nEnables separate settings for the left, right, top, and bottom padding dimensions. Use the pad-options to\ncreate non-uniform padding. These options must be enclosed in parentheses.\n\nValues without units are in pixels (px). A unit must be provided if other than pixels.\n\n LEFT=dimension \n specifies the amount of extra space added to the left side. \n\n RIGHT=dimension \n specifies the amount of extra space added to the right side. \n\n TOP=dimension \n specifies the amount of extra space added to the top. \n\n BOTTOM=dimension \n specifies the amount of extra space added to the bottom."},"StatementOptionType":"V","SubOptionsKeywords":"BOTTOM=|TOP=|RIGHT=|LEFT="},{"StatementOptionName":"SEPARATOR=","StatementOptionHelp":{"#cdata":"Syntax: SEPARATOR=TRUE | FALSE\n\nSpecifies whether a separating line is drawn between the inner margin and the rest of the layout content.\n\nNote: This option is valid in the first maintenance release of SAS 9.4 and later releases. \n\nDefault: FALSE \nTip: Use the SEPARATORATTRS= option to specify the attributes of the separating line."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that a separating line is drawn between the inner margin and the rest of the layout content.","@ToolTip2":"Specifies that no separating line is drawn between the inner margin and the rest of the layout content."}},{"StatementOptionName":"SEPARATORATTRS=","StatementOptionHelp":{"#cdata":"Syntax: SEPARATORATTRS=style-element | style-element (line-options) | (line-options) \n\nSpecifies the attributes of the inner margin separating line.\n\nNote: This option is valid in the first maintenance release of SAS 9.4 and later releases. \n\nDefault: The graphAxisLines style element \nInteraction: This option is ignored when SEPARATOR=FALSE."},"StatementOptionType":"V"}]}},{"StatementName":"ENDINNERMARGIN","StatementHelp":{"#cdata":"Syntax: ENDINNERMARGIN ; \n \nSignals the end of an ENDINNERMARGIN block."},"StatementOptions":null},{"StatementName":"AXISCOMP","StatementHelp":{"#cdata":"Syntax: AXISCOMP axis-option(s); \n \nSpecifies one or more axis options. \n\nRequirement: The AXISCOMP statement must be used inside of a primary or secondary column \nor row axis statement block. \n\nRequirement: You must specify at least one axis-option. \n\nRequirement: Within a COLUMNAXES statement block, the number of AXISCOMP statements must \nmatch the number of columns. \n\nRequirement: Within a ROWAXES statement block, the number of AXISCOMP statements must match \nthe number of rows. \n\nRestriction: You cannot use the THRESHOLDMAX or THRESHOLDMIN axis options with the \nAXISCOMP statement."},"StatementOptions":{"StatementOption":[{"StatementOptionName":"DISPLAY=","StatementOptionHelp":{"#cdata":"Controls the display of the axis features such as the axis label, line, tick marks, \nand values.\n\nDefault: ALL \n\nRequirement: The display-options must be enclosed in parentheses and separated by spaces."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"ALL","@Value2":"NONE","@Value3":"<(display-options)>"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that the axis label, line, tick marks, and values are displayed.","@ToolTip2":"Specifies that no axis features are displayed.","@ToolTip3":"Specifies one or more display options. LABEL displays the axis label. LINE displays the axis line. TICKS displays the axis tick marks. VALUES displays the values that are represented by the tick marks."}},{"StatementOptionName":"INTEGER=","StatementOptionHelp":{"#cdata":"Specifies whether evenly spaced integer values are used for tick marks.\n\nDefault: FALSE \n\nInteraction: The INTEGER= option is overridden by the TICKS= axis option. If the \nvariable is not continuous, then INTEGER= option is ignored. \n\nRestriction: The INTEGER= option is ignored on the X axis for bar charts, box plots, \nand histograms."},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"TRUE","@Value2":"FALSE"},"StatementOptionToolTips":{"@ToolTip1":"Specifies that evenly spaced integer values are used for tick marks.","@ToolTip2":"Specifies that evenly spaced integer values are not used for tick marks."}},{"StatementOptionName":"LABEL=","StatementOptionHelp":{"#cdata":"[Syntax: LABEL= 'string'] \n \nSpecifies the axis label.\n\nDefault: The default is to use the label of the column associated with the axis. \nIf the label does not exist, the column name is used as the label. \n\nNote: For a computed column, the default is the expression used to compute the column."},"StatementOptionType":"V"},{"StatementOptionName":"LABELFONTSIZE=","StatementOptionHelp":{"#cdata":"[Syntax: LABELFONTSIZE= dimension | style-reference] \n \nSpecifies the font size used to display the axis label.\n\nDefault: specified by the GraphLabelText:font_size style attribute."},"StatementOptionType":"V"},{"StatementOptionName":"THRESHOLDMAX=","StatementOptionHelp":{"#cdata":"[Syntax: THRESHOLDMAX= number] \n \nSpecifies a threshold for displaying one more tick mark at the high end of the axis. \nThe threshold is expressed as a decimal proportion of the tick interval, and it is \nmeasured from the potential tick value. If the largest data value lies within this \nthreshold distance from the potential tick mark, then the tick mark is displayed.\n\nDefault: .30 \nRange: 0 - 1 \n\nInteraction: If the variable is not continuous, then the THRESHOLDMAX= option is ignored. \n\nTip: If the threshold is set to 0, the potential tick mark is never displayed. If the \nthreshold is set to 1, the tick mark is always displayed. \n\nTip: Specifying THRESHOLDMIN=0 and THRESHOLDMAX=0 prevents the tick marks from extending \nbeyond the data range. \n\nTip: Specifying THRESHOLDMIN=1 and THRESHOLDMAX=1 ensures that the data range is bounded \nby tick marks. \n\nTip: For the minimum axis length, set the THRESHOLDMIN= and THRESHOLDMAX= options to 0."},"StatementOptionType":"V"},{"StatementOptionName":"THRESHOLDMIN=","StatementOptionHelp":{"#cdata":"[Syntax: THRESHOLDMIN= number] \n \nSpecifies a threshold for displaying one more tick mark at the low end of the axis. \nThe threshold is expressed as a decimal proportion of the tick interval, and it is \nmeasured from the potential tick value. If the lowest data value lies within this \nthreshold distance from the potential tick mark, then the tick mark is displayed.\n\nDefault: .30 \nRange: 0 - 1 \n\nInteraction: If the variable is not continuous, then the THRESHOLDMIN= option is ignored. \n\nTip: If the threshold is set to 0, the potential tick mark is never displayed. If the \nthreshold is set to 1, the tick mark is always displayed. \n\nTip: Specifying THRESHOLDMIN=0 and THRESHOLDMAX=0 prevents the tick marks from extending \nbeyond the data range. \n\nTip: Specifying THRESHOLDMIN=1 and THRESHOLDMAX=1 ensures that the data range is bounded \nby tick marks. \n\nTip: For the minimum axis length, set the THRESHOLDMIN= and THRESHOLDMAX= options to 0."},"StatementOptionType":"V"},{"StatementOptionName":"TICKDISPLAY=","StatementOptionHelp":{"#cdata":"Specifies where tick marks are displayed. \n \nDefault: OUTSIDE"},"StatementOptionType":"V","StatementOptionValues":{"@Value1":"OUTSIDE","@Value2":"INSIDE","@Value3":"BOTH"},"StatementOptionToolTips":{"@ToolTip1":"Displays tick marks outside of the axis lines.","@ToolTip2":"Displays tick marks inside of the axis lines.","@ToolTip3":"Displays tick marks across the axis lines."}},{"StatementOptionName":"TICKS=","StatementOptionHelp":{"#cdata":"[Syntax: TICKS= ( numeric-list )] \n \nSpecifies the tick values for the axis.\n\nRequirement: The numeric-list must be enclosed in parentheses and separated by spaces. \n\nInteraction: If the variable is not continuous, then the TICKS= option is ignored. \n\nTip: If ticks are specified outside of the axis range, then the axis range is extended \nto display the ticks."},"StatementOptionType":"V"},{"StatementOptionName":"VALUEFONTSIZE=","StatementOptionHelp":{"#cdata":"[Syntax: VALUEFONTSIZE= dimension | style-reference] \n \nSpecifies the font size used to display the tick values.\n\nDefault: specified by the GraphValueText:font_size style attribute."},"StatementOptionType":"V"}]}},{"StatementName":"EXTERNALAXIS","StatementOptions":null},{"StatementName":"IF","StatementHelp":{"#cdata":"GTL supports conditional logic that enables you to include or exclude one or more \nGTL statements at runtime: \n\nSyntax: \nIF ( condition ) \n GTL statement(s); \nELSE\n GTL statement(s); \nENDIF ;"},"StatementOptions":null},{"StatementName":"ELSE","StatementHelp":{"#cdata":"GTL supports conditional logic that enables you to include or exclude one or more \nGTL statements at runtime: \n\nSyntax: \nIF ( condition ) \n GTL statement(s); \nELSE\n GTL statement(s); \nENDIF ;"},"StatementOptions":null},{"StatementName":"ENDIF","StatementHelp":{"#cdata":"Delimits an IF statement block."},"StatementOptions":null}]}}} ================================================ FILE: server/data/SASARMMacros.json ================================================ {"Keywords":{"Keyword":[{"Name":"%ARMEND","Type":"MACRO_ARM","Help":{"#cdata":"Indicates the termination of an application. \n \nSyntax: %ARMEND< (option-1 <, ...option-n>)>; \n\nAvailable options are:\n\n APPID=numeric variable or constant \n is the application ID to use on the ARM_GETID function call. The value must be a numeric \n variable or constant. \n\n APPIDVAR=numeric variable \n is the application ID. The value must be a numeric variable.\n\n LEVEL=numeric variable or constant \n is a variable that specifies the execution level. The value must be a numeric constant or variable.\n\n MACONLY=NO | YES \n enables the %ARMEND macro to be issued in open code. You set the value to YES if the macro can be \n issued in open code, and NO if it can be issued only in a DATA step.\n\n Default: NO \n\n SCL=NO | YES \n is used only in SCL programs and specifies whether the macro is in an SCL environment. Set the value\n to YES if the macro is in an SCL environment, and NO if it is not. Default: NO"}},{"Name":"%ARMGTID","Type":"MACRO_ARM","Help":{"#cdata":"Assigns a unique identifier to a transaction class. \n \nSyntax: %ARMGTID (TXNNAME='transaction-name' < option-1 <, ...option-n>>); \n\nUse the %ARMGTID macro to name a transaction class. Transaction classes are related \nunits of work within an application. One or more %ARMGTID macros are typically issued \nwhen the application starts to name each of the transaction classes used by the application. \nThe %ARMGTID macro produces only one \nrecord for each transaction class, even if there are multiple %ARMGTID macros for the \nsame transaction class."}},{"Name":"%ARMINIT","Type":"MACRO_ARM","Help":{"#cdata":"Signifies the initialization of an application. \n \nSyntax: %ARMINIT (APPNAME='application-name' <, option-1 <, ...option-n>>); \n\nAvailable options are:\n\n APPIDVAR=numeric variable -- is the application ID. The value must be a numeric variable. \n\n APPUSER='application-userID' -- is the application user ID. The value is a SAS character variable or quoted literal. \n\n GETID=NO | YES -- is optional and denotes whether to generate an ARM_GETID function call after ARM_INIT. Default: NO \n\n LEVEL=numeric constant or variable -- is a variable that specifies the execution level. \n\n MACONLY=NO | YES -- enables the %ARMINIT macro to be issued in open code. Default: NO \n\n SCL=NO | YES -- is used only in SCL programs and specifies whether the macro is in an SCL environment. Default: NO \n\n TXNIDVAR=numeric variable -- is a numeric variable that contains the value of the transaction ID. \n\n TXNDET='name' -- is a transaction detail. The value is a SAS character variable or quoted literal. \n\n TXNNAME='transaction-name' -- is the transaction name. The value is a SAS character variable or quoted literal value."}},{"Name":"%ARMSTOP","Type":"MACRO_ARM","Help":{"#cdata":"Marks the end of a transaction instance. \n \nSyntax: %ARMSTOP (>);\n\nAvailable options are:\n\n LEVEL=numeric constant or variable \n is a variable that specifies the execution level. The value must be a numeric constant or variable.\n\n MACONLY=NO | YES \n enables the %ARMSTOP macro to be issued in open code. You set the value to YES if the macro can be \n issued in open code, and NO if it can be issued only in a DATA step. \n\n METRVAL1-7='name' \n is the value of the user-defined metric. The value must be a SAS character variable or a quoted literal \n value up to eight characters in length.\n\n SCL=NO | YES \n is used only in SCL programs and specifies whether the macro is in an SCL environment. Set the value \n to YES if the macro is in an SCL environment, and NO if it is not. Default: NO \n\n SHANDLE=numeric variable or constant \n is the start handle to use on the ARM_UPDATE function call. The value must be a numeric variable or constant. \n\n SHDLVAR=numeric variable \n is a numeric variable that contains the value of the start handle. \n\n STATUS=numeric variable or numeric constant \n is a transaction status value to pass to the ARM_STOP function call. The value must be a numeric \n variable or numeric constant 0, 1, or 2. The default is 0."}},{"Name":"%ARMSTRT","Type":"MACRO_ARM","Help":{"#cdata":"Signals the start of execution of a transaction instance and returns a unique handle that is passed \nto %ARMUPDT and %ARMSTOP. \n\nSyntax: %ARMSTRT (option-1 <, ...option-n>); \n\nAvailable options are: \n\n APPID=numeric variable or constant -- is the application ID to use on the ARM_GETID function call. \n\n APPIDVAR=numeric variable -- is the application ID. The value must be a numeric variable.\n\n CORR=n -- defines the type of parent and child transactions. Default: 0 \n\n GETID=NO | YES -- is optional and denotes whether to generate an ARM_GETID function call before ARM_START. Default: NO \n\n LEVEL=numeric constant or variable \n is a variable that specifies the execution level. The value must be a numeric constant or variable.\n\n MACONLY=NO | YES -- enables the %ARMSTRT macro to be issued in open code. Default: NO \n\n METRVAL1-7='name' -- is the value of the user-defined metric. The value must be a SAS character variable or a quoted literal. \n\n PARNTVAR=numeric variable -- is a numeric variable that contains the value of the parent transaction start handle. \n\n SCL=NO | YES -- is used only in SCL programs and specifies whether the macro is in an SCL environment. Default: NO \n\n SHDLVAR=numeric variable -- is a numeric variable that contains the value of the start handle. \n\n TXNDET='name' -- is a transaction detail. The value is a SAS character variable or quoted literal.\n\n TXNID=numeric variable or constant -- is the transaction ID to use in the ARM_START function call. \n\n TXNIDVAR=numeric variable -- is a numeric variable that contains the value of the transaction ID when GETID=NO. . \n\n TXNNAME='transaction-name' -- is the transaction name. The value is a SAS character variable or quoted literal."}},{"Name":"%ARMUPDT","Type":"MACRO_ARM","Help":{"#cdata":"Updates a transaction that has been previously started. \n \nSyntax: %ARMUPDT (DATA='variable', >); \n\nwhere: \n\n DATA='variable' -- is a SAS character variable or a quoted literal from the user-supplied data buffer that \n contains text to pass to the ARM_UPDATE function call. DATA= is not required, but it is highly recommended. \n\n LEVEL=numeric constant or variable \n is a variable that specifies the execution level. The value must be a numeric constant or variable.\n\n MACONLY=NO | YES -- enables the %ARMUPDT macro to be issued in open code. Default: NO \n\n METRVAL1-7='name' \n is the value of the user-defined metric. The value must be a SAS character variable or a quoted literal. \n\n SCL=NO | YES \n is used only in SCL programs and specifies whether the macro is in an SCL environment. Default: NO \n\n SHANDLE=numeric or constant \n is the start handle to use on the ARM_UPDATE function call. The value must be a numeric or constant.\n\n SHDLVAR=numeric variable -- is a numeric variable that contains the value of the start handle."}},{"Name":"%ARMCONV","Type":"MACRO_ARM","Help":{"#cdata":"Converts a SAS System 9 or later ARM log written in simple format to the more readable \nlabel=item ARM format used in Release 8.2."}},{"Name":"%ARMJOIN","Type":"MACRO_ARM","Help":{"#cdata":"Reads the six SAS data sets created by the %ARMPROC macro and creates SAS data sets and \nSQL views that contain common information about applications and transactions.\n\nSyntax: %ARMJOIN (>); \n\nAvailable options are: \n\n LIBIN=libref \n is the libref for the SAS library that contains the six SAS data sets that are created \n by the %ARMPROC macro. Default: WORK \n\n LIBOUT=libref \n is the libref for the SAS library that contains the application and transaction data sets. \n Default: WORK \n Restriction: If a Read-only library is specified in the LIBOUT= option, an error message \n is written to the ARM log and processing is stopped. \n\n TXNDS=YES | NO \n specifies whether the transaction data sets are to be created. Default: YES \n\n UPDTDS=YES | NO \n specifies whether the update data sets are to be created. Default: YES"}},{"Name":"%ARMPROC","Type":"MACRO_ARM","Help":{"#cdata":"Processes an input ARM log and outputs six SAS data sets that contain the gathered \ninformation from the log. \n \nSyntax: %ARMPROC (>); \n\nAvailable options are:\n\n LIB=libref \n is the libref for the SAS library that contains the six SAS data sets. Default: WORK \n\n LOG=pathname \n is the pathname for the physical location of the ARM log. If a pathname is not specified, \n you must pre-assign the ARMLOG fileref before calling the macro.\n\n LOGNEW=pathname \n is the pathname of the physical location of the new ARM log. It is used when ARM \n processing is resumed."}},{"Name":"%PERFEND","Type":"MACRO_ARM","Help":{"#cdata":"Syntax: %PERFEND;\n \nIndicates the termination of the application.\n\nUse the %PERFEND macro to terminate an application or user event. Each %PERFEND macro \nis paired with one %PERFINIT macro to mark the end of an application. The %PERFEND means \nthat the application does not issue any more ARM calls. ARM calls issued after an application \nhas been terminated with the %PERFEND macro result in an error. All transaction class \nidentifiers are cleared and are no longer available after the %PERFEND macro."}},{"Name":"%PERFINIT","Type":"MACRO_ARM","Help":{"#cdata":"Names the application instance and initializes the ARM interface. \n \nSyntax: %PERFINIT(APPNAME='application-name'); \n \nAPPNAME='application-name'; \nis the application name. The value is a SAS character variable or quoted literal. \n\nRestriction: The application name has a 127-character limit."}},{"Name":"%PERFSTOP","Type":"MACRO_ARM","Help":{"#cdata":"Specifies the end of a transaction. \n \nSyntax: %PERFSTOP; \n\nThere are no input parameters for the %PERFSTOP macro. \n\nUse the %PERFSTOP macro to signal the end of a transaction that was started using \nthe %PERFSTRT macro. The %PERFSTOP macro contains default user metrics. To see the \nrelationships between %PERFSTOP and the default user metrics, see Default User \nMetrics and Performance Macros."}},{"Name":"%PERFSTRT","Type":"MACRO_ARM","Help":{"#cdata":"Syntax: %PERFSTRT(TXNNAME='transaction-name'); \n \nUse the %PERFSTRT macro to signal the start of a transaction. The %PERFSTRT macro \ncontains default user metrics. "}}]}} ================================================ FILE: server/data/SASAutoVariables.json ================================================ {"Keywords":{"Keyword":[{"Name":"SYSBUFFR","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains text that is entered in response to a %INPUT statement when there is no \ncorresponding macro variable."}},{"Name":"SYSLOGAPPLNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the value of the LOGAPPLNAME= system option."}},{"Name":"SYSODSPATH","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the current Output Delivery System (ODS) pathname."}},{"Name":"SYSERRORTEXT","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the text of the last error message formatted for display in the SAS log."}},{"Name":"SYSHOSTNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the host name of a computer."}},{"Name":"SYSTCPIPHOSTNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the host names of the local and remote computers when multiple TCP/IP stacks \nare supported."}},{"Name":"SYSWARNINGTEXT","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the text of the last warning message formatted for display in the SAS log."}},{"Name":"SYSENCODING","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the name of the current session encoding."}},{"Name":"SYSBUFFER","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Unmatched text from %INPUT."}},{"Name":"SYSCC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The current condition code that SAS returns to your operating environment (the operating \nenvironment condition code)."}},{"Name":"SYSCMD","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Last unrecognized command from the command line of a macro window."}},{"Name":"SYSDEVIC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of current graphics device."}},{"Name":"SYSDMG","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code that reflects an action taken on a damaged data set."}},{"Name":"SYSDSN","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of most recent SAS data set in two fields."}},{"Name":"SYSFILRC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code set by the FILENAME statement."}},{"Name":"SYSLAST","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of most recent SAS data set in one field."}},{"Name":"SYSLCKRC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code set by the LOCK statement."}},{"Name":"SYSLIBRC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code set by the LIBNAME statement."}},{"Name":"SYSMSG","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Message for display in macro window."}},{"Name":"SYSPARM","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Value specified with the SYSPARM= system option."}},{"Name":"SYSPBUFF","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Text of macro parameter values."}},{"Name":"SYSRC","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Various system-related return codes."}},{"Name":"SYSCHARWIDTH","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The character width value."}},{"Name":"SYSDATE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The character value representing the date a SAS job or session began executing \n(two-digit year)."}},{"Name":"SYSDATE9","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The character value representing the date a SAS job or session began executing \n(four-digit year)."}},{"Name":"SYSDAY","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Day of week SAS job or session began executing."}},{"Name":"SYSENV","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Foreground or background indicator."}},{"Name":"SYSERR","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code set by SAS procedures and the DATA step."}},{"Name":"SYSINDEX","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Number of macros that have begun execution during this session."}},{"Name":"SYSINFO","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Return code information."}},{"Name":"SYSJOBID","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of current batch job or userid (varies by host environment)."}},{"Name":"SYSMACRONAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of current executing macro."}},{"Name":"SYSMENV","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Current macro execution environment."}},{"Name":"SYSNCPU","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The current number of processors that SAS may use in computation."}},{"Name":"SYSPROCESSID","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The process id of the current SAS process."}},{"Name":"SYSPROCESSNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The process name of the current SAS process."}},{"Name":"SYSPROCNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Name of current procedure being processed."}},{"Name":"SYSSCP","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The abbreviation of an operating system."}},{"Name":"SYSSCPL","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The name of an operating system."}},{"Name":"SYSSITE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The number assigned to your site."}},{"Name":"SYSSTARTID","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The id generated from the last STARTSAS statement."}},{"Name":"SYSSTARTNAME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The process name generated from the last STARTSAS statement."}},{"Name":"SYSTIME","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The character value of the time a SAS job or session began executing."}},{"Name":"SYSUSERID","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"The userid or login of the current SAS process."}},{"Name":"SYSVER","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Release or version number of SAS software executing."}},{"Name":"SYSVLONG","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the release number and maintenance level of SAS software that is running."}},{"Name":"SYSVLONG4","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the release number and maintenance level of SAS software that is running and \nhas a four digit year."}},{"Name":"SYSADDRBITS","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the number of bits of an address."}},{"Name":"SYSENDIAN","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains an indication of the byte order of the current session. \n \nThe possible values are LITTLE or BIG"}},{"Name":"SYSNOBS","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the number of observations read from the last data set that was closed by the previous \nprocedure or DATA step."}},{"Name":"SYSODSESCAPECHAR","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Displays the value of the ODS ESCAPECHAR= from within the program."}},{"Name":"SYSSIZEOFLONG","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the length in bytes of a long integer in the current session."}},{"Name":"SYSSIZEOFPTR","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the size in bytes of a pointer."}},{"Name":"SYSSIZEOFUNICODE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the length in bytes of a Unicode character in the current session."}},{"Name":"SYSDATASTEPPHASE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Indicates the current running phase of the DATA step. \n \nEnsures that the macro is being executed as part of the proper phase of a DATA step. \n\nType: Automatic macro variable (read only)"}},{"Name":"SYSHOSTINFOLONG","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the operating environment information that is displayed when the HOSTINFOLONG option is specified. \n \nType: Automatic macro variable (read only)"}},{"Name":"SYSPROCESSMODE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the name of the current SAS session run mode or server type. \n \nType: Automatic macro variable (read only)"}},{"Name":"SYSTIMEZONE","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the time zone name based on TIMEZONE option. \n \nType: Automatic macro variable (read only)"}},{"Name":"SYSTIMEZONEIDENT","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the time zone ID based on TIMEZONE option. \n \nType: Automatic macro variable (read only)"}},{"Name":"SYSTIMEZONEOFFSET","Type":"AUTOMATIC_VARIABLE","Help":{"#cdata":"Contains the current time zone offset based on TIMEZONE option."}}],"#comment":[{},{}]}} ================================================ FILE: server/data/SASAutocallMacros.json ================================================ {"Keywords":{"Keyword":[{"Name":"%CMPRES","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %CMPRES (text | text expression)\n\nCompresses multiple blanks and removes leading and trailing blanks."}},{"Name":"%QCMPRES","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QCMPRES (text | text expression)\n\nCompresses multiple blanks and removes leading and trailing blanks.\n\n%QCMPRES masks the result so special characters and mnemonic operators are treated \nas text instead of being interpreted by the macro facility."}},{"Name":"%COMPSTOR","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %COMPSTOR (PATHNAME=SAS-data-library)\n\nCompiles macros and stores them in a catalog in a permanent SAS library."}},{"Name":"%DATATYP","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax:%DATATYP (text | text expression)\n\nReturns the data type (numeric or char) of a value."}},{"Name":"%LEFT","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %LEFT(text | text expression)\n \nLeft-aligns an argument by removing leading blanks."}},{"Name":"%QLEFT","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QLEFT(text | text expression)\n\nLeft-aligns an argument by removing leading blanks.\n\nQLEFT masks the result so special characters and mnemonic operators are treated as \ntext instead of being interpreted by the macro facility."}},{"Name":"%QLOWCASE","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QLOWCASE(text | text expression)\n\nChanges uppercase characters to lowercase and returns a result that masks special \ncharacters and mnemonic operators."}},{"Name":"%SYSRC","Type":"MACRO_AUTOCALL","Help":{"#cdata":"[Syntax: %SYSRC(character-string)]\n\nReturns a value corresponding to an error condition."}},{"Name":"%TRIM","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %TRIM(text | text expression)\n\nTrim trailing blanks."}},{"Name":"%QTRIM","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QTRIM(text | text expression)\n \nTrim trailing blanks. Masks special characters and mnemonic operators."}},{"Name":"%VERIFY","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %VERIFY(source, excerpt)\n \nReturns the position of the first character unique to an expression."}},{"Name":"%DQLOAD","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %DQLOAD(DQLOCALE=(locale1 ...localeN), DQSETUPLOC=`file-specification', )\n \nSets system option values and loads locales into memory."}},{"Name":"%DQPUTLOC","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %DQPUTLOC(locale, , \n \nDisplays current information on a specified locale in the SAS log."}},{"Name":"%DQUNLOAD","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %DQUNLOAD \n \nUnloads all locales to increase the amount of free memory."}},{"Name":"%KLOWCASE","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %KLOWCASE (text | text expression) \n\nChanges uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS. \n\n%KLOWCASE returns a result without quotation marks, even if the argument has quotation marks. \n%QKLOWCAS produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT IN \n\nAutocall macros are included in a SAS library. This library might not be installed at your site \nor might be a site-specific version. If you cannot access this macro or if you want to find out \nif the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%QKLOWCAS","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QKLOWCAS (text | text expression) \n\nChanges uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS. \n\n%KLOWCASE returns a result without quotation marks, even if the argument has quotation marks. \n%QKLOWCAS produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT IN \n\nAutocall macros are included in a SAS library. This library might not be installed at your site \nor might be a site-specific version. If you cannot access this macro or if you want to find out \nif the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%KTRIM","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %KTRIM (text | text expression) \n \nTrims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM. \n\nQKTRIM produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ? ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN \n \nAutocall macros are included in a SAS library. This library might not be installed at your \nsite or might be a site-specific version. If you cannot access this macro or if you want to \nfind out if the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%QKTRIM","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %QKTRIM (text | text expression) \n \n \nTrims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM. \n\nQKTRIM produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ? ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN \n \nAutocall macros are included in a SAS library. This library might not be installed at your \nsite or might be a site-specific version. If you cannot access this macro or if you want to \nfind out if the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%KVERIFY","Type":"MACRO_AUTOCALL","Help":{"#cdata":"Syntax: %KVERIFY (source, excerpt) \n\nReturns the position of the first character unique to an expression. \n\nArguments:\nsource \n is text or a text expression that you want to examine for characters that do not exist in excerpt. \nexcerpt \n is text or a text expression that defines the set of characters that %KVERIFY uses to examine source."}}],"#comment":[{},{},{}]}} ================================================ FILE: server/data/SASCallRoutines.json ================================================ {"Keywords":{"Keyword":[{"Name":"PRXCHANGE","Type":"CALL_ROUTINE","Help":{"#cdata":"Performs a pattern-matching replacement."}},{"Name":"PRXDEBUG","Type":"CALL_ROUTINE","Help":{"#cdata":"Enables Perl regular expressions in a DATA step to send debug output to the SAS log."}},{"Name":"PRXFREE","Type":"CALL_ROUTINE","Help":{"#cdata":"Frees unneeded memory that was allocated for a Perl regular expression."}},{"Name":"PRXNEXT","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the position and length of a substring that matches a pattern and iterates \nover multiple matches within one string."}},{"Name":"PRXPOSN","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the start position and length for a capture buffer."}},{"Name":"PRXSUBSTR","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the position and length of a substring that matches a pattern."}},{"Name":"RXCHANGE","Type":"CALL_ROUTINE","Help":{"#cdata":"Changes one or more substrings that match a pattern."}},{"Name":"RXFREE","Type":"CALL_ROUTINE","Help":{"#cdata":"Frees memory allocated by other regular expression (RX) functions and routines."}},{"Name":"RXSUBSTR","Type":"CALL_ROUTINE","Help":{"#cdata":"Finds the position, length, and score of a substring that matches a pattern."}},{"Name":"CATS","Type":"CALL_ROUTINE","Help":{"#cdata":"Concatenates character strings and removes leading and trailing blanks."}},{"Name":"CATT","Type":"CALL_ROUTINE","Help":{"#cdata":"Concatenates character strings and removes trailing blanks."}},{"Name":"CATX","Type":"CALL_ROUTINE","Help":{"#cdata":"Concatenates character strings, removes leading and trailing blanks, and inserts separators."}},{"Name":"COMPCOST","Type":"CALL_ROUTINE","Help":{"#cdata":"Sets the costs of operations for later use by the COMPGED function."}},{"Name":"MISSING","Type":"CALL_ROUTINE","Help":{"#cdata":"Assigns a missing value to the specified character or numeric variables.."}},{"Name":"SCAN","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the position and length of a given word from a character expression."}},{"Name":"SCANQ","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the position and length of a given word from a character expression, and \nignores delimiters that are enclosed in quotation marks."}},{"Name":"MODULE","Type":"CALL_ROUTINE","Help":{"#cdata":"Calls the external routine without any return code. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL MODULE routine does not execute. \n\nSyntax: CALL MODULE( module-name <, argument-1, ..., argument-n>);\n\nRequired Argument:\nmodule-name - is the name of the external module to use.\n\nOptional Arguments:\ncontrol-string\n is an optional control string whose first character must be an asterisk (*), followed by any \n combination of the following characters:\n I\n prints the hexadecimal representations of all arguments to the CALL MODULE routine. You can use \n this option to help diagnose problems that are caused by incorrect arguments or attribute tables. \n If you specify the I option, the E option is implied.\n E\n prints detailed error messages. Without the E option (or the I option, which supersedes it), \n the only error message that the CALL MODULE routine generates is \"Invalid argument to function,\" \n which is usually not enough information to determine the cause of the error. The E option is \n useful for a production environment, whereas the I option is preferable for a development or \n debugging environment.\n H\n provides brief information about the syntax of the CALL MODULE routine, the attribute file format, \n and suggested SAS formats and informats. \n\nargument - is one or more arguments to pass to the requested routine."}},{"Name":"EXECUTE","Type":"CALL_ROUTINE","Help":{"#cdata":"Resolves an argument and issues the resolved value for execution ."}},{"Name":"SYMPUT","Type":"CALL_ROUTINE","Help":{"#cdata":"Assigns DATA step information to a macro variable."}},{"Name":"SYMPUTX","Type":"CALL_ROUTINE","Help":{"#cdata":"Assigns a value to a macro variable and removes both leading and trailing blanks."}},{"Name":"ALLPERM","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all permutations of the values of several variables ."}},{"Name":"LOGISTIC","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the logistic value."}},{"Name":"SOFTMAX","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the softmax value."}},{"Name":"STDIZE","Type":"CALL_ROUTINE","Help":{"#cdata":"Standardizes the values of one or more variables."}},{"Name":"TANH","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the hyperbolic tangent."}},{"Name":"RANBIN","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a binomial distribution."}},{"Name":"RANCAU","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a Cauchy distribution."}},{"Name":"RANEXP","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from an exponential distribution."}},{"Name":"RANGAM","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a gamma distribution."}},{"Name":"RANNOR","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a normal distribution."}},{"Name":"RANPERK","Type":"CALL_ROUTINE","Help":{"#cdata":"Randomly permutes the values of the arguments, and returns a permutation of \nk out of n values."}},{"Name":"RANPERM","Type":"CALL_ROUTINE","Help":{"#cdata":"Randomly permutes the values of the arguments."}},{"Name":"RANPOI","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a Poisson distribution."}},{"Name":"RANTBL","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a tabled probability distribution ."}},{"Name":"RANTRI","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a triangular distribution."}},{"Name":"RANUNI","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a random variate from a uniform distribution."}},{"Name":"STREAMINIT","Type":"CALL_ROUTINE","Help":{"#cdata":"Specifies a seed value to use for subsequent random number generation by the RAND function ."}},{"Name":"POKE","Type":"CALL_ROUTINE","Help":{"#cdata":"Writes a value directly into memory on a 32-bit platform . \n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL POKE routine does not execute. \n\nSyntax: CALL POKE(source, pointer <, length> <, floating-point>);\n\nRequired Arguments:\nsource\n specifies a constant, variable, or expression that contains a value to write into memory \npointer\n specifies a numeric expression that contains the virtual address of the data that the CALL POKE routine alters.\n\nOptional Arguments:\nlength\n specifies a numeric constant, variable, or expression that contains the number of bytes to write from the source \n to the address that is indicated by pointer. If you omit length, the action that the CALL POKE routine takes depends \n on whether source is a character value or a numeric value:\n \u2022If source is a character value, the CALL POKE routine copies the entire value of source to the specified memory location.\n \u2022If source is a numeric value, the CALL POKE routine converts source to a long integer and writes into memory the number \n of bytes that constitute a pointer.\n\n z/OS Specifics\n Under z/OS, pointers are 3 or 4 bytes long, depending on the situation. \n\nfloating-point\n specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."}},{"Name":"POKELONG","Type":"CALL_ROUTINE","Help":{"#cdata":"Writes a value directly into memory on 32-bit and 64-bit platforms. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL POKELONG routine does not execute. \n\nSyntax: CALL POKELONG(source, pointer <, length> <, floating-point>);\nRequired Arguments:\nsource\n specifies a character constant, variable, or expression that contains a value to write into memory. \npointer\n specifies a character string that contains the virtual address of the data that the CALL POKELONG routine alters.\n\nOptional Arguments:\nlength\n specifies a numeric SAS expression that contains the number of bytes to write from the source to the address \n that is indicated by the pointer. If you omit length, the CALL POKELONG routine copies the entire value of \n source to the specified memory location. \nfloating-point\n specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."}},{"Name":"SLEEP","Type":"CALL_ROUTINE","Help":{"#cdata":"Suspends the execution of a program that invokes this call routine for a specified \nperiod of time."}},{"Name":"SYSTEM","Type":"CALL_ROUTINE","Help":{"#cdata":"Submits an operating environment command for execution."}},{"Name":"LABEL","Type":"CALL_ROUTINE","Help":{"#cdata":"Assigns a variable label to a specified character variable."}},{"Name":"SET","Type":"CALL_ROUTINE","Help":{"#cdata":"Links SAS data set variables to DATA step or macro variables that have the same \nname and data type."}},{"Name":"VNAME","Type":"CALL_ROUTINE","Help":{"#cdata":"Assigns a variable name as the value of a specified variable."}},{"Name":"VNEXT","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the name, type, and length of a variable that is used in a DATA step."}},{"Name":"ALLCOMB","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all combinations of the values of n variables taken k at a time in a \nminimal change order."}},{"Name":"ALLCOMBI","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all combinations of the indices of n objects taken k at a time in a \nminimal change order."}},{"Name":"GRAYCODE","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all subsets of n items in a minimal change order."}},{"Name":"IS8601_CONVERT","Type":"CALL_ROUTINE","Help":{"#cdata":"Converts an ISO 8601 interval to datetime and duration values, or converts datetime \nand duration values to an ISO 8601 interval. \n\nSyntax: CALL IS8601_CONVERT(convert-from, convert-to, , ,);"}},{"Name":"LEXCOMB","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all distinct combinations of the non-missing values of n variables taken \nk at a time in lexicographic order."}},{"Name":"LEXCOMBI","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all combinations of the indices of n objects taken k at a time in \nlexicographic order."}},{"Name":"LEXPERK","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all distinct permutations of the non-missing values of n variables taken \nk at a time in lexicographic order."}},{"Name":"LEXPERM","Type":"CALL_ROUTINE","Help":{"#cdata":"Generates all distinct permutations of the non-missing values of several variables \nin lexicographic order."}},{"Name":"SORTC","Type":"CALL_ROUTINE","Help":{"#cdata":"Sorts the values of character arguments."}},{"Name":"SORTN","Type":"CALL_ROUTINE","Help":{"#cdata":"Sorts the values of numeric arguments."}},{"Name":"DQSCHEMEAPPLY","Type":"CALL_ROUTINE","Help":{"#cdata":"Applies a scheme and returns a transformed value and a transformation flag."}},{"Name":"DQPARSE","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a parsed character value and a status flag."}},{"Name":"DEFINE","Type":"CALL_ROUTINE","Help":{"#cdata":"Sets the value of an attribute for a particular column in the current row."}},{"Name":"INSERT_CATALOG","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a SAS catalog into a package. \n \nSyntax: \nCALL INSERT_CATALOG(packageId, libname, memname, desc, nameValue, rc); "}},{"Name":"INSERT_DATASET","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a SAS data set into a package. \n \nSyntax:\nCALL INSERT_DATASET(packageId, libname, memname, desc, nameValue, rc <, properties, propValue1, ...propValueN>); "}},{"Name":"INSERT_FDB","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a financial database into a package. \n \nSyntax: \nCALL INSERT_FDB(packageId, libname, memname, desc, nameValue, rc);"}},{"Name":"INSERT_FILE","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a file into a package. \n \nSyntax \nCALL INSERT_FILE(packageId, filename, filetype, mimeType, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"INSERT_HTML","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts HTML files into a package. \n \nSyntax:\nCALL INSERT_HTML(packageId, body, bodyUrl, frame, frameUrl, contents, contentsUrl, page, pageUrl, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"INSERT_MDDB","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a SAS multidimensional database into a package. \n \nSyntax:\nCALL INSERT_MDDB(packageId, libname, memname, desc, nameValue, rc);"}},{"Name":"INSERT_PACKAGE","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a package into another package."}},{"Name":"INSERT_REF","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a reference into a package. \n \nSyntax: \nCALL INSERT_REF(packageId, referenceType, reference, desc, nameValue, rc);"}},{"Name":"INSERT_SQLVIEW","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a PROC SQL view into a package. \n \nSyntax \nCALL INSERT_SQLVIEW(packageId, libname, memname, desc, nameValue, rc);"}},{"Name":"INSERT_VIEWER","Type":"CALL_ROUTINE","Help":{"#cdata":"Inserts a viewer into a package. \n \nSyntax: \nCALL INSERT_VIEWER(packageId, filename, mimeType, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"PACKAGE_BEGIN","Type":"CALL_ROUTINE","Help":{"#cdata":"Initializes a package and returns a unique package identifier. \n \nSyntax: \nCALL PACKAGE_BEGIN(packageId, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"PACKAGE_END","Type":"CALL_ROUTINE","Help":{"#cdata":"Frees the resources that are associated with a package. \n \nSyntax \nCALL PACKAGE_END(packageId, rc);"}},{"Name":"PACKAGE_PUBLISH","Type":"CALL_ROUTINE","Help":{"#cdata":"Publishes the specified package. The method of publication depends on the type of delivery transport."}},{"Name":"COMPANION_NEXT","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves the next companion HTML file in the ODS HTML set. \n \nSyntax \nCALL COMPANION_NEXT(entryId, path, filename, url, rc <, properties, propValue1, ...propValueN>);"}},{"Name":"ENTRY_FIRST","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns header information for the first entry in a package. \n \nSyntax: \nCALL ENTRY_FIRST(packageId, entryId, entryType, userSpecString, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"ENTRY_NEXT","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns header information from the next entry in a package. \n \nSyntax: \nCALL ENTRY_NEXT(packageId, entryId, entryType, userSpecString, desc, nameValue, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"PACKAGE_DESTROY","Type":"CALL_ROUTINE","Help":{"#cdata":"Deletes a package. \n \nSyntax \nCALL PACKAGE_DESTROY(packageId, rc);"}},{"Name":"PACKAGE_FIRST","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the header information for the first package in the package list. \n \nSyntax \nCALL PACKAGE_FIRST(pkgListId, packageId, numEntries, desc, dateTime, nameValue, channel, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"PACKAGE_NEXT","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the header information for the next package in the package list. \n \nSyntax:\nCALL PACKAGE_NEXT(pkgListId, packageId, numEntries, desc, dateTime, nameValue, channel, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"PACKAGE_TERM","Type":"CALL_ROUTINE","Help":{"#cdata":"Frees all resources associated with the package list identifier. \n \nSyntax \nCALL PACKAGE_TERM(pkgListId, rc);"}},{"Name":"RETRIEVE_CATALOG","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves a catalog from a package. \n \nSyntax \nCALL RETRIEVE_CATALOG(entryId, libname, memname, rc);"}},{"Name":"RETRIEVE_DATASET","Type":"CALL_ROUTINE","Help":{"#cdata":"This CALL routine retrieves a data set entry from a package. \n \nSyntax: \nCALL RETRIEVE_DATASET(entryId, libname, memname, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"RETRIEVE_FDB","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves a financial database entry from a package. \n \nSyntax: \nCALL RETRIEVE_FDB(entryId, libname, memname, rc); "}},{"Name":"RETRIEVE_FILE","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves an external binary or text file from a package. \n \nSyntax: \nCALL RETRIEVE_FILE(entryId, filename, rc);"}},{"Name":"RETRIEVE_HTML","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves an HTML entry from a package. \n \nSyntax: \nCALL RETRIEVE_HTML(entryId, path, body, bodyUrl, frame, frameUrl, contents, contentsUrl, pages, pagesUrl, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"RETRIEVE_MDDB","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves an MDDB entry from a package. \n \nSyntax: \nCALL RETRIEVE_MDDB(entryId, libname, memname, rc);"}},{"Name":"RETRIEVE_NESTED","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves the descriptive header information for a nested package entry.\n \nSyntax: \nCALL RETRIEVE_NESTED(entryId,packageId, numEntries, desc, dateTime, nameValue, rc);"}},{"Name":"RETRIEVE_PACKAGE","Type":"CALL_ROUTINE","Help":{"#cdata":"This CALL routine retrieves descriptive header information for all packages. \n \nSyntax \nCALL RETRIEVE_PACKAGE(pkgListId, retrievalType, retrievalInfo, totalPackages, rc<, properties, propValue1, propValueN>);"}},{"Name":"RETRIEVE_REF","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves a reference from a package. \n \nSyntax: \nCALL RETRIEVE_REF(entryId, referenceType, reference, rc);"}},{"Name":"RETRIEVE_SQLVIEW","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves a PROC SQL view from a package. \n \nSyntax: \nCALL RETRIEVE_SQLVIEW(entryId, libname, memname, rc);"}},{"Name":"RETRIEVE_VIEWER","Type":"CALL_ROUTINE","Help":{"#cdata":"Retrieves a viewer entry from a package.\n\nSyntax:\nCALL RETRIEVE_VIEWER(entryId, filename, rc<, properties, propValue1, ...propValueN>);"}},{"Name":"RANCOMB","Type":"CALL_ROUTINE","Help":{"#cdata":"Permutes the values of the arguments, and returns a random combination of \nk out of n values.\n\nSyntax: \nCALL RANCOMB(seed, k, variable-1<, variable\u20132, ...> ); \n\nRequired Arguments:\nseed \n is a numeric variable that contains the random number seed. \nk \n is the number of values that you want to have in the random combination. \n variable specifies all numeric variables, or all character variables that have the same length. \n K values of these variables are randomly permuted."}},{"Name":"ADDMATRIX","Type":"CALL_ROUTINE","Help":{"#cdata":"Performs an elementwise addition of two matrices or a matrix and a scalar.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL ADDMATRIX(X, Y, Z); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x n (that is, X[m, n]) or a scalar. \nY \n specifies an input matrix with dimensions m x n (that is, Y[m, n]) or a scalar. \nZ \n specifies an output matrix with dimensions m x n (that is, Z[m, n]), such that Z= X + Y"}},{"Name":"CHOL","Type":"CALL_ROUTINE","Help":{"#cdata":"Calculates the Cholesky decomposition for a given symmetric matrix.\n \nSyntax: [Valid for PROC FCMP only!]\nCALL CHOL(X, Y <, validate>); \n\nRequired Arguments:\nX \n specifies a symmetric positive-definite input matrix with dimensions m x m (that is, X[m, m]). \nY \n specifies an output matrix with dimensions m x m (that is, Y[m, m]). This variable contains \n the Cholesky decomposition, such that \n \n Z = YY*\n\n where Y is a lower triangular matrix with strictly positive diagonal entries and Y* denotes the \n conjugate transpose of Y. \n Note: If X is not symmetric positive-definite, then Y will be filled with missing values. \n\nOptional Argument:\nvalidate \n specifies an optional argument that can increase the processing speed by avoiding error checking. \n The argument can take the following values: \n \n 0 the matrix X will be checked for symmetry. This is the default if the validate argument is omitted. \n 1 the matrix is assumed to be symmetric."}},{"Name":"DET","Type":"CALL_ROUTINE","Help":{"#cdata":"Calculates the determinant of a specified matrix that should be square.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL DET(X, a); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x n (that is, X[m, m]). \na \n specifies the returned determinate value, such that \n \n a = |X|"}},{"Name":"DYNAMIC_ARRAY","Type":"CALL_ROUTINE","Help":{"#cdata":"Enables an array that is declared within a function to change size in an efficient manner.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL DYNAMIC_ARRAY(array\u2013name, new-dim1\u2013size, ...,, new-dimN-size); \n\nRequired Arguments:\narray-name \n specifies the name of a temporary array. \nnew-dim-size \n specifies a new size for the temporary array."}},{"Name":"ELEMMULT","Type":"CALL_ROUTINE","Help":{"#cdata":"Performs an elementwise multiplication of two matrices.\n\nSyntax:\nCALL ELEMMULT(X, Y, Z); \n\nRequired Arguments \nX \n specifies an input matrix with dimensions m x n (that is, X[m, n]). \nY \n specifies an input matrix with dimensions m x n (that is, Y[m, n]). \nZ \n specifies an output matrix with dimensions m x n (that is, Z[m, n])."}},{"Name":"EXPMATRIX","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns a matrix e**tA given the input matrix A and a multiplier t. \n \n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL EXPMATRIX(X, t, Y); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x m (that is, X[m, m]). \nt \n specifies a double scalar value. \nY \n specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that \n\n Y = \u0510**t\u1e8a where \u1e8a is the mean of X"}},{"Name":"FILLMATRIX","Type":"CALL_ROUTINE","Help":{"#cdata":"Replaces all of the element values of the input matrix with the specified value.\n \n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL FILLMATRIX(X, Y); \n\nRequired Arguments:\nX \n specifies an input numeric matrix. \nY \n specifies the numeric value that will fill the matrix."}},{"Name":"IDENTITY","Type":"CALL_ROUTINE","Help":{"#cdata":"Converts the input matrix to an identity matrix.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL IDENTITY(X); \n\nRequired Argument:\nX \n specifies an input matrix with dimensions m x m (that is, X[m, m])."}},{"Name":"INV|INVERSE","Type":"CALL_ROUTINE","Help":{"#cdata":"Calculates a matrix that is the inverse of the provided input matrix that should \nbe a square, non-singular matrix.\n \n[Valid for PROC FCMP only!] \n\nSyntax:\nCALL INV(X, Y); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x m (that is, X[m, m]). \nY \n specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that \n \n Y[m.m] = X'[m,m]\n\n where ' denotes inverse \n \n X x Y = Y x X = I\n \nand I is the identity matrix."}},{"Name":"MULT","Type":"CALL_ROUTINE","Help":{"#cdata":"Calculates the multiplicative product of two input matrices.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL MULT(X, Y, Z); \n\nRequired Arguments \nX \n specifies an input matrix with dimensions m x n (that is, X[m, n]). \nY \n specifies an input matrix with dimensions n x p (that is, Y[n, p]). \nZ \n specifies an output matrix with dimensions m x p (that is, Z[m, p]), such that \n\n Z[m,p] = X[m,n] x Y[n,p]"}},{"Name":"POWER","Type":"CALL_ROUTINE","Help":{"#cdata":"Raises a square matrix to a given scalar value.\n \n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL POWER(X, a, Y); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x m (that is, X[m, m]). \na \n specifies an integer scalar value (power). \nY \n specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that \n\n Y = X**a"}},{"Name":"SETNULL","Type":"CALL_ROUTINE","Help":{"#cdata":"Sets a pointer element of a structure to null.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL SETNULL(pointer-element); \n\nRequired Argument:\npointer-element \n is a pointer to a structure."}},{"Name":"STRUCTINDEX","Type":"CALL_ROUTINE","Help":{"#cdata":"Enables you to access each structure element in an array of structures.\n \nSyntax:\nCALL STRUCTINDEX(struct_array, index, struct_element); \n\nRequired Arguments:\nstruct_array \n specifies an array.\nindex \n is a 1\u2013based index as used in most SAS arrays. \nstruct_element \n points to an element in the array."}},{"Name":"SUBTRACTMATRIX","Type":"CALL_ROUTINE","Help":{"#cdata":"Performs an element-wide subtraction of two matrices or a matrix and a scalar.\n\n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL SUBTRACTMATRIX(X, Y, Z); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x n (that is, X[m, n]) or a scalar. \nY \n specifies an input matrix with dimensions m x n (that is, Y[m, n]) or a scalar. \nZ \n specifies an output matrix with dimensions m x n (that is, Z[m, n]), such that \n \n Z = X - Y"}},{"Name":"TRANSPOSE","Type":"CALL_ROUTINE","Help":{"#cdata":"Returns the transpose of a matrix.\n\n[Valid for PROC FCMP only!]\n\nSyntax: \nCALL TRANSPOSE(X, Y); \n\nRequired Arguments:\nX \n specifies an input matrix with dimensions m x n (that is, X[m, n]). \nY \n specifies an output matrix with dimensions n x m (that is, Y[n, m])"}},{"Name":"ZEROMATRIX","Type":"CALL_ROUTINE","Help":{"#cdata":"Replaces all of the element values of the numeric input matrix with 0.\n \n[Valid for PROC FCMP only!]\n\nSyntax:\nCALL ZEROMATRIX(X); \n\nRequired Argument \nX \n specifies a numeric input matrix."}}],"#comment":[{},{},{},{}]}} ================================================ FILE: server/data/SASColorValues.json ================================================ {"Color":{"Values":{"@Value1":"BLACK=CX000000","@Value2":"Navy=CX000080","@Value3":"DarkBlue=CX00008B","@Value4":"MediumBlue=CX0000CD","@Value5":"BLUE=CX0000FF","@Value6":"DarkGreen=CX006400","@Value7":"Green=CX008000","@Value8":"Teal=CX008080","@Value9":"DarkCyan=CX008B8B","@Value10":"DeepSkyBlue=CX00BFFF","@Value11":"DarkTurquoise=CX00CED1","@Value12":"MediumSpringGreen=CX00FA9A","@Value13":"GREEN=CX00FF00","@Value14":"SpringGreen=CX00FF7F","@Value15":"CYAN=CX00FFFF","@Value16":"BRBL=CX010101","@Value17":"VIB=CX090766","@Value18":"VDEYG=CX0A260E","@Value19":"DEB=CX100F26","@Value20":"VIG=CX118044","@Value21":"VDAGB=CX121519","@Value22":"VDAG=CX121915","@Value23":"VDABG=CX121919","@Value24":"VIGB=CX13478C","@Value25":"VIBG=CX138C89","@Value26":"DEGB=CX142233","@Value27":"DEG=CX143322","@Value28":"DEBG=CX143332","@Value29":"DAPB=CX151219","@Value30":"DEOLG=CX15260D","@Value31":"DAV=CX161219","@Value32":"DAOL=CX161911","@Value33":"VIYG=CX16A629","@Value34":"VDEP=CX170819","@Value35":"BLB=CX171719","@Value36":"BLG=CX171918","@Value37":"VDAYG=CX172118","@Value38":"DEPB=CX180F26","@Value39":"VDAP=CX181219","@Value40":"DEYG=CX185920","@Value41":"VDERP=CX190817","@Value42":"VDER=CX190A0D","@Value43":"VDEPR=CX190A12","@Value44":"VDAR=CX191213","@Value45":"VDAPR=CX191216","@Value46":"VDARP=CX191218","@Value47":"DARBR=CX191614","@Value48":"DABR=CX191714","@Value49":"BLR=CX191717","@Value50":"BLP=CX191719","@Value51":"RBK=CX191919","@Value52":"MidnightBlue=CX191970","@Value53":"DEV=CX1B0D26","@Value54":"DAB=CX1B1B26","@Value55":"DodgerBlue=CX1E90FF","@Value56":"DAOLG=CX1F261C","@Value57":"STB=CX201F73","@Value58":"LightSeaGreen=CX20B2AA","@Value59":"ForestGreen=CX228B22","@Value60":"DERBR=CX26150D","@Value61":"DEBR=CX261C0F","@Value62":"DAYBR=CX26251F","@Value63":"DAOLBR=CX26261C","@Value64":"STOLG=CX264C14","@Value65":"DAGB=CX2A3440","@Value66":"VIPB=CX2B0766","@Value67":"DABG=CX2D403F","@Value68":"DAGROLG=CX2E332C","@Value69":"STGB=CX2E4C73","@Value70":"STG=CX2E734E","@Value71":"STBG=CX2E7371","@Value72":"SeaGreen=CX2E8B57","@Value73":"DarkSlateGray=CX2F4F4F","@Value74":"DAGROL=CX30332C","@Value75":"BIB=CX3230B2","@Value76":"LimeGreen=CX32CD32","@Value77":"VIR=CX33070F","@Value78":"DEYBR=CX332E14","@Value79":"DAGRRBR=CX332E2C","@Value80":"DAGRBR=CX33322E","@Value81":"DAG=CX364C40","@Value82":"DAGRB=CX373740","@Value83":"STYG=CX388C43","@Value84":"DAYG=CX3B593F","@Value85":"STV=CX3C1859","@Value86":"DELG=CX3C6629","@Value87":"MediumSeaGreen=CX3CB371","@Value88":"DEP=CX3E1745","@Value89":"MOB=CX3E3D73","@Value90":"STPB=CX3F1F73","@Value91":"MOPB=CX3F3059","@Value92":"DAR=CX40262B","@Value93":"DAGRYBR=CX403E37","@Value94":"Turquoise=CX40E0D0","@Value95":"RoyalBlue=CX4169E1","@Value96":"DAP=CX423045","@Value97":"DAGRP=CX443C45","@Value98":"VILG=CX44A616","@Value99":"DEPR=CX45122E","@Value100":"DERP=CX45173E","@Value101":"DAPR=CX452938","@Value102":"DARP=CX453042","@Value103":"DAGRR=CX453C3D","@Value104":"DAGRG=CX454C48","@Value105":"MOOLG=CX45593B","@Value106":"SteelBlue=CX4682B4","@Value107":"MOV=CX473059","@Value108":"MOOL=CX47592A","@Value109":"DarkSlateBlue=CX483D8B","@Value110":"MediumTurquoise=CX48D1CC","@Value111":"GRPB=CX4A4159","@Value112":"Indigo=CX4B0082","@Value113":"VIPR=CX4C052C","@Value114":"DER=CX4C1923","@Value115":"STRBR=CX4C2714","@Value116":"MOGB=CX4C5D73","@Value117":"MOG=CX4C735E","@Value118":"MOBG=CX4C7372","@Value119":"BIGB=CX4D7EBF","@Value120":"BIG=CX4DBF81","@Value121":"BIBG=CX4DBFBC","@Value122":"GRV=CX4F4159","@Value123":"BIYG=CX52CC62","@Value124":"VIV=CX53098C","@Value125":"DABGR=CX535359","@Value126":"GROL=CX54594A","@Value127":"DarkOliveGreen=CX556B2F","@Value128":"OLGR=CX575953","@Value129":"DAPGR=CX585359","@Value130":"VIRP=CX59064C","@Value131":"STBR=CX593B18","@Value132":"MORBR=CX59453B","@Value133":"MOBR=CX594E41","@Value134":"GRRBR=CX594F4A","@Value135":"DARGR=CX595354","@Value136":"GRBR=CX59564D","@Value137":"BRGR=CX595753","@Value138":"MOOLBR=CX595936","@Value139":"DAGGR=CX595959","@Value140":"LIB=CX5A58A6","@Value141":"STLG=CX5B993D","@Value142":"GRB=CX5C5C73","@Value143":"MOYG=CX5D8C64","@Value144":"CadetBlue=CX5F9EA0","@Value145":"BIPB=CX6130B2","@Value146":"LIOL=CX628033","@Value147":"GRG=CX63736A","@Value148":"CornFlowerBlue=CX6495ED","@Value149":"DERO=CX662F14","@Value150":"DARO=CX663D29","@Value151":"MediumAquamarine=CX66CDAA","@Value152":"STP=CX671F73","@Value153":"DimGray=CX696969","@Value154":"SlateBlue=CX6A5ACD","@Value155":"MOP=CX6B3D73","@Value156":"OliveDrab=CX6B8E23","@Value157":"LIPB=CX6D5299","@Value158":"LIGB=CX6E86A6","@Value159":"LIG=CX6EA688","@Value160":"LIBG=CX6EA6A4","@Value161":"VIP=CX6F0980","@Value162":"MAROON=CX700000","@Value163":"PURPLE=CX703070","@Value164":"GRP=CX705C73","@Value165":"SlateGray=CX708090","@Value166":"STR=CX731727","@Value167":"STPR=CX731749","@Value168":"STRP=CX731F65","@Value169":"MOR=CX732E3A","@Value170":"MOPR=CX732E53","@Value171":"MORP=CX733D6A","@Value172":"GRPR=CX734C61","@Value173":"GRR=CX73545A","@Value174":"GRRP=CX73546E","@Value175":"MOYBR=CX736E58","@Value176":"GRYBR=CX737060","@Value177":"DEGY=CX749938","@Value178":"VLIB=CX7674D9","@Value179":"MOLG=CX769966","@Value180":"LightSlateGray=CX778899","@Value181":"BIV=CX7930B2","@Value182":"LIV=CX7A5299","@Value183":"MediumSlateBlue=CX7B68EE","@Value184":"LawnGreen=CX7CFC00","@Value185":"DAGY=CX7E9952","@Value186":"Aquamarine=CX7FFDD4","@Value187":"Chartreuse=CX7FFF00","@Value188":"Maroon=CX800000","@Value189":"Purple=CX800080","@Value190":"VIRO=CX803009","@Value191":"DEO=CX80511A","@Value192":"BRO=CX80603C","@Value193":"STYBR=CX806A2B","@Value194":"Olive=CX808000","@Value195":"GRAY=CX808080","@Value196":"VIGY=CX80BF1A","@Value197":"LIYG=CX80BF88","@Value198":"BGR=CX83838C","@Value199":"LIGROL=CX838C75","@Value200":"DEY=CX839938","@Value201":"PAB=CX8585A6","@Value202":"PAV=CX877099","@Value203":"LIOLGR=CX878C7E","@Value204":"SkyBlue=CX87CEEB","@Value205":"LightSkyBlue=CX87CEFA","@Value206":"BILG=CX88E55C","@Value207":"DAY=CX899952","@Value208":"BlueViolet=CX8A2BE2","@Value209":"PAPB=CX8A7AA6","@Value210":"DarkRed=CX8B0000","@Value211":"DarkMagenta=CX8B008B","@Value212":"SaddleBrown=CX8B4513","@Value213":"PGR=CX8B838C","@Value214":"LIOLBR=CX8B8C4B","@Value215":"GRLG=CX8B9985","@Value216":"STRO=CX8C411C","@Value217":"MORO=CX8C5438","@Value218":"GRRO=CX8C6754","@Value219":"LIRBR=CX8C7367","@Value220":"LIBR=CX8C7962","@Value221":"LIGRRBR=CX8C7D75","@Value222":"RGR=CX8C8385","@Value223":"LIGRBR=CX8C887A","@Value224":"LIBRGR=CX8C8883","@Value225":"GGR=CX8C8C8C","@Value226":"STGY=CX8DBA44","@Value227":"DAGRY=CX8E996B","@Value228":"DarkSeaGreen=CX8FBC8F","@Value229":"PAG=CX90A69A","@Value230":"VLIGB=CX90B0D9","@Value231":"VLIBG=CX90D9D7","@Value232":"LightGreen=CX90EE90","@Value233":"MediumPurple=CX9370DB","@Value234":"DarkViolet=CX9400D3","@Value235":"PaleGreen=CX98FB98","@Value236":"DEPPK=CX991F85","@Value237":"DEPK=CX99293D","@Value238":"DarkOrchid=CX9932CC","@Value239":"DEYPK=CX993329","@Value240":"DAPPK=CX995278","@Value241":"LIRP=CX99528E","@Value242":"DAPK=CX995C67","@Value243":"DAYPK=CX99615C","@Value244":"LIGRR=CX997078","@Value245":"LIGRPR=CX997086","@Value246":"PARP=CX997092","@Value247":"DEOY=CX997A1F","@Value248":"DAOY=CX998547","@Value249":"VIY=CX99BF1A","@Value250":"VLIG=CX99E5BC","@Value251":"YellowGreen=CX9ACD32","@Value252":"LIP=CX9B58A6","@Value253":"MOGY=CX9DBF66","@Value254":"VLIYG=CX9EEDA8","@Value255":"BIP=CXA030B2","@Value256":"BROWN=CXA05000","@Value257":"Sienna=CXA0522D","@Value258":"PAP=CXA185A6","@Value259":"VLIPB=CXA37AE5","@Value260":"STY=CXA3BF46","@Value261":"Brown=CXA52A2A","@Value262":"STO=CXA66921","@Value263":"MOO=CXA67D4D","@Value264":"LIYBR=CXA69F7A","@Value265":"LIGRYBR=CXA6A18A","@Value266":"DarkGray=CXA9A9A9","@Value267":"GRGY=CXA9BF86","@Value268":"MOY=CXABBF66","@Value269":"VLIV=CXAC74D9","@Value270":"LightBlue=CXADD8E6","@Value271":"GreenYellow=CXADFF2F","@Value272":"VPAB=CXAEADD9","@Value273":"BIGY=CXAEE554","@Value274":"PaleTurquiose=CXAFEEEE","@Value275":"VIOLET=CXB090D0","@Value276":"LightSteelBlue=CXB0C4DE","@Value277":"PowerBlue=CXB0E0E6","@Value278":"LILG=CXB1E599","@Value279":"FireBrick=CXB22222","@Value280":"STPPK=CXB2309E","@Value281":"MOPPK=CXB25FA5","@Value282":"VIO=CXB26306","@Value283":"GRPPK=CXB28FA2","@Value284":"LIBGR=CXB3B2BF","@Value285":"GRY=CXB5BF93","@Value286":"DarkGoldenrod=CXB8860B","@Value287":"MediumOrchid=CXBA55D3","@Value288":"MOPK=CXBA7C87","@Value289":"GRPK=CXBA9BA1","@Value290":"MOOY=CXBAA157","@Value291":"YGR=CXBBBFAC","@Value292":"RosyBrown=CXBC8F8F","@Value293":"VPAG=CXBCD9C5","@Value294":"LIPGR=CXBDB2BF","@Value295":"DarkKhaki=CXBDB76B","@Value296":"LIGY=CXBDE57A","@Value297":"MOYPK=CXBF8580","@Value298":"VIOY=CXBF9106","@Value299":"STOY=CXBF9926","@Value300":"GRYPK=CXBFA5A2","@Value301":"PKGR=CXBFB2B5","@Value302":"BRPK=CXBFB9A6","@Value303":"LIGGR=CXBFBFBF","@Value304":"VPAPB=CXC0A8E5","@Value305":"Silver=CXC0C0C0","@Value306":"LIME=CXC0FF81","@Value307":"BIY=CXC6E55C","@Value308":"MediumVioletRed=CXC71585","@Value309":"VLIP=CXCB74D9","@Value310":"VPAV=CXCBA8E5","@Value311":"PAGY=CXCBE5A1","@Value312":"VIPK=CXCC1B3B","@Value313":"VIYPK=CXCC2B1B","@Value314":"STYPK=CXCC5D52","@Value315":"IndianRed=CXCD5C5C","@Value316":"Peru=CXCD853F","@Value317":"LIY=CXCDE57A","@Value318":"PALG=CXD1E5C7","@Value319":"Chocolate=CXD2691E","@Value320":"Tan=CXD2B48C","@Value321":"VPAP=CXD3ADD9","@Value322":"LightGrey=CXD3D3D3","@Value323":"Thistle=CXD8BFD8","@Value324":"BIPPK=CXD93ABF","@Value325":"STPK=CXD9576E","@Value326":"LIPPK=CXD974C9","@Value327":"BIO=CXD9892B","@Value328":"LIO=CXD9A465","@Value329":"PAY=CXD9E5B0","@Value330":"Orchid=CXDA70D6","@Value331":"Goldenrod=CXDAA520","@Value332":"PaleVioletRed=CXDB7093","@Value333":"Crimson=CXDC143C","@Value334":"Gainsboro=CXDCDCDC","@Value335":"Plum=CXDDA0DD","@Value336":"Burlywood=CXDEB887","@Value337":"BWH=CXDEDDED","@Value338":"LILAC=CXE06090","@Value339":"TAN=CXE0A860","@Value340":"LightCyan=CXE0FFFF","@Value341":"LIPK=CXE599A7","@Value342":"LIYPK=CXE5A099","@Value343":"BIOY=CXE5B82E","@Value344":"PAPPK=CXE5B8D0","@Value345":"PAPK=CXE5BFC6","@Value346":"PAYPK=CXE5C5C2","@Value347":"LIOY=CXE5C76B","@Value348":"PAOY=CXE5D4A1","@Value349":"Lavender=CXE6E6FA","@Value350":"CREAM=CXE8D898","@Value351":"YWH=CXE8EDD5","@Value352":"DarkSalmon=CXE9967A","@Value353":"PWH=CXEBDDED","@Value354":"GWH=CXECEDEC","@Value355":"PKWH=CXEDDDE0","@Value356":"Violet=CXEE82EE","@Value357":"PaleGoldenrod=CXEEE8AA","@Value358":"LightCoral=CXF08080","@Value359":"Khaki=CXF0E68C","@Value360":"AliceBlue=CXF0F8FF","@Value361":"Honeydew=CXF0FFF0","@Value362":"Azure=CXF0FFFF","@Value363":"SandyBrown=CXF4A460","@Value364":"Wheat=CXF5DEB3","@Value365":"Beige=CXF5F5DC","@Value366":"WhiteSmoke=CXF5F5F5","@Value367":"MintCream=CXF5FFFA","@Value368":"GhostWhite=CXF8F8FF","@Value369":"Salmon=CXFA8072","@Value370":"AntiqueWhite=CXFAEBD7","@Value371":"Linen=CXFAF0E6","@Value372":"LightGoldenrodYellow=CXFAFAD2","@Value373":"Oldlace=CXFDF5E6","@Value374":"RED=CXFF0000","@Value375":"SALMON=CXFF0055","@Value376":"PINK=CXFF0080","@Value377":"MAGENTA=CXFF00FF","@Value378":"DeepPink=CXFF1493","@Value379":"OrangeRed=CXFF4500","@Value380":"ROSE=CXFF6060","@Value381":"Tomato=CXFF6347","@Value382":"HotPink=CXFF69B4","@Value383":"Coral=CXFF7F50","@Value384":"ORANGE=CXFF8000","@Value385":"DarkOrange=CXFF8C00","@Value386":"LightSalmon=CXFFA07A","@Value387":"Orange=CXFFA500","@Value388":"GOLD=CXFFAA00","@Value389":"LightPink=CXFFB6C1","@Value390":"Pink=CXFFC0CB","@Value391":"Gold=CXFFD700","@Value392":"Peachpuff=CXFFDAB9","@Value393":"NavajoWhite=CXFFDEAD","@Value394":"Moccasin=CXFFE4B5","@Value395":"Bisque=CXFFE4C4","@Value396":"MistyRose=CXFFE4E1","@Value397":"BlanchedAlmond=CXFFEBCD","@Value398":"PapayaWhip=CXFFEFD5","@Value399":"LavenderBlush=CXFFF0F5","@Value400":"Seashell=CXFFF5EE","@Value401":"Cornsilk=CXFFF8DC","@Value402":"LemonChiffon=CXFFFACD","@Value403":"FloralWhite=CXFFFAF0","@Value404":"Snow=CXFFFAFA","@Value405":"YELLOW=CXFFFF00","@Value406":"LightYellow=CXFFFFE0","@Value407":"Ivory=CXFFFFF0","@Value408":"WHITE=CXFFFFFF"},"ToolTips":{"@ToolTip1":"Black","@ToolTip2":"[HTML Color]","@ToolTip3":"[HTML Color]","@ToolTip4":"[HTML Color]","@ToolTip5":"Blue","@ToolTip6":"[HTML Color]","@ToolTip7":"[HTML Color]","@ToolTip8":"[HTML Color]","@ToolTip9":"[HTML Color]","@ToolTip10":"[HTML Color]","@ToolTip11":"[HTML Color]","@ToolTip12":"[HTML Color]","@ToolTip13":"Green","@ToolTip14":"[HTML Color]","@ToolTip15":"Cyan","@ToolTip16":"Brownish black","@ToolTip17":"Vivid blue","@ToolTip18":"Very deep yellowish green","@ToolTip19":"Deep blue","@ToolTip20":"Vivid green","@ToolTip21":"Very dark greenish blue","@ToolTip22":"Very dark green","@ToolTip23":"Very dark bluish green","@ToolTip24":"Vivid greenish blue","@ToolTip25":"Vivid bluish green","@ToolTip26":"Deep greenish blue","@ToolTip27":"Deep green","@ToolTip28":"Deep bluish green","@ToolTip29":"Dark purplish blue","@ToolTip30":"Deep olive green","@ToolTip31":"Dark violet","@ToolTip32":"Dark olive","@ToolTip33":"Vivid yellowish green","@ToolTip34":"Very deep purple","@ToolTip35":"Blackish blue","@ToolTip36":"Blackish green","@ToolTip37":"Very dark yellowish green","@ToolTip38":"Deep purplish blue","@ToolTip39":"Very dark purple","@ToolTip40":"Deep yellowish green","@ToolTip41":"Very deep reddish purple","@ToolTip42":"Very deep red","@ToolTip43":"Very deep purplish red","@ToolTip44":"Very dark red","@ToolTip45":"Very dark purplish red","@ToolTip46":"Very dark reddish purple","@ToolTip47":"Dark reddish brown","@ToolTip48":"Dark brown","@ToolTip49":"Blackish red","@ToolTip50":"Blackish purple","@ToolTip51":"Reddish black","@ToolTip52":"[HTML Color]","@ToolTip53":"Deep violet","@ToolTip54":"Dark blue","@ToolTip55":"[HTML Color]","@ToolTip56":"Dark olive green","@ToolTip57":"Strong blue","@ToolTip58":"[HTML Color]","@ToolTip59":"[HTML Color]","@ToolTip60":"Deep reddish brown","@ToolTip61":"Deep brown","@ToolTip62":"Dark yellowish brown","@ToolTip63":"Dark olive brown","@ToolTip64":"Strong olive green","@ToolTip65":"Dark greenish blue","@ToolTip66":"Vivid purplish blue","@ToolTip67":"Dark bluish green","@ToolTip68":"Dark grayish olive green","@ToolTip69":"Strong greenish blue","@ToolTip70":"Strong green","@ToolTip71":"Strong bluish green","@ToolTip72":"[HTML Color]","@ToolTip73":"[HTML Color]","@ToolTip74":"Dark grayish olive","@ToolTip75":"Brilliant blue","@ToolTip76":"[HTML Color]","@ToolTip77":"Vivid red","@ToolTip78":"Deep yellowish brown","@ToolTip79":"Dark grayish reddish brown","@ToolTip80":"Dark grayish brown","@ToolTip81":"Dark green","@ToolTip82":"Dark grayish blue","@ToolTip83":"Strong yellowish green","@ToolTip84":"Dark yellowish green","@ToolTip85":"Strong violet","@ToolTip86":"Deep yellow green","@ToolTip87":"[HTML Color]","@ToolTip88":"Deep purple","@ToolTip89":"Moderate blue","@ToolTip90":"Strong purplish blue","@ToolTip91":"Moderate purplish blue","@ToolTip92":"Dark red","@ToolTip93":"Dark grayish yellowish brown","@ToolTip94":"[HTML Color]","@ToolTip95":"[HTML Color]","@ToolTip96":"Dark purple","@ToolTip97":"Dark grayish purple","@ToolTip98":"Vivid yellow green","@ToolTip99":"Deep purplish red","@ToolTip100":"Deep reddish purple","@ToolTip101":"Dark purplish red","@ToolTip102":"Dark reddish purple","@ToolTip103":"Dark grayish red","@ToolTip104":"Dark grayish green","@ToolTip105":"Moderate olive green","@ToolTip106":"[HTML Color]","@ToolTip107":"Moderate violet","@ToolTip108":"Moderate olive","@ToolTip109":"[HTML Color]","@ToolTip110":"[HTML Color]","@ToolTip111":"Grayish purplish blue","@ToolTip112":"[HTML Color]","@ToolTip113":"Vivid purplish red","@ToolTip114":"Deep red","@ToolTip115":"Strong reddish brown","@ToolTip116":"Moderate greenish blue","@ToolTip117":"Moderate green","@ToolTip118":"Moderate bluish green","@ToolTip119":"Brilliant greenish blue","@ToolTip120":"Brilliant green","@ToolTip121":"Brilliant bluish green","@ToolTip122":"Grayish violet","@ToolTip123":"Brilliant yellowish green","@ToolTip124":"Vivid violet","@ToolTip125":"Dark bluish gray","@ToolTip126":"Grayish olive","@ToolTip127":"[HTML Color]","@ToolTip128":"Olive gray","@ToolTip129":"Dark purplish gray","@ToolTip130":"Vivid reddish purple","@ToolTip131":"Strong brown","@ToolTip132":"Moderate reddish brown","@ToolTip133":"Moderate brown","@ToolTip134":"Grayish reddish brown","@ToolTip135":"Dark reddish gray","@ToolTip136":"Grayish brown","@ToolTip137":"Brownish gray","@ToolTip138":"Moderate olive brown","@ToolTip139":"Dark greenish gray","@ToolTip140":"Light blue","@ToolTip141":"Strong yellow green","@ToolTip142":"Grayish blue","@ToolTip143":"Moderate yellowish green","@ToolTip144":"[HTML Color]","@ToolTip145":"Brilliant purplish blue","@ToolTip146":"Light olive","@ToolTip147":"Grayish green","@ToolTip148":"[HTML Color]","@ToolTip149":"Deep reddish orange","@ToolTip150":"Dark reddish orange","@ToolTip151":"[HTML Color]","@ToolTip152":"Strong purple","@ToolTip153":"[HTML Color]","@ToolTip154":"[HTML Color]","@ToolTip155":"Moderate purple","@ToolTip156":"[HTML Color]","@ToolTip157":"Light purplish blue","@ToolTip158":"Light greenish blue","@ToolTip159":"Light green","@ToolTip160":"Light bluish green","@ToolTip161":"Vivid purple","@ToolTip162":"Maroon","@ToolTip163":"Purple","@ToolTip164":"Grayish purple","@ToolTip165":"[HTML Color]","@ToolTip166":"Strong red","@ToolTip167":"Strong purplish red","@ToolTip168":"Strong reddish purple","@ToolTip169":"Moderate red","@ToolTip170":"Moderate purplish red","@ToolTip171":"Moderate reddish purple","@ToolTip172":"Grayish purplish red","@ToolTip173":"Grayish red","@ToolTip174":"Grayish reddish purple","@ToolTip175":"Moderate yellowish brown","@ToolTip176":"Grayish yellowish brown","@ToolTip177":"Deep greenish yellow","@ToolTip178":"Very light blue","@ToolTip179":"Moderate yellow green","@ToolTip180":"[HTML Color]","@ToolTip181":"Brilliant violet","@ToolTip182":"Light violet","@ToolTip183":"[HTML Color]","@ToolTip184":"[HTML Color]","@ToolTip185":"Dark greenish yellow","@ToolTip186":"[HTML Color]","@ToolTip187":"[HTML Color]","@ToolTip188":"[HTML Color]","@ToolTip189":"[HTML Color]","@ToolTip190":"Vivid reddish orange","@ToolTip191":"Deep orange","@ToolTip192":"Brownish orange","@ToolTip193":"Strong yellowish brown","@ToolTip194":"[HTML Color]","@ToolTip195":"Gray","@ToolTip196":"Vivid greenish yellow","@ToolTip197":"Light yellowish green","@ToolTip198":"Bluish gray","@ToolTip199":"Light grayish olive","@ToolTip200":"Deep yellow","@ToolTip201":"Pale blue","@ToolTip202":"Pale violet","@ToolTip203":"Light olive gray","@ToolTip204":"[HTML Color]","@ToolTip205":"[HTML Color]","@ToolTip206":"Brilliant yellow green","@ToolTip207":"Dark yellow","@ToolTip208":"[HTML Color]","@ToolTip209":"Pale purplish blue","@ToolTip210":"[HTML Color]","@ToolTip211":"[HTML Color]","@ToolTip212":"[HTML Color]","@ToolTip213":"Purplish gray","@ToolTip214":"Light olive brown","@ToolTip215":"Grayish yellow green","@ToolTip216":"Strong reddish orange","@ToolTip217":"Moderate reddish orange","@ToolTip218":"Grayish reddish orange","@ToolTip219":"Light reddish brown","@ToolTip220":"Light brown","@ToolTip221":"Light grayish reddish brown","@ToolTip222":"Reddish gray","@ToolTip223":"Light grayish brown","@ToolTip224":"Light brownish gray","@ToolTip225":"Greenish gray","@ToolTip226":"Strong greenish yellow","@ToolTip227":"Dark grayish yellow","@ToolTip228":"[HTML Color]","@ToolTip229":"Pale green","@ToolTip230":"Very light greenish blue","@ToolTip231":"Very light bluish green","@ToolTip232":"[HTML Color]","@ToolTip233":"[HTML Color]","@ToolTip234":"[HTML Color]","@ToolTip235":"[HTML Color]","@ToolTip236":"Deep purplish pink","@ToolTip237":"Deep pink","@ToolTip238":"[HTML Color]","@ToolTip239":"Deep yellowish pink","@ToolTip240":"Dark purplish pink","@ToolTip241":"Light reddish purple","@ToolTip242":"Dark pink","@ToolTip243":"Dark yellowish pink","@ToolTip244":"Light grayish red","@ToolTip245":"Light purplish red","@ToolTip246":"Pale reddish purple","@ToolTip247":"Deep orange yellow","@ToolTip248":"Dark orange yellow","@ToolTip249":"Vivid yellow","@ToolTip250":"Very light green","@ToolTip251":"[HTML Color]","@ToolTip252":"Light purple","@ToolTip253":"Moderate greenish yellow","@ToolTip254":"Very light yellowish green","@ToolTip255":"Brilliant purple","@ToolTip256":"Brown","@ToolTip257":"[HTML Color]","@ToolTip258":"Pale purple","@ToolTip259":"Very light purplish blue","@ToolTip260":"Strong yellow","@ToolTip261":"[HTML Color]","@ToolTip262":"Strong orange","@ToolTip263":"Moderate orange","@ToolTip264":"Light yellowish brown","@ToolTip265":"Light grayish yellowish brown","@ToolTip266":"[HTML Color]","@ToolTip267":"Grayish greenish yellow","@ToolTip268":"Moderate yellow","@ToolTip269":"Very light violet","@ToolTip270":"[HTML Color]","@ToolTip271":"[HTML Color]","@ToolTip272":"Very pale blue","@ToolTip273":"Brilliant greenish yellow","@ToolTip274":"[HTML Color]","@ToolTip275":"Violet","@ToolTip276":"[HTML Color]","@ToolTip277":"[HTML Color]","@ToolTip278":"Light yellow green","@ToolTip279":"[HTML Color]","@ToolTip280":"Strong purplish pink","@ToolTip281":"Moderate purplish pink","@ToolTip282":"Vivid orange","@ToolTip283":"Grayish purplish pink","@ToolTip284":"Light bluish gray","@ToolTip285":"Grayish yellow","@ToolTip286":"[HTML Color]","@ToolTip287":"[HTML Color]","@ToolTip288":"Moderate pink","@ToolTip289":"Grayish pink","@ToolTip290":"Moderate orange yellow","@ToolTip291":"Yellowish gray","@ToolTip292":"[HTML Color]","@ToolTip293":"Very pale green","@ToolTip294":"Light purplish gray","@ToolTip295":"[HTML Color]","@ToolTip296":"Light greenish yellow","@ToolTip297":"Moderate yellowish pink","@ToolTip298":"Vivid orange yellow","@ToolTip299":"Strong orange yellow","@ToolTip300":"Grayish yellowish pink","@ToolTip301":"Pinkish gray","@ToolTip302":"Brownish pink","@ToolTip303":"Light greenish gray","@ToolTip304":"Very pale purplish blue","@ToolTip305":"[HTML Color]","@ToolTip306":"Lime","@ToolTip307":"Brilliant yellow","@ToolTip308":"[HTML Color]","@ToolTip309":"Very light purple","@ToolTip310":"Very pale violet","@ToolTip311":"Pale greenish yellow","@ToolTip312":"Vivid pink","@ToolTip313":"Vivid yellowish pink","@ToolTip314":"Strong yellowish pink","@ToolTip315":"[HTML Color]","@ToolTip316":"[HTML Color]","@ToolTip317":"Light yellow","@ToolTip318":"Pale yellow green","@ToolTip319":"[HTML Color]","@ToolTip320":"[HTML Color]","@ToolTip321":"Very pale purple","@ToolTip322":"[HTML Color]","@ToolTip323":"[HTML Color]","@ToolTip324":"Brilliant purplish pink","@ToolTip325":"Strong pink","@ToolTip326":"Light purplish pink","@ToolTip327":"Brilliant orange","@ToolTip328":"Light orange","@ToolTip329":"Pale yellow","@ToolTip330":"[HTML Color]","@ToolTip331":"[HTML Color]","@ToolTip332":"[HTML Color]","@ToolTip333":"[HTML Color]","@ToolTip334":"[HTML Color]","@ToolTip335":"[HTML Color]","@ToolTip336":"[HTML Color]","@ToolTip337":"Bluish white","@ToolTip338":"Lilac","@ToolTip339":"Tan","@ToolTip340":"[HTML Color]","@ToolTip341":"Light pink","@ToolTip342":"Light yellowish pink","@ToolTip343":"Brilliant orange yellow","@ToolTip344":"Pale purplish pink","@ToolTip345":"Pale pink","@ToolTip346":"Pale yellowish pink","@ToolTip347":"Light orange yellow","@ToolTip348":"Pale orange yellow","@ToolTip349":"[HTML Color]","@ToolTip350":"Cream","@ToolTip351":"Yellowish white","@ToolTip352":"[HTML Color]","@ToolTip353":"Purplish white","@ToolTip354":"Greenish white","@ToolTip355":"Pinkish white","@ToolTip356":"[HTML Color]","@ToolTip357":"[HTML Color]","@ToolTip358":"[HTML Color]","@ToolTip359":"[HTML Color]","@ToolTip360":"[HTML Color]","@ToolTip361":"[HTML Color]","@ToolTip362":"[HTML Color]","@ToolTip363":"[HTML Color]","@ToolTip364":"[HTML Color]","@ToolTip365":"[HTML Color]","@ToolTip366":"[HTML Color]","@ToolTip367":"[HTML Color]","@ToolTip368":"[HTML Color]","@ToolTip369":"[HTML Color]","@ToolTip370":"[HTML Color]","@ToolTip371":"[HTML Color]","@ToolTip372":"[HTML Color]","@ToolTip373":"[HTML Color]","@ToolTip374":"Red","@ToolTip375":"Salmon","@ToolTip376":"Pink","@ToolTip377":"Magenta","@ToolTip378":"[HTML Color]","@ToolTip379":"[HTML Color]","@ToolTip380":"Rose","@ToolTip381":"[HTML Color]","@ToolTip382":"[HTML Color]","@ToolTip383":"[HTML Color]","@ToolTip384":"Orange","@ToolTip385":"[HTML Color]","@ToolTip386":"[HTML Color]","@ToolTip387":"[HTML Color]","@ToolTip388":"Gold","@ToolTip389":"[HTML Color]","@ToolTip390":"[HTML Color]","@ToolTip391":"[HTML Color]","@ToolTip392":"[HTML Color]","@ToolTip393":"[HTML Color]","@ToolTip394":"[HTML Color]","@ToolTip395":"[HTML Color]","@ToolTip396":"[HTML Color]","@ToolTip397":"[HTML Color]","@ToolTip398":"[HTML Color]","@ToolTip399":"[HTML Color]","@ToolTip400":"[HTML Color]","@ToolTip401":"[HTML Color]","@ToolTip402":"[HTML Color]","@ToolTip403":"[HTML Color]","@ToolTip404":"[HTML Color]","@ToolTip405":"Yellow","@ToolTip406":"[HTML Color]","@ToolTip407":"[HTML Color]","@ToolTip408":"White"}}} ================================================ FILE: server/data/SASContextPrompt.json ================================================ {"ContextPrompt":{"Function":[{"Name":"ARMCONV","Definition":"Converts a SAS System 9 or later ARM log written in simple format to the more readable label=item format that was used in SAS 8.2.","Parameter1":"login='aname'","Description1":"Is the physical name of the input ARM log.","Parameter2":"logout='aname'","Description2":"Is the physical name of the output ARM log."},{"Name":"ARMEND","Definition":"Indicates the termination of an application.","Parameter1":"option-1<","Description1":"Options: APPID=numeric variable or constant; APPIDVAR=numeric variable; LEVEL= variable; MACONLY=NO | YES; SCL=NO | YES.","Parameter2":"...option-n>","Description2":"Options: APPID=numeric variable or constant; APPIDVAR=numeric variable; LEVEL= variable; MACONLY=NO | YES; SCL=NO | YES."},{"Name":"ARMGTID","Definition":"Assigns a unique identifier to a transaction class.","Parameter1":"TXNNAME='aname'<","Description1":"Is a required transaction name that is a SAS character variable or quoted literal value, up to 127 characters.","Parameter2":"option-1<, ...option-n>>","Description2":"Options: APPID=numeric variable or constant; APPIDVAR=numeric variable; LEVEL=numeric constant or variable; MACONLY=NO | YES; METRNAM1-7='aname'; METRDEF1-7=option; SCL=NO | YES; TXNDET='aname'; TXNIDVAR=numeric variable."},{"Name":"ARMINIT","Definition":"Starts the initialization of an application.","Parameter1":"APPNAME='aname'<","Description1":"Is the required application name that is a SAS character variable or quoted literal value.","Parameter2":"option-1<","Description2":"Options: APPIDVAR=numeric variable; APPUSER='aname'; GETID=NO | YES; LEVEL=numeric constant or variable; MACONLY=NO | YES; SCL=NO | YES; TXNIDVAR=numeric variable; TXNDET='aname'; TXNNAME='aname'","Parameter3":"...option-n>>","Description3":"Options: APPIDVAR=numeric variable; APPUSER='aname'; GETID=NO | YES; LEVEL=numeric constant or variable; MACONLY=NO | YES; SCL=NO | YES; TXNIDVAR=numeric variable; TXNDET='aname'; TXNNAME='aname'"},{"Name":"ARMJOIN","Definition":"Reads the six SAS data sets created by the %ARMPROC macro, and creates SAS data sets and SQL views that contain common information about applications and transactions.","Parameter1":"<option-1<","Description1":"Options: LIBIN=libref; LIBOUT=libref; TXNDS=YES | NO; UPDTDS=YES | NO.","Parameter2":"...option-n>>","Description2":"Options: LIBIN=libref; LIBOUT=libref; TXNDS=YES | NO; UPDTDS=YES | NO."},{"Name":"ARMPROC","Definition":"Processes an input ARM log, and outputs six SAS data sets that contain the gathered information from the log.","Parameter1":"<option-1<","Description1":"Options: LIB=libref; LOG=pathname; LOGNEW=pathname.","Parameter2":"...option-n>>","Description2":"Options: LIB=libref; LOG=pathname; LOGNEW=pathname."},{"Name":"ARMSTOP","Definition":"Specifies the end of a transaction instance.","Parameter1":["<option-1<","...option-n>>"],"Description1":["Options: LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; SCL=NO | YES; SHANDLE=numeric variable or constant; SHDLVAR=numeric variable; STATUS=numeric variable or numeric constants.","Options: LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; SCL=NO | YES; SHANDLE=numeric variable or constant; SHDLVAR=numeric variable; STATUS=numeric variable or numeric constants."]},{"Name":"ARMSTRT","Definition":"Specifies the start of execution of a transaction instance, and returns a unique handle that is passed to %ARMUPDT and %ARMSTOP.","Parameter1":"option-1<","Description1":"Options: APPID=numeric variable or constant; APPIDVAR=numeric variable; CORR=n; GETID=NO | YES; LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; PARNTVAR=numeric variable; SCL=NO | YES; SHDLVAR=numeric variable; TXNDET='aname'; TXNID=numeric variable or constant; TXNIDVAR=numeric variable; TXNNAME='aname'.","Parameter2":"...option-n>","Description2":"Options: APPID=numeric variable or constant; APPIDVAR=numeric variable; CORR=n; GETID=NO | YES; LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; PARNTVAR=numeric variable; SCL=NO | YES; SHDLVAR=numeric variable; TXNDET='aname'; TXNID=numeric variable or constant; TXNIDVAR=numeric variable; TXNNAME='aname'."},{"Name":"ARMUPDT","Definition":"Updates a transaction instance that has been previously started.","Parameter1":"DATA='variable'<","Description1":"Is a SAS character variable or a quoted literal user-supplied data buffer that contains text to pass to the ARM_UPDATE function call. DATA = is not required but highly recommended.","Parameter2":"option-1<","Description2":"Options: LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; SCL=NO | YES; SHANDLE=numeric or constant; SHDLVAR=numeric variable.","Parameter3":"...option-n>>","Description3":"Options: LEVEL=numeric constant or variable; MACONLY=NO | YES; METRVAL1-7='aname'; SCL=NO | YES; SHANDLE=numeric or constant; SHDLVAR=numeric variable."},{"Name":"ABS","Definition":"Returns the absolute value.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"ADDR","Definition":"Returns the memory address of a variable on a 32-bit platform. The value that is returned is numeric.","Parameter1":"variable","Description1":"Specifies a variable name."},{"Name":"ADDRLONG","Definition":"Returns the memory address of a variable on 32-bit and 64-bit platforms. The return value is a character string that contains the binary representation of the address. To display this value, use the $HEXw. format to convert the binary value to its hexadecimal equivalent.","Parameter1":"variable","Description1":"Specifies a variable."},{"Name":"AIRY","Definition":"Returns the value of the Airy function.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"ALLPERM","Definition":"Generates all permutations of the values of several variables in a minimal change order.","Parameter1":"count","Description1":"Specifies an integer variable that ranges from 1 to the number of permutations.","Parameter2":"variable-1<","Description2":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted.","Parameter3":"variable-2...>","Description3":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted."},{"Name":"ANYALNUM","Definition":"Searches a character string for an alphanumeric character, and returns the first position at which the character is found.","Parameter1":"string <","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYALPHA","Definition":"Searches a character string for an alphabetic character, and returns the first position at which the character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYCNTRL","Definition":"Searches a character string for a control character, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYDIGIT","Definition":"Searches a character string for a digit, and returns the first position at which the digit is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYFIRST","Definition":"Searches a character string for a character that is valid as the first character in a SAS variable name under VALIDVARNAME=V7, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYGRAPH","Definition":"Searches a character string for a graphical character, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYLOWER","Definition":"Searches a character string for a lowercase letter, and returns the first position at which the letter is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYNAME","Definition":"Searches a character string for a character that is valid in a SAS variable name under VALIDVARNAME=V7, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYPRINT","Definition":"Searches a character string for a printable character, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYPUNCT","Definition":"Searches a character string for a punctuation character, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYSPACE","Definition":"Searches a character string for a white-space character (blank, horizontal and vertical tab, carriage return, line feed, and form feed), and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYUPPER","Definition":"Searches a character string for an uppercase letter, and returns the first position at which the letter is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ANYXDIGIT","Definition":"Searches a character string for a hexadecimal character that represents a digit, and returns the first position at which that character is found.","Parameter1":"string <","Description1":"Is the character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional integer that specifies the position at which the search should start and the direction in which to search."},{"Name":"ARCOS","Definition":"Returns the arccosine.","Parameter1":"argument ","Description1":"Specifies a numeric constant, variable, or expression. Range is between -1 and 1."},{"Name":"ARCOSH","Definition":"Returns the inverse hyperbolic cosine.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression. Range is greater than or equal to 1."},{"Name":"ARSIN","Definition":"Returns the arcsine.","Parameter1":"argument ","Description1":"Specifies a numeric constant, variable, or expression. Range is between -1 and 1."},{"Name":"ARSINH","Definition":"Returns the inverse hyperbolic sine.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression. Range is from negative infinity to infinity."},{"Name":"ARTANH","Definition":"Returns the inverse hyperbolic tangent.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression. Range is between -1 to 1."},{"Name":"ATAN","Definition":"Returns the arc tangent.","Parameter1":"argument ","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"ATAN2","Definition":"Returns the arc tangent of the ratio of two numeric variables.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"ATTRC","Definition":"Returns the value of a character attribute for a SAS data set.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"attr-name","Description2":"Is an attribute name. If attr-name is invalid, a missing value is returned. Valid values are: \"CHARSET\", \"ENCRYPT\", \"ENGINE\", \"LABEL\", \"LIB\", \"MEM\", \"MODE\", \"MTYPE\", \"SORTEDBY\", \"SORTLVL\", \"SORTSEQ\", \"TYPE\".\n "},{"Name":"ATTRN","Definition":"Returns the value of a numeric attribute for a SAS data set.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"attr-name","Description2":"Is the name of the SAS data set attribute whose numeric value\nis returned. If the value of attr-name is invalid, a missing\nvalue is returned. The following values are valid: \"ALTERPW\",\n\"ANOBS\", \"ANY\", \"ARAND\", \"ARWU\", \"AUDIT\", \"AUDIT_DATA\",\n\"AUDIT_BEFORE\", \"AUDIT_ERROR\", \"CRDTE\", \"ICONST\", \"INDEX\",\n\"ISINDEX\", \"ISSUBSET\", \"LRECL\", \"LRID\", \"MAXGEN\", \"MAXRC\",\n\"MODTE\", \"NDEL\", \"NEXTGEN\", \"NLOBS\", \"NLOBSF\", \"NOBS\", \"NVARS\",\n\"PW\", \"RADIX\", \"READPW\", \"TAPE\", \"WHSTMT\", \"WRITEPW\".\n "},{"Name":"BAND","Definition":"Returns the bitwise logical AND of two arguments. If either argument contains a missing value, then the function returns a missing value and sets _ERROR_ equal to 1.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"BETA","Definition":"Returns the value of the beta function.","Parameter1":"a","Description1":"Is the first shape parameter, where a > 0.","Parameter2":"b","Description2":"Is the second shape parameter, where b > 0."},{"Name":"BETAINV","Definition":"Returns a quantile from the beta distribution with shape parameters a and b.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 \u2264 p \u2264 1.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a > 0.","Parameter3":"b","Description3":"Is a numeric shape parameter. Range: b > 0."},{"Name":"BLACKCLPRC","Definition":"Calculates call prices for European options on futures, based on the Black model.","Parameter1":"E","Description1":"Is a non-missing, positive value that specifies exercise price. Specify E and F in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies time to maturity.","Parameter3":"F","Description3":"Is a non-missing, positive value that specifies future price. Specify F and E in the same units.","Parameter4":"r","Description4":"Is a non-missing, positive fraction that specifies the risk-free interest rate between the present time and t. Specify a value for r for the same time period as the unit of t.","Parameter5":"sigma","Description5":"Is a non-missing, positive fraction that specifies the volatility (the square root of the variance of r). Specify a value for sigma for the same time period as the unit of t."},{"Name":"BLACKPTPRC","Definition":"Calculates put prices for European options on futures, based on the Black model.","Parameter1":"E","Description1":"Is a non-missing, positive value that specifies exercise price. Specify E and F in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies time to maturity.","Parameter3":"F","Description3":"Is a non-missing, positive value that specifies future price. Specify F and E in the same units.","Parameter4":"r","Description4":"Is a non-missing, positive fraction that specifies the risk-free interest rate between the present time and t. Specify a value for r for the same time period as the unit of t.","Parameter5":"sigma","Description5":"Is a non-missing, positive fraction that specifies the volatility (the square root of the variance of r). Specify a value for sigma for the same time period as the unit of t."},{"Name":"BLKSHCLPRC","Definition":"Calculates call prices for European options on stocks, based on the Black-Scholes model.","Parameter1":"E","Description1":"Is a non-missing, positive value that specifies exercise price.\n\nRequirementSpecify E and S in the same units.\nData typeDOUBLE\n ","Parameter2":"t","Description2":"Is a nonmissing value that specifies the time to maturity, in years.\n\nData typeINTEGER","Parameter3":"S","Description3":"Is a nonmissing, positive value that specifies the share price. \n \nRequirementSpecify S and E in the same units.\nData typeDOUBLE","Parameter4":"r","Description4":"Is a nonmissing, positive value that specifies the annualized risk-free interest rate, continuously compounded.\n\nData typeDOUBLE\n","Parameter5":"sigma","Description5":"Is a nonmissing, positive fraction that specifies the volatility of the underlying asset.\nData typeDOUBLE"},{"Name":"BLSHIFT","Definition":"Returns the bitwise logical left shift of two arguments. If either argument contains a missing value, then the function returns a missing value and sets _ERROR_ equal to 1.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression. Range: 0 to 31, inclusive."},{"Name":"BNOT","Definition":"Returns the bitwise logical NOT of an argument.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive."},{"Name":"BOR","Definition":"Returns the bitwise logical OR of two arguments. If either argument contains a missing value, then the function returns a missing value and sets _ERROR_ equal to 1.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive."},{"Name":"BRSHIFT","Definition":"Returns the bitwise logical right shift of two arguments. If either argument contains a missing value, then the function returns a missing value and sets _ERROR_ equal to 1.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression. Range: 0 to 31, inclusive."},{"Name":"BXOR","Definition":"Returns the bitwise logical EXCLUSIVE OR of two arguments. If either argument contains a missing value, then the function returns a missing value and sets _ERROR_ equal to 1.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression. Range: between 0 and 2\u00b3\u00b2-1 inclusive."},{"Name":"BYTE","Definition":"Returns one character in the ASCII or the EBCDIC collating sequence.","Parameter1":"n","Description1":"Specifies an integer that represents a specific ASCII or EBCDIC character. Range: 0-255."},{"Name":"ALLCOMB","Definition":"Generates all combinations of the values of n variables taken k at a time in a minimal change order.","Parameter1":"count","Description1":"Specifies an integer variable that is assigned from 1 to the number of combinations in a loop.","Parameter2":"variable-1, ..., variable-n","Description2":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted."},{"Name":"ALLCOMBI","Definition":"Generates all combinations of the indices of n objects taken k at a time in a minimal change order.","Parameter1":"N","Description1":"Is a numeric constant, variable, or expression that specifies the total number of objects.","Parameter2":"K","Description2":"Is a numeric constant, variable, or expression that specifies the number of objects in each combination.","Parameter3":"index-1, ..., index-K <","Description3":"Is a numeric variable that contains indices of the objects in the returned combination. Indices are integers between 1 and N inclusive.","Parameter4":"index-added","Description4":"Is a numeric variable in which ALLCOMBI returns the value of the index that was added.","Parameter5":"index-removed>","Description5":"Is a numeric variable in which ALLCOMBI returns the value of the index that was removed."},{"Name":"CATS*1","Definition":"Removes leading and trailing blanks, and returns a concatenated character string.","Parameter1":"string-1<, ...string-n>","Description1":"Specifies a SAS character string."},{"Name":"CATS*2","Definition":"Removes leading and trailing blanks, and returns a concatenated character string.","Parameter1":"result","Description1":"Specifies a character variable.","Parameter2":"string-1<, ...string-n>","Description2":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string using the BESTw. format. In this case, SAS does not write a note to the log."},{"Name":"CATT*1","Definition":"Removes trailing blanks, and returns a concatenated character string.","Parameter1":"string-1<, ...string-n>","Description1":"Specifies a SAS character string."},{"Name":"CATT*2","Definition":"Removes trailing blanks, and returns a concatenated character string.","Parameter1":"result","Description1":"Specifies a character variable.","Parameter2":"string-1<, ...string-n>","Description2":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string using the BESTw. format. In this case, SAS does not write a note to the log."},{"Name":"CATX*1","Definition":"Removes leading and trailing blanks, inserts delimiters, and returns a concatenated character string.","Parameter1":"delimiter","Description1":"Specifies a character string that is used as a delimiter between concatenated strings.","Parameter2":"string-1<, ...string-n>","Description2":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string using the BESTw. format. In this case, SAS does not write a note to the log."},{"Name":"CATX*2","Definition":"Removes leading and trailing blanks, inserts delimiters, and returns a concatenated character string.","Parameter1":"delimiter","Description1":"Specifies a character string that is used as a delimiter between concatenated strings.","Parameter2":"result","Description2":"Specifies a character variable.","Parameter3":"string-1<, ...string-n>","Description3":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string using the BESTw. format. In this case, SAS does not write a note to the log."},{"Name":"COMPCOST","Definition":"Sets the costs of operations for later use by the COMPGED function.","Parameter1":"operation","Description1":"Is a character constant, variable, or expression that specifies an operation that is performed by the COMPGED function.","Parameter2":"value-1 <","Description2":"Is a numeric constant, variable, or expression that specifies the cost of the operation that is indicated by the preceding argument. Must be an integer that ranges from -32767 to 32767, or a missing value.","Parameter3":"operation-2, value-2 ...>","Description3":"Optional additional operation-value pairs."},{"Name":"EXECUTE","Definition":"Resolves the argument, and issues the resolved value for execution at the next step boundary.","Parameter1":"argument","Description1":"Specifies a character expression, a DATA step variable, or a character constant (enclosed in quotation marks) that yields a macro invocation or a SAS statement."},{"Name":"GRAYCODE*1","Definition":"Generates all subsets of n items in a minimal change order.","Parameter1":"k","Description1":"Specifies a numeric variable. Initializing k to a negative number causes CALL GRAYCODE to initialize the subset to be empty.","Parameter2":"numeric-variable-1, ..., numeric-variable-n","Description2":"Specifies numeric variables that have values of 0 or 1 which are updated when CALL GRAYCODE is executed."},{"Name":"GRAYCODE*2","Definition":"Generates all subsets of n items in a minimal change order.","Parameter1":"k","Description1":"Specifies a numeric variable. Initializing k to a negative number causes CALL GRAYCODE to initialize the subset to be empty.","Parameter2":"character-variable<","Description2":"Specifies a character variable that has a length of at least n characters. The first n characters indicate which items are in the subset.","Parameter3":"n<","Description3":"Specifies a numeric constant, variable, or expression. By default, n is the length of character-variable.","Parameter4":"in-out>>","Description4":"Specifies a character constant, variable, or expression. The default value is \"IO.\" The first character is used to indicate that an item is in the subset. The second character is used to indicate that an item is out of the subset."},{"Name":"IS8601_CONVERT","Definition":"Converts an ISO 8601 interval to datetime and duration values, or converts datetime and duration values to an ISO 8601 interval.","Parameter1":"convert-from","Description1":"\n Specifies a keyword in single quotation marks that indicates whether the source for the conversion is an interval, a datetime and duration value, or a duration value.\n\n Convert-from can have one of the following values:\n 'dn' specifies a date value, where n is a value from 1 to 6. The default value is 1. N is the number\n of components in the from-variables or the to-variables arguments. The following components are valid:\n \u2022year\n \u2022month\n \u2022day\n \u2022hour\n \u2022minute\n \u2022second\n 'dtn' specifies a datetime value, where n is a value from 1 to 6. The default value is 1. N is the number \n of components in the from-variables or the to-variables arguments. The following components are valid:\n \u2022year\n \u2022month\n \u2022day\n \u2022hour\n \u2022minute\n \u2022second\n 'dt/dt' specifies that the source value for the conversion is a datetime/datetime value.\n 'dt/du' specifies that the source value for the conversion is a datetime/duration value.\n 'dun' specifies that the source value for the conversion is a duration value, where n is a value from \n 1 to 6. The default value is 1. N is the number of components in the from-variables or the to-variables \n arguments. The following components are valid:\n \u2022year\n \u2022month\n \u2022day\n \u2022hour\n \u2022minute\n \u2022second\n 'du/dt' specifies that the source value for the conversion is a duration/datetime value.\n 'intvl' specifies that the source value for the conversion is an interval value.\n ","Parameter2":"convert-to","Description2":"\n Specifies a keyword in single quotation marks that indicates the results of the conversion.\n\n Convert-to can have one of the following values:\n 'dn' specifies a date value, where n is a value from 1 to 6. The default value is 1. N is the number\n of components in the from-variables or to-variables arguments. The following components are valid:\n \u2022year\n \u2022month\n day\n \u2022hour\n \u2022minute\n \u2022second\n 'dtn' specifies a datetime value, where n is a value from 1 to 6. The default value is 1. N is the number \n of components in the from-variables or the to-variables arguments. The following components are valid:\n \u2022year\n \u2022month\n \u2022day\n \u2022hour\n \u2022minute\n \u2022second\n 'dt/dt' specifies to create a datetime/datetime interval.\n 'dt/du' specifies to create a datetime/duration interval.\n 'dun' specifies to create a duration, where n is a value from 1 to 6. The default value is 1. N is the number \n of components in the from-variables or the to-variables arguments. The following components are valid:\n \u2022year\n \u2022month\n \u2022day\n \u2022hour\n \u2022minute\n \u2022second\n 'du/dt' specifies to create a duration/datetime interval.\n 'end' specifies to create a value that is the ending datetime or duration of an interval value.\n 'intvl' specifies to create an interval value.\n 'start' specifies to create a value that is the beginning datetime or duration of an interval value.\n ","Parameter3":"<from-variables>","Description3":"Specifies one or two variables that contain the source value. Specify one variable for an interval value and two variables, one each, for datetime and duration values.","Parameter4":"<to-variables>","Description4":"Specifies one or two variables that contain converted values. Specify one variable for in interval value and two variables, one each, for datetime and duration values.","Parameter5":"date-time-replacements","Description5":"Specifies date or time component values to use when a month, day, or time component is omitted from an interval, datetime, or duration value. date-time-replacements is specified as a series of numbers separated by a comma to represent, in this order, the year, month, day, hour, minute, or second."},{"Name":"LABEL","Definition":"Assigns a variable label to a specified character variable.","Parameter1":"variable-1","Description1":"Specifies any SAS variable. If variable-1 does not have a label, the variable name is assigned as the value of variable-2.","Parameter2":"variable-2","Description2":"Specifies any SAS character variable. Variable labels can be up to 256 characters long; therefore, the length of variable-2 should be at least 256 characters to avoid truncating variable labels."},{"Name":"LEXCOMB","Definition":"Generates all distinct combinations of the non-missing values of n variables taken k at a time in lexicographic order.","Parameter1":"count","Description1":"Specifies an integer value that is assigned values from 1 to the number of combinations in a loop.","Parameter2":"k","Description2":"Specifies an integer constant, variable, or expression between 1 and n, inclusive, that specifies the number of items in each combination.","Parameter3":"variable-1, ..., variable-n","Description3":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted."},{"Name":"LEXCOMBI","Definition":"Generates all combinations of the indices of n objects taken k at a time in lexicographic order.","Parameter1":"n","Description1":"Is a numeric constant, variable, or expression that specifies the total number of objects.","Parameter2":"k","Description2":"Is a numeric constant, variable, or expression that specifies the number of objects in each combination.","Parameter3":"index-1, ..., index-k","Description3":"Is a numeric variable that contains indices of the objects in the combination that is returned. Indices are integers between 1 and n, inclusive."},{"Name":"LEXPERK","Definition":"Generates all distinct permutations of the non-missing values of n variables taken k at a time in lexicographic order.","Parameter1":"count","Description1":"Specifies an integer variable that is assigned a value from 1 to the number of permutations in a loop.","Parameter2":"k","Description2":"Specifies an integer constant, variable, or expression between 1 and n, inclusive, that specifies the number of items in each permutation.","Parameter3":"variable-1, ..., variable-n","Description3":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted."},{"Name":"LEXPERM","Definition":"Generates all distinct permutations of the non-missing values of several variables in lexicographic order.","Parameter1":"count","Description1":"Specifies a numeric variable that has an integer value that ranges from 1 to the number of permutations.","Parameter2":"variable-1 <, ..., variable-N>","Description2":"Specifies either all numeric variables, or all character variables that have the same length. The values of these variables are permuted by LEXPERM."},{"Name":"LOGISTIC","Definition":"Applies the logistic function to each argument.","Parameter1":"argument<, argument, ...>","Description1":"Is a numeric variable."},{"Name":"MISSING","Definition":"Assigns missing values to the specified character or numeric variables.","Parameter1":"varname1<, varname2, ...>","Description1":"Specifies the name of SAS character or numeric variables."},{"Name":"MODULE","Definition":"Calls an external routine without any return code. \n \nSyntax: CALL MODULE(<control-string,> module-name <, argument-1, ..., argument-n>); \n\nRequired Argument:\nmodule-name - is the name of the external module to use.\n\nOptional Arguments:\ncontrol-string\nis an optional control string whose first character must be an asterisk (*), followed by any combination of the following characters:\n I\n prints the hexadecimal representations of all arguments to the CALL MODULE routine. You can use this option to help diagnose problems that are caused by incorrect arguments or attribute tables. If you specify the I option, the E option is implied.\n E\n prints detailed error messages. Without the E option (or the I option, which supersedes it), the only error message that the CALL MODULE routine generates is \"Invalid argument to function,\" which is usually not enough information to determine the cause of the error. The E option is useful for a production environment, whereas the I option is preferable for a development or debugging environment.\n H\n provides brief information about the syntax of the CALL MODULE routine, the attribute file format, and suggested SAS formats and informats. \n\nargument - is one or more arguments to pass to the requested routine.\n\nDetails\nWorking with Attribute Tables\n The CALL MODULE routine executes a routine that resides in an external library. The routine uses the \n required module-name argument to identify the name of the library, as well as optional arguments.\n \n CALL MODULE builds a parameter list by using the information in the arguments and a routine description \n and argument attribute table that you define in a separate file. The attribute table is a sequential text \n file that contains descriptions of the routines that you can invoke with the CALL MODULE routine. The \n purpose of the table is to define how CALL MODULE interprets its supplied arguments when it builds a \n parameter list to pass to the external routine. The attribute table contains a description for each \n external routine that you intend to call, and descriptions of each argument associated with that routine.\n \n Before you invoke CALL MODULE, you must define the fileref of SASCBTBL to point to the external file \n that contains the attribute table. You can name the file whatever you want when you create it. In this way, \n you use SAS variables and formats as arguments to CALL MODULE and ensure that these arguments are \n properly converted before being passed to the external routine. If you do not define this fileref, CALL \n MODULE calls the requested routine without altering the arguments. \n \nUsing Special Formats with the CALL MODULE Routine\nNumeric Alignment\nBy default, the CALL MODULE routine forces numeric alignment for fields that are defined with the IBw., \nPIBw., and RBw. formats within the SASCBTBL table. Therefore, the fields are padded to provide an \nappropriate 4-byte or 8-byte boundary. Most current compilers expect this alignment.\n\nNew formats were created specifically for the CALL MODULE routine to accommodate routines that were \nbuilt with a compiler that does not expect alignment. These new formats are IBUNALNw., PIBUNALNw., \nand RBUNALNw. Use these formats instead of the IBw., PIBw., and RBw. formats.","Parameter1":"<control-string","Description1":"\n Is an optional control string whose first character must be an asterisk (*), followed by any\n combination of the following characters:\n I prints the hexadecimal representations of all arguments to the CALL MODULE routine.\n E prints detailed error messages\n H provides brief information about the syntax of the CALL MODULE routine, the attribute \n file format, and suggested SAS formats and informats.","Parameter2":">module-name<","Description2":"Is the name of the external module to use.","Parameter3":"argument-1, ..., argument-n>","Description3":"Is one or more arguments to pass to the requested routine."},{"Name":"POKE","Definition":"Writes a value directly into memory on a 32-bit platform.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression that contains a value to write into memory.","Parameter2":"pointer","Description2":"Specifies a character string that contains the virtual address of the data that the CALL POKE routine alters.","Parameter3":"<length>","Description3":"Specifies a numeric constant, variable, or expression that contains the number of bytes to write from the source to the address that is indicated by pointer.","Parameter4":"<floating-point>","Description4":"Specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."},{"Name":"POKELONG","Definition":"Writes a value directly into memory on 32-bit and 64-bit platforms.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression that contains a value to write into memory.","Parameter2":"pointer","Description2":"Specifies a character string that contains the virtual address of the data that the CALL POKELONG routine alters.","Parameter3":"<length>","Description3":"Specifies a numeric SAS expression that contains the number of bytes to write from the source to the address that is indicated by the pointer.","Parameter4":"<floating-point>","Description4":"Specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."},{"Name":"PRXDEBUG","Definition":"Enables Perl regular expressions in a DATA step to send debugging output to the SAS log.","Parameter1":"on-off","Description1":"Specifies a numeric constant, variable, or expression. If the value of on-off is positive and non-zero, then debugging is turned on. If the value of on-off is zero, then debugging is turned off."},{"Name":"PRXFREE","Definition":"Frees memory that was allocated for a Perl regular expression.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is the identification number that is returned by the PRXPARSE function. regular-expression-id is set to missing if the call to the PRXFREE routine occurs without error."},{"Name":"PRXNEXT","Definition":"Returns the position and length of a substring that matches a pattern, and iterates over multiple matches within one string.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is the identification number that is returned by the PRXPARSE function.","Parameter2":"start","Description2":"Is a numeric variable that specifies the position at which to start the pattern matching in source.","Parameter3":"stop","Description3":"Is a numeric constant, variable, or expression that specifies the last character to use in source. If stop is -1, then the last character is the last non-blank character in source.","Parameter4":"source","Description4":"Specifies a character constant, variable, or expression that you want to search.","Parameter5":"position","Description5":"Is a numeric variable with a returned value that is the position in source at which the pattern begins. If no match is found, CALL PRXNEXT returns zero.","Parameter6":"length","Description6":"Is a numeric variable with a returned value that is the length of the string that is matched by the pattern. If no match is found, CALL PRXNEXT returns zero."},{"Name":"PRXPOSN","Definition":"Returns the start position and length for a capture buffer.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is a pattern identifier that is returned by the PRXPARSE function.","Parameter2":"capture-buffer","Description2":"Is a numeric constant, variable, or expression with a value that identifies the capture buffer from which to retrieve the start position and length.","Parameter3":"start <","Description3":"Is a numeric variable with a returned value that is the position at which the capture buffer is found.","Parameter4":"length>","Description4":"Is a numeric variable with a returned value that is the position at which the capture buffer is found."},{"Name":"PRXSUBSTR","Definition":"Returns the position and length of a substring that matches a pattern.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is an identification number that is returned by the PRXPARSE function.","Parameter2":"source","Description2":"Specifies a character constant, variable, or expression that you want to search.","Parameter3":"position <","Description3":"Is a numeric variable with a returned value that is the position in source where the pattern begins. If no match is found, CALL PRXSUBSTR returns zero.","Parameter4":"length>","Description4":"Is a numeric variable with a returned value that is the length of the substring that is matched by the pattern. If no match is found, CALL PRXSUBSTR returns zero."},{"Name":"RANBIN*1","Definition":"Returns a random variate from a binomial distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"n","Description2":"Is an integer number of independent Bernoulli trials. Range: n > 0.","Parameter3":"p","Description3":"Is a numeric probability of success parameter. Range: 0 < p < 1."},{"Name":"RANBIN*2","Definition":"Returns a random variate from a binomial distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANBIN is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"n","Description2":"Is an integer number of independent Bernoulli trials. Range: n > 0.","Parameter3":"p","Description3":"Is a numeric probability of success parameter. Range: 0 < p < 1.","Parameter4":"x","Description4":"Is a numeric SAS variable. A new value for the random variate x is returned each time CALL RANBIN is executed."},{"Name":"RANCAU*1","Definition":"Returns a random variate from a Cauchy distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1."},{"Name":"RANCAU*2","Definition":"Returns a random variate from a Cauchy distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANCAU is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"x","Description2":"Is a numeric SAS variable. A new value for the random variate x is returned each time CALL RANCAU is executed."},{"Name":"RANEXP*1","Definition":"Returns a random variate from an exponential distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1."},{"Name":"RANEXP*2","Definition":"Returns a random variate from an exponential distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANEXP is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"x","Description2":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANEXP is executed."},{"Name":"RANGAM*1","Definition":"Returns a random variate from a gamma distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a > 0."},{"Name":"RANGAM*2","Definition":"Returns a random variate from a gamma distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANGAM is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a > 0.","Parameter3":"x","Description3":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANGAM is executed."},{"Name":"RANNOR*1","Definition":"Returns a random variate from a normal distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1."},{"Name":"RANNOR*2","Definition":"Returns a random variate from a normal distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANNOR is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"x","Description2":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANNOR is executed."},{"Name":"RANPERK","Definition":"Randomly permutes the values of the arguments, and returns a permutation of k out of n values.","Parameter1":"seed","Description1":"Is a numeric variable that contains the random number seed.","Parameter2":"k","Description2":"Is the number of values that you want to have in the random permutation.","Parameter3":"variable-1<","Description3":"Specifies all numeric variables, or all character variables that have the same length. K values of these variables are randomly permuted.","Parameter4":"variable-2, ...>","Description4":"Specifies all numeric variables, or all character variables that have the same length. K values of these variables are randomly permuted."},{"Name":"RANPERM","Definition":"Randomly permutes the values of the arguments.","Parameter1":"seed","Description1":"Is a numeric variable that contains the random number seed.","Parameter2":"variable-1<","Description2":"Specifies all numeric variables or all character variables that have the same length. The values of these variables are randomly permuted.","Parameter3":"variable-2, ...>","Description3":"Specifies all numeric variables or all character variables that have the same length. The values of these variables are randomly permuted."},{"Name":"RANPOI*1","Definition":"Returns a random variate from a Poisson distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"m","Description2":"Is a numeric mean parameter greater than or equal to zero."},{"Name":"RANPOI*2","Definition":"Returns a random variate from a Poisson distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANPOI is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"m","Description2":"Is a numeric mean parameter greater than or equal to zero.","Parameter3":"x","Description3":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANPOI is executed."},{"Name":"RANTBL*1","Definition":"Returns a random variate from a tabled probability distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"p1, ...pn","Description2":"Is a numeric SAS value."},{"Name":"RANTBL*2","Definition":"Returns a random variate from a tabled probability distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANTBL is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"p1, ...pn","Description2":"Is a numeric SAS value.","Parameter3":"x","Description3":"Is a numeric SAS variable. A new value for the random variate x is returned each time CALL RANTBL is executed."},{"Name":"RANTRI*1","Definition":"Returns a random variate from a triangular distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"h","Description2":"Is a numeric SAS value. Range: 0 < h < 1."},{"Name":"RANTRI*2","Definition":"Returns a random variate from a triangular distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANTRI is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"h","Description2":"Is a numeric SAS value. Range: 0 < h < 1.","Parameter3":"x","Description3":"Is a numeric SAS variable. A new value for the random variate x is returned each time CALL RANTRI is executed."},{"Name":"RANUNI*1","Definition":"Returns a random variate from a uniform distribution.","Parameter1":"seed","Description1":"Is an integer. If seed is less than or equal to 0, the time of day is used to initialize the seed stream. Range: seed < 2\u00b3\u00b9 - 1."},{"Name":"RANUNI*2","Definition":"Returns a random variate from a uniform distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANUNI is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"x","Description2":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANUNI is executed."},{"Name":"SET","Definition":"Links SAS data set variables to DATA step or macro variables that have the same name and data type.","Parameter1":"data-set-id","Description1":"Is the identifier that is assigned by the OPEN function when the data set is opened."},{"Name":"SOFTMAX","Definition":"Returns the softmax value.","Parameter1":"argument<,argument, ...>","Description1":"Is numeric."},{"Name":"SORTC","Definition":"Sorts the values of character arguments.","Parameter1":"variable-1<, ..., variable-n>","Description1":"Specifies a character variable."},{"Name":"SORTN","Definition":"Sorts the values of numeric arguments.","Parameter1":"variable-1<, ..., variable-n>","Description1":"Specifies a numeric variable."},{"Name":"STDIZE","Definition":"Standardizes the values of one or more variables.","Parameter1":"<option-1, option-2, ...","Description1":"Specifies a character expression whose values can be uppercase, lowercase, or mixed case letters. Leading and trailing blanks are ignored.","Parameter2":">variable-1<","Description2":"Is numeric. These values will be standardized according to the method that you use.","Parameter3":"variable-2, ...>","Description3":"Is numeric. These values will be standardized according to the method that you use."},{"Name":"STREAMINIT","Definition":"Specifies a seed value to use for subsequent random number generation by the RAND function.","Parameter1":"seed","Description1":"Is an integer seed value. Range: seed < 2\u00b3\u00b9 - 1."},{"Name":"SYMPUT","Definition":"Assigns DATA step information to a macro variable.","Parameter1":"argument-1","Description1":"Specifies a character expression that identifies the macro variable that is assigned a value. If the macro variable does not exist, the routine creates it.","Parameter2":"argument-2","Description2":"Specifies a character constant, variable, or expression that contains the value that is assigned."},{"Name":"SYMPUTX","Definition":"Assigns a value to a macro variable, and removes both leading and trailing blanks.","Parameter1":"macro-variable","Description1":"A character constant, variable, or expression.","Parameter2":"value","Description2":"Specifies a character or numeric constant, variable, or expression. If value is numeric, SAS converts the value to a character string using the BEST. format and does not issue a note to the SAS log.","Parameter3":"symbol-table","Description3":"Specifies a character constant, variable, or expression. The following values are valid as the first non-blank character in symbol-table: G (global symbol table), L (local symbol table), F (any symbol table)."},{"Name":"SYSTEM","Definition":"Submits an operating environment command for execution.","Parameter1":"command","Description1":"Specifies any of the following: a system command that is enclosed in quotation marks (character string), an expression whose value is a system command, or the name of a character variable whose value is a system command that is executed."},{"Name":"VNEXT","Definition":"Returns the name, type, and length of a variable that is used in a DATA step.","Parameter1":"varname<","Description1":"Is a character variable that is updated by the CALL VNEXT routine.","Parameter2":"vartype<","Description2":"Is a character variable whose input value is ignored. The value that is returned is \"N\" or \"C\".","Parameter3":"varlength","Description3":"Is a numeric variable. The input value of varlength is ignored."},{"Name":"CAT","Definition":"Does not remove leading or trailing blanks, and returns a concatenated character string.","Parameter1":"item-1 <, ..., item-n>","Description1":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string by using the BESTw. format."},{"Name":"CATQ","Definition":"Concatenates character or numeric values by using a delimiter to separate items and by adding quotation marks to strings that contain the delimiter.","Parameter1":"modifier(s)<","Description1":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the CATQ function. Blanks are ignored.","Parameter2":"delimiter>","Description2":"Specifies a character constant, variable, or expression that is used as a delimiter between concatenated strings. If you specify this argument, then you must also specify the D modifier.","Parameter3":"item","Description3":"Specifies a constant, variable, or expression, either character or numeric. If item is numeric, then its value is converted to a character string by using the BESTw. format."},{"Name":"CDF","Definition":"\n Returns a value from a cumulative probability distribution.\n\nSyntax: CDF(distribution, quantile <, parameter-1, \u2026, parameter-k>)","Parameter1":"distribution","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribuion: BERNOULLI\n Beta distribuion: BETA\n Binomial distribuion: BINOMIAL\n Cauchy distribuion: CAUCHY\n Chi-Square distribuion: CHISQUARE\n Conway-Maxwell-Poisson distribuion: CMP\n Exponential distribuion: EXPONENTIAL\n F distribuion: F\n Gamma distribuion: GAMMA\n Generalized Poisson distribuion: GENPOISSON\n Geometric distribuion: GEOMETRIC\n Hypergeometric distribuion: HYPERGEOMETRIC\n Laplace distribuion: LAPLACE\n Logistic distribuion: LOGISTIC\n Lognormal distribuion: LOGNORMAL\n Negative binomial distribuion: NEGBINOMIAL\n Normal distribuion: NORMAL|GAUSS\n Normal mixture distribuion: NORMALMIX\n Pareto distribuion: PARETO\n Poisson distribuion: POISSON\n T distribuion: T\n Tweedie distribuion: TWEEDIE\n Uniform distribuion: UNIFORM\n Wald (inverse Gaussian) distribuion: WALD|IGAUSS\n Weibull distribuion: WEIBULL\n\nNote: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"quantile<","Description2":"Is a numeric constant, variable, or expression that specifies the value of the random variable.","Parameter3":"parm-1, ... ,parm-k>","Description3":"Are optional constants, variables, or expressions that specify shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"CEIL","Definition":"Returns the smallest integer that is greater than or equal to the argument, fuzzed to avoid unexpected floating-point results.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"CEILZ","Definition":"Returns the smallest integer that is greater than or equal to the argument, using zero fuzzing.","Parameter1":"argument","Description1":"Is a numeric constant, variable, or expression."},{"Name":"CEXIST","Definition":"Verifies the existence of a SAS catalog or SAS catalog entry.","Parameter1":"entry<","Description1":"Is a character constant, variable, or expression that specifies a SAS catalog, or the name of an entry in a catalog. If the entry value is a one- or two-level name, then it is assumed to be the name of a catalog.","Parameter2":"'U'>","Description2":"tests whether the catalog can be opened for updating."},{"Name":"CHAR","Definition":"Returns a single character from a specified position in a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"position","Description2":"Is an integer that specifies the position of the character to be returned."},{"Name":"CHOOSEC","Definition":"Returns a character value that represents the results of choosing from a list of arguments.","Parameter1":"index-expression","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"selection-1 <","Description2":"Specifies a character constant, variable, or expression. The value of this argument is returned by the CHOOSEC function.","Parameter3":"...selection-n>","Description3":"Specifies a character constant, variable, or expression. The value of this argument is returned by the CHOOSEC function."},{"Name":"CHOOSEN","Definition":"Returns a numeric value that represents the results of choosing from a list of arguments.","Parameter1":"index-expression","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"selection-1 <","Description2":"Specifies a numeric constant, variable, or expression. The value of this argument is returned by the CHOOSEN function.","Parameter3":"...selection-n>","Description3":"Specifies a numeric constant, variable, or expression. The value of this argument is returned by the CHOOSEN function."},{"Name":"CINV","Definition":"Returns a quantile from the chi-square distribution.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 \u2264 p < 1","Parameter2":"df<","Description2":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter3":"nc>","Description3":"Is an optional numeric noncentrality parameter. Range: nc \u2265 0."},{"Name":"CLOSE","Definition":"Closes a SAS data set.","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that the OPEN function returns."},{"Name":"CMISS","Definition":"Counts the number of missing arguments.","Parameter1":"argument-1 <","Description1":"Specifies a constant, variable, or expression. Argument can be either a character value or a numeric value.","Parameter2":"argument-2...>","Description2":"Specifies a constant, variable, or expression. Argument can be either a character value or a numeric value."},{"Name":"CNONCT","Definition":"Returns the noncentrality parameter from a chi-square distribution.","Parameter1":"x","Description1":"Is a numeric random variable greater than or equal to zero.","Parameter2":"df","Description2":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter3":"prob","Description3":"Is a probability. Raange: 0 < prob < 1."},{"Name":"COALESCE","Definition":"Returns the first non-missing value from a list of numeric arguments.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"COALESCEC","Definition":"Returns the first non-missing value from a list of character arguments.","Parameter1":"argument-1<","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"... argument-n>","Description2":"Specifies a character constant, variable, or expression."},{"Name":"COLLATE*1","Definition":"Returns a character string in ASCII or EBCDIC collating sequence.","Parameter1":"start-position<","Description1":"Specifies the numeric position in the collating sequence of the first character to be returned.","Parameter2":"end-position>","Description2":"Specifies the numeric position in the collating sequence of the last character to be returned."},{"Name":"COLLATE*2","Definition":"Returns a character string in ASCII or EBCDIC collating sequence.","Parameter1":"start-position<","Description1":"Specifies the numeric position in the collating sequence of the first character to be returned.","Parameter2":"length>","Description2":"Specifies the number of characters in the collating sequence. Default value: 200."},{"Name":"COMB","Definition":"Computes the number of combinations of n elements taken r at a time.","Parameter1":"n","Description1":"Is a non-negative integer that represents the total number of elements from which the sample is chosen.","Parameter2":"r","Description2":"Is a non-negative integer that represents the number of chosen elements. Range: r \u2264 n."},{"Name":"COMPARE","Definition":"Returns the position of the leftmost character by which two strings differ, or returns 0 if there is no difference.","Parameter1":"string-1","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"string-2<","Description2":"Specifies a character constant, variable, or expression.","Parameter3":"modifier(s)>","Description3":"Specifies a character string that can modify the action of the COMPARE function. You can use one or more of the following characters as a valid modifier: i or I (to ignore case), l or L (to remove leading blanks), n or N (to remove quotaion marks), : (to truncate the longer of string-1 or string-2 to the length of the shorter string, or to one, whichever is greater."},{"Name":"COMPBL","Definition":"Removes multiple blanks from a character string.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to compress."},{"Name":"COMPGED","Definition":"Returns the generalized edit distance between two strings.","Parameter1":"string-1","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"string-2<","Description2":"Specifies a character constant, variable, or expression.","Parameter3":"cutoff><","Description3":"Is a numeric constant, variable, or expression. If the actual generalized edit distance is greater than the value of cutoff, the value that is returned is equal to the value of cutoff.","Parameter4":"modifiers>","Description4":"Specifies a character string that can modify the action of the COMPGED function. You can use one or more of the following characters as a valid modifier: i or I (to ignore case), l or L (to remove leading blanks), n or N (to remove quotaion marks), : (to truncate the longer of string-1 or string-2 to the length of the shorter string, or to one, whichever is greater."},{"Name":"COMPLEV","Definition":"Returns the Levenshtein edit distance between two strings.","Parameter1":"string-1","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"string-2<","Description2":"Specifies a character constant, variable, or expression.","Parameter3":"cutoff><","Description3":"Specifies a numeric constant, variable, or expression. If the actual Levenshtein edit distance is greater than the value of cutoff, the value that is returned is equal to the value of cutoff.","Parameter4":"modifiers>","Description4":"Specifies a character string that can modify the action of the COMPLEV function. You can use one or more of the following characters as a valid modifier: i or I (to ignore case), l or L (to remove leading blanks), n or N (to remove quotaion marks), : (to truncate the longer of string-1 or string-2 to the length of the shorter string, or to one, whichever is greater."},{"Name":"COMPOUND","Definition":"Returns compound interest parameters.","Parameter1":"a","Description1":"Is numeric, and specifies the initial amount. Range: a \u2265 0.","Parameter2":"f","Description2":"Is numeric, and specifies the future amount (at the end of n periods). Range: f \u2265 0.","Parameter3":"r","Description3":"Is numeric, and specifies the periodic interest rate expressed as a fraction. Range: r \u2265 0.","Parameter4":"n","Description4":"Is an integer, and specifies the number of compounding periods. Range: n \u2265 0."},{"Name":"COMPRESS","Definition":"Returns a character string with specified characters removed from the original string.","Parameter1":"<source><","Description1":"Specifies a character constant, variable, or expression from which specified characters will be removed.","Parameter2":"chars><","Description2":"Specifies a character constant, variable, or expression that initializes a list of characters.","Parameter3":"modifier(s)>","Description3":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the COMPRESS function. Blanks are ignored."},{"Name":"CONSTANT","Definition":"Computes machine and mathematical constants.","Parameter1":"constant<","Description1":"Is a character constant, variable, or expression that identifies the constant to be returned. Valid constants are as follows: 'E', 'EULER', 'PI', 'EXACTINT', 'BIG', 'LOGBIG', 'SQRTBIG', 'SMALL', 'LOGSMALL', 'SQRTSMALL', 'MACEPS', 'LOGMACEPS', 'SQRTMACEPS'.","Parameter2":"parameter>","Description2":"Is an optional numeric parameter. Some of the constants specified in constant have an optional argument that alters the functionality of the CONSTANT function."},{"Name":"CONVX","Definition":"Returns the convexity for an enumerated cash flow.","Parameter1":"y","Description1":"Specifies the effective per-period yield-to-maturity, expressed as a fraction. Range: 0 < y < 1.","Parameter2":"f","Description2":"Specifies the frequency of cash flows per period. Range: f > 0.","Parameter3":"c(1), ..., c(k)","Description3":"Specifies a list of cash flows."},{"Name":"CONVXP","Definition":"Returns the convexity for a periodic cash flow stream, such as a bond.","Parameter1":"A","Description1":"Specifies the par value. Range: A > 0","Parameter2":"c","Description2":"Specifies the nominal per-period coupon rate, expressed as a fraction. Range: 0 \u2264 c < 1.","Parameter3":"n","Description3":"Specifies the number of coupons per period. n > 0 and is an integer.","Parameter4":"K","Description4":"Specifies the number of remaining coupons. Range: K > 0","Parameter5":"ko","Description5":"Specifies the time from the present date to the first coupon date, expressed in terms of the number of periods. Range: 0 < ko \u2264 1/n.","Parameter6":"y","Description6":"Specifies the nominal per-period yield-to-maturity, expressed as a fraction. Range: y > 0."},{"Name":"COS","Definition":"Returns the cosine.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression and is expressed in radians."},{"Name":"COSH","Definition":"Returns the hyperbolic cosine.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"COUNT","Definition":"Counts the number of times that a specified substring appears within a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression in which substrings are to be counted. Enclose a literal string of characters in quotation marks.","Parameter2":"substring<","Description2":"Is a character constant, variable, or expression that specifies the substring of characters to count in string. Enclose a literal string of characters in quotation marks.","Parameter3":"modifiers>","Description3":"Is a character constant, variable, or expression that specifies one or more modifiers. The following modifiers can be in uppercase or lowercase: i (ignores character case), t (trims trailing blanks)."},{"Name":"COUNTC","Definition":"Counts the number of characters in a string that appear or do not appear in a list of characters.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression in which characters are counted. Enclose a literal string of characters in quotation marks.","Parameter2":"charlist<","Description2":"Specifies a character constant, variable, or expression that initializes a list of characters. COUNTC counts characters in this list, provided that you do not specify the V modifier in the modifier argument.","Parameter3":"modifier(s)>","Description3":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the COUNTC function. Blanks are ignored."},{"Name":"COUNTW","Definition":"Counts the number of words in a character string.","Parameter1":"<string><","Description1":"Specifies a character constant, variable, or expression in which words are counted.","Parameter2":"<chars><","Description2":"Specifies an optional character constant, variable, or expression that initializes a list of characters. The characters in this list are the delimiters that separate words, provided that you do not use the K modifier in the modifier argument. If you specify the K modifier, then all characters that are not in this list are delimiters.","Parameter3":"modifier(s)>","Description3":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the COUNTW function."},{"Name":"CSS","Definition":"Returns the corrected sum of squares.","Parameter1":"argument-1<, ...argument-n>","Description1":"Specifies a numeric constant, variable, or expression. At least one nonmissing argument is required."},{"Name":"CUROBS","Definition":"Returns the observation number of the current observation.","Parameter1":"data-set-id","Description1":"Is a numeric value that specifies the data set identifier that the OPEN function returns."},{"Name":"CV","Definition":"Returns the coefficient of variation. At least two arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2<, ...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"DACCDB","Definition":"Returns the accumulated declining balance depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset. Range: y > 0.","Parameter4":"r","Description4":"Is numeric, the rate of depreciation expressed as a decimal. Range: r > 0."},{"Name":"DACCDBSL","Definition":"Returns the accumulated declining balance with conversion to a straight-line depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is an integer, the lifetime of the asset. Range y > 0.","Parameter4":"r","Description4":"Is numeric, the rate of depreciation that is expressed as a fraction. Range r > 0."},{"Name":"DACCSL","Definition":"Returns the accumulated straight-line depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For fractional p, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset. Range y > 0."},{"Name":"DACCSYD","Definition":"Returns the accumulated sum-of-years-digits depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset. Range y > 0."},{"Name":"DACCTAB","Definition":"Returns the accumulated depreciation from specified tables.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"t1, t2, ..., tn","Description3":"Are numeric, the fractions of depreciation for each time period with t1+t2+...tn\u22641."},{"Name":"DAIRY","Definition":"Returns the derivative of the AIRY function.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"DATDIF","Definition":"Returns the number of days between two dates.","Parameter1":"sdate","Description1":"Specifies a SAS date value that identifies the starting date. If sdate falls at the end of a month, then SAS treats the date as if it were the last day of a 30-day month.","Parameter2":"edate","Description2":"Specifies a SAS date value that identifies the ending date. If sdate falls at the end of a month, then SAS treats the date as if it were the last day of a 30-day month.","Parameter3":"basis","Description3":"Identifies a character constant or variable that describes how SAS calculates the date difference in the securities industry. The following character strings are valid: '30/360' (30-day month and a 360-day year), 'ACT/ACT' (uses actual number of days between dates), 'ACT/360' (uses actual number of calendar days in a month, and 360 days for the year), 'ACT/365' (uses actual number of calendar days for each month, and 365 days for the year)."},{"Name":"DATE","Definition":"Returns the current date as a SAS date value. \n \nAlias: TODAY \n\nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date and time values that are returned for this function are determined by the time zone."},{"Name":"DATEJUL","Definition":"Converts a Julian date to a SAS date value.","Parameter1":"julian-date","Description1":"Specifies a SAS numeric expression that represents a Julian date. A Julian date in SAS is a date in the form yyddd or yyyyddd, where yy or yyyy is a two-digit or four-digit integer that represents the year and ddd is the number of the day of the year. The value of ddd must be between 1 and 365 (or 366 for a leap year)."},{"Name":"DATEPART","Definition":"Extracts the date from a SAS datetime value.","Parameter1":"datetime","Description1":"Specifies a SAS expression that represents a SAS datetime value. For example: conn='01feb94:8:45'dt; servdate=datepart(conn);"},{"Name":"DATETIME","Definition":"Returns the current date and time of day as a SAS datetime value. \n \nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date and time values that are returned for this function are determined by the time zone."},{"Name":"DAY","Definition":"Returns the day of the month from a SAS date value.","Parameter1":"date","Description1":"Specifies a SAS expression that represents a SAS date value. For example: now='05may97'd; d=day(now);"},{"Name":"DCLOSE","Definition":"Closes a directory that was opened by the DOPEN function.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened by the DOPEN function."},{"Name":"DCREATE","Definition":"Returns the complete pathname of a new, external directory.","Parameter1":"directory-name<","Description1":"Is a character constant, variable, or expression that specifies the name of the directory to create. This value cannot include a pathname.","Parameter2":"parent-directory>","Description2":"Is a character constant, variable, or expression that contains the complete pathname of the directory in which to create the new directory. If you do not supply a value for parent-directory, then the current directory is the parent directory."},{"Name":"DEPDB","Definition":"Returns the declining balance depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset. Range: y > 0.","Parameter4":"r","Description4":"Is numeric, the rate of depreciation that is expressed as a fraction. Range: r > 0."},{"Name":"DEPDBSL","Definition":"Returns the declining balance with conversion to a straight-line depreciation.","Parameter1":"p","Description1":"Is an integer, the period for which the calculation is to be done.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is an integer, the lifetime of the asset. Range: y>0.","Parameter4":"r","Description4":"Is numeric, the rate of depreciation that is expressed as a fraction. Range: r > 0."},{"Name":"DEPSL","Definition":"Returns the straight-line depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For fractional p, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset. Range: y > 0."},{"Name":"DEPSYD","Definition":"Returns the sum-of-years-digits depreciation.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"y","Description3":"Is numeric, the lifetime of the asset in number of depreciation periods. Range: y > 0."},{"Name":"DEPTAB","Definition":"Returns the depreciation from specified tables.","Parameter1":"p","Description1":"Is numeric, the period for which the calculation is to be done. For noninteger p arguments, the depreciation is prorated between the two consecutive time periods that precede and follow the fractional period.","Parameter2":"v","Description2":"Is numeric, the depreciable initial value of the asset.","Parameter3":"t1, t2, ..., tn","Description3":"are numeric, the fractions of depreciation for each time period with t1+t2+...tn\u22641."},{"Name":"DEQUOTE","Definition":"Removes matching quotation marks from a character string that begins with a quotation mark, and deletes all characters to the right of the closing quotation mark.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression."},{"Name":"DEVIANCE","Definition":"Returns the deviance based on a probability distribution.","Parameter1":"distribution","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are: 'BERNOULLI' | 'BERN', 'BINOMIAL' | 'BINO', 'GAMMA', 'IGAUSS' | 'WALD', 'NORMAL' | 'GAUSSIAN', 'NORMAL' | 'GAUSSIAN'.","Parameter2":"variable","Description2":"Is a numeric constant, variable, or expression.","Parameter3":"shape-parameter(s)<","Description3":"Are one or more distribution-specific numeric parameters that characterize the shape of the distribution.","Parameter4":"epsilon>","Description4":"Is an optional numeric small value used for all of the distributions, except for the normal distribution."},{"Name":"DHMS","Definition":"Returns a SAS datetime value from date, hour, minute, and second values.","Parameter1":"date","Description1":"Specifies a SAS expression that represents a SAS date value.","Parameter2":"hour","Description2":"Is numeric.","Parameter3":"minute","Description3":"Is numeric.","Parameter4":"second","Description4":"Is numeric."},{"Name":"DIF","Definition":"Returns differences between an argument and its nth lag. n specifies the number of lags.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"DIGAMMA","Definition":"Returns the value of the digamma function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"DIM*1","Definition":"Returns the number of elements in an array. n specifies the dimension, in a multidimensional array, for which you want to know the number of elements.","Parameter1":"array-name","Description1":"Specifies the name of an array that was previously defined in the same DATA step. This argument cannot be a constant, variable, or expression."},{"Name":"DIM*2","Definition":"Returns the number of elements in an array.","Parameter1":"array-name","Description1":"Specifies the name of an array that was previously defined in the same DATA step. This argument cannot be a constant, variable, or expression.","Parameter2":"bound-n","Description2":"Is a numeric constant, variable, or expression that specifies the dimension, in a multidimensional array, for which you want to know the number of elements. Use bound-n only when n is not specified."},{"Name":"DIM*3","Definition":"Returns the dimensions of a list variable","Parameter1":"list-variable","Description1":"A list variable."},{"Name":"DINFO","Definition":"Returns information about a directory.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened by the DOPEN function.","Parameter2":"info-item","Description2":"Is a character constant, variable, or expression that specifies the information item to be retrieved. DINFO returns a blank if the value of the info-item argument is invalid. The information available varies according to the operating environment."},{"Name":"DIVIDE","Definition":"Returns the result of a division that handles special missing values for ODS output.","Parameter1":"x","Description1":"Is a numeric constant, variable, or expression.","Parameter2":"y","Description2":"Is a numeric constant, variable, or expression."},{"Name":"DNUM","Definition":"Returns the number of members in a directory.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened by the DOPEN function."},{"Name":"DOPEN","Definition":"Opens a directory, and returns a directory identifier value.","Parameter1":"fileref","Description1":"Is a character constant, variable, or expression that specifies the fileref assigned to the directory."},{"Name":"DOPTNAME","Definition":"Returns directory attribute information.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened by the DOPEN function.","Parameter2":"nval","Description2":"Is a numeric constant, variable, or expression that specifies the sequence number of the option."},{"Name":"DOPTNUM","Definition":"Returns the number of information items that are available for a directory.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened by the DOPEN function."},{"Name":"DREAD","Definition":"Returns the name of a directory member.","Parameter1":"directory-id","Description1":"Is a numeric value that specifies the identifier that was assigned when the directory was opened by the DOPEN function.","Parameter2":"nval","Description2":"Is a numeric constant, variable, or expression that specifies the sequence number of the member within the directory."},{"Name":"DROPNOTE","Definition":"Deletes a note marker from a SAS data set or an external file.","Parameter1":"data-set-id|file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the data set or external file was opened, generally by the OPEN function or the FOPEN function.","Parameter2":"note-id","Description2":"Is a numeric value that specifies the identifier that was assigned by the NOTE or FNOTE function."},{"Name":"DSNAME","Definition":"Returns the SAS data set name that is associated with a data set identifier.","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that is returned by the OPEN function."},{"Name":"DUR","Definition":"Returns the modified duration for an enumerated cash flow.","Parameter1":"y","Description1":"Specifies the effective per-period yield-to-maturity, expressed as a fraction. Range: y > 0.","Parameter2":"f","Description2":"Specifies the frequency of cash flows per period. Range: f > 0.","Parameter3":"c(1), ... ,c(k)","Description3":"Specifies a list of cash flows."},{"Name":"DURP","Definition":"Returns the modified duration for a periodic cash flow stream, such as a bond.","Parameter1":"A","Description1":"Specifies the par value. Range: A > 0.","Parameter2":"c","Description2":"Specifies the nominal per-period coupon rate, expressed as a fraction. Range: 0 \u2264 c < 1.","Parameter3":"n","Description3":"Specifies the number of coupons per period. Range: n > 0 and is an integer.","Parameter4":"K","Description4":"Specifies the number of remaining coupons. Range: K > 0 and is an integer.","Parameter5":"ko","Description5":"Specifies the time from the present date to the first coupon date, expressed in terms of the number of periods. Range: 0 < c \u2264 1/n.","Parameter6":"y","Description6":"Specifies the nominal per-period yield-to-maturity, expressed as a fraction. Range: y > 0."},{"Name":"ENVLEN","Definition":"Returns the length of an environment variable.","Parameter1":"argument","Description1":"Specifies a character variable that is the name of an operating system environment variable. Enclose argument in quotation marks."},{"Name":"ERF","Definition":"Returns the value of the (normal) error function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"ERFC","Definition":"Returns the value of the complementary (normal) error function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression.","Description4":null},{"Name":"EUCLID","Definition":"Returns the Euclidean norm of the non-missing arguments.","Parameter1":"value-1 <,value-2 ...>","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"EXIST","Definition":"Verifies the existence of a SAS library member.","Parameter1":"member-name<","Description1":"Is a character constant, variable, or expression that specifies the SAS library member.","Parameter2":"member-type<","Description2":"Is a character constant, variable, or expression that specifies the type of SAS library member.","Parameter3":"generation>>","Description3":"Is a numeric constant, variable, or expression that specifies the generation number of the SAS data set whose existence you are checking."},{"Name":"EXP","Definition":"Returns the value of the exponential function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"FACT","Definition":"Computes a factorial.","Parameter1":"n","Description1":"Is a numeric constant, variable, or expression."},{"Name":"FAPPEND","Definition":"Appends the current record to the end of an external file.","Parameter1":"file-id<","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"cc>","Description2":"Is a character constant, variable, or expression that specifies a carriage-control character: blank (start record on a new line), 0 (skip one blank line), - (skip two blanks), 1 (start a new page), + (overstrike a previous line), P (computer prompt), = (contains carriage control info), all else (start a new line)."},{"Name":"FCLOSE","Definition":"Closes an external file, directory, or directory member.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FCOL","Definition":"Returns the current column position in the File Data Buffer (FDB).","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FDELETE","Definition":"Deletes an external file or an empty directory.","Parameter1":"fileref | directory","Description1":"Is a character constant, variable, or expression that specifies the fileref that you assigned to the external file, or an empty directory that you want to delete."},{"Name":"FETCH","Definition":"Reads the next non-deleted observation from a SAS data set into the Data Set Data Vector (DDV).","Parameter1":"data-set-id<","Description1":"Is a numeric variable that specifies the data set identifier that is returned by the OPEN function.","Parameter2":"'NOSET'>","Description2":"Prevents the automatic passing of SAS data set variable values to macro or DATA step variables even if the SET routine has been called."},{"Name":"FETCHOBS","Definition":"Reads a specified observation from a SAS data set into the Data Set Data Vector (DDV).","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that is returned by the OPEN function.","Parameter2":"obs-number<","Description2":"Is a numeric constant, variable, or expression that specifies the number of the observation to read.","Parameter3":"options>","Description3":"Is a character constant, variable, or expression that names one or more options, separated by blanks: ABS (obs-number is absolute), NOSET (prevents automatic passing of SAS data set variable values even if the SET routine has been called)."},{"Name":"FEXIST","Definition":"Verifies the existence of an external file that is associated with a fileref.","Parameter1":"fileref","Description1":"Is a character constant, variable, or expression that specifies the fileref that is assigned to an external file."},{"Name":"FGET","Definition":"Copies data from the File Data Buffer (FDB) into a variable.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"variable<","Description2":"In a DATA step, specifies a character variable to hold the data. In a macro, specifies a macro variable to hold the data. If variable is a macro variable and it does not exist, it is created.","Parameter3":"length>","Description3":"Specifies the number of characters to retrieve from the FDB. If length is omitted, all characters in the FDB from the current column position to the next delimiter are returned."},{"Name":"FILEEXIST","Definition":"Verifies the existence of an external file by its physical name.","Parameter1":"file-name","Description1":"Is a character constant, variable, or expression that specifies a fully qualified physical filename of the external file in the operating environment."},{"Name":"FILENAME","Definition":"Assigns or deassigns a fileref to an external file, directory, or output device.","Parameter1":"fileref<","Description1":"Specifies the fileref to assign to the external file.","Parameter2":"file-name><","Description2":"Is a character constant, variable, or expression that specifies the external file.","Parameter3":"device-type><","Description3":"Is a character constant, variable, or expression that specifies the type of device. Valid values: DISK, PRINTER, TEMP, DUMMY, PIPE, PLOTTER, TAPE, TERMINAL, GTERM, UPRINTER.","Parameter4":"host-options><","Description4":"Specifies host-specific details such as file attributes and processing attributes.","Parameter5":"dir-ref>","Description5":"Specifies the fileref that was assigned to the directory or partitioned data set in which the external file resides."},{"Name":"FILEREF","Definition":"Verifies whether a fileref has been assigned for the current SAS session.","Parameter1":"fileref","Description1":"Is a character constant, variable, or expression that specifies the fileref to be validated. Range: 1 to 8 character."},{"Name":"FINANCE*1","Definition":"Computes the accrued interest for a security that pays periodic interest.","Parameter1":"'accrint'","Description1":"Use the 'accrint' string-identifier to compute the accrued interest for a security that pays periodic interest.","Parameter2":"issue","Description2":"Specifies the issue date of the security.","Parameter3":"first-interest","Description3":"Specifies the first interest date of the security.","Parameter4":"settlement","Description4":"Specifies the settlement date.","Parameter5":"rate","Description5":"Specifies the interest rate.","Parameter6":"par-value","Description6":"Specifies the par value of the security. If you omit par-value, SAS uses the value $1000.","Parameter7":"frequency","Description7":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter8":"basis","Description8":"Specifies the optional day count value."},{"Name":"FINANCE*2","Definition":"Computes the accrued interest for a security that pays interest at maturity.","Parameter1":"'accrintm'","Description1":"Use the 'accrintm' string-identifier to compute the accrued interest for a security that pays interest at maturity.","Parameter2":"issue","Description2":"Specifies the issue date of the security.","Parameter3":"settlement","Description3":"Specifies the settlement date.","Parameter4":"rate","Description4":"Specifies the interest rate.","Parameter5":"par-value","Description5":"Specifies the par value of the security. If you omit par-value, SAS uses the value $1000."},{"Name":"FINANCE*3","Definition":"Computes the depreciation for each accounting period by using a depreciation coefficient.","Parameter1":"'amordegrc'","Description1":"Use 'amordegrc' string-identifier to compute the depreciation for each accounting period by using a depreciation coefficient. ","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"date-purchased","Description3":"Specifies the date of the purchase of the asset.","Parameter4":"first-period","Description4":"Specifies the date of the end of the first period.","Parameter5":"salvage","Description5":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter6":"period","Description6":"Specifies the depreciation period.","Parameter7":"rate","Description7":"Specifies the rate of depreciation.","Parameter8":"basis","Description8":"Specifies the optional day count value. \n \nTip:\nWhen the first argument of the FINANCE function is AMORDEGRC and the value of basis is 2, the function returns a missing value."},{"Name":"FINANCE*4","Definition":"Computes the depreciation for each accounting period.","Parameter1":"'amorlinc'","Description1":"Use 'amorlinc' string-identifier to compute the depreciation for each accounting period.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"date-purchased","Description3":"Specifies the date of the purchase of the asset.","Parameter4":"first-period","Description4":"Specifies the date of the end of the first period.","Parameter5":"salvage","Description5":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter6":"period","Description6":"Specifies the depreciation period.","Parameter7":"rate","Description7":"Specifies the rate of depreciation.","Parameter8":"basis","Description8":"Specifies the optional day count value. \n \nTip:\nWhen the first argument of the FINANCE function is AMORLINC and the value of basis is 2, the function returns a missing value."},{"Name":"FINANCE*5","Definition":"Computes the number of days from the beginning of the coupon period to the settlement date.","Parameter1":"'coupdaybs'","Description1":"Use the 'coupdaybs' string-identifier to compute the number of days from the beginning of the coupon period to the settlement date.","Parameter2":"settlement","Description2":"Specifies the settlement date of the security. The security settlement date is the date after the issue date when the security is traded to the buyer.\n \nNote: Dates should be entered using the DATE function, or as results of other formulas or functions. For example, use DATE(2011,5,23) for the 23rd day of May 2011. Problems can occur if dates are entered as text.","Parameter3":"maturity","Description3":"Specifies the maturity date of the security. The maturity date is the date the security expires.\n \nNote: Dates should be entered using the DATE function, or as results of other formulas or functions. For example, use DATE(2011,5,23) for the 23rd day of May 2011. Problems can occur if dates are entered as text.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*6","Definition":"Computes the number of days in the coupon period that contains the settlement date.","Parameter1":"'coupdays'","Description1":"Use the 'coupdays' string-identifier to compute the number of days in the coupon period that contains the settlement date.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*7","Definition":"Computes the number of days from the settlement date to the next coupon date.","Parameter1":"'coupdaysnc'","Description1":"Use the 'coupdaysnc' string-identifier to compute the number of days from the settlement date to the next coupon date.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*8","Definition":"Computes the next coupon date after the settlement date.","Parameter1":"'coupncd'","Description1":"Use the 'coupncd' string-identifier to compute the next coupon date after the settlement date.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*9","Definition":"Computes the number of coupons that are payable between the settlement date and the maturity date.","Parameter1":"'coupnum'","Description1":"Use the 'coupnum' string-identifier to compute the number of coupons that are payable between the settlement date and the maturity date.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*10","Definition":"Computes the previous coupon date before the settlement date.","Parameter1":"'couppcd'","Description1":"Use the 'couppcd' string-identifier to compute the previous coupon date before the settlement date.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"frequency","Description4":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter5":"basis","Description5":"Specifies the optional day count value."},{"Name":"FINANCE*11","Definition":"Computes the cumulative interest paid between two periods.","Parameter1":"'cumipmt'","Description1":"Use the 'cumipmt' string-identifier to compute the cumulative interest paid between two periods.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"nper","Description3":"Specifies the total number of payment periods.","Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently.","Parameter5":"start-period","Description5":"Specifies the first period in the calculation. Payment periods are numbered beginning with 1.","Parameter6":"end-period","Description6":"Specifies the last period in the calculation.","Parameter7":"type","Description7":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*12","Definition":"Computes the cumulative principal that is paid on a loan between two periods.","Parameter1":"'cumprinc'","Description1":"Use the 'cumprinc' string-identifier to compute the cumulative principal that is paid on a loan between two periods.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"nper","Description3":"Specifies the total number of payment periods.","Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently.","Parameter5":"start-period","Description5":"Specifies the first period in the calculation. Payment periods are numbered beginning with 1.","Parameter6":"end-period","Description6":"Specifies the last period in the calculation.","Parameter7":"type","Description7":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*13","Definition":"Computes the depreciation of an asset for a specified period by using the fixed-declining balance method.","Parameter1":"'db'","Description1":"Use the 'db' string-identifier to compute the depreciation of an asset for a specified period by using the fixed-declining balance method.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"salvage","Description3":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter4":"life","Description4":"Specifies the number of periods over which the asset is depreciated (also called the useful life of the asset).","Parameter5":"period","Description5":"Specifies the period for which you want to calculate the depreciation. Period must use the same time units as life.","Parameter6":"month","Description6":"Specifies the number of months (month is an optional numeric argument). If month is omitted, it defaults to a value of 12."},{"Name":"FINANCE*14","Definition":"Computes the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.","Parameter1":"'ddb'","Description1":"Use the 'ddb' string-identifier to compute the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"salvage","Description3":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter4":"life","Description4":"Specifies the number of periods over which the asset is depreciated (also called the useful life of the asset).","Parameter5":"period","Description5":"Specifies the period for which you want to calculate the depreciation. Period must use the same time units as life.","Parameter6":"factor","Description6":"Specifies the rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method)."},{"Name":"FINANCE*15","Definition":"Computes the discount rate for a security.","Parameter1":"'disc'","Description1":"Use the 'disc' string-identifier to compute the discount rate for a security.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"price","Description4":"Specifies the price of security per $100 face value.","Parameter5":"redemption","Description5":"Specifies the amount to be received at maturity.","Parameter6":"basis","Description6":"Specifies the optional day count value."},{"Name":"FINANCE*16","Definition":"Converts a dollar price, expressed as a fraction, to a dollar price, expressed as a decimal number.","Parameter1":"'dollarde'","Description1":"Use the 'dollarde' string-identifier to convert a dollar price, expressed as a fraction, to a dollar price, expressed as a decimal number.","Parameter2":"fractional-dollar","Description2":"Specifies the number expressed as a fraction.","Parameter3":"fraction","Description3":"Specifies the integer to use in the denominator of a fraction."},{"Name":"FINANCE*17","Definition":"Converts a dollar price, expressed as a decimal number, to a dollar price, expressed as a fraction.","Parameter1":"'dollarfr'","Description1":"Use the 'dollarfr' string-identifier to convert a dollar price, expressed as a decimal number, to a dollar price, expressed as a fraction.","Parameter2":"decimal-dollar","Description2":"Specifies a decimal number.","Parameter3":"fraction","Description3":"Specifies the integer to use in the denominator of a fraction."},{"Name":"FINANCE*18","Definition":"Computes the annual duration of a security with periodic interest payments.","Parameter1":"'duration'","Description1":"Use the 'duration' string-identifier to compute the annual duration of a security with periodic interest payments.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"coupon","Description4":"Specifies he annual coupon rate of the security.","Parameter5":"yield","Description5":"Specifies he annual yield of the security.","Parameter6":"frequency","Description6":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter7":"basis","Description7":"Specifies the optional day count value."},{"Name":"FINANCE*19","Definition":"Computes the effective annual interest rate.","Parameter1":"'effect'","Description1":"Use the 'effect' string-identifier to compute the effective annual interest rate.","Parameter2":"nominal-rate","Description2":"Specifies the nominal interest rate.","Parameter3":"npery","Description3":"Specifies the number of compounding periods per year."},{"Name":"FINANCE*20","Definition":"Computes the future value of an investment.","Parameter1":"'fv'","Description1":"Use the 'fv' string-identifier to compute the future value of an investment.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"nper","Description3":"Specifies the total number of payment periods.","Parameter4":"payment","Description4":"Specifies the payment that is made each period; the payment cannot change over the life of the annuity. Typically, payment contains principal and interest but no fees and taxes. If payment is omitted, you must include the present-value argument.","Parameter5":"present-value","Description5":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If present-value is omitted, it is assumed to be 0 (zero), and you must include the payment argument.","Parameter6":"end-period","Description6":"Specifies the last period in the calculation.","Parameter7":"type","Description7":"\n Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\n If payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1.\n "},{"Name":"FINANCE*21","Definition":"Computes the future value of the initial principal after applying a series of compound interest rates.","Parameter1":"'fvschedule'","Description1":"Use the 'fvschedule' string-identifier to compute the interest rate for a fully invested security.","Parameter2":"principal","Description2":"Specifies the present value.","Parameter3":"schedule","Description3":"Specifies the sequence of interest rates to apply."},{"Name":"FINANCE*22","Definition":"Computes the interest rate for a fully invested security.","Parameter1":"'intrate'","Description1":"Use the 'intrate' string-identifier to compute the interest rate for a fully invested security.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"investment","Description4":"Specifies the amount that is invested in the security.","Parameter5":"redemption","Description5":"Specifies the amount to be received at maturity.","Parameter6":"basis","Description6":"Specifies the optional day count value."},{"Name":"FINANCE*23","Definition":"Computes the interest payment for an investment for a specified period.","Parameter1":"'ipmt'","Description1":"Use the 'ipmt' string-identifier to compute the interest payment for an investment for a specified period.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":["period","nper"],"Description3":["Specifies tthe period for which you want to calculate the depreciation. Period must use the same units as life.","Specifies the total number of payment periods."],"Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If pv is omitted, it is assumed to be 0 (zero), and you must include the fv argument.","Parameter5":"fv","Description5":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter6":"type","Description6":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\n If payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*24","Definition":"Computes the internal rate of return for a series of cash flows.","Parameter1":"'irr'","Description1":"Use the 'irr' string-identifier to compute the internal rate of return for a series of cash flows.","Parameter2":"value-1, value-2, ..., value-n","Description2":"Specifies a list of numeric arguments that contain numbers for which you want to calculate the internal rate of return."},{"Name":"FINANCE*25","Definition":"Calculates the interest paid during a specific period of an investment.","Parameter1":"'ispmt'","Description1":"Use the 'ispmt' string-identifier to calculate the interest paid during a specific period of an investment.","Parameter2":"interest-rate","Description2":"Is the interest rate for the investment.","Parameter3":"period","Description3":"Is the period to calculate the interest rate. Period must be a value between 1 and number-payments.","Parameter4":"number-payments","Description4":"Is the number of payments for the annuity.","Parameter5":"pv","Description5":"Is the loan amount or present value of the payments."},{"Name":"FINANCE*26","Definition":"Computes the Macaulay modified duration for a security with an assumed face value of $100.","Parameter1":"'mduration'","Description1":"Use the 'mduration' string-identifier to compute the Macaulay modified duration for a security with an assumed face value of $100.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"coupon","Description4":"Specifies he annual coupon rate of the security.","Parameter5":"yield","Description5":"Specifies he annual yield of the security.","Parameter6":"frequency","Description6":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter7":"basis","Description7":"Specifies the optional day count value."},{"Name":"FINANCE*27","Definition":"Computes the internal rate of return where positive and negative cash flows are financed at different rates.","Parameter1":"'mirr'","Description1":"Use the 'mirr' string-identifier to compute the internal rate of return where positive and negative cash flows are financed at different rates.","Parameter2":"value","Description2":"Specifies a list of numeric arguments that contain numbers. These numbers represent a series of payments (negative values) and income (positive values) that occur at regular periods. Value must contain at least one positive value and one negative value to calculate the modified internal rate of return.","Parameter3":"finance-rate","Description3":"Specifies the interest rate that you pay on the money that is used in the cash flows.","Parameter4":"reinvest-rate","Description4":"Specifies the interest rate that you receive on the cash flows as you reinvest them."},{"Name":"FINANCE*28","Definition":"Computes the annual nominal interest rates.","Parameter1":"'nominal'","Description1":"Use the 'nominal' string-identifier to compute the annual nominal interest rates.","Parameter2":"effective-rate","Description2":"Specifies the effective interest rate.","Parameter3":"npery","Description3":"Specifies the number of compounding periods per year."},{"Name":"FINANCE*29","Definition":"Computes the number of periods for an investment.","Parameter1":"'nper'","Description1":"Use the 'nper' string-identifier to compute the number of periods for an investment.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"payment","Description3":"Specifies the payment that is made each period; the payment cannot change over the life of the annuity. Typically, payment contains principal and interest but no other fees or taxes. If payment is omitted, you must include the pv argument.","Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If pv is omitted, it is assumed to be 0 (zero), and you must include the payment argument.","Parameter5":"fv","Description5":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter6":"type","Description6":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*30","Definition":"Computes the net present value of an investment based on a series of periodic cash flows and a discount rate.","Parameter1":"'npv'","Description1":"Use the 'npv' string-identifier to ","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"value","Description3":"Represents the sequence of the cash flows."},{"Name":"FINANCE*31","Definition":"Computes the price of a security per $100 face value with an odd first period.","Parameter1":"'oddfprice'","Description1":"Use the 'oddfprice' string-identifier to compute the price of a security per $100 face value with an odd first period.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"issue","Description4":"Specifies the issue date of the security.","Parameter5":"first-coupon","Description5":"Specifies the first coupon date of the security.","Parameter6":"rate","Description6":"Specifies the interest rate.","Parameter7":"yield","Description7":"Specifies the annual yield of the security.","Parameter8":"redemption","Description8":"Specifies the amount to be received at maturity.","Parameter9":"frequency","Description9":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter10":"basis","Description10":"Specifies the optional day count value."},{"Name":"FINANCE*32","Definition":"Computes the yield of a security with an odd first period.","Parameter1":"'oddfyield'","Description1":"Use the 'oddfyield' string-identifier to compute the yield of a security with an odd first period.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"issue","Description4":"Specifies the issue date of the security.","Parameter5":"first-coupon","Description5":"Specifies the first coupon date of the security.","Parameter6":"rate","Description6":"Specifies the interest rate.","Parameter7":"price","Description7":"Specifies the price of the security per $100 face value.","Parameter8":"redemption","Description8":"Specifies the amount to be received at maturity.","Parameter9":"frequency","Description9":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter10":"basis","Description10":"Specifies the optional day count value."},{"Name":"FINANCE*33","Definition":"Computes the price of a security per $100 face value with an odd last period.","Parameter1":"'oddlprice'","Description1":"Use the 'oddlprice' string-identifier to compute the price of a security per $100 face value with an odd last period.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"last-interest","Description4":"Specifies the last coupon date of the security.","Parameter5":"rate","Description5":"Specifies the interest rate.","Parameter6":"yield","Description6":"Specifies the annual yield of the security.","Parameter7":"redemption","Description7":"Specifies the amount to be received at maturity.","Parameter8":"frequency","Description8":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter9":"basis","Description9":"Specifies the optional day count value."},{"Name":"FINANCE*34","Definition":"Computes the yield of a security with an odd last period.","Parameter1":"'oddlyield'","Description1":"Use the 'oddlyield' string-identifier to compute the yield of a security with an odd last period.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"last-interest","Description4":"Specifies the last coupon date of the security.","Parameter5":"rate","Description5":"Specifies the interest rate.","Parameter6":"price","Description6":"Specifies the price of the security per $100 face value.","Parameter7":"redemption","Description7":"Specifies the amount to be received at maturity.","Parameter8":"frequency","Description8":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter9":"basis","Description9":"Specifies the optional day count value."},{"Name":"FINANCE*35","Definition":"Computes the periodic payment of an annuity.","Parameter1":"'pmt'","Description1":"Use the 'pmt' string-identifier to compute the periodic payment of an annuity.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"nper","Description3":"Specifies the number of payment periods.","Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If pv is omitted, it is assumed to be 0 (zero), and you must include the fv argument.","Parameter5":"fv","Description5":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter6":"type","Description6":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*36","Definition":"Computes the payment on the principal for an investment for a specified period.","Parameter1":"'ppmt'","Description1":"Use the 'ppmt' string-identifier to compute the payment on the principal for an investment for a specified period.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"period","Description3":"Specifies the period.\n\nRange: 1\u2013nper","Parameter4":"nper","Description4":"Specifies the number of payment periods.","Parameter5":"pv","Description5":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If pv is omitted, it is assumed to be 0 (zero), and you must include the fv argument.","Parameter6":"fv","Description6":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter7":"type","Description7":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\n If payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1.\n "},{"Name":"FINANCE*37","Definition":"Computes the price of a security per $100 face value that pays periodic interest.","Parameter1":"'price'","Description1":"Use the 'price' string-identifier to compute the price of a security per $100 face value that pays periodic interest.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"rate","Description4":"Specifies the interest rate.","Parameter5":"yield","Description5":"Specifies the annual yield of the security.","Parameter6":"redemption","Description6":"Specifies the amount to be received at maturity.","Parameter7":"frequency","Description7":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter8":"basis","Description8":"Specifies the optional day count value."},{"Name":"FINANCE*38","Definition":"Computes the price of a discounted security per $100 face value.","Parameter1":"'pricedisc'","Description1":"Use the 'pricedisc' string-identifier to compute the price of a discounted security per $100 face value.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"discount","Description4":"Specifies the discount rate of the security.","Parameter5":"redemption","Description5":"Specifies the amount to be received at maturity.","Parameter6":"basis","Description6":"Specifies the optional day count value."},{"Name":"FINANCE*39","Definition":"Computes the price of a security per $100 face value that pays interest at maturity.","Parameter1":"'pricemat'","Description1":"Use the 'pricemat' string-identifier to compute the price of a security per $100 face value that pays interest at maturity.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"issue","Description4":"Specifies the issue date of the security.","Parameter5":"rate","Description5":"Specifies the interest rate.","Parameter6":"yield","Description6":"Specifies the annual yield of the security.","Parameter7":"basis","Description7":"Specifies the optional day count value."},{"Name":"FINANCE*40","Definition":"Computes the present value of an investment.","Parameter1":"'pv'","Description1":"Use the 'pv' string-identifier to compute the present value of an investment.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"nper","Description3":"Specifies the total number of payment periods.","Parameter4":"payment","Description4":"Specifies the payment that is made each period; the payment cannot change over the life of the annuity. Typically, payment contains principal and interest but no other fees or taxes.","Parameter5":"fv","Description5":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter6":"type","Description6":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0. \n \nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*41","Definition":"Computes the interest rate per period of an annuity.","Parameter1":"'rate'","Description1":"Use the 'rate' string-identifier to compute the interest rate per period of an annuity.","Parameter2":"nper","Description2":"Specifies the total number of payment periods.","Parameter3":"payment","Description3":"Specifies the payment that is made each period; the payment cannot change over the life of the annuity. Typically, payment contains principal and interest but no other fees or taxes. If payment is omitted, you must include the pv argument.","Parameter4":"pv","Description4":"Specifies the present value or the lump-sum amount that a series of future payments is worth currently. If pv is omitted, it is assumed to be 0 (zero), and you must include the fv argument.","Parameter5":"fv","Description5":"Specifies the future value or a cash balance that you want to attain after the last payment is made. If fv is omitted, it is assumed to be 0 (for example, the future value of a loan is 0).","Parameter6":"type","Description6":"Specifies the number 0 or 1 and indicates when payments are due. If type is omitted, it is assumed to be 0.\n\nIf payments are due at the end of the period, then either omit the type argument or set it to 0. If payments are due at the beginning of the period, then set type to 1."},{"Name":"FINANCE*42","Definition":"Computes the amount that is received at maturity for a fully invested security.","Parameter1":"'received'","Description1":"Use the 'received' string-identifier to compute the amount that is received at maturity for a fully invested security.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"investment","Description4":"Specifies the amount that is invested in the security.","Parameter5":"discount","Description5":"Specifies the discount rate of the security.","Parameter6":"basis","Description6":"Specifies the optional day count value."},{"Name":"FINANCE*43","Definition":"Computes the straight-line depreciation of an asset for one period.","Parameter1":"'sln'","Description1":"Use the 'sln' string-identifier to compute the straight-line depreciation of an asset for one period.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"salvage","Description3":"Specifies the value at the end of the depreciation (also called the salvage value of an asset).","Parameter4":"life","Description4":"Specifies the number of periods over which the asset is depreciated (also called the useful life of the asset)."},{"Name":"FINANCE*44","Definition":"Computes the sum-of-years digits depreciation of an asset for a specified period.","Parameter1":"'syd'","Description1":"Use the 'syd' string-identifier to compute the sum-of-years digits depreciation of an asset for a specified period.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"salvage","Description3":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter4":"life","Description4":"Specifies the number of periods over which the asset is depreciated (also called the useful life of the asset).","Parameter5":"period","Description5":"Specifies a period in the same time units that are used for the argument life."},{"Name":"FINANCE*45","Definition":"Computes the bond-equivalent yield for a treasury bill.","Parameter1":"'tbilleq'","Description1":"Use the 'tbilleq' string-identifier to compute the bond-equivalent yield for a treasury bill.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"discount","Description4":"Specifies the discount rate of the security."},{"Name":"FINANCE*46","Definition":"Computes the price of a treasury bill per $100 face value.","Parameter1":"'tbillprice'","Description1":"Use the 'tbillprice' string-identifier to compute the price of a treasury bill per $100 face value.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"discount","Description4":"Specifies the discount rate of the security."},{"Name":"FINANCE*47","Definition":"Computes the yield for a treasury bill.","Parameter1":"'tbillyield'","Description1":"Use the 'tbillyield' string-identifier to compute the yield for a treasury bill.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"price","Description4":"Specifies the price of the security per $100 face value."},{"Name":"FINANCE*48","Definition":"Computes the depreciation of an asset for a specified or partial period by using a declining balance method.","Parameter1":"'vdb'","Description1":"Use the 'vdb' string-identifier to compute the depreciation of an asset for a specified or partial period by using a declining balance method.","Parameter2":"cost","Description2":"Specifies the initial cost of the asset.","Parameter3":"salvage","Description3":"Specifies the value at the end of the depreciation (also called the salvage value of the asset).","Parameter4":"life","Description4":"Specifies the number of periods over which the asset is depreciated (also called the useful life of the asset).","Parameter5":"start-period","Description5":"Specifies the first period in the calculation. Payment periods are numbered beginning with 1.","Parameter6":"end-period","Description6":"Specifies the last period in the calculation.","Parameter7":"factor","Description7":"Specifies the rate at which the balance declines. If factor is omitted, it is assumed to be 2 (the double-declining balance method).","Parameter8":"noswitch","Description8":"Specifies a logical value that determines whether to switch to straight-line depreciation when the depreciation is greater than the declining balance calculation. If noswitch is omitted, it is assumed to be 1"},{"Name":"FINANCE*49","Definition":"Computes the internal rate of return for a schedule of cash flows that is not necessarily periodic.","Parameter1":"'xirr'","Description1":"Use the 'xirr' string-identifier to compute the internal rate of return for a schedule of cash flows that is not necessarily periodic.","Parameter2":"values","Description2":"Specifies a series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.","Parameter3":"dates","Description3":"Specifies a schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they can occur in any order.","Parameter4":"guess","Description4":"Specifies an optional number that you guess is close to the result of XIRR."},{"Name":"FINANCE*50","Definition":"Computes the net present value for a schedule of cash flows that is not necessarily periodic.","Parameter1":"'xnpv'","Description1":"Use the 'xnpv' string-identifier to compute the net present value for a schedule of cash flows that is not necessarily periodic.","Parameter2":"rate","Description2":"Specifies the interest rate.","Parameter3":"values","Description3":"Specifies a series of cash flows that corresponds to a schedule of payments in dates. The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. The series of values must contain at least one positive value and one negative value.","Parameter4":"dates","Description4":"Specifies a schedule of payment dates that corresponds to the cash flow payments. The first payment date indicates the beginning of the schedule of payments. All other dates must be later than this date, but they can occur in any order."},{"Name":"FINANCE*51","Definition":"Computes the yield on a security that pays periodic interest.","Parameter1":"'yield'","Description1":"Use the 'yield' string-identifier to compute the yield on a security that pays periodic interest.","Parameter2":"settlement","Description2":"specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"rate","Description4":"Specifies the interest rate.","Parameter5":"price","Description5":"Specifies the price of the security per $100 face value.","Parameter6":"redemption","Description6":"Specifies the amount to be received at maturity.","Parameter7":"frequency","Description7":"Specifies the number of coupon payments per year. For annual payments, frequency=1; for semiannual payments, frequency=2; for quarterly payments, frequency=4.","Parameter8":"basis","Description8":"Specifies the optional day count value."},{"Name":"FINANCE*52","Definition":"Computes the annual yield for a discounted security (for example, a treasury bill).","Parameter1":"'yielddisc'","Description1":"Use the 'yielddisc' string-identifier to compute the annual yield for a discounted security (for example, a treasury bill).","Parameter2":"settlement","Description2":"specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"rate","Description4":"Specifies the interest rate.","Parameter5":"price","Description5":"Specifies the price of the security per $100 face value.","Parameter6":"redemption","Description6":"Specifies the amount to be received at maturity.","Parameter7":"basis","Description7":"Specifies the optional day count value."},{"Name":"FINANCE*53","Definition":"Computes the annual yield of a security that pays interest at maturity.","Parameter1":"'yieldmat'","Description1":"Use the 'yieldmat' string-identifier to compute the annual yield of a security that pays interest at maturity.","Parameter2":"settlement","Description2":"Specifies the settlement date.","Parameter3":"maturity","Description3":"Specifies the maturity date.","Parameter4":"issue","Description4":"Specifies the issue date of the security.","Parameter5":"rate","Description5":"Specifies the interest rate.","Parameter6":"price","Description6":"Specifies the price of the security per $100 face value.","Parameter7":"basis","Description7":"Specifies the optional day count value."},{"Name":"FIND*1","Definition":"Searches for a specific substring of characters within a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression that will be searched for substrings. Enclose a literal string of characters in quotation marks.","Parameter2":"substring<","Description2":"Is a character constant, variable, or expression that specifies the substring of characters to search for in string. Enclose a literal string of characters in quotation marks.","Parameter3":"modifiers><","Description3":"Is a character constant, variable, or expression that specifies one or more modifiers. The following modifiers can be in uppercase or lowercase: i (ignore character case), t (trim trailing blanks from string and substring).","Parameter4":"startpos>","Description4":"Is a numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction of the search."},{"Name":"FIND*2","Definition":"Searches for a specific substring of characters within a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression that will be searched for substrings. Enclose a literal string of characters in quotation marks.","Parameter2":"substring<","Description2":"Is a character constant, variable, or expression that specifies the substring of characters to search for in string. Enclose a literal string of characters in quotation marks.","Parameter3":"startpos><","Description3":"Is a numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction of the search.","Parameter4":"modifiers>","Description4":"Is a character constant, variable, or expression that specifies one or more modifiers. The following modifiers can be in uppercase or lowercase: i (ignore character case), t (trim trailing blanks from string and substring)."},{"Name":"FINDC*1","Definition":"Searches a string for any character in a list of characters.","Parameter1":"string<","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched. Enclose a literal string of characters in quotation marks.","Parameter2":"charlist>","Description2":"Is an optional constant, variable, or character expression that initializes a list of characters. FINDC searches for the characters in this list provided that you do not specify the K modifier in the modifier argument."},{"Name":"FINDC*2","Definition":"Searches a string for any character in a list of characters.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched. Enclose a literal string of characters in quotation marks.","Parameter2":"charlist<","Description2":"Is an optional constant, variable, or character expression that initializes a list of characters. FINDC searches for the characters in this list provided that you do not specify the K modifier in the modifier argument.","Parameter3":"modifier(s)>","Description3":"Is an optional character constant, variable, or expression in which each character modifies the action of the FINDC function. Refer to SAS documentation for list of valid modifiers."},{"Name":"FINDC*3","Definition":"Searches a string for any character in a list of characters.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched. Enclose a literal string of characters in quotation marks.","Parameter2":"charlist","Description2":"Is an optional constant, variable, or character expression that initializes a list of characters. FINDC searches for the characters in this list provided that you do not specify the K modifier in the modifier argument.","Parameter3":"modifier(s)<","Description3":"Is an optional character constant, variable, or expression in which each character modifies the action of the FINDC function. Refer to SAS documentation for list of valid modifiers.","Parameter4":"startpos>","Description4":"Is an optional numeric constant, variable, or expression having an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"FINDC*4","Definition":"Searches a string for any character in a list of characters.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched. Enclose a literal string of characters in quotation marks.","Parameter2":"charlist","Description2":"Is an optional constant, variable, or character expression that initializes a list of characters. FINDC searches for the characters in this list provided that you do not specify the K modifier in the modifier argument.","Parameter3":"<startpos>","Description3":"Is an optional numeric constant, variable, or expression having an integer value that specifies the position at which the search should start and the direction in which to search.","Parameter4":"modifier(s)>","Description4":"Is an optional character constant, variable, or expression in which each character modifies the action of the FINDC function. Refer to SAS documentation for list of valid modifiers."},{"Name":"FINDW*1","Definition":"Returns the character position of a word in a string, or returns the number of the word in a string.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched.","Parameter2":"word<","Description2":"Is a character constant, variable, or expression that specifies the word to be searched.","Parameter3":"chars>","Description3":"Is an optional character constant, variable, or expression that initializes a list of characters. The characters in this list are the delimiters that separate words, provided that you do not specify the K modifier in the modifier argument."},{"Name":"FINDW*2","Definition":"Returns the character position of a word in a string, or returns the number of the word in a string.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched.","Parameter2":"word","Description2":"Is a character constant, variable, or expression that specifies the word to be searched.","Parameter3":"chars","Description3":"Is an optional character constant, variable, or expression that initializes a list of characters. The characters in this list are the delimiters that separate words, provided that you do not specify the K modifier in the modifier argument.","Parameter4":"modifier(s)<","Description4":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the FINDW function. Refer to SAS documentation for list of valid modifiers.","Parameter5":"startpos>","Description5":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should begin and the direction in which to search."},{"Name":"FINDW*3","Definition":"Returns the character position of a word in a string, or returns the number of the word in a string.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched.","Parameter2":"word","Description2":"Is a character constant, variable, or expression that specifies the word to be searched.","Parameter3":"chars","Description3":"Is an optional character constant, variable, or expression that initializes a list of characters. The characters in this list are the delimiters that separate words, provided that you do not specify the K modifier in the modifier argument.","Parameter4":"startpos<","Description4":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should begin and the direction in which to search.","Parameter5":"modifier(s)>","Description5":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the FINDW function. Refer to SAS documentation for list of valid modifiers."},{"Name":"FINDW*4","Definition":"Returns the character position of a word in a string, or returns the number of the word in a string.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the character string to be searched.","Parameter2":"word","Description2":"Is a character constant, variable, or expression that specifies the word to be searched.","Parameter3":"startpos<","Description3":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should begin and the direction in which to search.","Parameter4":"chars<","Description4":"Is an optional character constant, variable, or expression that initializes a list of characters. The characters in this list are the delimiters that separate words, provided that you do not specify the K modifier in the modifier argument.","Parameter5":"modifier(s)>>","Description5":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the FINDW function. Refer to SAS documentation for list of valid modifiers."},{"Name":"FINFO","Definition":"Returns the value of a file information item.","Parameter1":"file-id","Description1":"Is a numeric constant, variable, or expression that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"info-item","Description2":"Is a character constant, variable, or expression that specifies the name of the file information item to be retrieved."},{"Name":"FINV","Definition":"Returns a quantile from the F distribution.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 \u2264 p < 1.","Parameter2":"ndf","Description2":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter3":"ddf<","Description3":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter4":"nc>","Description4":"Is an optional numeric noncentrality parameter. Range: nc \u2265 0."},{"Name":"FIPNAME","Definition":"Converts two-digit FIPS codes to uppercase state names.","Parameter1":"expression","Description1":"Specifies a numeric constant, variable, or expression that represents a U.S. FIPS code."},{"Name":"FIPNAMEL","Definition":"Converts two-digit FIPS codes to mixed case state names.","Parameter1":"expression","Description1":"Specifies a numeric constant, variable, or expression that represents a U.S. FIPS code."},{"Name":"FIPSTATE","Definition":"Converts two-digit FIPS codes to two-character state postal codes.","Parameter1":"expression","Description1":"Specifies a numeric constant, variable, or expression that represents a U.S. FIPS code."},{"Name":"FIRST","Definition":"Returns the first character in a character string.","Parameter1":"string","Description1":"Specifies a character string."},{"Name":"FLOOR","Definition":"Returns the largest integer that is less than or equal to the argument, fuzzed to avoid unexpected floating-point results.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"FLOORZ","Definition":"Returns the largest integer that is less than or equal to the argument, using zero fuzzing.","Parameter1":"argument","Description1":"Is a numeric constant, variable, or expression."},{"Name":"FNONCT","Definition":"Returns the value of the noncentrality parameter of an F distribution.","Parameter1":"x","Description1":"Is a numeric random variable. Range: x \u2265 0.","Parameter2":"ndf","Description2":"Is a numeric numerator degree of freedom parameter. Range: ndf > 0.","Parameter3":"ddf","Description3":"Is a numeric denominator degree of freedom parameter. Range: ddf > 0.","Parameter4":"prob","Description4":"Is a probability. Range: 0 < prob < 1."},{"Name":"FNOTE","Definition":"Identifies the last record that was read, and returns a value that the FPOINT function can use.","Parameter1":"file-id","Description1":"Is a numeric constant, variable, or expression that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FOPEN","Definition":"Opens an external file and returns a file identifier value.","Parameter1":"fileref<","Description1":"Is a character constant, variable, or expression that specifies the fileref assigned to the external file.","Parameter2":"open-mode","Description2":"Is a character constant, variable, or expression that specifies the type of access to the file: A (APPEND mode writes new records at end of file), I (INPUT mode allows reading only), O (OUTPUT mode allows writing new records at beginning of file), S (SEQUENTIAL input mode for pipes or ports), U (UPDATE mode allows both reading and writing).","Parameter3":"record-length","Description3":"Is a numeric constant, variable, or expression that specifies the logical record length of the file.","Parameter4":"record-format","Description4":"Is a character constant, variable, or expression that specifies the record format of the file. Valid values: B (binary), D (default format), E (editable), F(fixed-length records), P (contains printer carriage control), V (variable-length records)."},{"Name":"FOPTNAME","Definition":"Returns the name of an item of information about a file.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"nval","Description2":"Is a numeric constant, variable, or expression that specifies the number of the information item."},{"Name":"FOPTNUM","Definition":"Returns the number of information items that are available for an external file.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FPOINT","Definition":"Positions the read pointer on the next record to be read.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"note-id","Description2":"Specifies the identifier that was assigned by the FNOTE function."},{"Name":"FPOS","Definition":"Sets the position of the column pointer in the File Data Buffer (FDB).","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"nval","Description2":"Is a numeric constant, variable, or expression that specifies the column at which to set the pointer."},{"Name":"FPUT","Definition":"Moves data to the File Data Buffer (FDB) of an external file, starting at the FDB's current column position.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"cval","Description2":"Is a character constant, variable, or expression that specifies the file data."},{"Name":"FREAD","Definition":"Reads a record from an external file into the File Data Buffer (FDB).","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FREWIND","Definition":"Positions the file pointer to the start of the file.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FRLEN","Definition":"Returns the size of the last record that was read, or, if the file is opened for output, returns the current record size.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function."},{"Name":"FSEP","Definition":"Sets the token delimiters for the FGET function.","Parameter1":"file-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"character(s)<","Description2":"Is a character constant, variable, or expression that specifies one or more delimiters that separate items in the File Data Buffer (FDB).","Parameter3":"'x' | 'X'>","Description3":"Specifies that the character delimiter is a hexadecimal value."},{"Name":"FUZZ","Definition":"Returns the nearest integer if the argument is within 1E-12 of that integer.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"FWRITE","Definition":"Writes a record to an external file.","Parameter1":"file-id<","Description1":"Is a numeric variable that specifies the identifier that was assigned when the file was opened, generally by the FOPEN function.","Parameter2":"cc>","Description2":"Is a character constant, variable, or expression that specifies a carriage-control character: blank (start record on a new line), 0 (skip one blank line), - (skip two blanks), 1 (start a new page), + (overstrike a previous line), P (computer prompt), = (contains carriage control info), all else (start a new line)."},{"Name":"GAMINV","Definition":"Returns a quantile from the gamma distribution.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 \u2264 p < 1.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a > 0."},{"Name":"GAMMA","Definition":"Returns the value of the gamma function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"GARKHCLPRC","Definition":"Calculates call prices for European options on stocks, based on the Garman-Kohlhagen model.","Parameter1":"E","Description1":"Is a non-missing, positive value that specifies the exercise price. Specify E and S in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies the time to maturity.","Parameter3":"S","Description3":"Is a non-missing, positive value that specifies the spot currency price. Specify S and E in the same units.","Parameter4":"Rd","Description4":"Is a non-missing, positive fraction that specifies the risk-free domestic interest rate for period t. Specify a value for Rd for the same time period as the unit of t.","Parameter5":"Rf","Description5":"Is a non-missing, positive fraction that specifies the risk-free foreign interest rate for period t. Specify a value for Rf for the same time period as the unit of t.","Parameter6":"sigma","Description6":"Is a non-missing, positive fraction that specifies the volatility of the currency rate. Specify a value for sigma for the same time period as the unit of t."},{"Name":"GARKHPTPRC","Definition":"Calculates put prices for European options on stocks, based on the Garman-Kohlhagen model.","Parameter1":"E","Description1":"Is a non-missing, positive value that specifies the exercise price. Specify E and S in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies the time to maturity.","Parameter3":"S","Description3":"Is a non-missing, positive value that specifies the spot currency price. Specify S and E in the same units.","Parameter4":"Rd","Description4":"Is a non-missing, positive fraction that specifies the risk-free domestic interest rate for period t. Specify a value for Rd for the same time period as the unit of t.","Parameter5":"Rf","Description5":"Is a non-missing, positive fraction that specifies the risk-free foreign interest rate for period t. Specify a value for Rf for the same time period as the unit of t.","Parameter6":"sigma","Description6":"Is a non-missing, positive fraction that specifies the volatility of the currency rate. Specify a value for sigma for the same time period as the unit of t."},{"Name":"GCD","Definition":"Returns the greatest common divisor for one or more integers.","Parameter1":"x1, x2, x3, ..., xn","Description1":"Specifies a numeric constant, variable, or expression that has an integer value."},{"Name":"GEODIST","Definition":"Returns the geodetic distance between two latitude and longitude coordinates.","Parameter1":"latitude-1","Description1":"Is a numeric constant, variable, or expression that specifies the coordinate of a given position north or south of the equator.","Parameter2":"longitude-1","Description2":"Is a numeric constant, variable, or expression that specifies the coordinate of a given position east or west of the prime meridian, which runs through Greenwich, England.","Parameter3":"latitude-2","Description3":"Is a numeric constant, variable, or expression that specifies the coordinate of a given position north or south of the equator.","Parameter4":"longitude-2<","Description4":"Is a numeric constant, variable, or expression that specifies the coordinate of a given position east or west of the prime meridian, which runs through Greenwich, England.","Parameter5":"option(s)>","Description5":"Specifies a character constant, variable, or expression that contains any of the following characters: M (distance in miles), K (distance in kilometers), D (input values in degrees), R (input values in radians)."},{"Name":"GEOMEAN","Definition":"Returns the geometric mean.","Parameter1":"argument<, argument, ...>","Description1":"Is a non-negative numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF"},{"Name":"GEOMEANZ","Definition":"Returns the geometric mean, using zero fuzzing.","Parameter1":"argument<, argument, ...>","Description1":"Is a non-negative numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF"},{"Name":"GETOPTION","Definition":"Returns the value of a SAS system or graphics option.","Parameter1":"option-name<","Description1":"Is a character constant, variable, or expression that specifies the name of the system option (without the equal sign).\n \nTips: Do not put an equal sign after the name. For example, write PAGESIZE= as PAGESIZE. \n\nSAS options that are passwords, such as EMAILPW and METAPASS, return the value xxxxxxxx, \nand not the actual password.","Parameter2":"return-value-option><return-value-formatting-options>","Description2":"Return Value Options:\nDEFAULTVALUE\n returns the default option value.\nHOWSCOPE\n returns a character string that specifies the scope of an option.\nHOWSET\n returns a character string that specifies how an option value was set.\nSTARTUPVALUE\n returns the system option value that was used to start SAS either on the command line or in a configuration file.\n\nReturn Value Formatting Options:\nCM\n reports graphic units of measure in centimeters.\nEXPAND\n for options that contain environment variables, returns the option value with the value of the environment variable.\nKEYEXPAND\n for options that contain environment variables, returns the value in the format option-name=value.\nKEYWORD\n returns option values in a option-name=value format that would be suitable for direct use in the SAS OPTIONS or GOPTIONS global statements.\nHEXVALUE\n returns the option value as a hexadecimal value.\nIN\n reports graphic units of measure in inches.\nLOGNUMBERFORMAT\n formats SAS system option values using locale-specific punctuation.\n "},{"Name":"GETVARC","Definition":"Returns the value of a SAS data set character variable.","Parameter1":"data-set-id","Description1":"Is a numeric constant, variable, or expression that specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Is a numeric constant, variable, or expression that specifies the number of the variable in the Data Set Data Vector (DDV). You can obtain this value by using the VARNUM function."},{"Name":"GETVARN","Definition":"Returns the value of a SAS data set numeric variable.","Parameter1":"data-set-id","Description1":"Is a numeric constant, variable, or expression that specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Is a numeric constant, variable, or expression that specifies the number of the variable in the Data Set Data Vector (DDV). You can obtain this value by using the VARNUM function."},{"Name":"HARMEAN","Definition":"Returns the harmonic mean.","Parameter1":"argument<, argument, ...>","Description1":"Is a non-negative numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF"},{"Name":"HARMEANZ","Definition":"Returns the harmonic mean, using zero fuzzing.","Parameter1":"argument<, argument, ...>","Description1":"Is a non-negative numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF"},{"Name":"HBOUND*1","Definition":"Returns the upper bound of an array. n is an optional integer constant that specifies the dimension for which you want to know the upper bound. If no n value is specified, the HBOUND function returns the upper bound of the first dimension of the array.","Parameter1":"array-name","Description1":"Is the name of an array that was defined previously in the same DATA step."},{"Name":"HBOUND*2","Definition":"Returns the upper bound of an array. n is an optional integer constant that specifies the dimension for which you want to know the upper bound. If no n value is specified, the HBOUND function returns the upper bound of the first dimension of the array.","Parameter1":"array-name","Description1":"Is the name of an array that was defined previously in the same DATA step.","Parameter2":"bound-n","Description2":"Is a numeric constant, variable, or expression that specifies the dimension for which you want to know the upper bound. Use bound-n only if n is not specified."},{"Name":"HMS","Definition":"Returns a SAS time value from hour, minute, and second values.","Parameter1":"hour","Description1":"Is numeric.","Parameter2":"minute","Description2":"Is numeric.","Parameter3":"second","Description3":"Is numeric."},{"Name":"HOLIDAY","Definition":"Returns a SAS date value of a specified holiday for a specified year.","Parameter1":"'holiday'","Description1":"Is a character constant, variable, or expression that specifies one of the holiday values recognized by SAS (refer to SAS documentation for the list).","Parameter2":"year","Description2":"Is a numeric constant, variable, or expression that specifies a four-digit year. If you use a two-digit year, then you must specify the YEARCUTOFF= system option."},{"Name":"HOUR","Definition":"Returns the hour from a SAS time or datetime value.","Parameter1":"<time | datetime>","Description1":"Is a numeric constant, variable, or expression that specifies a SAS time or datetime value."},{"Name":"HTMLDECODE","Definition":"Decodes a string that contains HTML numeric character references or HTML character entity references, and returns the decoded string.","Parameter1":"expression","Description1":"Specifies a character constant, variable, or expression."},{"Name":"HTMLENCODE","Definition":"Encodes characters using HTML character entity references, and returns the encoded string.","Parameter1":"expression<","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"options>","Description2":"Is a character constant, variable, or expression that specifies the type of characters to encode. If you use more than one option, separate the options by spaces (eg. 'amp gt lt apos quot')."},{"Name":"IBESSEL","Definition":"Returns the value of the modified Bessel function.","Parameter1":"nu","Description1":"Specifies a numeric constant, variable, or expression. Range: V \u2265 0.","Parameter2":"x","Description2":"Specifies a numeric constant, variable, or expression. Range: x \u2265 0.","Parameter3":"kode","Description3":"Is a numeric constant, variable, or expression that specifies a nonnegative integer."},{"Name":"IFC","Definition":"Returns a character value based on whether an expression is true, false, or missing.","Parameter1":"logical-expression","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"value-returned-when-true","Description2":"Specifies a character constant, variable, or expression that is returned when the value of logical-expression is true.","Parameter3":"value-returned-when-false<","Description3":"Specifies a character constant, variable, or expression that is returned when the value of logical-expression is false.","Parameter4":"value-returned-when-missing>","Description4":"Specifies a character constant, variable, or expression that is returned when the value of logical-expression is missing."},{"Name":"IFN","Definition":"Returns a numeric value based on whether an expression is true, false, or missing.","Parameter1":"logical-expression","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"value-returned-when-true","Description2":"Specifies a numeric constant, variable, or expression that is returned when the value of logical-expression is true.","Parameter3":"value-returned-when-false<","Description3":"Specifies a numeric constant, variable, or expression that is returned when the value of logical-expression is false.","Parameter4":"value-returned-when-missing>","Description4":"Specifies a numeric constant, variable or expression that is returned when the value of logical-expression is missing."},{"Name":"INDEX","Definition":"Searches a character expression for a string of characters, and returns the position of the string's first character for the first occurrence of the string.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"excerpt","Description2":"Is a character constant, variable, or expression that specifies the string of characters to search for in source. Enclose a literal string of characters in quotation marks."},{"Name":"INDEXC","Definition":"Searches a character expression for any of the specified characters, and returns the position of that character.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"excerpt-1<, ... excerpt-n>","Description2":"Specifies the character constant, variable, or expression to search for in source. If you specify more than one excerpt, separate them with a comma."},{"Name":"INDEXW","Definition":"Searches a character expression for a string that is specified as a word, and returns the position of the first character in the word.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"excerpt<","Description2":"Specifies a character constant, variable, or expression to search for in source. SAS removes leading and trailing delimiters from excerpt.","Parameter3":"delimiter(s)>","Description3":"Specifies a character constant, variable, or expression containing the characters that you want INDEXW to use as delimiters in the character string. The default delimiter is the blank character."},{"Name":"INPUT","Definition":"Returns the value that is produced when SAS converts an expression using the specified informat.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to which you want to apply a specific informat.","Parameter2":"<? | ??>informat.","Description2":"The SAS informat you want to apply to the source. The optional ? and ?? modifiers suppress error messages and input lines when invalid data are read."},{"Name":"INPUTC","Definition":"Enables you to specify a character informat at run time.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to which you want to apply the informat.","Parameter2":"informat<","Description2":"Is a character constant, variable, or expression that contains the character informat you want to apply to source.","Parameter3":"w>","Description3":"Is a numeric constant, variable, or expression that specifies a width to apply to the informat."},{"Name":"INPUTN","Definition":"Enables you to specify a numeric informat at run time.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to which you want to apply the informat.","Parameter2":"informat<","Description2":"Is a character constant, variable or expression that contains the numeric informat you want to apply to source.","Parameter3":"w<","Description3":"Is a numeric constant, variable, or expression that specifies a width to apply to the informat.","Parameter4":"d>>","Description4":"Is a numeric constant, variable, or expression that specifies the number of decimal places to use."},{"Name":"INT","Definition":"Returns the integer value, fuzzed to avoid unexpected floating-point results.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"INTCINDEX","Definition":"Returns the cycle index when a date, time, or datetime interval and value are specified.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months.","Parameter2":"date-time-value","Description2":"Specifies a date, time, or datetime value that represents a time period of a specified interval."},{"Name":"INTCK","Definition":"Returns the count of the number of interval boundaries between two dates, two times, or two datetime values.","Parameter1":"interval<multiple><.shift-index>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months.","Parameter2":"from","Description2":"Specifies a SAS expression that represents the starting SAS date, time, or datetime value.","Parameter3":"to","Description3":"Specifies a SAS expression that represents the ending SAS date, time, or datetime value."},{"Name":"INTCYCLE","Definition":"Returns the date, time, or datetime interval at the next higher seasonal cycle when a date, time, or datetime interval is specified.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months."},{"Name":"INTFIT","Definition":"Returns a time interval that is aligned between two dates.","Parameter1":"argument-1","Description1":"Specifies a SAS expression that represents a SAS date or datetime value, or an observation.","Parameter2":"argument-2","Description2":"Specifies a SAS expression that represents a SAS date or datetime value, or an observation.","Parameter3":"'type'","Description3":"Specifies whether the arguments are SAS date values, datetime values, or observations. Valid values: d (date), dt (datetime), obs (observations)."},{"Name":"INTFMT","Definition":"Returns a recommended SAS format when a date, time, or datetime interval is specified.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months.","Parameter2":"'size'","Description2":"Specifies either LONG or SHORT. When a format includes a year value, LONG or L specifies a format that uses a four-digit year. SHORT or S specifies a format that uses a two-digit year."},{"Name":"INTGET","Definition":"Returns a time interval based on three date or datetime values.","Parameter1":"date-1","Description1":"Specifies a SAS date or datetime value.","Parameter2":"date-2","Description2":"Specifies a SAS date or datetime value.","Parameter3":"date-3","Description3":"Specifies a SAS date or datetime value."},{"Name":"INTINDEX","Definition":"Returns the seasonal index when a date, time, or datetime interval and value are specified.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months.","Parameter2":"date-value","Description2":"Specifies a date, time, or datetime value that represents a time period of the given interval."},{"Name":"INTNX","Definition":"Increments a date, time, or datetime value by a given time interval, and returns a date, time, or datetime value.","Parameter1":"interval<multiple><.shift-index>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months.","Parameter2":"start-from","Description2":"Specifies a SAS expression that represents a SAS date, time, or datetime value that identifies a starting point.","Parameter3":"increment<","Description3":"Specifies a negative, positive, or zero integer that represents the number of date, time, or datetime intervals. Increment is the number of intervals to shift the value of start-from.","Parameter4":"alignment>","Description4":"Controls the position of SAS dates within the interval. Alignment can be one of these values: BEGINNING|B, MIDDLE|M, END|E, SAME (as the input date)."},{"Name":"INTRR","Definition":"Returns the internal rate of return as a fraction.","Parameter1":"freq","Description1":"Is numeric, the number of payments over a specified base period of time that is associated with the desired internal rate of return. Range: freq > 0.","Parameter2":"c0, c1, ..., cn","Description2":"Are numeric, the optional cash payments."},{"Name":"INTSEAS","Definition":"Returns the length of the seasonal cycle when a date, time, or datetime interval is specified.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months."},{"Name":"INTSHIFT","Definition":"Returns the shift interval that corresponds to the base interval.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months."},{"Name":"INTTEST","Definition":"Returns 1 if a time interval is valid, and returns 0 if a time interval is invalid.","Parameter1":"interval<<multiple.<shift-index>>>","Description1":"A three-part interval name (WEEK3.2, MONTH2.2, YEAR2.4, or QTR.3). For example, the interval name MONTH2.2 specifies bimonthly periods starting on the first day of even-numbered months."},{"Name":"INTZ","Definition":"Returns the integer portion of the argument, using zero fuzzing.","Parameter1":"argument","Description1":"Is a numeric constant, variable, or expression."},{"Name":"IQR","Definition":"Returns the interquartile range.","Parameter1":"value-1<, value-2...>","Description1":"Specifies a numeric constant, variable, or expression for which the interquartile range is to be computed."},{"Name":"IORCMSG","Definition":"Returns a formatted error message for _IORC_."},{"Name":"IRR","Definition":"Returns the internal rate of return as a percentage.","Parameter1":"freq","Description1":"Is numeric, the number of payments over a specified base period of time that is associated with the desired internal rate of return.","Parameter2":"c0,c1, ...,cn","Description2":"Are numeric, the optional cash payments."},{"Name":"JBESSEL","Definition":"Returns the value of the Bessel function.","Parameter1":"nu","Description1":"Specifies a numeric constant, variable, or expression. Range: V > 0.","Parameter2":"x","Description2":"Specifies a numeric constant, variable, or expression. Range: x > 0."},{"Name":"JULDATE","Definition":"Returns the Julian date from a SAS date value.","Parameter1":"date","Description1":"Specifies a SAS date value."},{"Name":"JULDATE7","Definition":"Returns a seven-digit Julian date from a SAS date value.","Parameter1":"date","Description1":"Specifies a SAS date value."},{"Name":"KURTOSIS","Definition":"Returns the kurtosis.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. At least four non-missing arguments are required.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression. At least four non-missing arguments are required.","Parameter3":"argument-3","Description3":"Specifies a numeric constant, variable, or expression. At least four non-missing arguments are required.","Parameter4":"argument-4<","Description4":"Specifies a numeric constant, variable, or expression. At least four non-missing arguments are required.","Parameter5":"argument-n>","Description5":"Specifies a numeric constant, variable, or expression. At least four non-missing arguments are required."},{"Name":"LAG","Definition":"Returns values from a queue. n specifies the number of lagged values.","Parameter1":"argument","Description1":"Specifies a numeric or character constant, variable, or expression."},{"Name":"LARGEST","Definition":"Returns the kth largest non-missing value.","Parameter1":"k","Description1":"Is a numeric constant, variable, or expression that specifies which value to return.","Parameter2":"value-1<, value-2 ...>","Description2":"Specifies the value of a numeric constant, variable, or expression to be processed."},{"Name":"LBOUND*1","Definition":"Returns the lower bound of an array. n is an optional integer constant that specifies the dimension for which you want to know the lower bound. If no n value is specified, the LBOUND function returns the lower bound of the first dimension of the array.","Parameter1":"array-name","Description1":"Is the name of an array that was defined previously in the same DATA step."},{"Name":"LBOUND*2","Definition":"Returns the lower bound of an array. n is an optional integer constant that specifies the dimension for which you want to know the lower bound. If no n value is specified, the LBOUND function returns the lower bound of the first dimension of the array.","Parameter1":"array-name","Description1":"Is the name of an array that was defined previously in the same DATA step.","Parameter2":"bound-n","Description2":"Is a numeric constant, variable, or expression that specifies the dimension for which you want to know the upper bound. Use bound-n only if n is not specified."},{"Name":"LCM","Definition":"Returns the least common multiple.","Parameter1":"x1, x2, x3, ..., xn","Description1":"Specifies a numeric constant, variable, or expression that has an integer value."},{"Name":"LCOMB","Definition":"Computes the logarithm of the COMB function; that is, the logarithm of the number of combinations of n objects taken r at a time.","Parameter1":"n","Description1":"Is a non-negative integer that represents the total number of elements from which the sample is chosen.","Parameter2":"r","Description2":"Is a non-negative integer that represents the number of chosen elements. Restriction: r \u2264 n."},{"Name":"LEFT","Definition":"Left-aligns a character string by removing leading blanks.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"QLEFT","Definition":"Left-aligns a character string by removing leading blanks.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression that might contain the following special characters and mnemonic operators: ."},{"Name":"LENGTH","Definition":"Returns the length of a non-blank character string, excluding trailing blanks, and returns 1 for a blank character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression."},{"Name":"LENGTHC","Definition":"Returns the length of a character string, including trailing blanks.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression."},{"Name":"LENGTHM","Definition":"Returns the amount of memory (in bytes) that is allocated for a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression."},{"Name":"LENGTHN","Definition":"Returns the length of a character string, excluding trailing blanks.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression."},{"Name":"LFACT","Definition":"Computes the logarithm of the FACT (factorial) function.","Parameter1":"n","Description1":"Is an integer that represents the total number of elements from which the sample is chosen."},{"Name":"LGAMMA","Definition":"Returns the natural logarithm of the Gamma function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Range: must be positive."},{"Name":"LIBNAME","Definition":"Assigns or deassigns a libref for a SAS library.","Parameter1":"<libref><","Description1":"Is a character constant, variable, or expression that specifies the libref that is assigned to a SAS library. The maximum length of libref is eight characters.","Parameter2":"SAS-library<","Description2":"Is a character constant, variable, or expression that specifies the physical name of the SAS library that is associated with the libref. is a character constant, variable, or expression that specifies one or more valid options for the specified engine, delimited with blanks. This argument can be null.","Parameter3":"engine<","Description3":"Is a character constant, variable, or expression that specifies the engine that is used to access SAS files opened in the data library. is a character constant, variable, or expression that specifies one or more valid options for the specified engine, delimited with blanks. This argument can be null.","Parameter4":"options>>>","Description4":"Is a character constant, variable, or expression that specifies one or more valid options for the specified engine, delimited with blanks. This argument can be null."},{"Name":"LIBREF","Definition":"Verifies that a libref has been assigned.","Parameter1":"libref","Description1":"Specifies the libref to be verified."},{"Name":"LOG","Definition":"Returns the natural (base e) logarithm.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Range: must be positive."},{"Name":"LOG1PX","Definition":"Returns the log of 1 plus the argument.","Parameter1":"x","Description1":"Specifies a numeric variable, constant, or expression."},{"Name":"LOG10","Definition":"Returns the logarithm to the base 10.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Range: must be positive."},{"Name":"LOG2","Definition":"Returns the logarithm to the base 2.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Range: must be positive."},{"Name":"LOGBETA","Definition":"Returns the logarithm of the beta function.","Parameter1":"a","Description1":"Is the first shape parameter, where a > 0.","Parameter2":"b","Description2":"Is the second shape parameter, where b > 0."},{"Name":"LOGCDF","Definition":"Returns the logarithm of a left cumulative distribution function.","Parameter1":"'distribution'","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\nExcept for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"quantile<","Description2":"Is a numeric variable, constant, or expression that specifies the value of a random variable.","Parameter3":"parm-1, ...,parm-k>","Description3":"Are optional shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"LOGPDF","Definition":"Returns the logarithm of a probability density (mass) function.","Parameter1":"'distribution'","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"quantile<","Description2":"Is a numeric variable, constant, or expression that specifies the value of a random variable.","Parameter3":"parameter-1, ..., parameter-k>","Description3":"Are optional shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"LOGSDF","Definition":"Returns the logarithm of a survival function.","Parameter1":"'dist'","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\nNote: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"quantile<","Description2":"Is a numeric variable, constant, or expression that specifies the value of a random variable.","Parameter3":"parameter-1, ..., parameter-k>","Description3":"Are optional shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"LOWCASE","Definition":"Converts all letters in an argument to lowercase.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"QLOWCASE","Definition":"Converts all letters in an argument to lowercase. QLOWCASE produces a result with special characters and mnemonic operators masked.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression that might contain the following special characters and mnemonic operators masked: & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN."},{"Name":"LPERM","Definition":"Computes the logarithm of the PERM function; that is, the logarithm of the number of permutations of n objects, with the option of including r number of elements.","Parameter1":"n<","Description1":"Is an integer that represents the total number of elements from which the sample is chosen.","Parameter2":"r","Description2":"Is an optional integer value that represents the number of chosen elements. If r is omitted, the function returns the factorial of n. Restriction: r \u2264 n."},{"Name":"LPNORM","Definition":"Returns the Lp norm of the second argument and subsequent non-missing arguments.","Parameter1":"p","Description1":"Specifies a numeric constant, variable, or expression that is greater than or equal to 1, which is used as the power for computing the Lp norm.","Parameter2":"value-1<","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"value-2...>","Description3":"Specifies a numeric constant, variable, or expression."},{"Name":"MAD","Definition":"Returns the median absolute deviation from the median.","Parameter1":"value-1<","Description1":"Specifies a numeric constant, variable, or expression of which the median absolute deviation from the median is to be computed.","Parameter2":"value-2...>","Description2":"Specifies a numeric constant, variable, or expression of which the median absolute deviation from the median is to be computed."},{"Name":"MARGRCLPRC","Definition":"Calculates call prices for European options on stocks, based on the Margrabe model.","Parameter1":"X1","Description1":"Is a non-missing, positive value that specifies the price of the first asset. Specify X1 and X2 in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies the time to expiration.","Parameter3":"X2","Description3":"Is a non-missing, positive value that specifies the price of the second asset. Specify X2 and X1 in the same units.","Parameter4":"sigma1","Description4":"Is a non-missing, positive fraction that specifies the volatility of the first asset. Specify a value for sigma1 for the same time period as the unit of t.","Parameter5":"sigma2","Description5":"Is a non-missing, positive fraction that specifies the volatility of the second asset. Specify a value for sigma2 for the same time period as the unit of t.","Parameter6":"rho12","Description6":"Specifies the correlation between the first and second assets. Range: between -1 and 1."},{"Name":"MARGRPTPRC","Definition":"Calculates put prices for European options on stocks, based on the Margrabe model.","Parameter1":"X1","Description1":"Is a non-missing, positive value that specifies the price of the first asset. Specify X1 and X2 in the same units.","Parameter2":"t","Description2":"Is a non-missing value that specifies the time to expiration.","Parameter3":"X2","Description3":"Is a non-missing, positive value that specifies the price of the second asset. Specify X2 and X1 in the same units.","Parameter4":"sigma1","Description4":"Is a non-missing, positive fraction that specifies the volatility of the first asset. Specify a value for sigma1 for the same time period as the unit of t.","Parameter5":"sigma2","Description5":"Is a non-missing, positive fraction that specifies the volatility of the second asset. Specify a value for sigma2 for the same time period as the unit of t.","Parameter6":"rho12","Description6":"Specifies the correlation between the first and second assets. Range: between -1 and 1."},{"Name":"MAX","Definition":"Returns the largest value. At least two arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2<","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"...argument-n>","Description3":"Specifies a numeric constant, variable, or expression."},{"Name":"MD5","Definition":"Returns the result of the message digest of a specified string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression. Enclose a literal string of characters in quotation marks."},{"Name":"MDY","Definition":"Returns a SAS date value from month, day, and year values.","Parameter1":"month","Description1":"Specifies a numeric constant, variable, or expression that represents an integer from 1 through 12.","Parameter2":"day","Description2":"Specifies a numeric constant, variable, or expression that represents an integer from 1 through 31.","Parameter3":"year","Description3":"Specifies a numeric constant, variable, or expression with a value of a two-digit or four-digit integer that represents the year."},{"Name":"MEAN","Definition":"Returns the arithmetic mean (average). At least one non-missing argument is required. Otherwise, the function returns a missing value.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF."},{"Name":"MEDIAN","Definition":"Returns the median value.","Parameter1":"value1<","Description1":"Is a numeric constant, variable, or expression.","Parameter2":"value2, ...>","Description2":"Is a numeric constant, variable, or expression."},{"Name":"MIN","Definition":"Returns the smalles value. At least two arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2<","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"...argument-n>","Description3":"Specifies a numeric constant, variable, or expression."},{"Name":"MINUTE","Definition":"Returns the minute from a SAS time or datetime value.","Parameter1":"time | datetime","Description1":"Is a numeric constant, variable, or expression that specifies a SAS time or datetime value."},{"Name":"MISSING","Definition":"Returns a numeric result that indicates whether the argument contains a missing value.","Parameter1":"numeric-expression | character-expression","Description1":"Specifies a numeric or character constant, variable, or expression."},{"Name":"MOD","Definition":"Returns the remainder from the division of the first argument by the second argument, fuzzed to avoid most unexpected floating-point results.","Parameter1":"argument-1","Description1":"Is a numeric constant, variable, or expression that specifies the dividend.","Parameter2":"argument-2","Description2":"Is a numeric constant, variable, or expression that specifies the divisor. Restriction: cannot be 0."},{"Name":"MODULEIC","Definition":"Calls an external routine or module that resides in an image that can be shared. Returns a character value.","Parameter1":"<cntl-string","Description1":"Is an optional control string whose first character must be an asterisk (*), followed by any combination of the following characters: I (detects incorrect arguments or attribute tables), E (prints error messages), Sx (uses x as a separator character to separate field definitions), H (provides help on CALL MODULE routine syntax).","Parameter2":">module-name<","Description2":"Is the name of the external module to use.","Parameter3":"argument-1","Description3":"Is one or more arguments to pass to the requested routine.","Parameter4":"..., argument-n>","Description4":"Is one or more arguments to pass to the requested routine."},{"Name":"MODULEIN","Definition":"Calls an external routine or module that resides in an image that can be shared. Returns a numeric value.","Parameter1":"<cntl-string","Description1":"Is an optional control string whose first character must be an asterisk (*), followed by any combination of the following characters: I (detects incorrect arguments or attribute tables), E (prints error messages), Sx (uses x as a separator character to separate field definitions), H (provides help on CALL MODULE routine syntax).","Parameter2":">module-name<","Description2":"Is the name of the external module to use.","Parameter3":"argument-1","Description3":"Is one or more arguments to pass to the requested routine.","Parameter4":"..., argument-n>","Description4":"Is one or more arguments to pass to the requested routine."},{"Name":"MODULEC","Definition":"Calls an external routine and returns a character value.","Parameter1":"<cntl-string","Description1":"Is an optional control string whose first character must be an asterisk (*), followed by any combination of the following characters: I (detects incorrect arguments or attribute tables), E (prints error messages), Sx (uses x as a separator character to separate field definitions), H (provides help on CALL MODULE routine syntax).","Parameter2":">module-name<","Description2":"Is the name of the external module to use.","Parameter3":"argument-1","Description3":"Is one or more arguments to pass to the requested routine.","Parameter4":"..., argument-n>","Description4":"Is one or more arguments to pass to the requested routine."},{"Name":"MODULEN","Definition":"Calls an external routine and returns a numeric value.","Parameter1":"<cntl-string","Description1":"Is an optional control string whose first character must be an asterisk (*), followed by any combination of the following characters: I (detects incorrect arguments or attribute tables), E (prints error messages), Sx (uses x as a separator character to separate field definitions), H (provides help on CALL MODULE routine syntax).","Parameter2":">module-name<","Description2":"Is the name of the external module to use.","Parameter3":"argument-1","Description3":"Is one or more arguments to pass to the requested routine.","Parameter4":"..., argument-n>","Description4":"Is one or more arguments to pass to the requested routine."},{"Name":"MODZ","Definition":"Returns the remainder from the division of the first argument by the second argument, using zero fuzzing.","Parameter1":"argument-1","Description1":"Is a numeric constant, variable, or expression that specifies the dividend.","Parameter2":"argument-2","Description2":"Is a non-zero numeric constant, variable, or expression that specifies the divisor."},{"Name":"MONTH","Definition":"Returns the month from a SAS date value.","Parameter1":"date","Description1":"Specifies a numeric constant, variable, or expression that represents a SAS date value."},{"Name":"MOPEN","Definition":"Opens a file by directory ID and member name, and returns either the file identifier or a 0.","Parameter1":"directory-id","Description1":"Is a numeric variable that specifies the identifier that was assigned when the directory was opened, generally by the DOPEN function.","Parameter2":"member-name","Description2":"Is a character constant, variable, or expression that specifies the member name in the directory.","Parameter3":"open-mode","Description3":"Is a character constant, variable, or expression that specifies the type of access to the file: A (APPEND mode writes new records at end of file), I (INPUT mode allows reading only), O (OUTPUT mode allows writing new records at beginning of file), S (SEQUENTIAL input mode for pipes or ports), U (UPDATE mode allows both reading and writing), W (SEQUENTIAL update mode for pipes or ports)","Parameter4":"record-length","Description4":"Is a numeric constant, variable, or expression that specifies the logical record length of the file. To use the existing record length for the file, specify a length of 0, or do not provide a value here.","Parameter5":"record-format","Description5":"Is a character constant, variable, or expression that specifies the record format of the file. Valid values: B (binary), D (default format), E (editable), F(fixed-length records), P (contains printer carriage control), V (variable-length records)."},{"Name":"MORT","Definition":"Returns amortization parameters.","Parameter1":"a","Description1":"Is numeric, and specifies the initial amount.","Parameter2":"p","Description2":"Is numeric, and specifies the periodic payment.","Parameter3":"r","Description3":"Is numeric, and specifies the periodic interest rate that is expressed as a fraction.","Parameter4":"n","Description4":"Is an integer, and specifies the number of compounding periods. Range: n \u2265 0."},{"Name":"MSPLINT","Definition":"Returns the ordinate of a monotonicity-preserving interpolating spline.","Parameter1":"X","Description1":"Is a numeric constant, variable, or expression that specifies the abscissa for which the ordinate of the spline is to be computed.","Parameter2":"n","Description2":"Is a numeric constant, variable, or expression that specifies the number of knots. N must be a positive integer.","Parameter3":"X1 <, X2, ..., Xn>","Description3":"Are numeric constants, variables, or expressions that specify the abscissas of the knots. These values must be non-missing and listed in nondecreasing order.","Parameter4":"Y1 <,Y2, ..., Yn><","Description4":"Are numeric constants, variables, or expressions that specify the ordinates of the knots. The number of Y1 through Yn arguments must be the same as the number of X1 through Xn arguments.","Parameter5":"D1, Dn>","Description5":"Are optional numeric constants, variables, or expressions that specify the derivatives of the spline at X1 and Xn."},{"Name":"N","Definition":"Returns the number of non-missing numeric values. At least one argument is required.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"NETPV","Definition":"Returns the net present value as a fraction.","Parameter1":"r","Description1":"Is numeric, the interest rate over a specified base period of time expressed as a fraction. Range: r \u2265 0.","Parameter2":"freq","Description2":"Is numeric, the number of payments during the base period of time that is specified with the rate r. Range: freq > 0. Exception: The case freq=0 is a flag to allow continuous discounting.","Parameter3":"c0,c1, ...,cn","Description3":"Are numeric cash flows that represent cash outlays (payments) or cash inflows (income) occurring at times 0, 1, ...n."},{"Name":"NLITERAL","Definition":"Converts a character string that you specify to a SAS name literal.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression that is to be converted to a SAS name literal. Enclose a literal string of characters in quotation marks."},{"Name":"NMISS","Definition":"Returns the number of missing numeric values. At least one argument is required.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"NOTALNUM","Definition":"Searches a character string for a non-alphanumeric character, and returns the first position at which the character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTALPHA","Definition":"Searches a character string for a nonalphabetic character, and returns the first position at which the character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTCNTRL","Definition":"Searches a character string for a character that is not a control character, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTDIGIT","Definition":"Searches a character string for any character that is not a digit, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTE","Definition":"Returns an observation ID for the current observation of a SAS data set.","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that the OPEN function returns."},{"Name":"NOTFIRST","Definition":"Searches a character string for an invalid first character in a SAS variable name under VALIDVARNAME=V7, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTGRAPH","Definition":"Searches a character string for a non-graphical character, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTLOWER","Definition":"Searches a character string for a character that is not a lowercase letter, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTNAME","Definition":"Searches a character string for an invalid character in a SAS variable name under VALIDVARNAME=V7, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTPRINT","Definition":"Searches a character string for a nonprintable character, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTPUNCT","Definition":"Searches a character string for a character that is not a punctuation character, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTSPACE","Definition":"Searches a character string for a character that is not a white-space character (blank, horizontal and vertical tab, carriage return, line feed, and form feed), and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTUPPER","Definition":"Searches a character string for a character that is not an uppercase letter, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NOTXDIGIT","Definition":"Searches a character string for a character that is not a hexadecimal character, and returns the first position at which that character is found.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression to search.","Parameter2":"start>","Description2":"Is an optional numeric constant, variable, or expression with an integer value that specifies the position at which the search should start and the direction in which to search."},{"Name":"NPV","Definition":"Returns the net present value with the rate expressed as a percentage.","Parameter1":"r","Description1":"Is numeric, the interest rate over a specified base period of time expressed as a percentage.","Parameter2":"freq","Description2":"Is numeric, the number of payments during the base period of time specified with the rate r. Range: freq > 0. Exception: The case freq=0 is a flag to allow continuous discounting.","Parameter3":"c0,c1, ...,cn","Description3":"Are numeric cash flows that represent cash outlays (payments) or cash inflows (income) occurring at times 0, 1, ...n."},{"Name":"NVALID","Definition":"Checks the validity of a character string for use as a SAS variable name.","Parameter1":"string<","Description1":"Specifies a character constant, variable, or expression which will be checked to determine whether its value can be used as a SAS variable name. Trailing blanks are ignored.","Parameter2":"validvarname>","Description2":"Is a character constant, variable, or expression that specifies one of the following values: V7, ANY, NLITERAL"},{"Name":"NWKDOM","Definition":"Returns the date for the nth occurrence of a weekday for the specified month and year.","Parameter1":"n","Description1":"Specifies the numeric week of the month that contains the specified day. Range: 1-5.","Parameter2":"weekday","Description2":"Specifies the number that corresponds to the day of the week. Range: 1-7. Tip: Sunday is considered the first day of the week and has a weekday value of 1.","Parameter3":"month","Description3":"Specifies the number that corresponds to the month of the year. Range: 1-12.","Parameter4":"year","Description4":"Specifies a four-digit calendar year."},{"Name":"OPEN","Definition":"Opens a SAS data set.","Parameter1":"<data-set-name<","Description1":"Is a character constant, variable, or expression that specifies the name of the SAS data set or SAS SQL view to be opened. The value of this character string should be of the form <libref.>member-name<(data-set-options)>","Parameter2":"mode>>","Description2":"Is a character constant, variable, or expression that specifies the type of access to the data set: I (INPUT mode, for read only), IN (sequential INPUT mode, with revisit of observations allowed), IS (sequential INPUT mode, with revisit of observations not allowed)."},{"Name":"ORDINAL","Definition":"Returns the kth smallest of the missing and nonmissing values. At least two arguments are required.","Parameter1":"k","Description1":"Is a numeric constant, variable, or expression with an integer value that is less than or equal to the number of subsequent elements in the list of arguments.","Parameter2":"argument-1","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"argument-2<","Description3":"Specifies a numeric constant, variable, or expression.","Parameter4":"...argument-n>","Description4":"Specifies a numeric constant, variable, or expression."},{"Name":"PATHNAME","Definition":"Returns the physical name of an external file or a SAS library, or returns a blank.","Parameter1":"(fileref | libref)<","Description1":"Is a character constant, variable, or expression that specifies either the fileref that is assigned to an external file or the libref that is assigned to a SAS library.","Parameter2":"search-ref>","Description2":"Is a character constant, variable, or expression that specifies whether to search for a fileref or a libref. Values: F (to search for a fileref) or L (to search for a libref)."},{"Name":"PCTL","Definition":"Returns the percentile that corresponds to the percentage. n is a digit from 1 to 5 which specifies the definition of the percentile to be computed.","Parameter1":"percentage","Description1":"Is a numeric constant, variable, or expression that specifies the percentile to be computed. Range: 0 \u2264 percentage \u2264 100, and is numeric.","Parameter2":"value1<","Description2":"Is a numeric variable, constant, or expression.","Parameter3":"value2, ...>","Description3":"Is a numeric variable, constant, or expression."},{"Name":"PDF*1","Definition":"The PDF function for the Bernoulli distribution returns the probability density function of a Bernoulli distribution, with the probability of success equal to p.","Parameter1":"'BERNOULLI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"PDF*2","Definition":"The PDF function for the beta distribution returns the probability density function of a beta distribution, with the shape parameters a and b. The PDF function is evaluated at the value x.","Parameter1":"'BETA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"b<","Description4":"Is a numeric shape parameter. Range: b > 0.","Parameter5":"l","Description5":"Is the numeric left location parameter. Default: 0.","Parameter6":"r>","Description6":"Is the right location parameter. Default: 0. Range: r>l."},{"Name":"PDF*3","Definition":"The PDF function for the binomial distribution returns the probability density function of a binomial distribution, with the parameters p and n, which is evaluated at the value m. ","Parameter1":"'BINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is an integer random variable that counts the number of successes.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is an integer parameter that counts the number of independent Bernoulli trials."},{"Name":"PDF*4","Definition":"The PDF function for the Cauchy distribution returns the probability density function of a Cauchy distribution, with the location parameter \u03b8 and the scale parameter \u03bb. The PDF function is evaluated at the value x. ","Parameter1":"'CAUCHY'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*5","Definition":"The PDF function for the chi-square distribution returns the probability density function of a chi-square distribution, with df degrees of freedom and the non-centrality parameter nc. The PDF function is evaluated at the value x.","Parameter1":"'CHISQUARE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter. Range: nc \u2265 0."},{"Name":"PDF*6","Definition":"The Conway-Maxwell-Poisson (CMP) distribution is a generalization of the Poisson distribution that enables you to model underdispersed and overdispersed data.","Parameter1":"'CONMAXPOI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a nonnegative integer that represents counts data.","Parameter3":"\u03bb","Description3":"Is similar to the mean, as in the Poisson distribution.","Parameter4":"\u03bd","Description4":"Is a dispersion parameter."},{"Name":"PDF*7","Definition":"Returns a value from a probability density (mass) distribution.","Parameter1":"'EXPONENTIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*8","Definition":"The PDF function for the F distribution returns the probability density function of an F distribution, with ndf numerator degrees of freedom, ddf denominator degrees of freedom, and the non-centrality parameter nc. The PDF function is evaluated at the value x.","Parameter1":"'F'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"ndf","Description3":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter4":"ddf<","Description4":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter5":"nc>","Description5":"Is a numeric non-centrality parameter. Range: nc > =0."},{"Name":"PDF*9","Definition":"The PDF function for the gamma distribution returns the probability density function of a gamma distribution, with the shape parameter a and the scale parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'GAMMA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*10","Definition":"The PDF function for the generalized Poisson distribution returns the probability density function of a generalized Poisson distribution, with the shape parameter \u03b8. The PDF function is evaluated at the value x.","Parameter1":"'GENPOISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"\u03b8","Description3":"Specifies a shape parameter.\n \nRange <10^5 and >0","Parameter4":"\u03b7>","Description4":"Specifies a shape parameter.\n \nRange: \u22650 and <0.95\n "},{"Name":"PDF*11","Definition":"The PDF function for the geometric distribution returns the probability density function of a geometric distribution, with the parameter p. The PDF function is evaluated at the value m.","Parameter1":"'GEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a numeric random variable that denotes the number of failures before the first success. Range: m \u2265 0.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"PDF*12","Definition":"The PDF function for the hypergeometric distribution returns the probability density function of an extended hypergeometric distribution, with population size N, number of items R, sample size n, and odds ratio o. The PDF function is evaluated at the value x. If o is omitted or equal to 1, the value returned is from the usual hypergeometric distribution.","Parameter1":"'HYPERGEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"N","Description3":"Is an integer population size parameter. Range: N = 1, 2, ...","Parameter4":"R","Description4":"Is an integer number of items in the category of interest. Range: R = 0, 1, ..., N","Parameter5":"n<","Description5":"Is an integer sample size parameter. Range: n = 1, 2, ..., N","Parameter6":"o>","Description6":"Is an optional numeric odds ratio parameter. Range: o > 0."},{"Name":"PDF*13","Definition":"The PDF function for the Laplace distribution returns the probability density function of the Laplace distribution, with the location parameter \u03b8 and the scale parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'LAPLACE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*14","Definition":"The PDF function for the logistic distribution returns the probability density function of a logistic distribution, with the location parameter \u03b8 and the scale parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'LOGISTIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*15","Definition":"The PDF function for the lognormal distribution returns the probability density function of a lognormal distribution, with the log scale parameter \u03b8 and the shape parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'LOGNORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*16","Definition":"The PDF function for the negative binomial distribution returns the probability density function of a negative binomial distribution, with probability of success p and number of successes n. The PDF function is evaluated at the value m.","Parameter1":"'NEGBINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a positive integer random variable that counts the number of failures. Range: m= 0, 1, ...","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is a numeric value that counts the number of successes. Range: n > 0."},{"Name":"PDF*17","Definition":"The PDF function for the normal distribution returns the probability density function of a normal distribution, with the location parameter \u03b8 and the scale parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'NORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PDF*18","Definition":"The PDF function for the Normal Mixture distribution returns the probability that an observation from a mixture of normal distribution is less than or equal to x.","Parameter1":"'NORMALMIX'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"n","Description3":"Is the integer number of mixtures. Range: n = 1, 2, ...","Parameter4":"p","Description4":"Is the n proportions, p1, p2, ..., pn, where sum of p1 to pn is equal to 1. Range: p = 0, 1, ...","Parameter5":"m","Description5":"Is the n means, m1, m2, ...,mn.","Parameter6":"s","Description6":"Is the n standard deviations, s1, s2, ..., sn. Range: s > 0."},{"Name":"PDF*19","Definition":"The PDF function for the Pareto distribution returns the probability density function of a Pareto distribution, with the shape parameter a and the scale parameter k. The PDF function is evaluated at the value x.","Parameter1":"'PARETO'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"k>","Description4":"Is a numeric scale parameter. Default: 1. Range: k > 0."},{"Name":"PDF*20","Definition":"The PDF function for the Poisson distribution returns the probability density function of a Poisson distribution, with mean m. The PDF function is evaluated at the value n.","Parameter1":"'POISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"n","Description2":"Is an integer random variable. Range: n= 0, 1, ...","Parameter3":"m","Description3":"Is a numeric mean parameter. Range: m > 0."},{"Name":"PDF*21","Definition":"The PDF function for the T distribution returns the probability density function of a T distribution, with degrees of freedom df and the non-centrality parameter nc. The PDF function is evaluated at the value x.","Parameter1":"'T'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"t","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter."},{"Name":"PDF*22","Definition":"The PDF function for the Tweedie distribution returns an exponential dispersion model with variance and mean related by the equation variance.","Parameter1":"'TWEEDIE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a random variable.\n\nRange: y \u22650\nNotes: This argument is required.\n When y>1, y is numeric. When p=1, y is an integer.\n ","Parameter3":"p<","Description3":"Is the power parameter.\n\nRange: p \u22651\nNote: This argument is required.\n ","Parameter4":"\u03bc","Description4":"Is the mean.\n\nDefault: 1\nRange: \u03bc > 0\n ","Parameter5":"\u03c6>","Description5":"Is the dispersion parameter.\n\nDefault: 1\nRange: \u03c6>0\n "},{"Name":"PDF*23","Definition":"The PDF function for the uniform distribution returns the probability density function of a uniform distribution, with the left location parameter l and the right location parameter r. The PDF function is evaluated at the value x.","Parameter1":"'UNIFORM'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"l","Description3":"Is the numeric left location parameter. Default: 0.","Parameter4":"r","Description4":"Is the numeric right location parameter. Default: 1. Range: r>l."},{"Name":"PDF*24","Definition":"The PDF function for the Wald distribution returns the probability density function of a Wald distribution, with the shape parameter \u03bb, which is evaluated at the value x.","Parameter1":"'WALD'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"\u03bb<","Description3":"Is a numeric shape parameter.\n\nRange: \u03bb > 0","Parameter4":"\u03bc>","Description4":"Is the mean.\n\nDefault: 1\nRange: \u03bc > 0"},{"Name":"PDF*25","Definition":"The PDF function for the Weibull distribution returns the probability density function of a Weibull distribution, with the shape parameter a and the scale parameter \u03bb. The PDF function is evaluated at the value x.","Parameter1":"'WEIBULL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*1","Definition":"The CDF function for the Bernoulli distribution returns the probability that an observation from a Bernoulli distribution, with probability of success equal to p, is less than or equal to x.","Parameter1":"'BERNOULLI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"CDF*2","Definition":"The CDF function for the beta distribution returns the probability that an observation from a beta distribution, with shape parameters a and b, is less than or equal to v.","Parameter1":"'BETA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"b<","Description4":"Is a numeric shape parameter. Range: b > 0.","Parameter5":"l","Description5":"Is the numeric left location parameter. Default: 0.","Parameter6":"r>","Description6":"Is the right location parameter. Default: 0. Range: r>l."},{"Name":"CDF*3","Definition":"The CDF function for the binomial distribution returns the probability that an observation from a binomial distribution, with parameters p and n, is less than or equal to m.","Parameter1":"'BINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is an integer random variable that counts the number of successes.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is an integer parameter that counts the number of independent Bernoulli trials."},{"Name":"CDF*4","Definition":"The CDF function for the Cauchy distribution returns the probability that an observation from a Cauchy distribution, with the location parameter \u03b8 and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'CAUCHY'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*5","Definition":"The CDF function for the chi-square distribution returns the probability that an observation from a chi-square distribution, with df degrees of freedom and the non-centrality parameter nc, is less than or equal to x.","Parameter1":"'CHISQUARE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter. Range: nc \u2265 0."},{"Name":"CDF*6","Definition":"The CDF function returns cumulative probability from 0 to y.","Parameter1":"'CONMAXPOI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a nonnegative integer that represents counts data.","Parameter3":"\u03bb","Description3":"Is similar to the mean, as in the Poisson distribution.","Parameter4":"\u03bd","Description4":"Is a dispersion parameter."},{"Name":"CDF*7","Definition":"The CDF function for the exponential distribution returns the probability that an observation from an exponential distribution, with the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'EXPONENTIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*8","Definition":"The CDF function for the F distribution returns the probability that an observation from an F distribution, with ndf numerator degrees of freedom, ddf denominator degrees of freedom, and the non-centrality parameter nc, is less than or equal to x.","Parameter1":"'F'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"ndf","Description3":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter4":"ddf<","Description4":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter5":"nc>","Description5":"Is a numeric non-centrality parameter. Range: nc > =0."},{"Name":"CDF*9","Definition":"The CDF function for the gamma distribution returns the probability that an observation from a gamma distribution, with the shape parameter a and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'GAMMA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*10","Definition":"Probability mass function for the generalized Poisson distribution.","Parameter1":"'GENPOISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"\u03b8","Description3":"\n Specifies a shape parameter.\n\n Range <10^5 and >0\n ","Parameter4":"\u03b7>","Description4":"\n Specifies a shape parameter.\n\n Range: \u22650 and <0.95\n "},{"Name":"CDF*11","Definition":"The CDF function for the geometric distribution returns the probability that an observation from a geometric distribution, with the parameter p, is less than or equal to m.","Parameter1":"'GEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a numeric random variable that denotes the number of failures before the first success. Range: m \u2265 0.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"CDF*12","Definition":"The CDF function for the hypergeometric distribution returns the probability that an observation from an extended hypergeometric distribution, with population size N, number of items R, sample size n, and odds ratio o, is less than or equal to x.","Parameter1":"'HYPERGEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"N","Description3":"Is an integer population size parameter. Range: N = 1, 2, ...","Parameter4":"R","Description4":"Is an integer number of items in the category of interest. Range: R = 0, 1, ..., N","Parameter5":"n<","Description5":"Is an integer sample size parameter. Range: n = 1, 2, ..., N","Parameter6":"o>","Description6":"Is an optional numeric odds ratio parameter. Range: o > 0."},{"Name":"CDF*13","Definition":"The CDF function for the Laplace distribution returns the probability that an observation from the Laplace distribution, with the location parameter \u03b8 and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'LAPLACE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*14","Definition":"The CDF function for the Logistic distribution returns the probability that an observation from a Logistic distribution, with the location parameter \u03b8 and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'LOGISTIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*15","Definition":"The CDF function for the lognormal distribution returns the probability that an observation from a lognormal distribution, with the log scale parameter \u03b8 and the shape parameter \u03bb, is less than or equal to x.","Parameter1":"'LOGNORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*16","Definition":"The CDF function for the negative binomial distribution returns the probability that an observation from a negative binomial distribution, with the probability of success p and the number of successes n, is less than or equal to m.","Parameter1":"'NEGBINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a positive integer random variable that counts the number of failures. Range: m= 0, 1, ...","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is a numeric value that counts the number of successes. Range: n > 0."},{"Name":"CDF*17","Definition":"The CDF function for the Normal distribution returns the probability that an observation from the Normal distribution, with the location parameter \u03b8 and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'NORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"CDF*18","Definition":"The CDF function for the Normal Mixture distribution returns the probability that an observation from a mixture of normal distribution is less than or equal to x.","Parameter1":"'NORMALMIX'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"n","Description3":"Is the integer number of mixtures. Range: n = 1, 2, ...","Parameter4":"p","Description4":"Is the n proportions, p1, p2, ..., pn, where sum of p1 to pn is equal to 1. Range: p = 0, 1, ...","Parameter5":"m","Description5":"Is the n means, m1, m2, ...,mn.","Parameter6":"s","Description6":"Is the n standard deviations, s1, s2, ..., sn. Range: s > 0."},{"Name":"CDF*19","Definition":"The CDF function for the Pareto distribution returns the probability that an observation from a Pareto distribution, with the shape parameter a and the scale parameter k, is less than or equal to x.","Parameter1":"'PARETO'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"k>","Description4":"Is a numeric scale parameter. Default: 1. Range: k > 0."},{"Name":"CDF*20","Definition":"The CDF function for the Poisson distribution returns the probability that an observation from a Poisson distribution, with mean m, is less than or equal to n.","Parameter1":"'POISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"n","Description2":"Is an integer random variable. Range: n= 0, 1, ...","Parameter3":"m","Description3":"Is a numeric mean parameter. Range: m > 0."},{"Name":"CDF*21","Definition":"The CDF function for the T distribution returns the probability that an observation from a T distribution, with degrees of freedom df and the non-centrality parameter nc, is less than or equal to x.","Parameter1":"'T'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"t","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter."},{"Name":"CDF*22","Definition":"The CDF function for the Tweedie distribution returns an exponential dispersion model with variance and mean related by the equation variance.","Parameter1":"'TWEEDIE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"\n Is a random variable.\n\n Range: y \u22650\n Notes: This argument is required.\n When y>1, y is numeric. When p=1, y is an integer.\n ","Parameter3":"p<","Description3":"\n Is the power parameter.\n\n Range: p \u22651\n Note: This argument is required.\n ","Parameter4":"\u03bc","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n ","Parameter5":"\u03c6>","Description5":"\n Is the dispersion parameter.\n\n Default: 1\n Range: \u03c6>0\n "},{"Name":"CDF*23","Definition":"The CDF function for the uniform distribution returns the probability that an observation from a uniform distribution, with the left location parameter l and the right location parameter r, is less than or equal to x.","Parameter1":"'UNIFORM'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"l","Description3":"Is the numeric left location parameter. Default: 0.","Parameter4":"r","Description4":"Is the numeric right location parameter. Default: 1. Range: r>l."},{"Name":"CDF*24","Definition":"The CDF function for the Wald distribution returns the probability that an observation from a Wald distribution, with the shape parameter \u03bb, is less than or equal to x.","Parameter1":"'WALD'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"\u03bb<","Description3":"\n Is a numeric shape parameter.\n\n Range: \u03bb > 0\n ","Parameter4":"\u03bc>","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n "},{"Name":"CDF*25","Definition":"The CDF function for the Weibull distribution returns the probability that an observation from a Weibull distribution, with the shape parameter a and the scale parameter \u03bb, is less than or equal to x.","Parameter1":"'WEIBULL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*1","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'BERNOULLI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"SDF*2","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'BETA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"b<","Description4":"Is a numeric shape parameter. Range: b > 0.","Parameter5":"l","Description5":"Is the numeric left location parameter. Default: 0.","Parameter6":"r>","Description6":"Is the right location parameter. Default: 0. Range: r>l."},{"Name":"SDF*3","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'BINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is an integer random variable that counts the number of successes.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is an integer parameter that counts the number of independent Bernoulli trials."},{"Name":"SDF*4","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'CAUCHY'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*5","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'CHISQUARE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter. Range: nc \u2265 0."},{"Name":"SDF*6","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'CONMAXPOI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a nonnegative integer that represents counts data.","Parameter3":"\u03bb","Description3":"Is similar to the mean, as in the Poisson distribution.","Parameter4":"\u03bd","Description4":"Is a dispersion parameter."},{"Name":"SDF*7","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'EXPONENTIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*8","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'F'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"ndf","Description3":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter4":"ddf<","Description4":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter5":"nc>","Description5":"Is a numeric non-centrality parameter. Range: nc > =0."},{"Name":"SDF*9","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'GAMMA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*10","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'GENPOISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"\u03b8","Description3":"\n Specifies a shape parameter.\n\n Range <10^5 and >0\n ","Parameter4":"\u03b7>","Description4":"\n Specifies a shape parameter.\n\n Range: \u22650 and <0.95\n "},{"Name":"SDF*11","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'GEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a numeric random variable that denotes the number of failures before the first success. Range: m \u2265 0.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"SDF*12","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'HYPERGEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"N","Description3":"Is an integer population size parameter. Range: N = 1, 2, ...","Parameter4":"R","Description4":"Is an integer number of items in the category of interest. Range: R = 0, 1, ..., N","Parameter5":"n<","Description5":"Is an integer sample size parameter. Range: n = 1, 2, ..., N","Parameter6":"o>","Description6":"Is an optional numeric odds ratio parameter. Range: o > 0."},{"Name":"SDF*13","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'LAPLACE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*14","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'LOGISTIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*15","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'LOGNORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*16","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'NEGBINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a positive integer random variable that counts the number of failures. Range: m= 0, 1, ...","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is a numeric value that counts the number of successes. Range: n > 0."},{"Name":"SDF*17","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'NORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SDF*18","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'NORMALMIX'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"n","Description3":"Is the integer number of mixtures. Range: n = 1, 2, ...","Parameter4":"p","Description4":"Is the n proportions, p1, p2, ..., pn, where sum of p1 to pn is equal to 1. Range: p = 0, 1, ...","Parameter5":"m","Description5":"Is the n means, m1, m2, ...,mn.","Parameter6":"s","Description6":"Is the n standard deviations, s1, s2, ..., sn. Range: s > 0."},{"Name":"SDF*19","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'PARETO'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"k>","Description4":"Is a numeric scale parameter. Default: 1. Range: k > 0."},{"Name":"SDF*20","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'POISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"n","Description2":"Is an integer random variable. Range: n= 0, 1, ...","Parameter3":"m","Description3":"Is a numeric mean parameter. Range: m > 0."},{"Name":"SDF*21","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'T'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"t","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter."},{"Name":"SDF*22","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'TWEEDIE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"\n Is a random variable.\n\n Range: y \u22650\n Notes: This argument is required.\n When y>1, y is numeric. When p=1, y is an integer.\n ","Parameter3":"p<","Description3":"\n Is the power parameter.\n\n Range: p \u22651\n Note: This argument is required.\n ","Parameter4":"\u03bc","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n ","Parameter5":"\u03c6>","Description5":"\n Is the dispersion parameter.\n\n Default: 1\n Range: \u03c6>0\n "},{"Name":"SDF*23","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'UNIFORM'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"l","Description3":"Is the numeric left location parameter. Default: 0.","Parameter4":"r","Description4":"Is the numeric right location parameter. Default: 1. Range: r>l."},{"Name":"SDF*24","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'WALD'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"\u03bb<","Description3":"\n Is a numeric shape parameter.\n\n Range: \u03bb > 0\n ","Parameter4":"\u03bc>","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n "},{"Name":"SDF*25","Definition":"The SDF function computes the survival function (upper tail) from various continuous and discrete distributions.","Parameter1":"'WEIBULL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*1","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BERNOULLI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"QUANTILE*2","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BETA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"b<","Description4":"Is a numeric shape parameter. Range: b > 0.","Parameter5":"l","Description5":"Is the numeric left location parameter. Default: 0.","Parameter6":"r>","Description6":"Is the right location parameter. Default: 0. Range: r>l."},{"Name":"QUANTILE*3","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is an integer random variable that counts the number of successes.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is an integer parameter that counts the number of independent Bernoulli trials."},{"Name":"QUANTILE*4","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CAUCHY'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*5","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CHISQUARE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter. Range: nc \u2265 0."},{"Name":"QUANTILE*6","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CONMAXPOI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a nonnegative integer that represents counts data.","Parameter3":"\u03bb","Description3":"Is similar to the mean, as in the Poisson distribution.","Parameter4":"\u03bd","Description4":"Is a dispersion parameter."},{"Name":"QUANTILE*7","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'EXPONENTIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*8","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'F'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"ndf","Description3":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter4":"ddf<","Description4":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter5":"nc>","Description5":"Is a numeric non-centrality parameter. Range: nc > =0."},{"Name":"QUANTILE*9","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GAMMA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*10","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GENPOISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"\u03b8","Description3":"\n Specifies a shape parameter.\n\n Range <10^5 and >0\n ","Parameter4":"\u03b7>","Description4":"\n Specifies a shape parameter.\n\n Range: \u22650 and <0.95\n "},{"Name":"QUANTILE*11","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a numeric random variable that denotes the number of failures before the first success. Range: m \u2265 0.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"QUANTILE*12","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'HYPERGEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"N","Description3":"Is an integer population size parameter. Range: N = 1, 2, ...","Parameter4":"R","Description4":"Is an integer number of items in the category of interest. Range: R = 0, 1, ..., N","Parameter5":"n<","Description5":"Is an integer sample size parameter. Range: n = 1, 2, ..., N","Parameter6":"o>","Description6":"Is an optional numeric odds ratio parameter. Range: o > 0."},{"Name":"QUANTILE*13","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LAPLACE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*14","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LOGISTIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*15","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LOGNORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*16","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NEGBINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a positive integer random variable that counts the number of failures. Range: m= 0, 1, ...","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is a numeric value that counts the number of successes. Range: n > 0."},{"Name":"QUANTILE*17","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"QUANTILE*18","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NORMALMIX'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"n","Description3":"Is the integer number of mixtures. Range: n = 1, 2, ...","Parameter4":"p","Description4":"Is the n proportions, p1, p2, ..., pn, where sum of p1 to pn is equal to 1. Range: p = 0, 1, ...","Parameter5":"m","Description5":"Is the n means, m1, m2, ...,mn.","Parameter6":"s","Description6":"Is the n standard deviations, s1, s2, ..., sn. Range: s > 0."},{"Name":"QUANTILE*19","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'PARETO'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"k>","Description4":"Is a numeric scale parameter. Default: 1. Range: k > 0."},{"Name":"QUANTILE*20","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'POISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"n","Description2":"Is an integer random variable. Range: n= 0, 1, ...","Parameter3":"m","Description3":"Is a numeric mean parameter. Range: m > 0."},{"Name":"QUANTILE*21","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'T'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"t","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter."},{"Name":"QUANTILE*22","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'TWEEDIE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"\n Is a random variable.\n\n Range: y \u22650\n Notes: This argument is required.\n When y>1, y is numeric. When p=1, y is an integer.\n ","Parameter3":"p<","Description3":"\n Is the power parameter.\n\n Range: p \u22651\n Note: This argument is required.\n ","Parameter4":"\u03bc","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n ","Parameter5":"\u03c6>","Description5":"\n Is the dispersion parameter.\n\n Default: 1\n Range: \u03c6>0\n "},{"Name":"QUANTILE*23","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'UNIFORM'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"l","Description3":"Is the numeric left location parameter. Default: 0.","Parameter4":"r","Description4":"Is the numeric right location parameter. Default: 1. Range: r>l."},{"Name":"QUANTILE*24","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'WALD'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"\u03bb<","Description3":"\n Is a numeric shape parameter.\n\n Range: \u03bb > 0\n ","Parameter4":"\u03bc>","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n "},{"Name":"QUANTILE*25","Definition":"The QUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'WEIBULL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*1","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BERNOULLI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"SQUANTILE*2","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BETA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"b<","Description4":"Is a numeric shape parameter. Range: b > 0.","Parameter5":"l","Description5":"Is the numeric left location parameter. Default: 0.","Parameter6":"r>","Description6":"Is the right location parameter. Default: 0. Range: r>l."},{"Name":"SQUANTILE*3","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'BINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is an integer random variable that counts the number of successes.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is an integer parameter that counts the number of independent Bernoulli trials."},{"Name":"SQUANTILE*4","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CAUCHY'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*5","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CHISQUARE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter. Range: nc \u2265 0."},{"Name":"SQUANTILE*6","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'CONMAXPOI'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"Is a nonnegative integer that represents counts data.","Parameter3":"\u03bb","Description3":"Is similar to the mean, as in the Poisson distribution.","Parameter4":"\u03bd","Description4":"Is a dispersion parameter."},{"Name":"SQUANTILE*7","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'EXPONENTIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*8","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'F'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"ndf","Description3":"Is a numeric numerator degrees of freedom parameter. Range: ndf > 0.","Parameter4":"ddf<","Description4":"Is a numeric denominator degrees of freedom parameter. Range: ddf > 0.","Parameter5":"nc>","Description5":"Is a numeric non-centrality parameter. Range: nc > =0."},{"Name":"SQUANTILE*9","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GAMMA'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*10","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GENPOISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"\u03b8","Description3":"\n Specifies a shape parameter.\n\n Range <10^5 and >0\n ","Parameter4":"\u03b7>","Description4":"\n Specifies a shape parameter.\n\n Range: \u22650 and <0.95\n "},{"Name":"SQUANTILE*11","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'GEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a numeric random variable that denotes the number of failures before the first success. Range: m \u2265 0.","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1."},{"Name":"SQUANTILE*12","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'HYPERGEOMETRIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is an integer random variable.","Parameter3":"N","Description3":"Is an integer population size parameter. Range: N = 1, 2, ...","Parameter4":"R","Description4":"Is an integer number of items in the category of interest. Range: R = 0, 1, ..., N","Parameter5":"n<","Description5":"Is an integer sample size parameter. Range: n = 1, 2, ..., N","Parameter6":"o>","Description6":"Is an optional numeric odds ratio parameter. Range: o > 0."},{"Name":"SQUANTILE*13","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LAPLACE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*14","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LOGISTIC'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*15","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'LOGNORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*16","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NEGBINOMIAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"m","Description2":"Is a positive integer random variable that counts the number of failures. Range: m= 0, 1, ...","Parameter3":"p","Description3":"Is a numeric probability of success. Range: 0 \u2264 p \u2264 1.","Parameter4":"n","Description4":"Is a numeric value that counts the number of successes. Range: n > 0."},{"Name":"SQUANTILE*17","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NORMAL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x<","Description2":"Is a numeric random variable.","Parameter3":"\u03b8","Description3":"Is a numeric location parameter. Default: 0","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"SQUANTILE*18","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'NORMALMIX'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"n","Description3":"Is the integer number of mixtures. Range: n = 1, 2, ...","Parameter4":"p","Description4":"Is the n proportions, p1, p2, ..., pn, where sum of p1 to pn is equal to 1. Range: p = 0, 1, ...","Parameter5":"m","Description5":"Is the n means, m1, m2, ...,mn.","Parameter6":"s","Description6":"Is the n standard deviations, s1, s2, ..., sn. Range: s > 0."},{"Name":"SQUANTILE*19","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'PARETO'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"k>","Description4":"Is a numeric scale parameter. Default: 1. Range: k > 0."},{"Name":"SQUANTILE*20","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'POISSON'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"n","Description2":"Is an integer random variable. Range: n= 0, 1, ...","Parameter3":"m","Description3":"Is a numeric mean parameter. Range: m > 0."},{"Name":"SQUANTILE*21","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'T'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"t","Description2":"Is a numeric random variable.","Parameter3":"df<","Description3":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter4":"nc>","Description4":"Is an optional numeric non-centrality parameter."},{"Name":"SQUANTILE*22","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'TWEEDIE'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"y","Description2":"\n Is a random variable.\n\n Range: y \u22650\n Notes: This argument is required.\n When y>1, y is numeric. When p=1, y is an integer.\n ","Parameter3":"p<","Description3":"\n Is the power parameter.\n\n Range: p \u22651\n Note: This argument is required.\n ","Parameter4":"\u03bc","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n ","Parameter5":"\u03c6>","Description5":"\n Is the dispersion parameter.\n\n Default: 1\n Range: \u03c6>0\n "},{"Name":"SQUANTILE*23","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'UNIFORM'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"l","Description3":"Is the numeric left location parameter. Default: 0.","Parameter4":"r","Description4":"Is the numeric right location parameter. Default: 1. Range: r>l."},{"Name":"SQUANTILE*24","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'WALD'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"\u03bb<","Description3":"\n Is a numeric shape parameter.\n\n Range: \u03bb > 0\n ","Parameter4":"\u03bc>","Description4":"\n Is the mean.\n\n Default: 1\n Range: \u03bc > 0\n "},{"Name":"SQUANTILE*25","Definition":"The SQUANTILE function computes the quantile from the specified continuous or discrete distribution, based on the probability value that is provided.","Parameter1":"'WEIBULL'","Description1":"Is a character constant, variable, or expression that identifies the distribution.","Parameter2":"x","Description2":"Is a numeric random variable.","Parameter3":"a<","Description3":"Is a numeric shape parameter. Range: a > 0.","Parameter4":"\u03bb>","Description4":"Is a numeric scale parameter. Default: 1. Range: \u03bb > 0."},{"Name":"PEEK","Definition":"Stores the contents of a memory address in a numeric variable on a 32-bit platform.","Parameter1":"address<","Description1":"Is a numeric constant, variable, or expression that specifies the memory address.","Parameter2":"length>","Description2":"Is a numeric constant, variable, or expression that specifies the data length. Range: 2 to 8."},{"Name":"PEEKC","Definition":"Stores the contents of a memory address in a character variable on a 32-bit platform.","Parameter1":"address<","Description1":"Is a numeric constant, variable, or expression that specifies the memory address.","Parameter2":"length>","Description2":"Is a numeric constant, variable, or expression that specifies the data length. Default: 8. Range: 1 to 32,767."},{"Name":"PEEKCLONG","Definition":"Stores the contents of a memory address in a character variable on 32-bit and 64-bit platforms.","Parameter1":"address<","Description1":"Specifies a character constant, variable, or expression that contains the binary pointer address.","Parameter2":"length>","Description2":"Is a numeric constant, variable, or expression that specifies the length of the character data. Default: 8. Range: 1 to 32,767."},{"Name":"PEEKLONG","Definition":"Stores the contents of a memory address in a numeric variable on 32-bit and 64-bit platforms.","Parameter1":"address<","Description1":"Specifies a character constant, variable, or expression that contains the binary pointer address.","Parameter2":"length>","Description2":"Is a numeric constant, variable, or expression that specifies the length of the character data. Default: 4 on 32-bit computers; 8 on 64-bit computers. Range: 1 -4 on 32-bit computers; 1-8 on 64-bit computers."},{"Name":"PERM","Definition":"Computes the number of permutations of n items that are taken r at a time.","Parameter1":"n<","Description1":"Is an integer that represents the total number of elements from which the sample is chosen.","Parameter2":"r>","Description2":"Is an integer value that represents the number of chosen elements. If r is omitted, the function returns the factorial of n. Restriction: r \u2264 n."},{"Name":"POINT","Definition":"Locates an observation that is identified by the NOTE function.","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that the OPEN function returns.","Parameter2":"note-id","Description2":"Is a numeric variable that specifies the identifier assigned to the observation by the NOTE function."},{"Name":"POISSON","Definition":"Returns the probability from a Poisson distribution.","Parameter1":"m","Description1":"Is a numeric mean parameter. Range: m \u2265 0.","Parameter2":"n","Description2":"Is an integer random variable. Range: n \u2265 0."},{"Name":"PROBBETA","Definition":"Returns the probability from a beta distribution.","Parameter1":"x","Description1":"Is a numeric random variable. Range: 0 \u2264 x \u2264 1.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a > 0.","Parameter3":"b","Description3":"Is a numeric shape parameter. Range: b > 0."},{"Name":"PROBBNML","Definition":"Returns the probability from a binomial distribution.","Parameter1":"p","Description1":"Is a numeric probability of success parameter. Range: 0 \u2264 p \u2264 1.","Parameter2":"n","Description2":"Is an integer number of independent Bernoulli trials parameter. Range: n > 0.","Parameter3":"m","Description3":"Is an integer number of successes random variable. Range: 0 \u2264 m \u2264 n."},{"Name":"PROBBNRM","Definition":"Returns a probability from a bivariate normal distribution.","Parameter1":"x","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"y","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"r","Description3":"Is a numeric correlation coefficient. Range: -1 \u2264 r \u2264 1."},{"Name":"PROBCHI","Definition":"Returns the probability from a chi-square distribution.","Parameter1":"x","Description1":"Is a numeric random variable. Range: x \u2265 0.","Parameter2":"df","Description2":"Is a numeric degrees of freedom parameter. Range: df \u2265 0.","Parameter3":"nc","Description3":"Is an optional numeric noncentrality parameter. Range: nc \u2265 0."},{"Name":"PROBF","Definition":"Returns the probability from an F distribution.","Parameter1":"x","Description1":"Is a numeric random variable. Range: x \u2265 0.","Parameter2":"ndf","Description2":"Is a numeric numerator degrees of freedom parameter. Range: ndf \u2265 0.","Parameter3":"ddf<","Description3":"Is a numeric denominator degrees of freedom parameter. Range: ddf \u2265 0.","Parameter4":"nc","Description4":"Is an optional numeric noncentrality parameter. Range: nc \u2265 0."},{"Name":"PROBGAM","Definition":"Returns the probability from a gamma distribution.","Parameter1":"x","Description1":"Is a numeric random variable. Range: x \u2265 0.","Parameter2":"a","Description2":"Is a numeric shape parameter. Range: a \u2265 0."},{"Name":"PROBHYPR","Definition":"Returns the probability from a hypergeometric distribution.","Parameter1":"N","Description1":"Is an integer population size parameter. Range: N \u2265 1.","Parameter2":"K","Description2":"Is an integer number of items in the category of interest parameter. Range: 0 \u2264 K \u2264 N.","Parameter3":"n","Description3":"Is an integer sample size parameter. Range: 0 \u2264 n \u2264 N.","Parameter4":"x<","Description4":"Is an integer random variable. Range: max(0, K + n-N) \u2264 n \u2264 min(K,n).","Parameter5":"r>","Description5":"Is an optional numeric odds ratio parameter. Range: r \u2265 0."},{"Name":"PROBIT","Definition":"Returns a quantile from the standard normal distribution.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 < p < 1."},{"Name":"PROBMC","Definition":"Returns a probability or a quantile from various distributions for multiple comparisons of means.","Parameter1":"distribution","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions: ANOM (Analysis of Means), DUNNETT1 (One-sided Dunnett), DUNNETT2 (Two-sided Dunnett), MAXMOD (Maximum Modulus), PARTRANGE (Partitioned Range), RANGE (Studentized Range), WILLIAMS.","Parameter2":"q","Description2":"Is the quantile from the distribution.","Parameter3":"prob","Description3":"Is the left probability from the distribution. Restriction: Either prob or q can be specified, but not both.","Parameter4":"df","Description4":"Is the degrees of freedom.","Parameter5":"nparms<","Description5":"Is the number of treatments. For DUNNETT1 and DUNNETT2, the control group is not counted.","Parameter6":"parameters>","Description6":"Is an optional set of nparms parameters that must be specified to handle the case of unequal sample sizes. The meaning of parameters depends on the value of distribution. If parameters is not specified, equal sample sizes are assumed, which is usually the case for a null hypothesis."},{"Name":"PROBNEGB","Definition":"Returns the probability from a negative binomial distribution.","Parameter1":"p","Description1":"Is a numeric probability of success parameter. Range: 0 \u2264 p \u2264 1.","Parameter2":"n","Description2":"Is an integer number of successes parameter. Range: n \u2265 0.","Parameter3":"m","Description3":"Is a positive integer random variable, the number of failures. Range: m \u2265 0."},{"Name":"PROBNORM","Definition":"Returns the probability from the standard normal distribution.","Parameter1":"x","Description1":"Is a numeric random variable."},{"Name":"PROBT","Definition":"Returns the probability from a t distribution.","Parameter1":"x","Description1":"Is a numeric random variable.","Parameter2":"df<","Description2":"Is a numeric degrees of freedom parameter. Range: df \u2265 0.","Parameter3":"nc>","Description3":"Is an optional numeric noncentrality parameter."},{"Name":"PROPCASE","Definition":"Converts all words in an argument to proper case.","Parameter1":"argument<","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"delimiter(s)>","Description2":"Specifies one or more delimiters that are enclosed in quotation marks. The default delimiters are blank, forward slash, hyphen, open parenthesis, period, and tab."},{"Name":"PRXCHANGE","Definition":"Performs a pattern-matching replacement.","Parameter1":"perl-regular-expression | regular-expression-id","Description1":"Specifies either a character constant, variable, or expression with a value that is a Perl regular expression, or a numeric variable with a value that is a pattern identifier that is returned from the PRXPARSE function.","Parameter2":"times","Description2":"Is a numeric constant, variable, or expression that specifies the number of times to search for a match and replace a matching pattern. Use -1 to do replacements until the end of the source.","Parameter3":"source","Description3":"Specifies a character constant, variable, or expression that you want to search."},{"Name":"PRXMATCH","Definition":"Searches for a pattern match and returns the position at which the pattern is found.","Parameter1":"regular-expression-id | perl-regular-expression","Description1":"Specifies either a numeric variable with a value that is a pattern identifier that is returned from the PRXPARSE function, or a character constant, variable, or expression with a value that is a Perl regular expression.","Parameter2":"source","Description2":"Specifies a character constant, variable, or expression that you want to search."},{"Name":"PRXPAREN","Definition":"Returns the last bracket match for which there is a match in a pattern.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is an identification number that is returned by the PRXPARSE function."},{"Name":"PRXPARSE","Definition":"Compiles a Perl regular expression (PRX) that can be used for pattern matching of a character value.","Parameter1":"perl-regular-expression","Description1":"Specifies a character value that is a Perl regular expression."},{"Name":"PRXPOSN","Definition":"Returns a character string that contains the value for a capture buffer.","Parameter1":"regular-expression-id","Description1":"Specifies a numeric variable with a value that is a pattern identifier that is returned by the PRXPARSE function.","Parameter2":"capture-buffer","Description2":"Is a numeric constant, variable, or expression that identifies the capture buffer for which to retrieve a value: 0 returns the entire match; between 1 and the number of open parentheses returns the value for that capture buffer; greater than the number of open parentheses returns a missing value.","Parameter3":"source","Description3":"Specifies the text from which to extract capture buffers."},{"Name":"PTRLONGADD","Definition":"Returns the pointer address as a character variable on 32-bit and 64-bit platforms.","Parameter1":"pointer<","Description1":"Is a character constant, variable, or expression that specifies the pointer address.","Parameter2":"amount>","Description2":"Is a numeric constant, variable, or expression that specifies the amount to add to the address."},{"Name":"PUT","Definition":"Returns a value using a specified format.","Parameter1":"source","Description1":"Identifies the constant, variable, or expression whose value you want to reformat.","Parameter2":"format.","Description2":"Contains the SAS format that you want applied to the value that is specified in the source. The format. must be of the same type as the source."},{"Name":"PUTC","Definition":"Enables you to specify a character format at run time.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to which you want to apply the format.","Parameter2":"format.<","Description2":"Is a character constant, variable, or expression with a value that is the character format you want to apply to source.","Parameter3":"w>","Description3":"Is a numeric constant, variable, or expression that specifies a width to apply to the format. It overrides any width specification in the format. argument."},{"Name":"PUTN","Definition":"Enables you to specify a numeric format at run time.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression to which you want to apply the format.","Parameter2":"format.<","Description2":"Is a character constant, variable, or expression with a value that is the numeric format you want to apply to source.","Parameter3":"w<","Description3":"Is a numeric constant, variable, or expression that specifies a width to apply to the format. It overrides any width specification in the format. argument.","Parameter4":"d>>","Description4":"Is a numeric constant, variable, or expression that specifies the number of decimal places to use."},{"Name":"PVP","Definition":"Returns the present value for a periodic cash flow stream (such as a bond), with repayment of principal at maturity.","Parameter1":"A","Description1":"Specifies the par value. Range: A > 0.","Parameter2":"c","Description2":"Specifies the nominal per-year coupon rate, expressed as a fraction. Range: 0 \u2264 c \u2264 1.","Parameter3":"n","Description3":"Specifies the number of coupons per year. Range: n > 0 and is an integer.","Parameter4":"K","Description4":"Specifies the number of remaining coupons. Range: K > 0 and is an integer.","Parameter5":"ko","Description5":"Specifies the time from the present date to the first coupon date, expressed in terms of the number of years. Range: 0 \u2264 ko \u2264 1/n.","Parameter6":"y","Description6":"Specifies the nominal per-year yield-to-maturity, expressed as a fraction. Range: y > 0."},{"Name":"TR","Definition":"Returns the quarter of the year from a SAS date value.","Parameter1":"date","Description1":"Specifies a numeric constant, variable, or expression that represents a SAS date value."},{"Name":"QUANTILE","Definition":"Returns the quantile from a distribution when you specify the left probability (CDF).","Parameter1":"distribution","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\nNote: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"probability","Description2":"Is a numeric constant, variable, or expression that specifies the value of a random variable.","Parameter3":"parameter-1, ..., parameter-k","Description3":"Are optional shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"QUOTE","Definition":"Adds double quotation marks to a character value.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"RANBIN","Definition":"Returns a random variate from a binomial distribution.","Parameter1":"seed","Description1":"Is a numeric constant, variable, or expression with an integer value. If seed \u2264 0, the time of day is used to initialize the seed stream. Range: seed<(2\u00b3\u00b9)-1.","Parameter2":"n","Description2":"Is a numeric constant, variable, or expression with an integer value that specifies the number of independent Bernoulli trials parameter. Range: n > 0.","Parameter3":"p","Description3":"Is a numeric constant, variable, or expression that specifies the probability of success. Range: 0 < p < 1."},{"Name":"RANCAU","Definition":"Returns a random variate from a Cauchy distribution.","Parameter1":"seed","Description1":"Is a numeric constant, variable, or expression with an integer value. If seed \u2264 0, the time of day is used to initialize the seed stream. Range: seed<(2\u00b3\u00b9)-1."},{"Name":"RAND","Definition":"Generates random numbers from a distribution that you specify.","Parameter1":"dist","Description1":"Is a character constant, variable, or expression that identifies the distribution. Refer to SAS documentation for valid distributions (eg. 'NORMAL', 'CHISQUARE', 'F', 'T', etc.).","Parameter2":"parm-1, ...,parm-k","Description2":"Are shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"RANEXP","Definition":"Returns a random variate from an exponential distribution.","Parameter1":"seed","Description1":"Is a numeric constant, variable, or expression with an integer value. If seed \u2264 0, the time of day is used to initialize the seed stream. Range: seed<(2\u00b3\u00b9)-1."},{"Name":"RANGAM","Definition":"Returns a random variate from a gamma distribution.","Parameter1":"seded","Description1":"Is a numeric constant, variable, or expression with an integer value. If seed \u2264 0, the time of day is used to initialize the seed stream. Range: seed<(2\u00b3\u00b9)-1.","Parameter2":"a","Description2":"Is a numeric constant, variable, or expression that specifies the shape parameter. Range: a > 0 "},{"Name":"RANGE","Definition":"Returns the range of the nonmissing values. At least one nonmissing argument is required.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"RANK","Definition":"Returns the position of a character in the ASCII or EBCDIC collating sequence.","Parameter1":"x","Description1":"Specifies a character constant, variable, or expression."},{"Name":"RANUNI","Definition":"Returns a random variate from a uniform distribution.","Parameter1":"seed","Description1":"Is a numeric constant, variable, or expression with an integer value. If seed \u2264 0, the time of day is used to initialize the seed stream. Range: seed<(2\u00b3\u00b9)-1."},{"Name":"RENAME","Definition":"Renames a member of a SAS library, an entry in a SAS catalog, an external file, or a directory.","Parameter1":"old-name","Description1":"Specifies a character constant, variable, or expression that is the current name of a member of a SAS library, an entry in a SAS catalog, an external file, or an external directory.","Parameter2":"new-name<","Description2":"Specifies a character constant, variable, or expression that is the new one-level name for the library member, catalog entry, external file, or directory.","Parameter3":"type","Description3":"Is a character constant, variable, or expression that specifies the type of element to rename. Values: 'ACCESS' (SAS/ACCESS), 'CATALOG', 'DATA', 'VIEW', 'FILE'. Default: 'DATA'","Parameter4":"description<","Description4":"Specifies a character constant, variable, or expression that is the description of a catalog entry. You can specify description only when the value of type is CATALOG. Description can be a null argument.","Parameter5":"password<","Description5":"Is a character constant, variable, or expression that specifies the password for the data set that is being renamed. Password can be a null argument.","Parameter6":"generation>>>>","Description6":"Is a numeric constant, variable, or expression that specifies the generation number of the data set that is being renamed. Generation can be a null argument."},{"Name":"REPEAT","Definition":"Returns a character value that consists of the first argument repeated n+1 times.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"n","Description2":"Specifies the number of times to repeat argument. Restriction: n must be greater than or equal to 0."},{"Name":"RESOLVE","Definition":"Returns the resolved value of the argument after it has been processed by the macro facility.","Parameter1":"argument","Description1":"Is a character constant, variable, or expression with a value that is a macro expression."},{"Name":"REVERSE","Definition":"Reverses a character string.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"REWIND","Definition":"Positions the data set pointer at the beginning of a SAS data set.","Parameter1":"data-set-id","Description1":"Is a numeric variable that specifies the data set identifier that the OPEN function returns."},{"Name":"RIGHT","Definition":"Right aligns a character expression.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"RMS","Definition":"Returns the root mean square of the nonmissing arguments.","Parameter1":"argument-1<","Description1":"Is a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF.","Parameter2":"..., argument-n>","Description2":"Is a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF."},{"Name":"ROUND","Definition":"Rounds the first argument to the nearest multiple of the second argument, or to the nearest integer when the second argument is omitted.","Parameter1":"argument<","Description1":"Is a numeric constant, variable, or expression to be rounded.","Parameter2":"rounding-unit>","Description2":"Is a positive, numeric constant, variable, or expression that specifies the rounding unit."},{"Name":"ROUNDE","Definition":"Rounds the first argument to the nearest multiple of the second argument, and returns an even multiple when the first argument is halfway between the two nearest multiples.","Parameter1":"argument<","Description1":"Is a numeric constant, variable, or expression to be rounded.","Parameter2":"rounding-unit>","Description2":"Is a positive, numeric constant, variable, or expression that specifies the rounding unit."},{"Name":"ROUNDZ","Definition":"Rounds the first argument to the nearest multiple of the second argument, using zero fuzzing.","Parameter1":"argument<","Description1":"Is a numeric constant, variable, or expression to be rounded.","Parameter2":"rounding-unit>","Description2":"Is a positive, numeric constant, variable, or expression that specifies the rounding unit."},{"Name":"SAVING","Definition":"Returns the future value of a periodic saving.","Parameter1":"f","Description1":"Is numeric, the future amount (at the end of n periods). Range: f \u2265 0.","Parameter2":"p","Description2":"Is numeric, the fixed periodic payment. Range: p \u2265 0.","Parameter3":"r","Description3":"Is numeric, the periodic interest rate expressed as a decimal. Range: r \u2265 0.","Parameter4":"n","Description4":"Is an integer, the number of compounding periods. Range: n \u2265 0."},{"Name":"SCAN*1","Definition":"Returns the nth word from a character string.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"count<","Description2":"Is a nonzero numeric constant, variable, or expression that has an integer value that specifies the number of the word in the character string that you want SCAN to select. For example, a value of 1 indicates the first word.","Parameter3":"charlist<","Description3":"Specifies an optional character expression that initializes a list of characters. By default, all characters in charlist are used as delimiters.","Parameter4":"modifier(s)>>","Description4":"Specifies a character constant, a variable, or an expression in which each non-blank character modifies the action of the SCAN function. Refer to SAS documentation for the list of valid modifiers."},{"Name":"SCAN*2","Definition":"This CALL SCAN routine returns the position and length of the nth word from a character string.","Parameter1":"<string>","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"count","Description2":"Is a non-zero numeric constant, variable, or expression that has an integer value that specifies the number of the word in the character string that you want the CALL SCAN routine to select.","Parameter3":"position","Description3":"Specifies a numeric variable in which the position of the word is returned. If count exceeds the number of words in the string, then the value that is returned in position is zero. If count is zero or missing, then the value that is returned in position is missing.","Parameter4":"length <","Description4":"Specifies a numeric variable in which the length of the word is returned. If count exceeds the number of words in the string, then the value that is returned in length is zero. If count is zero or missing, then the value that is returned in length is missing.","Parameter5":"<charlist> <","Description5":"Specifies an optional character constant, variable, or expression that initializes a list of characters. This list determines which characters are used as the delimiters that separate words.","Parameter6":"<modifier>>>","Description6":"Specifies a character constant, variable, or expression in which each non-blank character modifies the action of the CALL SCAN routine. Blanks are ignored."},{"Name":"SCAN*3","Definition":"Searches for a word and masks special characters and mnemonic operators.","Parameter1":"argument","Description1":"Is a character string or a text expression. If argument contains a special character or mnemonic operator, use %QSCAN.","Parameter2":"n<","Description2":"Is an integer or a text expression that yields an integer, which specifies the position of the word to return.","Parameter3":"delimiters>","Description3":"Specifies an optional list of one or more characters that separate \"words\" or text expressions that yield one or more characters. Possible delimiters: blank . < ( + & ! $ * ) ; ^ - / , % |."},{"Name":"SCANQ*1","Definition":"Returns the nth word from a character expression, ignoring delimiters that are enclosed in quotation marks.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"n<","Description2":"Is a numeric constant, variable, or expression that has an integer value that specifies the number of the word in the character string that you want QSCAN to select. If n is positive, CALL SCANQ counts words from left to right. If n is negative, SCANQ counts words from right to left. If n is zero, or |n| is greater than the number of words in the character string, CALL SCANQ returns a position and length of zero.","Parameter3":"delimiter(s)<","Description3":"Specifies an optional character constant, variable, or expression that specifies the characters that you want SCANQ to use to separate words in the character string. Restriction: You cannot use single or double quotation marks as delimiters. Default: If you omit delimiter, SCANQ uses white space characters (blank, horizontal and vertical tab, carriage return, line feed, and form feed) as delimiters."},{"Name":"SCANQ*2","Definition":"Returns the position and length of a given word from a character expression, and ignores delimiters that are enclosed in quotation marks.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"n","Description2":"Is a numeric constant, variable, or expression that has an integer value that specifies the number of the word in the character string that you want QSCAN to select. If n is positive, CALL SCANQ counts words from left to right. If n is negative, SCANQ counts words from right to left. If n is zero, or |n| is greater than the number of words in the character string, CALL SCANQ returns a position and length of zero.","Parameter3":"position","Description3":"Specifies a numeric variable in which the position of the word is returned.","Parameter4":"length<","Description4":"Specifies a numeric variable in which the length of the word is returned.","Parameter5":"delimiter(s)<","Description5":"Specifies an optional character constant, variable, or expression that specifies the characters that you want SCANQ to use to separate words in the character string. Restriction: You cannot use single or double quotation marks as delimiters. Default: If you omit delimiter, SCANQ uses white space characters (blank, horizontal and vertical tab, carriage return, line feed, and form feed) as delimiters."},{"Name":"SDF","Definition":"Returns a survival function.","Parameter1":"distribution","Description1":"Is a character string that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"quantile","Description2":"Is a numeric constant, variable or expression that specifies the value of a random variable.","Parameter3":"parameter-1, ..., parameter-k","Description3":"Are optional shape, location, or scale parameters appropriate for the specific distribution."},{"Name":"SECOND","Definition":"Returns the second from a SAS time or datetime value.","Parameter1":"time | datetime","Description1":"Is a numeric constant, variable, or expression with a value that represents a SAS time or datetime value."},{"Name":"SIGN","Definition":"Returns the sign of a value.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"SIN","Definition":"Returns the sine.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression and is expressed in radians."},{"Name":"SINH","Definition":"Returns the hyperbolic sine.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"SKEWNESS","Definition":"Returns the skewness of the nonmissing arguments. At least 3 arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"argument-3<","Description3":"Specifies a numeric constant, variable, or expression.","Parameter4":"...argument-n>","Description4":"Specifies a numeric constant, variable, or expression."},{"Name":"SLEEP","Definition":"For a specified period of time, suspends the execution of a program that invokes this function or call routine.","Parameter1":"n","Description1":"Is a numeric constant, variable, or expression that specifies the number of units of time for which you want to suspend execution of a program. Range: n \u2265 0 ","Parameter2":"unit","Description2":"Is a numeric constant, variable, or expression that specifies the unit of time, as a power of 10, which is applied to n. For example, 1 corresponds to a second, and .001 to a millisecond."},{"Name":"SMALLEST","Definition":"Returns the kth smallest nonmissing value.","Parameter1":"k","Description1":"Is a numeric constant, variable, or expression that specifies which value to return.","Parameter2":"value-1<, value-2 ...>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"SOUNDEX","Definition":"Encodes a string to facilitate searching.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"SPEDIS","Definition":"Determines the likelihood of two words matching, expressed as the asymmetric spelling distance between the two words.","Parameter1":"query","Description1":"Identifies the word to query for the likelihood of a match. SPEDIS removes trailing blanks before comparing the value.","Parameter2":"keyword","Description2":"Specifies a target word for the query. SPEDIS removes trailing blanks before comparing the value."},{"Name":"SQRT","Definition":"Returns the square root of a value.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Argument must be nonnegative."},{"Name":"STD","Definition":"Returns the standard deviation of the nonmissing arguments. At least two nonmissing arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2<","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"...argument-n>","Description3":"Specifies a numeric constant, variable, or expression."},{"Name":"STDERR","Definition":"Returns the standard error of the mean of the nonmissing arguments. At least two nonmissing arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"argument-2<","Description2":"Specifies a numeric constant, variable, or expression.","Parameter3":"...argument-n>","Description3":"Specifies a numeric constant, variable, or expression."},{"Name":"STFIPS","Definition":"Converts state postal codes to FIPS state codes.","Parameter1":"postal-code","Description1":"Specifies a character expression that contains the two-character standard state postal code. Characters can be mixed case. The function ignores trailing blanks, but generates an error if the expression contains leading blanks."},{"Name":"STNAME","Definition":"Converts state postal codes to uppercase state names.","Parameter1":"postal-code","Description1":"Specifies a character expression that contains the two-character standard state postal code. Characters can be mixed case. The function ignores trailing blanks, but generates an error if the expression contains leading blanks."},{"Name":"STNAMEL","Definition":"Converts state postal codes to mixed case state names.","Parameter1":"postal-code","Description1":"Specifies a character expression that contains the two-character standard state postal code. Characters can be mixed case. The function ignores trailing blanks, but generates an error if the expression contains leading blanks."},{"Name":"STRIP","Definition":"Returns a character string with all leading and trailing blanks removed.","Parameter1":"string","Description1":"Is a character constant, variable, or expression."},{"Name":"SUBPAD","Definition":"Returns a substring that has a length you specify, using blank padding if necessary.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"position<","Description2":"Is a positive integer that specifies the position of the first character in the substring.","Parameter3":"length>","Description3":"Is a non-negative integer that specifies the length of the substring. If you do not specify length, the SUBPAD function returns the substring that extends from the position that you specify to the end of the string."},{"Name":"SUBSTR*1","Definition":"Extracts a substring from an argument. Appropriate for a SUBSTR (right of =) function, of the form <variable=> SUBSTR(string, position<,length>.)","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"position<","Description2":"Specifies a numeric constant, variable, or expression that is the beginning character position.","Parameter3":"length>","Description3":"Specifies a numeric constant, variable, or expression that is the length of the substring to extract."},{"Name":"SUBSTR*2","Definition":"Replaces character value contents. Appropriate for a SUBSTR (left of =) function, of the form SUBSTR(variable, position<,length>)=characters-to-replace.","Parameter1":"variable","Description1":"Specifies a character variable.","Parameter2":"position<","Description2":"Specifies a numeric constant, variable, or expression that is the beginning character position.","Parameter3":"length>","Description3":"Specifies a numeric constant, variable, or expression that is the length of the substring that will be replaced."},{"Name":"SUBSTR*3","Definition":"%SUBSTR produces a substring of a character string.","Parameter1":"argument","Description1":"Is a character string or a text expression.","Parameter2":"position<","Description2":"Is an integer or an expression (text, logical, or arithmetic) that yields an integer, which specifies the position of the first character in the substring.","Parameter3":"length>","Description3":"Is an optional integer or an expression (text, logical, or arithmetic) that yields an integer that specifies the number of characters in the substring."},{"Name":"QSUBSTR","Definition":"%QSUBSTR produces a substring of a character string, masking special characters and mnemonic operators.","Parameter1":"argument","Description1":"Is a character string or a text expression that might contain special characters and mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN.","Parameter2":"position<","Description2":"Is an integer or an expression (text, logical, or arithmetic) that yields an integer, which specifies the position of the first character in the substring.","Parameter3":"length>","Description3":"Is an optional integer or an expression (text, logical, or arithmetic) that yields an integer that specifies the number of characters in the substring."},{"Name":"SUBSTRN","Definition":"Returns a substring, allowing a result with a length of zero.","Parameter1":"string","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"position<","Description2":"Is an integer that specifies the position of the first character in the substring.","Parameter3":"length","Description3":"Is an integer that specifies the length of the substring. If you do not specify length, the SUBSTRN function returns the substring that extends from the position that you specify to the end of the string."},{"Name":"SUM","Definition":"Returns the sum of the nonmissing arguments.","Parameter1":"argument, argument, ...","Description1":"Specifies a numeric constant, variable, or expression. If all the arguments have missing values, the result is a missing value."},{"Name":"SUMABS","Definition":"Returns the sum of the absolute values of the non-missing arguments.","Parameter1":"value-1<","Description1":"Specifies a numeric expression.","Parameter2":"value-2 ...>","Description2":"Specifies a numeric expression."},{"Name":"SYMEXIST","Definition":"Returns an indication of the existence of a macro variable.","Parameter1":"argument","Description1":"Can be one of the following items: (1) the name of a macro variable within double quotation marks but without an ampersand; (2) the name of a DATA step character variable, specified with no quotation marks, which contains a macro variable name; (3) a character expression that constructs a macro variable name."},{"Name":"SYMGET","Definition":"Returns the value of a macro variable during DATA step execution.","Parameter1":"argument","Description1":"Can be one of the following items: (1) the name of a macro variable within double quotation marks but without an ampersand; (2) the name of a DATA step character variable, specified with no quotation marks, which contains a macro variable name; (3) a character expression that constructs a macro variable name."},{"Name":"SYMGLOBL","Definition":"Returns an indication of whether a macro variable is in global scope to the DATA step during DATA step execution.","Parameter1":"argument","Description1":"Can be one of the following items: (1) the name of a macro variable within double quotation marks but without an ampersand; (2) the name of a DATA step character variable, specified with no quotation marks, which contains a macro variable name; (3) a character expression that constructs a macro variable name."},{"Name":"SYMLOCAL","Definition":"Returns an indication of whether a macro variable is in local scope to the DATA step during DATA step execution.","Parameter1":"argument","Description1":"Can be one of the following items: (1) the name of a macro variable within double quotation marks but without an ampersand; (2) the name of a DATA step character variable, specified with no quotation marks, which contains a macro variable name; (3) a character expression that constructs a macro variable name."},{"Name":"SYSGET","Definition":"Returns the value of the specified operating environment variable.","Parameter1":"operating-environment-variable","Description1":"Is a character constant, variable, or expression with a value that is the name of an operating environment variable. The case of operating-environment-variable must agree with the case that is stored in the operating environment. Trailing blanks in the argument of SYSGET are significant. Use the TRIM function to remove them."},{"Name":"SYSMSG","Definition":"Returns error or warning message text from processing the last data set or external file function."},{"Name":"SYSPARM","Definition":"Returns the system parameter string."},{"Name":"SYSPROCESSID","Definition":"Returns the process ID of the current process."},{"Name":"SYSPROCESSNAME","Definition":"Returns the process name that is associated with a given process ID, or returns the name of the current process.","Parameter1":"<process_id>","Description1":"Specifies a 32-character hexadecimal process id."},{"Name":"SYSPROD","Definition":"Determines whether a product is licensed.","Parameter1":"product-name","Description1":"Specifies a character constant, variable, or expression with a value that is the name of a SAS product."},{"Name":"SYSRC","Definition":"Returns a system error number."},{"Name":"SYSTEM","Definition":"Issues an operating environment command during a SAS session, and returns the system return code.","Parameter1":"command","Description1":"Specifies any of the following: a system command that is enclosed in quotation marks (explicit character string), an expression whose value is a system command, or the name of a character variable whose value is a system command that is executed."},{"Name":"TAN","Definition":"Returns the tangent.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression and is expressed in radians."},{"Name":"TANH*1","Definition":"Returns the hyperbolic tangent.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression."},{"Name":"TANH*2","Definition":"This CALL TANH routine returns the hyperbolic tangent.","Parameter1":"argument-1<","Description1":"Specifies a numeric variable. Do not use a constant or a SAS expression because the CALL routine is unable to update these arguments.","Parameter2":"..., argument-n>","Description2":"Specifies a numeric variable. Do not use a constant or a SAS expression because the CALL routine is unable to update these arguments."},{"Name":"TIME","Definition":"Returns the current time of day as a numeric SAS time value. \n \nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date and time values that are returned for this function are determined by the time zone."},{"Name":"TIMEPART","Definition":"Extracts a time value from a SAS datetime value.","Parameter1":"datetime","Description1":"Is a numeric constant, variable, or expression that represents a SAS datetime value."},{"Name":"TINV","Definition":"Returns a quantile from the t distribution.","Parameter1":"p","Description1":"Is a numeric probability. Range: 0 < p < 1","Parameter2":"df","Description2":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter3":"nc","Description3":"Is an optional numeric noncentrality parameter."},{"Name":"TNONCT","Definition":"Returns the value of the noncentrality parameter from the Student's t distribution.","Parameter1":"x","Description1":"Is a numeric random variable.","Parameter2":"df","Description2":"Is a numeric degrees of freedom parameter. Range: df > 0.","Parameter3":"prob","Description3":"Is a probability. Range: 0 < prob < 1","Parameter4":null,"Description4":null},{"Name":"TODAY","Definition":"Returns the current date as a numeric SAS date value. \n \nAlias: DATE \n\nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date and time values that are returned for this function are determined by the time zone."},{"Name":"TRANSLATE","Definition":"Replaces specific characters in a character string.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression that contains the original character string.","Parameter2":"to-1","Description2":"Specifies the characters that you want TRANSLATE to use as substitutes.","Parameter3":"from-1<","Description3":"Specifies the characters that you want TRANSLATE to replace.","Parameter4":", ...to-n, from-n>","Description4":"Additional to and from arguments."},{"Name":"TRANSTRN","Definition":"Replaces all occurrences of a substring found in a character string, allowing a zero-length replacement string.","Parameter1":"text","Description1":"Specifies the input string.","Parameter2":"from","Description2":"Specifies the string to be searched for.","Parameter3":"to","Description3":"Specifies what each occurrence of the from argument will be changed to."},{"Name":"TRANWRD","Definition":"Replaces or removes all occurrences of a substring in a character string.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression that you want to translate.","Parameter2":"target","Description2":"Specifies a character constant, variable, or expression that is searched for in source.","Parameter3":"replacement","Description3":"Specifies a character constant, variable, or expression that replaces target."},{"Name":"TRIGAMMA","Definition":"Returns the value of the trigamma function.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression. Nonpositive integers are invalid."},{"Name":"TRIM","Definition":"Removes trailing blanks from a character string, and returns one blank if the string is missing.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"QTRIM","Definition":"Removes trailing blanks from a character string, and returns one blank if the string is missing. QTRIM produces a result with special characters and mnemonic operators masked.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or text expression that might contain special characters and/or mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN."},{"Name":"TRIMN","Definition":"Removes trailing blanks from character expressions, and returns a string with a length of zero if the expression is missing.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"TRUNC","Definition":"Truncates a numeric value to a specified number of bytes.","Parameter1":"number","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"length","Description2":"Specifies an integer."},{"Name":"UNIFORM","Definition":"Returns a random variate from a uniform distribution.","Parameter1":"seed","Description1":"Is the seed value. A new value for seed is returned each time CALL RANUNI is executed. Range: seed < 2\u00b3\u00b9 - 1.","Parameter2":"x","Description2":"Is a numeric variable. A new value for the random variate x is returned each time CALL RANUNI is executed."},{"Name":"UPCASE","Definition":"Converts all letters in an argument to uppercase.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"QUPCASE","Definition":"Converts all letters in an argument to uppercase. %QUPCASE masks special characters and mnemonic operators in its result.","Parameter1":"character string | text expression","Description1":"Specifies a character constant, variable, or text expression that might contain special characters and/or mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN."},{"Name":"URLDECODE","Definition":"Returns a string that was decoded using the URL escape syntax.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"URLENCODE","Definition":"Returns a string that was encoded using the URL escape syntax.","Parameter1":"argument","Description1":"Specifies a character constant, variable, or expression."},{"Name":"USS","Definition":"Returns the uncorrected sum of squares of the nonmissing arguments. At least one nonmissing argument is required.","Parameter1":"argument-1<","Description1":"Specifies a numeric constant, variable, or expression.","Parameter2":"...argument-n>","Description2":"Specifies a numeric constant, variable, or expression."},{"Name":"UUIDGEN","Definition":"Returns the short or binary form of a Universal Unique Identifier (UUID).","Parameter1":"<max-warnings<","Description1":"Specifies an integer value that represents the maximum number of warnings that this function writes to the log. Default: 1.","Parameter2":"binary-result>>","Description2":"Specifies an integer value that indicates whether this function should return a binary result. Nonzero indicates a binary result should be returned. Zero indicates that a character result should be returned. Default: 0.","Parameter3":null,"Description3":null,"Parameter4":null,"Description4":null},{"Name":"VAR","Definition":"Returns the variance of the nonmissing arguments. At least two nonmissing arguments are required.","Parameter1":"argument-1","Description1":"Specifies a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF.","Parameter2":"argument-2<","Description2":"Specifies a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF.","Parameter3":"...argument-n>","Description3":"Specifies a numeric constant, variable, or expression. The argument list can consist of a variable list, which is preceded by OF."},{"Name":"VARFMT","Definition":"Returns the format that is assigned to a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VARINFMT","Definition":"Returns the informat that is assigned to a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VARLABEL","Definition":"Returns the label that is assigned to a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VARLEN","Definition":"Returns the length of a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VARNAME","Definition":"Returns the name of a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VARNUM","Definition":"Returns the number of a variable's position in a SAS data set.","Parameter1":"data-set-id","Description1":["Specifies the data set identifier that the OPEN function returns.",null],"Parameter2":"var-name","Description2":"Specifies the variable's name."},{"Name":"VARRAY","Definition":"Returns a value that indicates whether the specified name is an array.","Parameter1":"name","Description1":"Specifies a name that is expressed as a scalar or as an array reference."},{"Name":"VARRAYX","Definition":"Returns a value that indicates whether the value of the specified argument is an array.","Parameter1":"expression","Description1":"Specifies a character constant, variable, or expression. The value of the specified expression cannot denote an array reference."},{"Name":"VARTYPE","Definition":"Returns the data type of a SAS data set variable.","Parameter1":"data-set-id","Description1":"Specifies the data set identifier that the OPEN function returns.","Parameter2":"var-num","Description2":"Specifies the number of the variable's position in the SAS data set."},{"Name":"VERIFY","Definition":"Returns the position of the first character in a string that is not in any of several other strings.","Parameter1":"source","Description1":"Specifies a character constant, variable, or expression.","Parameter2":"excerpt-1<","Description2":"Specifies a character constant, variable, or expression. If you specify more than one excerpt, separate them with a comma.","Parameter3":"...excerpt-n>","Description3":"Specifies a character constant, variable, or expression. If you specify more than one excerpt, separate them with a comma."},{"Name":"VFORMAT","Definition":"Returns the format that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VFORMATD","Definition":"Returns the decimal value of the format that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VFORMATDX","Definition":"Returns the decimal value of the format that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VFORMATN","Definition":"Returns the format name that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VFORMATNX","Definition":"Returns the format name that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VFORMATW","Definition":"Returns the format width that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VFORMATWX","Definition":"Returns the format width that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VFORMATX","Definition":"Returns the format that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VINARRAY","Definition":"Returns a value that indicates whether the specified variable is a member of an array.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VINARRAYX","Definition":"Returns a value that indicates whether the value of the specified argument is a member of an array.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VINFORMAT","Definition":"Returns the informat that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VINFORMATD","Definition":"Returns the decimal value of the informat that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VINFORMATDX","Definition":"Returns the decimal value of the informat that is associated with the value of the specified variable.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VINFORMATN","Definition":"Returns the informat name that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VINFORMATNX","Definition":"Returns the informat name that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VINFORMATW","Definition":"Returns the informat width that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VINFORMATWX","Definition":"Returns the informat width that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VINFORMATX","Definition":"Returns the informat that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VLABEL","Definition":"Returns the label that is associated with the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VLABELX","Definition":"Returns the label that is associated with the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VLENGTH","Definition":"Returns the compile-time (allocated) size of the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VLENGTHX","Definition":"Returns the compile-time (allocated) size for the variable that has a name that is the same as the value of the argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VNAME*1","Definition":"Returns the name of the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VNAME*2","Definition":"Assigns a variable name as the value of a specified variable (variable-2).","Parameter1":"variable-1","Description1":"Specifies any SAS variable.","Parameter2":"variable-2","Description2":"Specifies any SAS character variable. Because SAS variable names can contain up to 32 characters, the length of variable-2 should be at least 32."},{"Name":"VNAMEX","Definition":"Validates the value of the specified argument as a variable name.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VTYPE","Definition":"Returns the type (character or numeric) of the specified variable.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VTYPEX","Definition":"Returns the type (character or numeric) for the value of the specified argument.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"VVALUE","Definition":"Returns the formatted value that is associated with the variable that you specify.","Parameter1":"var","Description1":"Specifies a variable that is expressed as a scalar or as an array reference. You cannot use an expression as an argument."},{"Name":"VVALUEX","Definition":"Returns the formatted value that is associated with the argument that you specify.","Parameter1":"expression","Description1":"Specifies a SAS character constant, variable, or expression that evaluates to a variable name. The value of the specified expression cannot denote an array reference."},{"Name":"WEEK","Definition":"Returns the week-number value.","Parameter1":"<sas-date>","Description1":"Specifies a SAS date value. If the SAS date argument is not specified, the WEEK function returns the week-number value of the current date.","Parameter2":"<'descriptor'>","Description2":"Specifies the value of the descriptor. The following descriptors can be specified in uppercase or lowercase characters: 'U' (Default; SAS date specified as number-of-week value in decimal number 0-53; Sunday first day of week); 'V' (SAS date specified as number-of-week value in decimal number 1-53; Monday first day of week); 'W' (SAS date specified as number-of-week value in decimal number 0-53; Monday first day of week);"},{"Name":"WEEKDAY","Definition":"From a SAS date value, returns an integer that corresponds to the day of the week.","Parameter1":"date","Description1":"Specifies a SAS expression that represents a SAS date value."},{"Name":"WHICHC","Definition":"Searches for a character value that is equal to the first argument, and returns the index of the first matching value.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the value to search for.","Parameter2":"value-1<","Description2":"Is a character constant, variable, or expression that specifies the value to be searched.","Parameter3":"value-2, ...>","Description3":"Is a character constant, variable, or expression that specifies the value to be searched."},{"Name":"WHICHN","Definition":"Searches for a numeric value that is equal to the first argument, and returns the index of the first matching value.","Parameter1":"string","Description1":"Is a character constant, variable, or expression that specifies the value to search for.","Parameter2":"value-1<","Description2":"Is a character constant, variable, or expression that specifies the value to be searched.","Parameter3":"value-2, ...>","Description3":"Is a character constant, variable, or expression that specifies the value to be searched."},{"Name":"YEAR","Definition":"Returns the year from a SAS date value.","Parameter1":"date","Description1":"Specifies a SAS expression that represents a SAS date value."},{"Name":"YIELDP","Definition":"Returns the yield-to-maturity for a periodic cash flow stream, such as a bond.","Parameter1":"A","Description1":"Specifies the face value. Range: A > 0.","Parameter2":"c","Description2":"Specifies the nominal annual coupon rate, expressed as a fraction. Range: 0 \u2264 c < 1.","Parameter3":"n","Description3":"Specifies the number of coupons per year. Range: n > 0.","Parameter4":"K","Description4":"Specifies the number of remaining coupons from settlement date to maturity. Range: K > 0 and is an integer.","Parameter5":"ko","Description5":"Specifies the time from settlement date to the next coupon as a fraction of the annual basis. Range: 0 < c \u2264 1/n.","Parameter6":"p","Description6":"Specifies the price with accrued interest. Range: p > 0."},{"Name":"YRDIF","Definition":"Returns the difference in years between two dates.","Parameter1":"sdate","Description1":"Specifies a SAS date value that identifies the starting date.","Parameter2":"edate","Description2":"Specifies a SAS date value that identifies the ending date.","Parameter3":"basis","Description3":"Identifies a character constant or variable that describes how SAS calculates the date difference in the securities industry. The following character strings are valid: '30/360' (30-day month and a 360-day year), 'ACT/ACT' (uses actual number of days between dates), 'ACT/360' (uses actual number of calendar days in a month, and 360 days for the year), 'ACT/365' (uses actual number of calendar days for each month, and 365 days for the year)."},{"Name":"YYQ","Definition":"Returns a SAS date value from year and quarter year values.","Parameter1":"year","Description1":"Specifies a two-digit or four-digit integer that represents the year. The YEARCUTOFF= system option defines the year value for two-digit dates.","Parameter2":"quarter","Description2":"Specifies the quarter of the year (1, 2, 3, or 4)."},{"Name":"ZIPCITY","Definition":"Returns a city name and the two-character postal code that corresponds to a zip code.","Parameter1":"zip-code","Description1":"Specifies a numeric or character expression that contains a five-digit zip code."},{"Name":"ZIPCITYDISTANCE","Definition":"Returns the geodetic distance between two zip code locations.","Parameter1":["zip-code-1","zip-code-2"],"Description1":["Specifies a numeric or character expression that contains the zip code of a location in the United States of America.","Specifies a numeric or character expression that contains the zip code of a location in the United States of America."]},{"Name":"ZIPFIPS","Definition":"Converts zip codes to two-digit FIPS codes.","Parameter1":"zip-code","Description1":"Specifies a numeric or character expression that contains a five-digit zip code."},{"Name":"ZIPNAME","Definition":"Converts zip codes to uppercase state names.","Parameter1":"zip-code","Description1":"Specifies a numeric or character expression that contains a five-digit zip code."},{"Name":"ZIPNAMEL","Definition":"Converts zip codes to mixed case state names.","Parameter1":"zip-code","Description1":"Specifies a numeric or character expression that contains a five-digit zip code."},{"Name":"ZIPSTATE","Definition":"Converts zip codes to two-character state postal codes.","Parameter1":"zip-code","Description1":"Specifies a numeric or character expression that contains a five-digit zip code."},{"Name":"ASCEBC","Definition":"Converts an input character string from ASCII to EBCDIC.","Parameter1":"in-string","Description1":"Is any ASCII string, and can be a character variable, a character literal enclosed in double quotation marks, or another character expression. The value of in-string is limited to 200 characters."},{"Name":"EBCASC","Definition":"Converts an input character string from EBCDIC to ASCII.","Parameter1":"in-string","Description1":"Is any EBCDIC string, and can be a character variable, a character literal enclosed in double quotation marks, or another character expression. The value of in-string is limited to 200 characters."},{"Name":"FILEATTR","Definition":"Returns the attribute information for a specified file.","Parameter1":"file-specification","Description1":"Is the file for which you are requesting information. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"item","Description2":"Specifies which attribute of the file you are requesting. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression."},{"Name":"FINDFILE","Definition":"Searches a directory for a file.","Parameter1":"file-specification","Description1":"Specifies the file specification of the file that you are searching for. It can contain any valid OpenVMS file specification, including wildcards. The value for file-specification can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"context","Description2":"Is a variable used internally by SAS to maintain the search context between executions of FINDFILE. It must be initialized to 0 before the first execution of FINDFILE for a given file-specification and must not be modified between executions."},{"Name":"GETDVI","Definition":"Returns a specified item of information from a device.","Parameter1":"device-name","Description1":"Specifies a physical device name or a logical name equated to a physical device name. Specify the device name as a character-string expression.","Parameter2":"item","Description2":"Is a character variable that contains any item accepted by the F$GETDVI lexical function (for example, the physical device name)."},{"Name":"GETJPI","Definition":"Retrieves job-process information.","Parameter1":"jpi-item<","Description1":"Is a character variable that contains any item accepted by the F$GETJPI lexical function, for example, a user process name.","Parameter2":"pid","Description2":"Can be either character (process-name variable) or numeric (process-ID variable)."},{"Name":"GETLOG","Definition":"Returns information about a DCL logical name.","Parameter1":"logical-name<","Description1":"Can be a character variable, character literal enclosed in double quotation marks, or another character expression.","Parameter2":"table>","Description2":"Is an optional character parameter that is the name of a DCL logical name table. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter3":"<index>","Description3":"Is an optional numeric parameter that indicates the number of the translation to return if a logical name has multiple translations. This argument can be either a numeric literal or numeric variable. The default value is 0.","Parameter4":"<mode>","Description4":"Is an optional character parameter that contains the access mode to be used for translation. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression. The default is \"USER\".","Parameter5":"<case>","Description5":"Is an optional character parameter that determines the case to be used for translation. Values: \"CASE_BLIND\" | \"CASE_SENSITIVE\".","Parameter6":"item","Description6":"Is an optional character parameter that specifies what type of information is to be returned about a logical name. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression. The default value is \"VALUE\"."},{"Name":"GETMSG","Definition":"Translates an OpenVMS error code into text.","Parameter1":"status","Description1":"Is an OpenVMS status code. It is usually returned from one of the other functions that return an OpenVMS status code on failure."},{"Name":"GETQUOTA","Definition":"Retrieves disk quota information.","Parameter1":"dev","Description1":"Is the device that you want to gather disk quota information for.","Parameter2":"user","Description2":"Receives your numeric user identification code (UIC) on the disk. The UICw. format can be used to format the numeric value. This variable must be initialized to 0 before the first execution.","Parameter3":"usage","Description3":"Receives your current disk usage in blocks. This variable must be initialized to 0 before the first execution.","Parameter4":"perm","Description4":"Receives your permanent quota. This variable must be initialized to 0 before the first execution.","Parameter5":"over","Description5":"Receives your allowed overdraft. This variable must be initialized to 0 before the first execution.","Parameter6":"context","Description6":"Is a numeric variable that must be initialized to 0 before the first execution and must not be modified between calls.","Parameter7":"chan","Description7":"Is a numeric variable that must be initialized to 0 before the first execution and must not be modified between calls."},{"Name":"GETSYM","Definition":"Returns the value of a DCL symbol.","Parameter1":"symbol-name","Description1":"Is the name of a DCL symbol defined in your process. It can be a character variable, character literal enclosed in double quotation marks, or another character expression. If symbol-name is more than 200 characters long, it is truncated."},{"Name":"GETTERM","Definition":"Returns the characteristics of your terminal device.","Parameter1":"characteristic-name","Description1":"Is the name of the terminal characteristic to be returned. The argument can be a character variable, character literal enclosed in double quotation marks, or another character expression. If characteristic-name is longer than 200 characters, it is truncated."},{"Name":"NODENAME","Definition":"Returns the name of the current node."},{"Name":"PUTLOG","Definition":"Creates an OpenVMS logical-name in your process-level logical name table.","Parameter1":"logical-name","Description1":"The name of the OpenVMS logical name that you want to create. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"value","Description2":"Is the string to be assigned to the symbol. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression."},{"Name":"PUTSYM","Definition":"Creates a DCL symbol in the parent SAS process.","Parameter1":"symbol-name","Description1":"Is the name of the DCL symbol that you want to create. It can be a character variable value, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"value","Description2":"Is the string to be assigned to the symbol. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter3":"scope","Description3":"Defines whether the symbol is a local or global symbol. If the value of scope is 1, the symbol is defined as a local symbol. If the value of scope is 2, the symbol is defined as a global symbol. The scope argument can be either a numeric literal or a numeric variable."},{"Name":"SETTERM","Definition":"Modifies a characteristic of your terminal device.","Parameter1":"characteristic-name","Description1":"Is the name of the terminal characteristic to be modified. The argument can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"new-value","Description2":"Is the new setting for the characteristic."},{"Name":"TERMIN","Definition":"Allows simple input from SYS$INPUT.","Parameter1":"prompt","Description1":"Is the prompt printed on the monitor. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression."},{"Name":"TERMOUT","Definition":"Allows simple output to SYS$OUTPUT.","Parameter1":"output","Description1":"Is a character string to write to SYS$OUTPUT. It can be a character variable, character literal enclosed in double quotation marks, or another character expression."},{"Name":"TTCLOSE","Definition":"Closes a channel that was previously assigned by TTOPEN.","Parameter1":"channel","Description1":"Is the channel variable returned from the TTOPEN function."},{"Name":"TTCONTRL","Definition":"Modifies the characteristics of a channel that was previously assigned by TTOPEN.","Parameter1":"control-specification","Description1":"Is the control string as described for the TTOPEN function. The syntax for control-specification is the same as for TTOPEN, except that the DEVICE= attribute cannot be changed.","Parameter2":"channel","Description2":"Is the channel variable that was returned from the TTOPEN function."},{"Name":"TTOPEN","Definition":"Assigns an I/O channel to a terminal.","Parameter1":"control-specification","Description1":"Is the control string that specifies the terminal and processing options, separated from each other by blanks. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression.","Parameter2":"channel","Description2":"Is a numeric variable into which the TTOPEN function places the channel number."},{"Name":"TTREAD","Definition":"Reads characters from the channel assigned by TTOPEN.","Parameter1":"channel","Description1":"Is the channel variable returned from the TTOPEN function.","Parameter2":"buffer","Description2":"Is the character variable where the returned characters are stored.","Parameter3":"<size>","Description3":"Is an optional numeric variable, numeric literal, or an expression which indicates the maximum number of characters to read and receives the number of characters read. If you do not specify size, the TTREAD function reads characters up to the size of buffer."},{"Name":"TTWRITE","Definition":"Writes characters to the channel assigned by TTOPEN.","Parameter1":"channel","Description1":"Is the channel variable returned from the TTOPEN function.","Parameter2":"buffer","Description2":"Is the character variable, character literal, or an expression that contains the data to be written.","Parameter3":"<size>","Description3":"Is an optional numeric variable, numeric literal, or expression that specifies how many characters to write from buffer. If you do not specify size, the entire buffer is sent, including any trailing blanks."},{"Name":"VMS","Definition":"Spawns a subprocess and executes a DCL command.","Parameter1":"DCL-command","Description1":"Is the DCL command that is passed to the subprocess. It can be a character variable, a character literal enclosed in double quotation marks, or another character expression."},{"Name":"BQUOTE","Definition":"Mask special characters and mnemonic operators in a resolved value at macro execution.","Parameter1":"character string | text expression","Description1":"Character string or text expression."},{"Name":"NRBQUOTE","Definition":"Mask special characters and mnemonic operators in a resolved value at macro execution.","Parameter1":"character string | text expression","Description1":"Character string or text expression."},{"Name":"EVAL","Definition":"Evaluates arithmetic and logical expressions using integer arithmetic.","Parameter1":"arithmetic or logical expression","Description1":"Integer arithmetic or logical expression."},{"Name":"NRQUOTE","Definition":"Masks special characters, including & and %, and mnemonic operators in a resolved value at macro execution.","Parameter1":"character string | text expression","Description1":"Character string or text expression."},{"Name":"STR","Definition":"Masks special characters, excluding & and %, and mnemonic operators in constant text during macro compilation.","Parameter1":"character-string","Description1":"A character string that may contain special characters and/or mnemonic operators such as + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN."},{"Name":"NRSTR","Definition":"Masks special characters, including & and %, and mnemonic operators in constant text during macro compilation.","Parameter1":"character-string","Description1":"A character string that may contain special characters and/or mnemonic operators such as + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN & %."},{"Name":"QSCAN","Definition":"Searches for a word and masks special characters and mnemonic operators.","Parameter1":"argument","Description1":"Is a character string or a text expression. If argument might contain a special character or mnemonic operator, listed below, use %QSCAN.","Parameter2":"n<","Description2":"Is an integer or a text expression that yields an integer, which specifies the position of the word to return.","Parameter3":"delimiters>","Description3":"Specifies an optional list of one or more characters that separate \"words\" or text expressions that yield one or more characters. Possible delimiters: blank . < ( + & ! $ * ) ; ^ - / , % |."},{"Name":"SUPERQ","Definition":"Masks all special characters and mnemonic operators at macro execution but prevents further resolution of the value.","Parameter1":"argument","Description1":"Is the name of a macro variable with no leading ampersand or a text expression that produces the name of a macro variable with no leading ampersand."},{"Name":"SYMEXIST","Definition":"Returns an indication of the existence of a macro variable.","Parameter1":"macro-variable-name","Description1":"Is the name of a macro variable or a text expression that yields the name of a macro variable."},{"Name":"SYSEVALF","Definition":"Evaluates arithmetic and logical expressions using floating-point arithmetic.","Parameter1":"expression<","Description1":"Is an arithmetic or logical expression to evaluate.","Parameter2":"conversion-type>","Description2":"Converts the value returned by %SYSEVALF to the type of value specified. Valid values: BOOLEAN (returns 0 if result is 0 or missing; 1 if any other value); CEIL (returns a character value representing the smallest integer that is greater than or equal to the result of the expression.); FLOOR (returns a character value representing the largest integer that is less than or equal to the result of the expression.); INTEGER (returns a character value representing the integer portion of the result, truncating the decimal portion.)"},{"Name":"SYSFUNC","Definition":"Execute SAS functions or user-written functions.","Parameter1":"function(argument-1 <...argument-n>)<","Description1":"Is the function to execute, including one or more arguments used by the function. You cannot nest functions to be used with a single %SYSFUNC. However, you can nest %SYSFUNC calls.","Parameter2":"format>","Description2":"Is an optional format to apply to the result of function. This format can be provided by SAS, generated by PROC FORMAT, or created with SAS/TOOLKIT."},{"Name":"QSYSFUNC","Definition":"Execute SAS functions or user-written functions. %QSYSFUNC masks special characters and mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN.","Parameter1":"function(argument-1 <...argument-n>)<","Description1":"Is the function to execute, including one or more arguments used by the function. You cannot nest functions to be used with a single %SYSFUNC. However, you can nest %SYSFUNC calls.","Parameter2":"format>","Description2":"Is an optional format to apply to the result of function. This format can be provided by SAS, generated by PROC FORMAT, or created with SAS/TOOLKIT."},{"Name":"SYSGET","Definition":"Returns the value of the specified operating environment variable.","Parameter1":"environment-variable","Description1":"Is the name of an environment variable. The case of environment-variable must agree with the case that is stored on the operating environment."},{"Name":"SYSPROD","Definition":"Reports whether a SAS software product is licensed at the site.","Parameter1":"product","Description1":"Can be a character string or text expression that yields a code for a SAS product: AF CPE GRAPH PH-CLINICAL ASSIST EIS IML QC BASE ETS INSIGHT SHARE CALC FSP LAB STAT CONNECT GIS OR TOOLKIT."},{"Name":"UNQUOTE","Definition":"During macro execution, unmasks all special characters and mnemonic operators for a value.","Parameter1":"character string | text expression","Description1":"Character string or text expression that might contain special characters and/or mnemonic operators."},{"Name":"CMPRES","Definition":"Compress multiple blanks and remove leading and trailing blanks.","Parameter1":"text | text expression","Description1":"A character constant or expression."},{"Name":"QCMPRES","Definition":"Compress multiple blanks and remove leading and trailing blanks. QCMPRES produces a result with special characters and mnemonic operators masked.","Parameter1":"text | text expression","Description1":"A character constant or expression that might contain special characters and/or mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN."},{"Name":"COMPSTOR","Definition":"Compiles macros and stores them in a catalog in a permanent SAS library.","Parameter1":"PATHNAME=SAS-data-library","Description1":"SAS-data-library is the physical name of a SAS library on your host system."},{"Name":"DATATYP","Definition":"Returns the data type of a value.","Parameter1":"text | text expression","Description1":"A character constant or expression."},{"Name":"VERIFY","Definition":"Returns the position of the first character unique to an expression. %VERIFY returns the position of the first character in source that is not also present in excerpt. If all characters in source are present in excerpt, %VERIFY returns 0.","Parameter1":"source","Description1":"Is text or a text expression that you want to examine for characters that do not exist in excerpt.","Parameter2":"excerpt ","Description2":"Is text or a text expression. This is the text that defines the set of characters that %VERIFY uses to examine source."},{"Name":"DQLOAD","Definition":"Sets system option values and loads locales into memory.","Parameter1":"DQLOCALE=(locale1 ...localeN)","Description1":"Specifies a value for the DQLOCALE= system option to load an ordered list of locales into memory.","Parameter2":"DQSETUPLOC=`file-specification' | `path-specification'","Description2":"Specifies a value for the system option DQSETUPLOC=.","Parameter3":"<DQINFO=0 | 1>","Description3":"Generates additional information in the SAS log about the status of the locale load operation. The default value is DQINFO=0."},{"Name":"DQPUTLOC","Definition":"Displays current information on a specified locale in the SAS log.","Parameter1":"locale","Description1":"Specifies the locale of interest. The value can be a locale name in quotation marks or the name of a variable whose value is a locale name or an expression that evaluates to a locale name.","Parameter2":"<SHORT=0 | 1>","Description2":"Shortens the length of the entry in the SAS log. Specify SHORT=1 to remove the descriptions of how the definitions are used. The default value is SHORT=0, which displays the descriptions of how the definitions are used.","Parameter3":"<PARSEDEFN=0 | 1>","Description3":"Lists with each gender analysis definition and each match definition the related parse definition, if such a parse definition exists. The default value PARSEDEFN=1 lists the related parse definition. PARSEDEFN=0 does not list the related parse definition."},{"Name":"DQCASE","Definition":"Returns a character value with standardized capitalization.","Parameter1":"char","Description1":"Is the value that is transformed, according to the specified case definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'case-definition'<","Description2":"Specifies the name of the case definition that will be referenced during the transformation.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified case definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQGENDER","Definition":"Returns a gender determination from the name of an individual.","Parameter1":"char","Description1":"Is the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'gender-analysis-definition'<","Description2":"Specifies the name of the gender analysis definition, which must exist in the specified locale.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified gender analysis definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQGENDERINFOGET","Definition":"Returns the name of the parse definition that is associated with the specified gender definition.","Parameter1":"'gender-analysis-definition'<","Description1":"Specifies the name of the gender analysis definition, which must exist in the specified locale.","Parameter2":"'locale'>","Description2":"Specifies the name of the locale that contains the specified gender analysis definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQGENDERPARSED","Definition":"Returns a gender determination from the parsed name of an individual.","Parameter1":"parsed-char","Description1":"Is a parsed value that contains the name of an individual. The value can be expressed as the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'gender-analysis-definition'<","Description2":"Specifies the name of the gender analysis definition that will be referenced to determine gender. The specified gender analysis definition has a related parse definition. To return an accurate gender determination, the related parse definition must be the same parse definition that was used to parse the parsed-char.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified gender analysis definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQIDENTIFY","Definition":"Returns a category name from a character value.","Parameter1":"char","Description1":"Is the value that is transformed, according to the specified identification definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'identification-definition'<","Description2":"Specifies the name of the identification definition, which must exist in the specified locale.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified identification definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQLOCALEGUESS","Definition":"Returns the name of the locale that is most likely represented by a character value.","Parameter1":"char","Description1":"Is the value that is analyzed to determine a locale, according to the specified guess definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'locale-guess-definition'","Description2":"Specifies the name of the guess definition."},{"Name":"DQLOCALEINFOGET","Definition":"Returns information about locales.","Parameter1":"<'info-type'>","Description1":"Specifies the type of locale information that is to be returned. The only valid value is LOADED. If no parameter is specified, LOADED is used by default."},{"Name":"DQLOCALEINFOLIST","Definition":"Displays the names of the definitions in a locale and returns a count of those definitions.","Parameter1":"'definition-type'<","Description1":"Specifies the definitions that are displayed. Valid values are ALL CASE GENDER GUESS IDENTIFICATION MATCH PARSE PATTERN STANDARDIZATION.","Parameter2":"'locale'>","Description2":"Specifies the name of the locale. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQMATCH","Definition":"Returns a match code from a character value.","Parameter1":"char","Description1":"Is the value for which a match code is created, according to the specified match definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`match-definition'<","Description2":"Specifies the name of the match definition.","Parameter3":"sensitivity","Description3":"Specifies an integer value that determines the amount of information in the returned match code. Valid values range from 50 to 95. The default value is 85. A higher sensitivity value includes more information in the match code.","Parameter4":"'locale'>","Description4":"Specifies the name of the locale that contains the specified match definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQMATCHINFOGET","Definition":"Returns the name of the parse definition that is associated with a match definition.","Parameter1":"`match-definition'<","Description1":"Specifies the name of the match definition, which must exist in the specified locale.","Parameter2":"'locale'>","Description2":"Specifies the name of the locale that contains the specified match definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQMATCHPARSED","Definition":"Returns a match code from a parsed character value.","Parameter1":"parsed-char","Description1":"Is a parsed character value for which a match code will be created. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value. The value must have been parsed with the parse definition that is associated with the specified match definition.","Parameter2":"`match-definition'<","Description2":"Specifies the name of the match definition.","Parameter3":"sensitivity","Description3":"Specifies an integer value that determines the amount of information in the returned match code. Valid values range from 50 to 95. The default value is 85. A higher sensitivity value includes more information in the match code.","Parameter4":"'locale'>","Description4":"Specifies the name of the locale that contains the specified match definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQPARSE*1","Definition":"Returns a parsed character value and a status flag.","Parameter1":"parsed-string","Description1":"Is the input value that is parsed according to the specified parse definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`parse-definition'<","Description2":"Specifies the name of the parse definition.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified parse definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQPARSE*2","Definition":"Returns a parsed character value and a status flag.","Parameter1":"parsed-string","Description1":"Is the input value that is parsed according to the specified parse definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`parse-definition'","Description2":"Specifies the name of the parse definition","Parameter3":"`parse-result'","Description3":"Is an output character variable that receives the result of the parse operation.","Parameter4":"`parse-return-code'<","Description4":"Is an output numeric variable that returns 1.0 when the parse operation is successful. Otherwise, this variable receives a 0.","Parameter5":"'locale'>","Description5":"Specifies the name of the locale that contains the specified match definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQPARSEINFOGET","Definition":"Returns the token names in a parse definition.","Parameter1":"`parse-definition'<","Description1":"Specifies the name of the parse definition.","Parameter2":"'locale'>","Description2":"Specifies the name of the locale that contains the specified parse definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQPARSETOKENGET","Definition":"Returns a token from a parsed character value.","Parameter1":"parsed-char","Description1":"Is the parsed character value from which the value of the specified token will be returned. The parsed-char can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`token'","Description2":"Specifies the name of the token that is returned from the parsed value. The token must be enabled by the specified parse definition.","Parameter3":"'parse-definition'<","Description3":"Specifies the name of the parse definition that will be used to obtain the value of the token. The parse definition must be the same as the parse definition that originally parsed the parsed-char value.","Parameter4":"'locale'>","Description4":"Specifies the name of the locale that contains the specified match definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQPARSETOKENPUT","Definition":"Inserts a token into a parsed character value and returns the updated parsed character value.","Parameter1":"parsed-char","Description1":"Is the parsed character value that receives the new token value, according to the specified parse definition. The parsed-char value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"token-value","Description2":"Specifies the value of the token that is to be inserted into the parsed value.","Parameter3":"`token-name'","Description3":"Specifies the name of the token that is to be inserted into the parsed value. The specified token must be enabled by the specified parse definition.","Parameter4":"`parse-definition'<","Description4":"Specifies the name of the parse definition, which must exist in the specified locale. The specified parse definition must be the same definition that was used to parse the parsed-char value.","Parameter5":"'locale'>","Description5":"Specifies the name of the parse definition, which must exist in the specified locale. The specified parse definition must be the same definition that was used to parse the parsed-char value."},{"Name":"DQPATTERN","Definition":"Returns a pattern analysis from an input character value.","Parameter1":"char","Description1":"Is the name of the value that will be analyzed. The value can be a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`pattern-analysis-definition'<","Description2":"Specifies the name of the definition that will be referenced during the creation of the pattern analysis. The definition must exist in the specified locale.","Parameter3":"'locale'>","Description3":"Specifies the name of the locale that contains the specified pattern analysis definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQSCHEMEAPPLY*1","Definition":"Applies a scheme and returns a transformed value.","Parameter1":"char","Description1":"Is the value to which the specified scheme will be applied. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`scheme'","Description2":"Identifies the scheme that is applied to the input value. For schemes using SAS format, the scheme argument is a fully-qualified SAS data set name in quotation marks.","Parameter3":"`scheme-format'<","Description3":"Identifies the file format of the scheme. Valid values are as follows:\n\n BFD\n indicates that the specified scheme is stored in Blue Fusion Data format. This is the default value.\n\n NOBFD\n indicates that the specified scheme is stored in SAS format.","Parameter4":"`mode'","Description4":"Specifies how the scheme is to be applied to the values of the input character variable. Valid values for the mode argument are defined as follows:\n\n PHRASE\n compares the entire input character value to the entirety of each of the DATA values in the scheme.\n\n ELEMENT\n compares each element in the input character value to each of the DATA values in the scheme.","Parameter5":"'scheme-lookup-method'","Description5":"Specifies one of three mutually-exclusive methods of applying the scheme. Valid values are as follows:\n\n EXACT\n this default value specifies that the input value is to be compared to the DATA values in the scheme without changing the input value in any way.\n\n IGNORE_CASE\n specifies that capitalization is to be ignored when the input value is compared to the DATA values in the scheme.\n\n USE_MATCHDEF\n specifies that the match code of the input value is to be compared to the match codes of the DATA values in the scheme.","Parameter6":"`match-definition'","Description6":"Specifies the name of the match definition in the specified locale that will be used to create match codes during the application of the scheme.","Parameter7":"sensitivity","Description7":"Specifies the amount of information in the match codes that are created during the application of the scheme. With higher sensitivity values, two values must be increasingly similar to create the same match code. At lower sensitivity values, values can receive the same match code despite their dissimilarities. Valid values range from 50 to 95.","Parameter8":"'locale'>","Description8":"Specifies the locale that contains the specified match definition that will be referenced during the application of the scheme. The value can be a locale name in quotation marks, or the name of a variable whose value resolves to a locale name."},{"Name":"DQSCHEMEAPPLY*2","Definition":"Applies a scheme and returns a transformed value and a transformation flag.","Parameter1":"char","Description1":"Is the value to which the specified scheme will be applied. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"output-variable","Description2":"Identifies the character variable that receives the transformed input value.","Parameter3":"'scheme'","Description3":"Identifies the scheme that is applied to the input value.","Parameter4":"`scheme-format'<","Description4":"Identifies the file format of the scheme. Valid values are as follows:\n\n BFD\n indicates that the specified scheme is stored in Blue Fusion Data format. This is the default value.\n\n NOBFD\n indicates that the specified scheme is stored in SAS format.","Parameter5":"`mode'","Description5":"Specifies how the scheme is to be applied to the values of the input character variable. Valid values for the mode argument are defined as follows:\n\n PHRASE\n compares the entire input character value to the entirety of each of the DATA values in the scheme.\n\n ELEMENT\n compares each element in the input character value to each of the DATA values in the scheme.\n ","Parameter6":"transform-count-variable","Description6":"Identifies the numeric variable that receives the returned number of transformations that were performed on the input value.","Parameter7":"'scheme-lookup-method'","Description7":"Specifies one of three mutually-exclusive methods of applying the scheme. Valid values are as follows:\n\n EXACT\n this default value specifies that the input value is to be compared to the DATA values in the scheme without changing the input value in any way.\n\n IGNORE_CASE\n specifies that capitalization is to be ignored when the input value is compared to the DATA values in the scheme.\n\n USE_MATCHDEF\n specifies that the match code of the input value is to be compared to the match codes of the DATA values in the scheme.\n ","Parameter8":"'match-definition'","Description8":"Specifies the name of the match definition in the specified locale that will be used to create match codes during the application of the scheme.","Parameter9":"sensitivity","Description9":"Specifies the amount of information in the match codes that are created during the application of the scheme. With higher sensitivity values, two values must be increasingly similar to create the same match code. At lower sensitivity values, two values receive the same match code despite their dissimilarities. Valid values range from 50 to 95.","Parameter10":"'locale'>","Description10":"Specifies the locale that contains the specified match definition that will be referenced during the application of the scheme. The value can be a locale name in quotation marks or the name of a variable whose value resolves to a locale name."},{"Name":"DQSRVARCHJOB","Definition":"Runs an dfPower Architect job on a DataFlux Integration Server and returns a job identifier.","Parameter1":"job-name","Description1":"Identifies the dfPower Architect job as it exists on the specified DataFlux Integration Server.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"<port>","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036.","Parameter4":"<macro-name1","Description4":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter5":"macro-value1","Description5":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable.","Parameter6":"macro-name2","Description6":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter7":"macro-value2...>","Description7":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable."},{"Name":"DQSRVCOPYLOG","Definition":"Copies a job's log file from a DataFlux Integration Server.","Parameter1":"job-id","Description1":"Identifies the job that was submitted to a DataFlux Integration Server. The identifier was previously returned by a function such as DQSRVARCHJOB or DQSRVPROFJOBFILE.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"<port>","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036.","Parameter4":"filename","Description4":"Identifies where the log file will be copied on the local host."},{"Name":"DQSRVDELETELOG","Definition":"Deletes a job's log file from a DataFlux Integration Server.","Parameter1":"job-id","Description1":"Identifies the job that was submitted to a DataFlux Integration Server. The identifier was previously returned by a function such as DQSRVARCHJOB or DQSRVPROFJOBFILE.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"<port>","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036."},{"Name":"DQSRVJOBSTATUS","Definition":"Returns the status of a job that was submitted to a DataFlux Integration Server.","Parameter1":"job-id","Description1":"Identifies the job that was submitted to a DataFlux Integration Server. The identifier was previously returned by a function such as DQSRVARCHJOB or DQSRVPROFJOBFILE.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"port","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036.","Parameter4":"timeout","Description4":"Specifies a time in seconds that determines when status information is returned from the host. Valid values are defined as follows:\n\n -1 \n returns status information only when the job is finished. Return values are 0 (job completed successfully) or 1 (job failed).\n\n 0 \n returns status information immediately. Return values are 0 (job completed successfully), 1 (job failed), or 2 (job running).\n\n greater-than-zero: \n specifies a time limit for the interval argument. If the job is still running after the timeout value, another value is returned only when the job is finished.","Parameter5":"interval","Description5":"Specifies the repeat period for the return of status information, within the limit that is imposed by the timeout argument."},{"Name":"DQSRVKILLJOB","Definition":"Terminates a job that is running on a DataFlux Integration Server.","Parameter1":"job-id","Description1":"Identifies the job that was submitted to a DataFlux Integration Server. The identifier was previously returned by a function such as DQSRVARCHJOB or DQSRVPROFJOBFILE.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"port","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036."},{"Name":"DQSRVPROFJOBFILE","Definition":"Runs a file-type Profile job on a DataFlux Integration Server and returns a job identifier.","Parameter1":"job-name","Description1":"Identifies the dfPower Architect job as it exists on the specified DataFlux Integration Server.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"port","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036.","Parameter4":"results-filename","Description4":"Identifies the file that receives job results.","Parameter5":"append","Description5":"Valid values are defined as follows:\n\n 0 appends job results below any existing content in the results file.\n\n 1 overwrites any existing content in the results file.","Parameter6":"description<","Description6":"Identifies a character variable whose value describes the current run of the job. The descriptive text is added either to the top of the results file or above the results that will be appended to the bottom of the results file.","Parameter7":"macro-name1","Description7":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter8":"macro-value1","Description8":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable.","Parameter9":"macro-name2","Description9":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter10":"macro-value2...>","Description10":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable."},{"Name":"DQSRVPROFJOBREP","Definition":"Runs a repository-type Profile job on a DataFlux Integration Server and returns a job identifier.","Parameter1":"job-name","Description1":"Identifies the dfPower Architect job as it exists on the specified DataFlux Integration Server.","Parameter2":"<host>","Description2":"Identifies the host of the DataFlux Integration Server. If this value is not specified, then the local host is used by default.","Parameter3":"port","Description3":"Identifies the port through which the local host communicates with the DataFlux Integration Server. If this argument is not specified, or if the value is 0 or a negative number, then the default port number is used. The default port number is 21036.","Parameter4":"repository","Description4":"Identifies the repository on the DataFlux Integration Server that contains the dfPower Profile job.","Parameter5":"report","Description5":"Identifies the file that receives the report that is generated by the dfPower Profile job.","Parameter6":"description<","Description6":"Identifies a character variable whose value describes the current run of the job. The descriptive text is added either to the top of the results file or above the results that will be appended to the bottom of the results file.","Parameter7":"macro-name1","Description7":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter8":"macro-value1","Description8":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable.","Parameter9":"macro-name2","Description9":"Identifies an dfPower Architect macro that exists on the DataFlux Integration Server. The value of macro-nameX can be specified as text, or as the name of a character variable.","Parameter10":"macro-value2...>","Description10":"Specifies the character value that will be used by the associated dfPower Architect macro. Macro-value1 is used by macro-name1. The value of macro-valueX can be specified as text, or as the name of a character variable."},{"Name":"DQSRVUSER","Definition":"Authenticates a user on a DataFlux Integration Server.","Parameter1":"userid","Description1":"Identifies the user according to the registry in a DataFlux Integration Server.","Parameter2":"password","Description2":"Authenticates the user according to the registry in the DataFlux Integration Server. The password can be plain text or SAS-encoded."},{"Name":"DQSTANDARDIZE","Definition":"Returns a character value after standardizing casing, spacing, and format, and applies a common representation to certain words and abbreviations.","Parameter1":"char","Description1":"Is the value that will be standardized according to the specified standardization definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"'standardization-definition'<","Description2":"Specifies the name of the standardization definition, which must exist in the specified locale.","Parameter3":"locale>","Description3":"Specifies the name of the locale that contains the specified standardization definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"DQTOKEN","Definition":"Returns a token from a character value.","Parameter1":"char","Description1":"Is the value from which the specified token will be returned, according to the specified parse definition. The value can be the name of a character variable, a character value in quotation marks, or an expression that evaluates to a variable name or a quoted value.","Parameter2":"`token'","Description2":"Identifies the token that is returned.","Parameter3":"'parse-definition'<","Description3":"Specifies the name of the parse definition, which must exist in the specified locale.","Parameter4":"locale>","Description4":"Specifies the name of the locale that contains the specified parse definition. The value can be a name in quotation marks, the name of a variable whose value is a locale name, or an expression that evaluates to a variable name or to a quoted locale name."},{"Name":"TPLOT","Definition":"Creates a triangular plot that graphically displays genetic marker test results.","Parameter1":"SAS-data-set","Description1":"Specifies the name of the SAS data set that is the output data set from the ALLELE procedure, containing the linkage disequilibrium test and HWE test p-values.","Parameter2":"SAS-data-set","Description2":"Specifies the name of the SAS data set that contains the p-values for the marker-trait association tests. This data set can be the output data set from the CASECONTROL procedure, the FAMILY procedure, or the PSMOOTH procedure, or it can be created by the user.","Parameter3":"variable","Description3":"Names the variable that contains the marker-trait association p-values in the SAS data set that is specified in the second argument.","Parameter4":"<ALPHA=number>","Description4":"Specifies the significance level for the marker-trait association test. This level is used as a cut-off for the p-value range corresponding to the symbol shape on the plot. This number must be between 0 and 1. The default is ALPHA=0.05."},{"Name":"DEFINE","Definition":"Sets the value of an attribute for a particular column in the current row.","Parameter1":"column-id | _ROW_","Description1":"Specifies a column name or a column number (that is, the position of the column from the left edge of the report). _ROW_ is an automatic variable that indicates the entire current row.","Parameter2":"'attribute-name'","Description2":"Is the attribute to define. Valid attributes are: BLINK, COLOR, COMMAND, FORMAT, HIGHLIGHT, RVSVIDEO, URL, URLBP, and URLP.","Parameter3":"value","Description3":"Sets the value for the attribute."},{"Name":"FOREACH","Definition":"The FOREACH statement iteratively applies a constraint over an array of variables.","Parameter1":"array","Description1":"An array defined in the ARRAY statement.","Parameter2":"type","Description2":"The type of the constraint.","Parameter3":"<offset>","Description3":"The optional offset parameter is an integer and is interpreted in the context of the constraint type."},{"Name":"ContinueFor","Definition":"Sets the number of additional iterations for the genetic algorithm optimization","Parameter1":"niter","Description1":"Specifies that the optimization continue for niter more iterations. To stop at the current iteration, set niter to 0."},{"Name":"Cross","Definition":"Executes a genetic crossover operator from within a user subroutine.","Parameter1":"selected","Description1":"Is an array that specifies the solutions to be crossed.","Parameter2":"seg","Description2":"Is the desired segment of the solution to which the crossover operator should be applied.","Parameter3":"type<","Description3":"Is the type of crossover operator to apply, which also determines the number and type of parameters expected. The accepted values for type are: 'arithmetic', cycle', heuristic', 'null', 'order', pmatch', 'simple', twopoint', and 'uniform'.","Parameter4":"parameter1","Description4":"Optional parameter applicable to some operators.","Parameter5":"parameter2, ...>","Description5":"Optional parameter(s) applicable to some operators."},{"Name":"Dynamic_array","Definition":"Allocates a numeric array.","Parameter1":"arrayname","Description1":"Is a previously declared array, whose dimensions are to be re-allocated.","Parameter2":"dim1<","Description2":"Is the size of the first dimension.","Parameter3":"dim2, ...dim6>","Description3":"Are optional. Up to six dimensions can be specified."},{"Name":"EvaluateLC","Definition":"Evaluates linear constraints.","Parameter1":"lc","Description1":"Is a two-dimensional array representing the linear constraints.","Parameter2":"results","Description2":"Is a numeric array to receive the magnitude of the constraint violation for each linear constraint.","Parameter3":"sum","Description3":"Is a variable to receive the sum of the constraint violations over all the constraints.","Parameter4":"selected","Description4":"Is an array identifying the selected solution.","Parameter5":"seg<","Description5":"Is the segment of the solution to which the linear constraints apply.","Parameter6":"child>","Description6":"Is an optional parameter, and should be specified only when EvaluateLC is called from a user crossover operator."},{"Name":"GetDimensions","Definition":"Gets the dimensions of an array variable.","Parameter1":"source","Description1":"Is the array variable whose dimensions are desired.","Parameter2":"dest","Description2":"Is an array to receive the dimensions of source."},{"Name":"GetObjValues","Definition":"Retrieves objective function values from the current solution generation.","Parameter1":"dest","Description1":"Is an array to receive the objective values.","Parameter2":"n","Description2":"Is the number of objective values to get."},{"Name":"GetSolutions","Definition":"Retrieves solutions from the current generation.","Parameter1":"sol","Description1":"Is an array to receive the solution elements.","Parameter2":"n","Description2":"Is the number of solutions to get.","Parameter3":"seg","Description3":"Is the segment of the solution to retrieve."},{"Name":"Initialize","Definition":"Creates the initial solution generation.","Parameter1":"option","Description1":"Is a string that specifies an initialization option. The available options and their effect are as follows:\n\n '_uniform_' generate uniformly distributed solutions\n _dataset_' read solutions from the data set specified in a FIRSTGEN= option.\n 'default' read solutions from the data set specified in a FIRSTGEN= option, if one was specified.\n '_retain_' bring forward the best solutions from the current generation.\n 'user-routine' Any string not matching the preceding options is interpreted to be a user-defined initialization routine.\n ","Parameter2":"size<","Description2":"Is the number of solutions to create by using a given option.","Parameter3":"option, size>...","Description3":"More option-size pairs (optional)."},{"Name":"MarkPareto","Definition":"Identifies the Pareto-optimal set from a population of solutions","Parameter1":"result","Description1":"Is a one-dimensional array to accept the results of the evaluation.","Parameter2":"n","Description2":"Is a variable to receive the number of Pareto-optimal solutions.","Parameter3":"objectives","Description3":"Is a two-dimensional array that contains the multiple objective values for each solution.","Parameter4":"minmax","Description4":"Is a one-dimensional array to specify how the objective values are to be used."},{"Name":"Mutate","Definition":"Executes a genetic mutation operator from within a user subroutine.","Parameter1":"selected","Description1":"Is an array that specifies the solution to be mutated.","Parameter2":"seg","Description2":"Is the desired segment of the solution to which the mutation should be applied.","Parameter3":"type<","Description3":"Is the type of mutation operator to apply, which also determines the number and type of parameters expected. The accepted values for type are: 'delta', 'invert', swap', and 'uniform'.","Parameter4":"parameter1, parameter2, ...>","Description4":"Are optional parameters applicable to some operators."},{"Name":"Objective","Definition":"Evaluates a standard objective function from within a user subroutine.","Parameter1":"selected","Description1":"Is an array that specifies the solution to be evaluated.","Parameter2":"seg","Description2":"Is the desired segment of the solution to be evaluated.","Parameter3":"type<","Description3":"Is objective function name, which also determines the number and type of parameters expected. The accepted value for type is 'TSP'.","Parameter4":"parameter1, parameter2, ...>","Description4":"Are optional parameters applicable to particular objective functions."},{"Name":"PackBits","Definition":"Writes bits to a packed integer array.","Parameter1":"array","Description1":"Is an array to which the value is to be assigned.","Parameter2":"start","Description2":"Is the starting position for the bit assignments.","Parameter3":"width","Description3":"Is the number of bits to assign.","Parameter4":"value","Description4":"Is the value to be assigned to the bits. For a single bit, this should be 0 or 1."},{"Name":"ReadChild","Definition":"Reads a segment from a selected child solution into an array, within a user crossover operator.","Parameter1":"selected","Description1":"Specifies the family (parents and children) obtained from the selection process.","Parameter2":"seg","Description2":"Specifies the solution segment to be read.","Parameter3":"n","Description3":"Specifies the child in the family from which to read the solution segment.","Parameter4":"values","Description4":"Specifies an array to receive the solution elements."},{"Name":"ReadCompare","Definition":"Reads a segment from a selected solution into an array, within a user fitness comparison subroutine.","Parameter1":"selected","Description1":"Specifies the pair of solutions to be compared, obtained from the selection process.","Parameter2":"seg","Description2":"Specifies the solution segment to be read.","Parameter3":"n","Description3":"Specifies the solution (1 or 2) from which to read the segment.","Parameter4":"values","Description4":"Specifies an array to receive the solution elements."},{"Name":"ReadMember","Definition":"Reads the selected solution into an array for a user objective function or mutation operator","Parameter1":"selected","Description1":"Is a parameter passed to the user subroutine by the GA procedure, which points to the selected solution.","Parameter2":"seg","Description2":"Specifies which segment of the solution to retrieve.","Parameter3":"destination","Description3":"Specifies an array in which to store the solution elements."},{"Name":"ReadParent","Definition":"Reads selected solution elements into an array in a user crossover subroutine.","Parameter1":"selected","Description1":"Is a parameter passed to the user subroutine by the GA procedure, which points to the selected solution family.","Parameter2":"seg","Description2":"Is the segment of the desired parent solution to be obtained ","Parameter3":"n","Description3":"Is the number of the parent, starting at 1.","Parameter4":"destination","Description4":"Is an array in which to store the solution elements."},{"Name":"ReEvaluate","Definition":"Reruns the evaluation phase of the genetic algorithm.","Parameter1":"<index>","Description1":"Is a numeric scalar or array that specifies the indices of the solutions to be updated. The indices correspond to the order of the solutions obtained from a GetSolutions call."},{"Name":"SetBounds","Definition":"The SetBounds subroutine is used to establish upper and lower bounds on the solution space.","Parameter1":"lower","Description1":"Is a lower bound for the solution components.","Parameter2":"upper<","Description2":"Is an upper bound for the solution components.","Parameter3":"seg>","Description3":"Is optional, and specifies a segment of the solution to which the bounds apply. If seg is not specified, then it defaults to a value of 1.","Parameter4":null,"Description4":null},{"Name":"SetCross","Definition":"The SetCross routine is used to assign a standard crossover operator.","Parameter1":"type<","Description1":"Is the name of the crossover operator to be applied. The accepted values for type are: 'arithmetic', 'cycle', 'heuristic', order', 'pmatch', simple', twopoint', and 'uniform'.","Parameter2":"seg><","Description2":"Is optional, and specifies a segment of the solution to which the operator should be applied. If seg is not specified, then it defaults to a value of 1.","Parameter3":"pname","Description3":"Is optional, and specifies the name of a particular property to be set for the crossover operator.","Parameter4":"pvalue><","Description4":" specifies the value to be assigned to the corresponding property name.","Parameter5":"pname, pvalue>...","Description5":"More optional pname-pvalue pairs."},{"Name":"SetCrossProb","Definition":"The SetCrossProb subroutine is used to set the crossover probability for the genetic algorithm optimization process.","Parameter1":"p","Description1":"Is the crossover probability."},{"Name":"SetCrossRoutine","Definition":"Installs a user subroutine for the crossover operator.","Parameter1":"'routine'<","Description1":"Is the name of a subroutine you have defined, which is called when the mutation operator is applied. This parameter must be a string literal; a variable is not accepted.","Parameter2":"nparents","Description2":"Is optional, and specifies the number of parent solutions the operator requires. If not specified, 2 is assumed.","Parameter3":"nchildren>","Description3":"Is optional, and specifies the number of children solutions the operator will generate. If not specified, 2 is assumed."},{"Name":"SetElite","Definition":"Sets the number of best solutions to pass to the next generation.","Parameter1":"elite","Description1":"Is the number of best solutions to be passed unmodified from the current solution generation to the next."},{"Name":"SetEncoding","Definition":"The SetEncoding subroutine is used to establish the type of problem solution encoding.","Parameter1":"encoding","Description1":"Is a string used to specify the form of the solution."},{"Name":"SetFinalize","Definition":"Designates a user subroutine to perform post processing at the end of the optimization process.","Parameter1":"'routine'","Description1":"Is the name of a subroutine you have defined, which is called when the optimization process ends. This parameter must be a string literal; a variable is not accepted."},{"Name":"SetMut","Definition":"The SetMut routine is used to assign a standard mutation operator.","Parameter1":"type<","Description1":"Is the name of the mutation operator to be applied. The accepted values for type are: 'delta', 'invert', 'null', 'swap'. and 'uniform'.","Parameter2":"seg><","Description2":"Is optional, and specifies a segment of the solution to which the operator should be applied.","Parameter3":"pname","Description3":"Is optional, and specifies the name of a particular property to be set for the mutation operator.","Parameter4":"pvalue><","Description4":"Specifies the value to be assigned to the corresponding property name.","Parameter5":"pname, pvalue>...","Description5":"More optional pname-pvalue pairs."},{"Name":"SetMutProb","Definition":"The SetMutProb subroutine is used to set the mutation probability for the genetic algorithm optimization.","Parameter1":"p","Description1":"Is the mutation probability."},{"Name":"SetMutRoutine","Definition":"The SetMutRoutine call enables you to designate a subroutine you have defined to be used for the mutation operator.","Parameter1":"'routine'","Description1":"Is the name of a subroutine you have defined, which is called when the mutation operator is applied. This parameter must be a string literal; a variable is not accepted."},{"Name":"SetObj","Definition":"The SetObj routine is used to assign a procedure-supplied objective function.","Parameter1":"type","Description1":"Is the name of the objective function to be used. The accepted value for type is 'TSP'.","Parameter2":"minmax<","Description2":"Is an indicator to maximize or minimize the objective. A value of 0 is used to specify a minimization, and a value of 1 to specify maximizing the objective.","Parameter3":"seg><","Description3":"Is optional, and specifies a segment of the solution to which the objective function should be applied.","Parameter4":"pname","Description4":"Is optional, and specifies the name of a particular property to be set for the objective function.","Parameter5":"pvalue><","Description5":"Specifies the value to be assigned to the corresponding property name.","Parameter6":"pname, pvalue>...","Description6":"More optional pname-pvalue pair(s)."},{"Name":"SetObjFunc","Definition":"The SetObjFunc subroutine is used to designate a user function to be the objective for the optimization process.","Parameter1":"'fname'","Description1":"Is the name of a user objective function. This parameter must be a literal string.","Parameter2":"minmax","Description2":"Is set to 0 to minimize the objective, 1 to maximize."},{"Name":"SetProperty","Definition":"The SetProperty call is used to set or modify properties of a genetic operator, objective function, or a selector.","Parameter1":"optype<","Description1":"Is the type of operator. It should have a value of 'cross' for a crossover operator, 'mut' for a mutation operator, 'obj' for an objective function, or 'sel' for a selector.","Parameter2":"seg>","Description2":"Is optional, used only for mutation and crossover operators, and specifies the segment in which the operator resides. It is necessary only for multisegment encoding. The default value if seg is not specified is 1.","Parameter3":"pname","Description3":"Specifies the name of a particular property to be set.","Parameter4":"pvalue<","Description4":" specifies the value to be assigned to the corresponding property name.","Parameter5":"pname, pvalue>...","Description5":"Additional pname-pvalue pair(s) (optional)."},{"Name":"SetSel","Definition":"The SetSel call is used to specify a selector for the regeneration process, which selects members of the current generation to be propagated to the next.","Parameter1":"selector<","Description1":"Is the type of selection strategy to be used.","Parameter2":"pname","Description2":"Is optional, and specifies the name of a particular property to be set for the selector operator.","Parameter3":"pvalue><","Description3":"Specifies the value to be assigned to the corresponding property name.","Parameter4":"pname, pvalue>...","Description4":"Additional optional pname-pvalue pair(s)."},{"Name":"SetUpdateRoutine","Definition":"Designates a control subroutine to be called at each iteration.","Parameter1":"'routine'","Description1":"Is the name of a subroutine you have defined that is called once during each iteration of the optimization process. This parameter must be a string literal; a variable is not accepted."},{"Name":"ShellSort","Definition":"Sorts a numeric array.","Parameter1":"x<","Description1":"Is a one or two dimensional array to be sorted.","Parameter2":"by<","Description2":"Is an optional numeric scalar or array that specifies the columns by which the array is to be sorted. If not specified, column 1 is the default.","Parameter3":"descend>>","Description3":"Is an optional numeric scalar or array used to specify which columns in the by parameter are to be in descending order. Any columns not specified in a descend parameter will be in ascending order."},{"Name":"Shuffle","Definition":"The Shuffle subroutine randomly rearranges the elements of the x array.","Parameter1":"x","Description1":"Is a numeric array to be randomly shuffled."},{"Name":"UnpackBits","Definition":"The UnpackBits function facilitates the extraction of bit values from arbitrary locations in an integer array.","Parameter1":"source","Description1":"Is an array containing the packed bit values.","Parameter2":"start","Description2":"Is the starting bit, with the lowest bit starting at 1.","Parameter3":"width","Description3":"Is the number of bits to retrieve. A value of 1 retrieves a single bit."},{"Name":"UpdateSolutions","Definition":"The UpdateSolutions subroutine is used to replace the values of the selected solution segment with new values computed in an update routine.","Parameter1":"sol","Description1":"Is an array containing the replacement solution elements.","Parameter2":"n","Description2":"Is the number of solutions to update.","Parameter3":"seg","Description3":"Is the segment of the solution to replace."},{"Name":"WriteChild","Definition":"The WriteChild subroutine is called inside a user crossover operator subroutine to assign to the elements of a selected child solution.","Parameter1":"selected","Description1":"Is an array specifying the selected family of solutions.","Parameter2":"seg","Description2":"Is the segment to which the elements are to be written.","Parameter3":"n","Description3":"Is the child within the family to which the elements are to be written. A value of 1 is for the first child, 2 for the second, and so on.","Parameter4":"source","Description4":"Is an array containing the values to be written."},{"Name":"WriteMember","Definition":"Assigns values to a selected solution from within a user objective function or mutation operator.","Parameter1":"selected","Description1":"Is an array specifying the selected family of solutions.","Parameter2":"seg","Description2":"Is the segment to which the elements are to be written.","Parameter3":"source","Description3":"Is an array containing the values to be written."},{"Name":"RANCOMB","Definition":"Permutes the values of the arguments, and returns a random combination of k out of n values.","Parameter1":"seed","Description1":"Is a numeric variable that contains the random number seed.","Parameter2":"k","Description2":"Is the number of values that you want to have in the random combination.","Parameter3":"variable-1<","Description3":"Specifies all numeric variables, or all character variables that have the same length. K values of these variables are randomly permuted.","Parameter4":"variable\u20132, ...>","Description4":"Specifies all numeric variables, or all character variables that have the same length. K values of these variables are randomly permuted."},{"Name":"EFFRATE","Definition":"Returns the effective annual interest rate.","Parameter1":"compounding-interval","Description1":"Is a SAS interval. This value represents how often rate compounds.","Parameter2":"rate","Description2":"Is numeric. rate is a nominal annual interest rate (expressed as a percentage) that is compounded at each compounding interval."},{"Name":"MVALID","Definition":"Checks the validity of a character string for use as a SAS member name.","Parameter1":"libname","Description1":"Specifies a character constant, variable, or expression that associates a SAS library with a libref. Leading and trailing blanks are ignored.","Parameter2":"string","Description2":"Specifies a character constant, variable, or expression that is checked to determine whether its value can be used as a SAS member name. Leading and trailing blanks are ignored.","Parameter3":"memtype<","Description3":"Specifies a character constant, variable, or expression that is the member type of the member name that you are using. Leading and trailing blanks are ignored. The value of memtype is not validated. The following member types are available: \n\n ACCESS specifies access descriptor files that are created by SAS/ACCESS. \n CATALOG specifies SAS catalogs. \n DATA specifies SAS data files. \n FDB specifies a financial database. \n ITEMSTOR specifies a SAS data set that consists of pieces of information that can be accessed independently. The SAS Registry is an example of an item store. \n MDDB specifies a multidimensional database. \n PROGRAM specifies stored compiled SAS programs. \n VIEW specifies SAS views.","Parameter4":"validmemname>","Description4":"Specifies a character constant, variable, or expression. The values for validmemname can be uppercase or lowercase. Leading and trailing blanks are ignored. The following list contains the values that you can use with validmemname: \n\n COMPAT | COMPATIBLE\n EXTEND \n \nDefault: VALIDMEMNAME= is set to COMPAT."},{"Name":"NOMRATE","Definition":"Returns the nominal annual interest rate.","Parameter1":"compounding-interval","Description1":"Is a SAS interval. This value represents how often the returned value is compounded.","Parameter2":"rate","Description2":"Is numeric. rate is the effective annual interest rate (expressed as a percentage) that is compounded at each interval."},{"Name":"SAVINGS","Definition":"Returns the balance of a periodic savings by using variable interest rates.","Parameter1":"base-date","Description1":"Is a SAS date. The value that is returned is the balance of the savings at base-date.","Parameter2":"initial-deposit-date","Description2":"Is a SAS date. initial-deposit-date is the date of the first deposit. Subsequent deposits are at the beginning of subsequent deposit intervals.","Parameter3":"deposit-amount","Description3":"Is numeric. All deposits are assumed constant. deposit-amount is the value of each deposit.","Parameter4":"deposit-number","Description4":"Is a positive integer. deposit-number is the number of deposits.","Parameter5":"deposit-interval","Description5":"Is a SAS interval. deposit-interval is the frequency at which deposits are made.","Parameter6":"compounding-interval","Description6":null,"Parameter7":"date-1","Description7":"Is a SAS interval. compounding-interval is the compounding interval.","Parameter8":"rate-2<","Description8":"Is a numeric percentage. Each rate is paired with a date. rate is the interest rate that starts on date.","Parameter9":"date-2, rate-2,...>","Description9":"Optional additional data-rate pair(s)."},{"Name":"SOAPWEB","Definition":"Calls a Web service by using basic Web authentication; credentials are provided in the arguments.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"URL<","Description2":"Specifies a character value that is the URL of the Web service endpoint.","Parameter3":"options>","Description3":"Optional Arguments:\n \nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWEBUSERNAME \n specifies a character value that is a user name for either basic or NTLM Web authentication. \nWEBPASSWORD \n specifies a character value that is a password for either basic or NTLM Web authentication. \n Encodings that are produced by PROC PWENCODE are supported. \nWEBDOMAIN \n specifies a character value that is the domain or realm for the user name and password \n for NTLM authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to \n set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SOAPWEBMETA","Definition":"Calls a Web service by using basic Web authentication; credentials for the authentication domain are retrieved from metadata.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"URL<","Description2":"Specifies a character value that is the URL of the Web service endpoint.","Parameter3":"options>","Description3":"Optional Arguments:\n \nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWEBAUTHDOMAIN \n specifies a character value that is the authentication domain from which to retrieve a user \n name and password from metadata for basic Web authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to \n set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SOAPWIPSERVICE","Definition":"Calls a SAS registered Web service by using WS-Security authentication; credentials are provided in the arguments.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"SERVICE<","Description2":"Specifies the service name of the endpoint service as the service is stored in the Service Registry.","Parameter3":"options>","Description3":"Optional Arguments:\n \nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password for WSSUSERNAME. \n Encodings that are produced by PROC PWENCODE are supported. \nENVFILE \n specifies a character value that is the location of the SAS environments file. \nENVIRONMENT \n specifies a character value that is the environment defined in the SAS environments file to use. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to \n set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SOAPWIPSRS","Definition":"Calls a SAS registered Web service by using WS-Security authentication; credentials are provided in the arguments.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"URL","Description2":"Specifies a character value that is the URL of the Web service endpoint.","Parameter3":"SRSURL<","Description3":"Specifies a character value that is the URL of the System Registry Service.","Parameter4":"options>","Description4":"Optional Arguments:\n \nOUT \n specifies a character value that is the fileref where the SOAP response output XML will \n be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password \n for WSSUSERNAME. Encodings that are produced by PROC PWENCODE are supported. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the \n SOAP header. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily \n to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SOAPWS","Definition":"Calls a Web service by using WS-Security authentication; credentials are provided in the arguments.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"URL<","Description2":"Specifies a character value that is the URL of the Web service endpoint.","Parameter3":"options>","Description3":"Optional Arguments:\n \nOUT \n specifies a character value that is the fileref where the SOAP response output XML \n will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password for \n WSSUSERNAME. Encodings that are produced by PROC PWENCODE are supported. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the \n SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that \n are produced by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily \n to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SOAPWSMETA","Definition":"Calls a Web service by using WS-Security authentication; credentials for the provided authentication domain are retrieved from metadata.","Parameter1":"IN","Description1":"Specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request.","Parameter2":"URL<","Description2":"Specifies a character value that is the URL of the Web service endpoint.","Parameter3":"options>","Description3":"Optional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSAUTHDOMAIN \n specifies a character value that is the authentication domain for which to retrieve credentials \n to be used for WS-Security authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to \n set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."},{"Name":"SQUANTILE","Definition":"Returns the quantile from a distribution when you specify the right probability (SDF).","Parameter1":"distribution","Description1":"Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters.","Parameter2":"probability","Description2":"Is a numeric constant, variable, or expression that specifies the value of a random variable.","Parameter3":"parameter-1, ... , parameter-k","Description3":"Are optional shape, location, or scale parameters that are appropriate for the specific distribution."},{"Name":"SYSEXIST","Definition":"Returns a value that indicates whether an operating-environment variable exists in your environment.","Parameter1":"argument","Description1":"Specifies a character variable that is the name of an operating-environment variable that you want to test."},{"Name":"TIMEVALUE","Definition":"Returns the equivalent of a reference amount at a base date by using variable interest rates.","Parameter1":"base-date","Description1":"Is a SAS date. The value that is returned is the time value of reference-amount at base-date.","Parameter2":"reference-date","Description2":"Is a SAS date. reference-date is the date of reference-amount.","Parameter3":"reference-amount","Description3":"Is numeric. reference-amount is the amount at reference-date.","Parameter4":"compounding-interval","Description4":"Is a SAS interval. compounding-interval is the compounding interval.","Parameter5":"date-1","Description5":"Is a SAS date. Each date is paired with a rate. date is the time that rate takes effect.","Parameter6":"rate-1<","Description6":"Is a numeric percentage. Each rate is paired with a date. rate is the interest rate that starts on date.","Parameter7":"date-2, rate-2,...>","Description7":"Optional additional date-rate pairs(s)"},{"Name":" ADDMATRIX","Definition":"Performs an elementwise addition of two matrices or a matrix and a scalar.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x n (that is, X[m, n]) or a scalar.","Parameter2":"Y","Description2":"Specifies an input matrix with dimensions m x n (that is, Y[m, n]) or a scalar.","Parameter3":"Z","Description3":"Specifies an output matrix with dimensions m x n (that is, Z[m, n]), such that Z = X + Y."},{"Name":"CHOL","Definition":"Calculates the Cholesky decomposition for a given symmetric matrix.","Parameter1":"X","Description1":"Specifies a symmetric positive-definite input matrix with dimensions m x m (that is, X[m, m]).","Parameter2":"Y <","Description2":"Specifies an output matrix with dimensions m x m (that is, Y[m, m]). This variable contains the Cholesky decomposition, such that \n\n Z= YY*\n \nwhere Y is a lower triangular matrix with strictly positive diagonal entries and \nY* denotes the conjugate transpose of Y. \n\nNote: If X is not symmetric positive-definite, then Y will be filled with missing values. \n","Parameter3":"validate>","Description3":"Specifies an optional argument that can increase the processing speed by avoiding error checking. The argument can take the following values: \n\n 0 the matrix X will be checked for symmetry. This is the default if the validate \n argument is omitted. \n 1 the matrix is assumed to be symmetric. \n"},{"Name":"DET","Definition":"Calculates the determinant of a specified matrix that should be square.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x n (that is, X[m, m]).","Parameter2":"a","Description2":"Specifies the returned determinate value, such that a = |X|."},{"Name":"DYNAMIC_ARRAY","Definition":"Enables an array that is declared within a function to change size in an efficient manner.","Parameter1":"array\u2013name","Description1":"Specifies the name of a temporary array.","Parameter2":"new-dim1\u2013size, ..., new-dimN-size","Description2":"Specifies a new size for the temporary array."},{"Name":"ELEMMULT","Definition":"Performs an elementwise multiplication of two matrices.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x n (that is, X[m, n]).","Parameter2":"Y","Description2":"Specifies an input matrix with dimensions m x n (that is, Y[m, n]).","Parameter3":"Z","Description3":"Specifies an output matrix with dimensions m x n (that is, Z[m, n])."},{"Name":"EXPMATRIX","Definition":"Returns a matrix e**tA given the input matrix A and a multiplier t.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x m (that is, X[m, m]).","Parameter2":"t","Description2":"Specifies a double scalar value.","Parameter3":"Y","Description3":"Specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that Y = \u0510**t\u1e8a where \u1e8a is the mean of X."},{"Name":"FILLMATRIX","Definition":"Replaces all of the element values of the input matrix with the specified value.","Parameter1":"X","Description1":"Specifies an input numeric matrix.","Parameter2":"Y","Description2":"Specifies the numeric value that will fill the matrix."},{"Name":"IDENTITY","Definition":"Converts the input matrix to an identity matrix.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x m (that is, X[m, m])."},{"Name":"INV","Definition":"Calculates a matrix that is the inverse of the provided input matrix that should be a square, non-singular matrix.","Parameter1":"X","Description1":"specifies an input matrix with dimensions m x m (that is, X[m, m]).","Parameter2":"Y","Description2":"Specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that \n \n Y[m.m] = X'[m,m]\n\n where ' denotes inverse \n \n X x Y = Y x X = I\n \nand I is the identity matrix."},{"Name":"MULT","Definition":"Calculates the multiplicative product of two input matrices.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x n (that is, X[m, n]).","Parameter2":"Y","Description2":"Specifies an input matrix with dimensions n x p (that is, Y[n, p]).","Parameter3":"Z","Description3":"Specifies an output matrix with dimensions m x p (that is, Z[m, p]), such that \n\n Z[m,p] = X[m,n] x Y[n,p]"},{"Name":"POWER","Definition":"Raises a square matrix to a given scalar value.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x m (that is, X[m, m]).","Parameter2":"a","Description2":"Specifies an integer scalar value (power).","Parameter3":"Y","Description3":"Specifies an output matrix with dimensions m x m (that is, Y[m, m]), such that \n \n Y = X**a"},{"Name":"SETNULL","Definition":"Sets a pointer element of a structure to null.","Parameter1":"pointer-element","Description1":"Is a pointer to a structure"},{"Name":"STRUCTINDEX","Definition":"Enables you to access each structure element in an array of structures.","Parameter1":"struct_array","Description1":"Specifies an array.","Parameter2":"index","Description2":"Is a 1\u2013based index as used in most SAS arrays.","Parameter3":"struct_element","Description3":"Points to an element in the array."},{"Name":"SUBTRACTMATRIX","Definition":"Performs an element-wide subtraction of two matrices or a matrix and a scalar.","Parameter1":"X","Description1":"specifies an input matrix with dimensions m x n (that is, X[m, n]) or a scalar.","Parameter2":"Y","Description2":"specifies an input matrix with dimensions m x n (that is, Y[m, n]) or a scalar.","Parameter3":"Z","Description3":"specifies an output matrix with dimensions m x n (that is, Z[m, n]), such that \n\n Z = X - Y","Parameter4":null,"Description4":null},{"Name":"TRANSPOSE","Definition":"Returns the transpose of a matrix.","Parameter1":"X","Description1":"Specifies an input matrix with dimensions m x n (that is, X[m, n]).","Parameter2":"Y","Description2":"Specifies an output matrix with dimensions n x m (that is, Y[n, m])."},{"Name":"ZEROMATRIX","Definition":"Replaces all of the element values of the numeric input matrix with 0.","Parameter1":"X","Description1":"Specifies a numeric input matrix."},{"Name":"INVCDF","Definition":"Computes the quantile from any distribution for which you have defined a cumulative distribution function (CDF).","Parameter1":"'CDF-function-name'","Description1":"Specifies the name of the CDF function. Enclose CDF-function-name in quotation marks. \n\nRequirement:CDF-function-name must be a function defined using the FCMP procedure. It must \nhave a signature as follows: \n function <CDF-function-name> (x, parameter-1, parameter-2, \u2026, parameter-n);\n endsub;","Parameter2":"options-array","Description2":"Specifies an array of options to use with the INVCDF function. Options-array is used to \ncontrol and monitor the process of inverting the CDF. Options-array can be a missing value (.), \nor it can have up to four of the following elements in the following order: \n\n initial-value \n specifies the initial guess for the quantile at which the inversion process starts. This is \n useful when you have an idea of the approximate value for quantile. The default for initial-value is 0.1. \n desired-accuracy \n specifies the desired relative accuracy of the quantile. You can specify any value in the range (0,0.1).\n The default for desired-accuracy is 1.0e-8.\n domain-type \n specifies the domain for the CDF function. A missing value or a value of 0 indicates a nonnegative \n support, that is [0,\u221e). Any other value indicates a support over the entire real line, that is (-\u221e,\u221e). \n The default for domain-type is 0. \n return-code \n specifies the return status. If options-array is of dimension 4 or more, then the fourth element contains \n the return status. Return-code can have one of the following values: \n <=0 \n indicates success. If negative, then the absolute value is the number of times the CDF function was \n evaluated in order to compute the quantile. A larger absolute value indicates longer convergence time. \n 1 \n indicates that the quantile could not be computed.","Parameter3":"cumulative-probability","Description3":"Specifies the cumulative probability value for which the quantile is desired. This must be in the range [0,1).","Parameter4":"parameter-1, parameter-2, ..., parameter-n","Description4":"Specifies the parameters of the distribution at which the quantile is desired. You must specify exactly the same number of parameters as required by the specified CDF function, and they should appear exactly in the same order as required by the specified CDF function."},{"Name":"ISNULL","Definition":"Determines whether a pointer element of a structure is null.","Parameter1":"pointer-element","Description1":"Specifies a variable that contains the address of another variable."},{"Name":"LIMMOMENT","Definition":"Computes the limited moment of any distribution for which you have defined a cumulative distribution function (CDF).","Parameter1":"'CDF-function-name'","Description1":"Specifies the name of the CDF function. Enclose CDF-function-name in quotation marks. \n\nRequirement:CDF-function-name must be a function defined using the FCMP procedure. It must \nhave a signature as follows: \n function <CDF-function-name> (x, parameter-1, parameter-2, \u2026, parameter-n);\n endsub;","Parameter2":"options-array","Description2":"Specifies an array of options to use with the INVCDF function. Options-array is used to \ncontrol and monitor the process of inverting the CDF. Options-array can be a missing value (.), \nor it can have up to four of the following elements in the following order: \n\n initial-value \n specifies the initial guess for the quantile at which the inversion process starts. This is \n useful when you have an idea of the approximate value for quantile. The default for initial-value is 0.1. \n desired-accuracy \n specifies the desired relative accuracy of the quantile. You can specify any value in the range (0,0.1).\n The default for desired-accuracy is 1.0e-8.\n domain-type \n specifies the domain for the CDF function. A missing value or a value of 0 indicates a nonnegative \n support, that is [0,\u221e). Any other value indicates a support over the entire real line, that is (-\u221e,\u221e). \n The default for domain-type is 0. \n return-code \n specifies the return status. If options-array is of dimension 4 or more, then the fourth element contains \n the return status. Return-code can have one of the following values: \n <=0 \n indicates success. If negative, then the absolute value is the number of times the CDF function was \n evaluated in order to compute the quantile. A larger absolute value indicates longer convergence time. \n 1 \n indicates that the quantile could not be computed.","Parameter3":"order","Description3":"Specifies the order of the desired limited moment. This value must be in the range [1,10].","Parameter4":"limit","Description4":"Specifies the upper limit that is used to compute the desired limited moment. This value must be greater than 0.","Parameter5":"parameter-1, parameter-2, ..., parameter-n","Description5":"Specifies the parameters of the distribution at which the limited moment is desired. You must specify exactly the same number of parameters as required by the specified CDF function, and they should appear exactly in the same order as required by the specified CDF function."},{"Name":"READ_ARRAY","Definition":"Reads data from a SAS data set into a PROC FCMP array variable.","Parameter1":"data_set_name","Description1":"Specifies the name of the data set from which the array data will be read. data_set_name must be a character literal or variable that contains the member name (libname.memname) of the data set to be read from.","Parameter2":"array_variable <","Description2":"specifies the PROC FCMP array variable into which the data is read. array_variable must be a local temporary array variable because the function might need to grow or shrink its size to accommodate the size of the data set.","Parameter3":"'col_name_1', ..., 'col_name_n'>","Description3":"Specifies optional names for the specific columns of the data set that will be read. \n\nIf specified, col_name must be a literal string enclosed in quotation marks. col_name cannot be a PROC FCMP variable. If column names are not specified, PROC FCMP reads all of the columns in the data set."},{"Name":"RUN_MACRO(, ); ","Definition":"Executes a predefined SAS macro.","Parameter1":"'macro_name' <","Description1":"specifies the name of the macro to be run. \n \nRequirement:macro_name must be a string enclosed in quotation marks or a character variable that contains the macro to be executed.","Parameter2":"variable_1, ..., variable_n>","Description2":"Specifies optional PROC FCMP variables, which are set by macro variables of the same name. These arguments must be PROC FCMP double or character variables. \n\nBefore SAS executes the macro, SAS macro variables are defined with the same name and value as the PROC FCMP variables. After SAS executes the macro, the macro variable values are copied back to the corresponding PROC FCMP variables."},{"Name":"RUN_SASFILE","Definition":"Executes SAS code in a fileref that you specify.","Parameter1":"'fileref_name' <","Description1":"Specifies the name of the SAS fileref that points to the SAS code. \n \nRequirement:fileref_name must be a string enclosed in quotation marks or a character variable that contains the name of the SAS fileref.","Parameter2":"variable-1, ..., variable-n>","Description2":"Specifies optional PROC FCMP variables that will be set by macro variables of the same name. These arguments must be PROC FCMP double or character variables. \n\nBefore SAS executes the code that references the SAS file, the SAS macro variables are defined with the same name and value as the PROC FCMP variables. After execution, these macro variable values are copied back to the corresponding PROC FCMP variables."},{"Name":"SOLVE","Definition":"Computes implicit values of a function.","Parameter1":"'function-name'","Description1":"Specifies the name of the function. Enclose function-name in quotation marks.","Parameter2":"options-array","Description2":"Specifies an array of options to use with the SOLVE function. Options-array is used to control and \nmonitor the root-finding process. Options-array can be a missing value (.), or it can have up to five \nof the following elements in the following order: \n\n initial-value \n specifies the starting value for the implied value. The default for the first call is 0.001. If \n the same line of code is executed again, then options-array uses the previously found implied value. \n absolute-criterion \n specifies a value for convergence. The absolute value of the difference between the expected value \n and the predicted value must be less than the value of absolute-criterion for convergence. \n Default:1.0e\u201312 \n relative-criterion \n specifies a value for convergence. When the change in the computed implied value is less than the \n value of relative-criterion, then convergence is assumed. \n Default:1.0e\u20136 \n maximum-iterations \n specifies the maximum number of iterations to use to find the solution. \n Default:100 \n solve-status \n can be one of the following values: \n 0 successful. \n 1 could not decrease the error. \n 2 could not compute a change vector. \n 3 maximum number of iterations exceeded. \n 4 initial objective function is missing.","Parameter3":"expected-value","Description3":"Specifies the expected value of the function of interest.","Parameter4":"argument-1, ..., argument-n","Description4":"Specifies the arguments to pass to the function that is being minimized."},{"Name":"WRITE_ARRAY","Definition":"Writes data from a PROC FCMP array variable to a data set that can then be used by SAS programs, macros, and procedures.","Parameter1":"data_set_name","Description1":"Specifies the name of the data set to which the array data will be written. data_set_name must be a character literal or variable that contains the member name (libname.memname) of the data set to be created.","Parameter2":"array_variable <","Description2":"Specifies the PROC FCMP array or matrix variable whose contents will be written to data_set_name.","Parameter3":"'col_name_1', ..., 'col_name_n'>","Description3":"Specifies optional names for the columns of the data set that will be created. \n\nIf specified, col_name must be a literal string enclosed in quotation marks. col_name cannot be a PROC FCMP variable. If column names are not specified, the column name will be the array name with a numeric suffix."},{"Name":"INSERT_CATALOG","Definition":"Inserts a SAS catalog into a package.","Parameter1":"packageID","Description1":"Identifies the package into which the catalog will be inserted. \n \nType: Numeric.","Parameter2":"libname","Description2":"Names the library that contains the catalog. \n \nType: Numeric.","Parameter3":"memname","Description3":"Specifies the name of the catalog. \n \nType: Character","Parameter4":"desc","Description4":"Describes the catalog. \n \nType: Character","Parameter5":"nameValue","Description5":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc","Description6":"Receives a return code. \n \nType: Numeric."},{"Name":"INSERT_DATASET","Definition":"Inserts a SAS data set into a package.","Parameter1":"packageId","Description1":"Identifies the package into which the data set will be inserted. \n \nType: Numeric.","Parameter2":"libname","Description2":"Names the library that contains the data set. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the name of the data set. \n \nType: Character.","Parameter4":"desc","Description4":"Describes the data set. \n \nType: Character.","Parameter5":"nameValue","Description5":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc<","Description6":"Receives a return code. \n \nType: Numeric.","Parameter7":"properties","Description7":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ALLOW_READ_PROTECTED_MEMBER\n DATASET_OPTIONS\n TRANSFORMATION_TYPE\n CSV_SEPARATOR\n CSV_FLAG\n\nType: Character\n ","Parameter8":"propValue1, ...propValueN>","Description8":"Specifies one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ALLOW_READ_PROTECTED_MEMBER\n specifies a value of \"YES\". It is important to note that the password and encryption \n attributes are not preserved in the intermediate published format (whether on a queue \n or in an archive). Because of this exposure, take care when publishing data sets that \n are password protected, encrypted or both. \n\n DATASET_OPTIONS\n specifies data set options. \n\n TRANSFORMATION_TYPE\n indicates that the data set should be transformed to the specified type when published. \n At this time, the only supported value for this property is CSV, for Comma-Separated-Value.\n\n CSV_SEPARATOR\n indicates the separator to use when creating the CSV file. The default separator \n is a comma (,).\n\n CSV_FLAG\n indicates a CSV override flag. Supported values include NO_VARIABLES, NO_LABELS, and \n EXTENDED. By default, when writing numeric variable values into the CSV file, BEST is \n used to format numerics that have no format associated with them. To override this \n default, specify the property value EXTENDED on the CSV_FLAG property. This extends \n the number of digits used as the precision level. By default, if the data set is \n transformed into a CSV file, then the file's first line contains all of the specified \n variables. The second line contains all of the specified labels. To override this \n default behavior, specify flags with values \"NO_VARIABLES\" or \"NO_LABELS\". To \n specify both values, a CSV_FLAG property must be specified for each.\n\nType: Character or Numeric\n "},{"Name":"INSERT_FDB","Definition":["Inserts a financial database (FDB) into a package.","Inserts a SAS data set into a package."],"Parameter1":"packageID","Description1":"Identifies the package into which the FDB will be inserted. \n \nType: Numeric.","Parameter2":"libname","Description2":"Names the library that contains the FDB. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the name of the FDB. \n \nType: Character.","Parameter4":"desc","Description4":"Describes the FDB. \n \nType: Character.","Parameter5":"nameValue","Description5":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc<","Description6":"Receives a return code. Type: Numeric."},{"Name":"INSERT_FILE","Definition":"Inserts a file into a package.","Parameter1":"packageID","Description1":"Identifies the package into which the file will be inserted. \n \nType: Numeric.","Parameter2":"filename","Description2":"Names the file, using the following syntax:\n\n FILENAME: external_filename\n FILEREF: sas_fileref\n\nType: Character\n ","Parameter3":"filetype","Description3":"Specifies the file type, which must be TEXT or BINARY. \n \nType: Character.\n ","Parameter4":"mimeType","Description4":"Specifies the MIME type, the value of which is determined by the user. Subscribers can filter packages based on MIME type.\n\n Suggested MIME types include the following:\n\n application/msword\n application/octet-stream\n application/pdf\n application/postscript\n application/zip\n audio/basic\n image/jpeg\n image/gif\n image/tiff\n model/vrml\n text/html\n text/plain\n text/richtext\n video/mpeg\n video/quicktime\n ","Parameter5":["desc","nameValue"],"Description5":"Describes the file. Type: Character.","Parameter6":"nameValue","Description6":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\n Name/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter7":"rc<","Description7":"Receives a return code. \n \nType: Numeric.","Parameter8":"properties","Description8":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n PATH\n\nType: Character \n ","Parameter9":"propValue1, ...propValueN>","Description9":"Specifies one value for each specified property name. The order of the property values must match the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n PATH\n indicates the relative path information for this file. The relative path is included \n as the name of the file when defined in the ZIP file. The specified path should not \n contain a drive or device letter, or a leading slash. All slashes should be forward \n slashes '/' as opposed to backslashes '\\'. This property is recognized only by the \n archive transport. It is ignored by all other transports.\n\nType: Character\n "},{"Name":"INSERT_HTML","Definition":"Inserts HTML files into a package.","Parameter1":"packageId","Description1":"Identifies the package into which the HTML will be inserted. \n \nType: Numeric.","Parameter2":"body","Description2":"Names the HTML body file, using the following syntax:\n\n FILEREF: SAS_fileref\n FILENAME: external_filename\n\nType: Character \n ","Parameter3":"bodyURL","Description3":"Specifies the URL to be used for the body file.\n\nType: Character \n ","Parameter4":"frame","Description4":"Names the HTML frame file, using the following syntax:\n\n FILEREF: SAS_fileref\n FILENAME: external_filename\n\nType: Character \n ","Parameter5":"frameURL","Description5":"Specifies the URL to be used for the frame file. Type: Character","Parameter6":"contents","Description6":"Names the HTML contents file, using the following syntax:\n\n FILEREF: SAS_fileref\n FILENAME: external_filename\n\nType: Character \n ","Parameter7":"contentsURL","Description7":"Specifies the URL to be used for the contents file. \n \nType: Character.","Parameter8":"page","Description8":"Names the HTML page file, using the following syntax:\n\n FILEREF: SAS_fileref \n FILENAME: external_filename\n\nType: Character \n ","Parameter9":"pageURL","Description9":"Specifies the URL to be used for the page file. \n \nType: Character.","Parameter10":"desc","Description10":"Describes the inserted HTML package entry. \n \nType: Character.","Parameter11":"nameValue","Description11":"Identifies a list of one or more space-separated name/value pairs, each in the form of name=value. Name/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter12":"rc<","Description12":"Receives a return code. \n \nType: Numeric.","Parameter13":"properties","Description13":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ENCODING\n COMPANION_FILE\n COMPANION_MIMETYPE\n COMPANION_URL\n GPATH\n GPATH_URL\n NESTED_NAME\n\nType: Character\n ","Parameter14":"propValue1, ...propValueN>","Description14":"Specifies one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ENCODING\n indicates the character set of the HTML files, such as ISO-8859-1.\n\n COMPANION_FILE\n indicates the name of an additional HTML file that is to be added to this set of \n HTML files. Multiple COMPANION_FILE properties and values can be specified. Name \n the companion files, using the following syntax: FILEREF: SAS_fileref or\n FILENAME: external_filename\n\n COMPANION_MIMETYPE\n indicates the MIME type of the companion file that is to be added to the inserted \n HTML entry. If specified, then this property must be preceded by the COMPANION_FILE \n property.\n\n COMPANION_URL\n indicates the URL of an HTML file that is to be added to the inserted HTML entry.\n If specified, then this property must be preceded by the COMPANION_FILE property.\n\n GPATH\n indicates the name of a single directory that contains the ODS-generated graphical \n files for inclusion as companion files to the HTML file set.\n \n GPATH_URL\n indicates the URL of the directory that contains the ODS-generated graphical files. \n An example of a URL might be ~ods-output/images. Alternatively, you can specify \n \"NONE\" as the GPATH_URL property value. If the value of \"NONE\" is specified, then \n only the filename is used as the URL.\n\n NESTED_NAME\n indicates the name of the nested directory to create for the storage of the set \n of HTML files. If you do not specify a value for this property, then a name is \n generated automatically.\n\nType: Character\n "},{"Name":"INSERT_MDDB","Definition":"Inserts a SAS multidimensional database into a package.","Parameter1":"packageID","Description1":"Identifies the package into which the MDDB will be inserted. \n \nType: Numeric.","Parameter2":"libname","Description2":"Names the library that contains the MDDB. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the name of the MDDB. \n \nType: Character.","Parameter4":"desc","Description4":"Describes the MDDB. \n \nType: Character.","Parameter5":"nameValue","Description5":"\n Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc","Description6":"Receives a return code. \n \nType: Numeric."},{"Name":"INSERT_PACKAGE","Definition":"Inserts a package into another package.","Parameter1":"packageId","Description1":"Identifies the package. \n \nType: Numeric.","Parameter2":"insertPackageId","Description2":"Identifies the package that will be nested in the package identified by packageID. \n \nType: Numeric.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties","Description4":"Identifies a comma-separated list of optional property names. At present, only one property is supported:\n\n NESTED_NAME\n\n Type: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies one value for each specified property name. The order of the property values must match the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n NESTED_NAME \n indicates the name of the nested directory to create for the storage of the nested package. \n If you do not specify a value for this property, then a name is generated automatically. \n\n Note: The NESTED_NAME property is valid only when publishing to the WebDAV-compliant \n server transport. \nType: Character \n "},{"Name":"INSERT_REF","Definition":"Inserts a reference into a package.","Parameter1":"packageID","Description1":"Identifies the package into which the reference will be inserted. \n \nType: Numeric.","Parameter2":"referenceType","Description2":"Specifies the type of the reference. Specify HTML or URL. \n \nType: Character.","Parameter3":"reference","Description3":"Specifies the reference that is to be inserted. \n \nType: Character.","Parameter4":"desc","Description4":"Describes the reference. \n \nType: Character.","Parameter5":"nameValue","Description5":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc","Description6":"Receives a return code. Type: Numeric."},{"Name":"INSERT_SQLVIEW","Definition":"Inserts a PROC SQL view into a package.","Parameter1":"packageId","Description1":"Identifies the package into which the PROC SQL view will be inserted. \n \nType: Numeric.","Parameter2":"libname","Description2":"Names the library that contains the PROC SQL view. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the name of the PROC SQL view. \n \nType: Character.","Parameter4":"desc","Description4":"Describes the PROC SQL view. \n \nType: Character.","Parameter5":"nameValue","Description5":"\n Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\nName/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc","Description6":"Receives a return code. \n \nType: Numeric."},{"Name":"INSERT_VIEWER","Definition":"Inserts a viewer into a package.","Parameter1":"packageId","Description1":"Identifies the package into which the viewer will be inserted. \n \nType: Numeric.","Parameter2":"filename","Description2":"Names the viewer, using the following syntax:\n\n FILENAME: external_filename\n FILEREF: sas_fileref\n\nType: Character\n ","Parameter3":"mimeType","Description3":"Specifies the MIME type, the value of which is determined by the user. Subscribers can filter packages based on MIME type.","Parameter4":"desc","Description4":"Describes the file. \n \nType: Character.","Parameter5":"nameValue","Description5":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\n Name/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc<","Description6":"Receives a return code. \n \nType: Numeric.","Parameter7":"properties","Description7":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ENCODING\n VIEWER_TYPE\n\nType: Character \n ","Parameter8":"propValue1, ...propValueN>","Description8":"Specifies one value for each specified property. The order of the values must match the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ENCODING \n indicates the character set of the viewer file, such as ISO-8859-1. \n\n VIEWER_TYPE \n indicates the type of the viewer. Valid values are HTML and TEXT. \n The default value is HTML.\n\nType: Character\n "},{"Name":"PACKAGE_BEGIN","Definition":"Initializes a package and returns a unique package identifier.","Parameter1":"packageId","Description1":"Identifies the new package. \n \nType: Numeric.","Parameter2":"desc","Description2":"Describes the package. \n \nType: Character.","Parameter3":"nameValue","Description3":"Identifies a list of one or more space-separated name/value pairs, each in one of the following forms:\n\n name\n name=value\n name=\"value\"\n name=\"single value with spaces\"\n name=(value)\n name=(\"value\")\n name=(value1, \"value 2\", ... valueN)\n\n Name/value pairs are site-specific; they are used for the purpose of filtering.\n ","Parameter6":"rc<","Description6":"Receives a return code. \n \nType: Numeric.","Parameter7":"properties","Description7":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ABSTRACT\n EXPIRATION_DATETIME\n NAMESPACES\n \nType: Character \n ","Parameter8":"propValue1, ...propValueN>","Description8":"Specifies one value for each specified property name. The order of the values must match the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ABSTRACT \n provides an abstract (short summary) of the inserted package.\n\n EXPIRATION_DATETIME \n numeric SAS datetime value. This value should be specified in GMT format. \n\n NAMESPACES \n specifies unique names that associate published packages with specific contexts \n on a WebDAV-compliant server. The association of a namespace with a package \n organizes package data on a server according to meaningful criteria or contexts.\n\nType: Character or Numeric\n "},{"Name":"PACKAGE_END","Definition":"Frees the resources that are associated with a package.","Parameter1":"packageID","Description1":"Identifies the package. \n \nType: Numeric.","Parameter2":"rc","Description2":"Receives a return code. \n \nType: Numeric."},{"Name":"PACKAGE_PUBLISH*1","Definition":"Publishes a package to an archive.","Parameter1":"packageID","Description1":"Identifies the package that is to be published. \n \nType: Numeric.","Parameter2":"publishType","Description2":"Indicates how to publish the package. To publish the package by using the archive transport, specify TO_ARCHIVE. \n \nType: Character.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric","Parameter4":"properties","Description4":"Identifies a comma-separated list of optional property names. Specify any of the following property names, or specify '' to indicate that no properties are to be applied: \n\n ARCHIVE_NAME\n ARCHIVE_PATH\n FTP_PASSWORD\n FTP_USER\n HTTP_PASSWORD\n HTTP_PROXY_URL\n HTTP_USER\n\nType: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies a value for each specified property name. The order of the property values must match the order of the property names in the properties parameter.\n\nType: Character \n "},{"Name":"PACKAGE_PUBLISH*2","Definition":"Publishes a package using the e-mail transport.","Parameter1":"packageID","Description1":"Identifies the package that is to be published. \n \nType: Numeric.","Parameter2":"publishType","Description2":"Indicates how to publish the package. To publish the package by using the e-mail transport, specify TO_EMAIL. Type: Character.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties","Description4":"Identifies a comma-separated list of optional property names. Specify any of the following property names, or specify '' to indicate that no properties are to be applied: \n\n ADDRESSLIST_DATASET_LIBNAME, ADDRESSLIST_DATASET_MEMNAME, \n ADDRESSLIST_VARIABLE_NAME, APPLIED_TEXT_VIEWER_NAME, \n APPLIED_VIEWER_NAME, ARCHIVE_NAME, ARCHIVE_PATH, \n COLLECTION_URL, DATASET_OPTIONS, ENCODING, FROM, \n FTP_PASSWORD, FTP_USER, HTTP_PASSWORD, HTTP_PROXY_URL,\n HTTP_USER, IF_EXISTS, PARENT_URL, PROCESS_VIEWER, REPLYTO, \n SUBJECT, TARGET_VIEW_NAME, TARGET_VIEW_MIMETYPE, \n TEXT_VIEWER_NAME, VIEWER_NAME \n\nType: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies a value for each specified property name. The order of the property values must match the order of the property names in the properties parameter.\n\nType: Character or Numeric.\n ","Parameter6":"address1 <, ...addressN>","Description6":null},{"Name":"PACKAGE_PUBLISH*3","Definition":"Publishes a package to one or more message queues.","Parameter1":"packageID","Description1":"Identifies the package that is to be published. \n \nType: Numeric.","Parameter2":"publishType","Description2":"Indicates how to publish the package. To publish the package by using the queue transport, specify a publishType of TO_QUEUE. Type: Character.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties<","Description4":"Identifies a comma-separated list of optional property names. Specify any of the following property names, or specify '' to indicate that no properties are to be applied: \n\nType: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies a value for each specified property name. The order of the property values must match the order of the property names in the properties parameter.\n \n ARCHIVE_NAME\n ARCHIVE_PATH\n CORRELATIONID\n FTP_PASSWORD\n FTP_USER\n HTTP_PASSWORD\n HTTP_PROXY_URL\n HTTP_USER\n \nType: Character or Numeric.\n ","Parameter6":"queue1 <, ...queueN>","Description6":"Character string that specifies the queue(s) that will be used to publish the package. When publishing to MSMQ queues, use the following syntax: \n\n MSMQ://queueHostMachineName\\queueName\n \n When publishing to MQSeries queues, use the following syntax: \n MQSERIES://queueManager:queueName\n or \n MQSERIES-C://queueManager:queueName\n\nType: Character \n "},{"Name":"PACKAGE_PUBLISH*4","Definition":"Publishes a package to subscribers who are associated with specified channel.","Parameter1":"packageID","Description1":"Identifies the package that is to be published. \n \nType: Numeric.","Parameter2":"publishType","Description2":"Indicates how to publish the package. To publish a package to the subscribers of a channel, specify a publishType value of TO_SUBSCRIBERS. Type: Character.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties<","Description4":"Identifies a comma-separated list of optional property names. Specify any of the following property names, or specify '' to indicate that no properties are to be applied: \n\n APPLIED_TEXT_VIEWER_NAME, APPLIED_VIEWER_NAME, ARCHIVE_NAME, \n ARCHIVE_PATH, CHANNEL_STORE, COLLECTION_URL, CORRELATIONID, \n ENCODING, FOLDER_PATH, FROM, FTP_PASSWORD, FTP_USER, \n GENERATED_NAME, HTTP_PASSWORD, HTTP_PROXY_URL, HTTP_USER, \n IF_EXISTS, METAPASS, METAUSER, PARENT_URL, PROCESS_VIEWER,\n REPLYTO, SUBJECT, TARGET_VIEW_NAME, TARGET_VIEW_MIMETYPE, \n TEXT_VIEWER_NAME, VIEWER_NAME\n\nType: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies a value for each specified property name. The order of the property values must match the order of the property names in the properties parameter.\n\nType: Character or Numeric.\n ","Parameter6":"channel","Description6":"Specifies the name of the channel as it is defined in the SAS Metadata Repository. The channel contains a list of subscribers to whom the package will be published. \n\nType: Character \n "},{"Name":"PACKAGE_PUBLISH*5","Definition":"Publishes a package to a WebDAV-compliant server.","Parameter1":"packageID","Description1":"Identifies the package that is to be published. \n \nType: Numeric.","Parameter2":"publishType","Description2":"Indicates how to publish the package. To publish the package using the WebDAV transport, specify a publishType of TO_WEBDAV. Type: Character.","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties<","Description4":"Identifies a comma-separated list of optional property names. Specify any of the following property names, or specify '' to indicate that no properties are to be applied:\n\n ARCHIVE_NAME\n ARCHIVE_PATH\n COLLECTION_URL\n HTTP_PASSWORD\n HTTP_PROXY_URL\n HTTP_USER\n IF_EXISTS\n PARENT_URL\n TARGET_VIEW_MIMETYPE\n TARGET_VIEW_NAME\n TEXT_VIEWER_NAME\n VIEWER_NAME\n \nType: Character\n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies a value for each specified property name. The order of the property values must match the order of the property names in the properties parameter.\n\nType: Character or Numeric.\n "},{"Name":"COMPANION_NEXT","Definition":"Retrieves the next companion HTML file in the ODS HTML set.","Parameter1":"entryIdx","Description1":"Identifies the companion HTML file entry.","Parameter2":"path","Description2":"Specifies the full path of the location that will receive the retrieved file.\n\nType: Character \n","Parameter3":"filename","Description3":"Returns the name of the new file. \n \nType: Character.","Parameter4":"url","Description4":"Returns the URL of the companion file. \n \nType: Character.","Parameter5":"rc<","Description5":"Receives a return code. \n \nType: Numeric.","Parameter6":"properties","Description6":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ENCODING\n MIMETYPE\n\nType: Character \n","Parameter7":"propValue1, ...propValueN>","Description7":"Specifies one value for each specified property name. The order of the property values must match the order of the property names in the properties parameter. Valid property values are defined as follows: \n\n ENCODING \n input character string that specifies the target encoding for the companion \n file. The companion file is translated into the specified encoding. An example \n of a target encoding value is ISO-8859-1.\n\n MIMETYPE \n character output parameter that identifies the MIME type of the companion \n file. The MIME type is returned in the MIMETYPE variable. The publisher of \n the companion file can set the user-specified MIME type after the companion \n file is published. If the publisher does not specify the MIME type, then the \n returned value is blank.\n\nType: Character \n"},{"Name":"ENTRY_FIRST","Definition":"Returns header information for the first entry in a package.","Parameter1":"packageId","Description1":"identifies the package. \n \nType: Numeric.","Parameter2":"entryId","Description2":"Returns the identifier of the entry. \n \nType: Numeric","Parameter3":"entryType","Description3":"Returns the type of the entry. Available types include the following:\n\n BINARY\n CATALOG\n DATASET\n FDB\n HTML\n MDDB\n NESTED_PACKAGE\n REFERENCE\n SQLVIEW\n TEXT\n VIEWER\n\nType: Character \n","Parameter4":"userSpecString","Description4":"Returns a string from the specified entry. \n \nType: Character.","Parameter5":"desc","Description5":"Returns the entry description from the specified entry. \n \nType: Character.","Parameter6":"nameValue","Description6":"Returns the name/value pairs assigned to the specified entry. Name/value pairs are site-specific; they are used for the purpose of filtering. \n\nType: Character \n ","Parameter7":"rc<","Description7":"Receives a return code. \n \nType: Numeric.","Parameter8":"properties","Description8":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n FILENAME\n\nType: Character \n ","Parameter9":"propValue1, ...propValueN>","Description9":"Returns one value for each specified property name. Valid property names are supported as follows: \n\n FILENAME \n output character string variable that returns the name of the file \n (as it exists in the package).\n\nType: Character \n "},{"Name":"ENTRY_NEXT","Definition":"Returns header information for the next entry in a package.","Parameter1":"packageId","Description1":"identifies the package. \n \nType: Numeric.","Parameter2":"entryId","Description2":"Returns the identifier of the entry. \n \nType: Numeric","Parameter3":"entryType","Description3":"Returns the type of the entry. Available types include the following:\n\n BINARY\n CATALOG\n DATASET\n FDB\n HTML\n MDDB\n NESTED_PACKAGE\n REFERENCE\n SQLVIEW\n TEXT\n VIEWER\n\nType: Character \n ","Parameter4":"userSpecString","Description4":"Returns a string from the specified entry. \n \nType: Character.","Parameter5":"desc","Description5":"Returns the entry description from the specified entry. \n \nType: Character.","Parameter6":"nameValue","Description6":"Returns the name/value pairs assigned to the specified entry. Name/value pairs are site-specific; they are used for the purpose of filtering. \n\nType: Character \n","Parameter7":"rc<","Description7":"Receives a return code. Type: Numeric.","Parameter8":"properties","Description8":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n FILENAME\n\nType: Character \n","Parameter9":"propValue1, ...propValueN>","Description9":"Returns one value for each specified property name. Valid property names are supported as follows: \n\n FILENAME \n output character string variable that returns the name of the file \n (as it exists in the package).\n\nType: Character \n "},{"Name":"PACKAGE_DESTROY","Definition":"Deletes a package.","Parameter1":"packageID","Description1":"Identifies the package to be deleted. \n \nType: Numeric.","Parameter2":"rc","Description2":"Receives a return code. \n \nType: Numeric."},{"Name":"PACKAGE_FIRST","Definition":"Returns the header information for the first package in the package list.","Parameter1":"pkgListId","Description1":"Identifies the list of retrieved packages. \n \nType: Numeric.","Parameter2":"packageId","Description2":"Identifies the retrieved package. \n \nType: Numeric.","Parameter3":"numEntries","Description3":"Returns the number of entries in the package. \n \nType: Numeric.","Parameter4":"desc","Description4":"Returns a description of the package. \n \nType: Character.","Parameter5":"dateTime","Description5":"Returns the date and time that the package was published, in GMT format.\n\nType: Numeric\n ","Parameter6":"nameValue","Description6":"Returns the name/value pairs assigned to the package. Name/value pairs are site-specific; they are used for the purpose of filtering. \n\nType: Character \n ","Parameter7":"channel","Description7":"Returns the name of a channel to which the package was published.\n\nType: Character \n ","Parameter8":"rc<","Description8":"Receives a return code.\n\nType: Numeric \n ","Parameter9":"properties","Description9":"Identifies a comma-separated list of optional property names to be returned from the package. Valid property names are as follows:\n\n ABSTRACT\n EXPIRATION_DATETIME\n\nType: Character \n ","Parameter10":"propValue1, ...propValueN>","Description10":"Returns one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows: \n\n ABSTRACT \n character string variable, if specified, is returned to the ABSTRACT \n variable.\n\n EXPIRATION_DATETIME \n numeric variable, if specified, is returned as the package expiration\n date-and-time stamp to the EXPIRATION_DATETIME variable. The date-and-\n time stamp is in GMT format.\n\nType: Character or Numeric \n "},{"Name":"PACKAGE_NEXT","Definition":"Returns the header information for the next package in the package list.","Parameter1":"pkgListId","Description1":"Identifies the list of retrieved packages. \n \nType: Numeric.","Parameter2":"packageId","Description2":"Returns the name of the retrieved package. \n \nType: Numeric.","Parameter3":"numEntries","Description3":"Returns the total number of entries in the package. \n \nType: Numeric.","Parameter4":"desc","Description4":"Describes the package. \n \nType: Character.","Parameter5":"dateTime","Description5":"Returns the date and time value that the package was published, in GMT format.\n\nType: Numeric\n ","Parameter6":"nameValue","Description6":"Returns the name/value pairs assigned to the package. Name/value pairs are site-specific; they are used for the purpose of filtering. \n\nType: Character \n ","Parameter7":"channel","Description7":"Returns the name of a channel to which the package was published.\n\nType: Character \n ","Parameter8":"rc<","Description8":"Receives a return code.\n\nType: Numeric \n ","Parameter9":"properties","Description9":"Identifies a comma-separated list of optional property names to be returned from the package. Valid property names are as follows:\n\n ABSTRACT\n EXPIRATION_DATETIME\n\nType: Character \n ","Parameter10":"propValue1, ...propValueN>","Description10":"Returns one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows: \n\n ABSTRACT \n character string variable, if specified, is returned to the ABSTRACT \n variable.\n\n EXPIRATION_DATETIME \n numeric variable, if specified, is returned as the package expiration\n date-and-time stamp to the EXPIRATION_DATETIME variable. The date-and-\n time stamp is in GMT format.\n\nType: Character or Numeric \n "},{"Name":"PACKAGE_TERM","Definition":"Frees all resources associated with the package list identifier.","Parameter1":"pkgListId","Description1":"Identifies the list of packages. \n \nType: Numeric.","Parameter2":"rc","Description2":"Receives a return code. \n \nType: Numeric."},{"Name":"RETRIEVE_CATALOG","Definition":"Retrieves a catalog from a package.","Parameter1":"entryId","Description1":"Identifies the catalog entry.\n\nType: Numeric \n ","Parameter2":"libname","Description2":"Specifies the SAS library that will contain the retrieved catalog.\n\nType: Character \n ","Parameter3":"memname","Description3":"Names the retrieved catalog.\n\nType: Character \n ","Parameter4":"rc","Description4":"Receives a return code.\n\nType: Numeric \n "},{"Name":"RETRIEVE_DATASET","Definition":"This CALL routine retrieves a data set entry from a package.","Parameter1":"entryId","Description1":"Identifies the data set entry. \n \nType: Numeric.","Parameter2":"libname","Description2":"Specifies the SAS library that will contain the retrieved data set. \n \nType: Character.","Parameter3":"memname","Description3":"Names the retrieved data set. \n \nType: Character.","Parameter4":"rc<","Description4":"Receives a return code. \n \nType: Numeric.","Parameter7":"properties","Description7":"\n Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n DATASET_OPTIONS\n CSV_SEPARATOR\n CSV_FLAG\n\n Type: Character\n ","Parameter8":"propValue1, ...propValueN>","Description8":"\n Specifies one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n DATASET_OPTIONS\n character parameter SAS data set options that are to be applied to the\n retrieved data set.\n\n CSV_SEPARATOR\n character property that applies only when the RETRIEVE_DATASET CALL routine\n is called on a CSV file entry. When this occurs, the CSV file is transformed\n into a SAS data set. A binary CSV file is identified by a MIME type of\n application/x-comma-separated-values. Use the CSV_SEPARATOR property to\n indicate the separator to be used when creating the CSV file. The default\n separator is a comma.\n\n CSV_FLAG\n character property that only applies when calling the RETRIEVE_DATASET \n CALL routine for a binary file entry. A binary CSV file is identified \n by a MIME type of application/x-comma-separated-values. This property \n is a CSV override flag. By default when converting this binary CSV file \n into a SAS data set, the first line will be processed as variable names. \n The second line will be processed as variable label names.\n\nType: Character \n "},{"Name":"RETRIEVE_FDB","Definition":"Retrieves a financial database entry from a package.","Parameter1":"entryId","Description1":"Identifies the FDB entry. \n \nType: Numeric.","Parameter2":"libname","Description2":"Specifies the SAS library that will contain the retrieved FDB. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the member name of the retrieved FDB. \n \nType: Character.","Parameter4":"rc","Description4":"Receives a return code. \n \nType: Numeric."},{"Name":"RETRIEVE_FILE","Definition":"Retrieves an external binary or text file from a package.","Parameter1":"entryId","Description1":"Identifies the file entry. \n \nType: Numeric.","Parameter2":"filename","Description2":"Specifies the name of the file or fileref, using the following syntax:\n\n FILENAME: external_filename\n FILEREF: SAS_fileref\n\nType: Character \n ","Parameter3":"rc","Description3":"Receives a return code. \n \nType: Numeric."},{"Name":"RETRIEVE_HTML","Definition":"Retrieves an HTML entry from a package.","Parameter1":"entryId","Description1":"Identifies the HTML entry. \n \nType: Numeric.","Parameter2":"path","Description2":"Specifies the full designation of the location that will receive the retrieved files.\n\nType: Character \n ","Parameter3":"body","Description3":"Returns the name of the HTML body file. \n\nType: Character \n ","Parameter4":"bodyURL","Description4":"Returns the URL of the HTML body file. \n\nType: Character \n ","Parameter5":"frame","Description5":"Returns the name of the HTML frame file.\n\nType: Character \n ","Parameter6":"frameURL","Description6":"returns the URL of the HTML frame file.\n\nType: Character \n ","Parameter7":"contents","Description7":"Returns the name of the HTML contents file. \n \nType: Character.","Parameter8":"contentsURL","Description8":"Returns the URL of the HTML contents file. \n \nType: Character.","Parameter9":"pages","Description9":"Returns the name of the HTML page file.\n\nType: Character \n ","Parameter10":["pagesURL","desc"],"Description10":["Returns the URL of the HTML page file. \n \nType: Character.","Describes the inserted HTML package entry. \n \nType: Character."],"Parameter11":"rc<","Description11":"Receives a return code. \n \nType: Numeric.","Parameter12":"properties","Description12":"\n Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ENCODING\n BODY_TOTAL\n FILE_TOTAL\n COMPANION_TOTAL\n \nType: Character\n ","Parameter13":"propValue1, ...propValueN>","Description13":"Specifies one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ENCODING\n input character string that indicates the target encoding for the retrieved \n HTML file. An example of a target encoding value is ISO-8859-1. Refer to \n Publish and Retrieve Encoding Behavior for further information.\n\n BODY_TOTAL\n numeric output parameter that returns the total number of HTML body files \n published as part of this set.\n\n FILE_TOTAL\n numeric output parameter that returns the total number of all HTML files \n published as part of this set. This includes all body, page, contents, \n frame, and additional HTML files and companion files.\n\n COMPANION_TOTAL\n numeric output parameter that returns the total number of extraneous \n HTML files that were published as part of this set.\n\nType: Character or Numeric\n\n "},{"Name":"RETRIEVE_MDDB","Definition":"Retrieves an MDDB entry from a package. An MDDB is a multidimensional database (not a data set) offered by SAS.","Parameter1":"entryId","Description1":"Identifies the MDDB entry. \n \nType: Numeric.","Parameter2":"libname","Description2":"Specifies the SAS library that will contain the retrieved MDDB. \n \nType: Character.","Parameter3":"memname","Description3":"Specifies the name of the retrieved MDDB. \n \nType: Character.","Parameter4":"rc","Description4":"Receives a return code. \n \nType: Numeric."},{"Name":"RETRIEVE_NESTED","Definition":"Retrieves the descriptive header information for a nested package entry ","Parameter1":"entryId","Description1":"Identifies the nested package entry. \n \nType: Numeric.","Parameter2":"packageId","Description2":"Returns the identifier of the nested package. \n \nType: Numeric.","Parameter3":"numEntries","Description3":"Returns the number of entries in the nested package. \n \nType: Numeric.","Parameter4":"desc","Description4":"Returns a description of the nested package entry. \n \nType: Character.","Parameter5":"dateTime","Description5":"Returns the date and time that the nested package was published, in GMT format.\n\nType: Numeric\n ","Parameter6":"nameValue","Description6":"Returns the name/value pairs assigned to the package. Name/value pairs are site-specific; they are used for the purpose of filtering. \n\nType: Character \n ","Parameter7":"rc","Description7":"Receives a return code.\n\nType: Numeric \n "},{"Name":"RETRIEVE_PACKAGE","Definition":"This CALL routine retrieves descriptive header information for all packages.","Parameter1":"pkgListId","Description1":"Identifies the list of packages. \n \nType: Numeric.","Parameter2":"retrievalType","Description2":"Specifies the transport to use when retrieving a package. Valid values include the following:\n\n FROM_QUEUE\n FROM_ARCHIVE\n FROM_WEBDAV\n\nType: Character\n ","Parameter3":"retrievalInfo","Description3":"Specifies transport-specific information that determines the package to retrieve. When retrieving from an archive, specify the physical path and name of the archive, excluding the extension. When retrieving from a WebDAV-compliant server, specify the URL that identifies the package to retrieve. When retrieving from MSMQ queues, use the following syntax:\n\n MSMQ://queueHostMachineName\\queueName\n \n When retrieving from MQSeries queues, use the following syntax:\n MQSERIES://queueManager:queueName \n or\n MQSERIES-C://queueManager:queueName \n \nType: Character\n ","Parameter4":"totalPackages","Description4":"Provides the total number of packages found.\n\nType: Numeric \n ","Parameter5":"rc<","Description5":"Receives a return code.\n\nType: Numeric \n ","Parameter6":"properties","Description6":"Identifies a comma-separated list of optional property names to be returned from the package. Valid property names are as follows:\n\n CORRELATIONID\n FTP_PASSWORD\n FTP_USER\n HTTP_PASSWORD\n HTTP_PROXY_URL\n HTTP_USER\n NAMESPACES\n QUEUE_TIMEOUT\n \nType: Character\n ","Parameter7":"propValue1, ...propValueN>","Description7":"Returns one value for each specified property. The order of the values matches the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n CORRELATIONID\n This character string specifies retrieval of only those packages that have the\n specified correlation identifier. (Applies only to the message queue transport.)\n\n FTP_PASSWORD\n When retrieving with the archive transport (FROM_ARCHIVE), this character string \n indicates the password that is used to connect to the remote host. Specify this \n property only when the host does not accept anonymous access. (Applies to the \n FROM_ARCHIVE property when the FTP protocol is used.)\n\n FTP_USER\n When retrieving with the archive transport, this character string indicates the \n name of the user to connect to the remote host. (Applies to the FROM_ARCHIVE \n property when the FTP protocol is used.)\n\n HTTP_PASSWORD\n When retrieving with the WebDAV transport (FROM_WEBDAV), this character string \n indicates the password used to bind to the Web server. Specify this property only \n when the Web server does not accept anonymous access. (Applies to the FROM_ARCHIVE \n property when the HTTP protocol is used.)\n\n HTTP_PROXY_URL\n When retrieving with the WebDAV transport, this character string indicates the \n URL of the proxy server. (Applies to the archive transport when the HTTP protocol \n is used with archive specifications.)\n\n HTTP_USER\n When retrieving with the WebDAV transport, this character string indicates the \n name of the user to bind to the Web server. (Applies to the FROM_ARCHIVE property \n when the HTTP protocol is used.)\n\n NAMESPACES\n When retrieving with the WebDav transport, this character string lists one or \n more namespaces that you are interested in, using the syntax shown in the \n following example:\n\n a=\"http://www.host.com/myNamespace\"\n A=\"http://www.host.com/myNamespace1\"\n B=\"http://www.host.com/myNamespace2\"\n \n QUEUE_TIMEOUT \n This numeric value identifies the number of seconds for the poll timeout. \n By default, if this property is not specified, the RETRIEVE_PACKAGE CALL \n routine polls and returns immediately with the number of packages found, \n if any. To override this default, specify the QUEUE_TIMEOUT property so \n that the RETRIEVE_PACKAGE CALL routine will continue to poll for packages \n until at least one package is found on the queue or until the timeout \n occurs, whichever occurs first.\n\nType: Character or Numeric\n "},{"Name":"RETRIEVE_REF","Definition":"Retrieves a reference from a package.","Parameter1":"entryId","Description1":"Identifies the reference entry to be retrieved. \n \nType: Numeric.","Parameter2":"referenceType","Description2":"Returns the type of the reference, the value of which can be HTML or URL. \n \nType: Character","Parameter3":"reference","Description3":"Returns the value of the reference. \n \nType: Character","Parameter4":"rc","Description4":"Receives a return code. \n \nType: Numeric."},{"Name":"RETRIEVE_SQLVIEW","Definition":"Retrieves a PROC SQL view from a package.","Parameter1":"entryId","Description1":"identifies the PROC SQL view entry. \n \nType: Numeric","Parameter2":"libname","Description2":"Specifies the SAS library that will contain the retrieved PROC SQL view. \n \nType: Character","Parameter3":"memname","Description3":"Specifies the name of the PROC SQL view. \n \nType: Character","Parameter4":"rc","Description4":"Receives a return code. \n \nType: Numeric"},{"Name":"RETRIEVE_VIEWER","Definition":"Retrieves a viewer entry from a package.","Parameter1":"entryId","Description1":"Identifies the file entry. \n \nType: Numeric.","Parameter2":"filename","Description2":"Specifies the name of the file or fileref, using the following syntax:\n\n FILENAME: external_filename\n FILEREF: sas_fileref\n\nType: Character\n ","Parameter3":"rc<","Description3":"Receives a return code. \n \nType: Numeric.","Parameter4":"properties","Description4":"Identifies a comma-separated list of optional property names. Valid property names are as follows:\n\n ENCODING\n \nType: Character \n ","Parameter5":"propValue1, ...propValueN>","Description5":"Specifies one value for each specified property. The order of the values must match the order of the property names in the properties parameter. Valid property values are defined as follows:\n\n ENCODING \n input character string that indicates the target encoding for the retrieved \n viewer file. An example of a target encoding value is ISO-8859-1.\n\nType: Character\n "},{"Name":"SYSMACEXEC","Definition":"The %SYSMACEXEC function returns the number 1 if the macro is currently executing. Otherwise, if the macro is not executing, the number 0 is returned.","Parameter1":"macro_name","Description1":"The name of a macro or a text expression that yields the name of the macro."},{"Name":"SYSMACEXIST","Definition":"The %SYSMACEXIST function returns the number 1 if a definition for the macro exists in the WORK.SASMACR catalog. If there is not a macro definition, the returned value is 0.","Parameter1":"macro_name","Description1":"The name of a macro or a text expression that yields the name of the macro."},{"Name":"SYSMEXECDEPTH","Definition":"Returns the nesting depth of macro execution from the point of the call to %SYSMEXECDEPTH.","Parameter1":null,"Description1":"No parameters are required."},{"Name":"SYSMEXECNAME","Definition":"Returns the name of the macro executing at a requested nesting level.","Parameter1":"n","Description1":"The nesting level at which you are requesting the macro name.\n 0 open code\n >0 nesting level"},{"Name":"GRDSVC_ENABLE","Definition":"Enables or disables one or all SAS sessions on a grid.","Parameter1":"identifier<","Description1":"Specifies one or all server sessions to be enabled or disabled for grid execution. \nThe identifier is specified as follows:\n\n server-ID\n specifies the name of a SAS/CONNECT server session to be enabled or disabled for grid execution.\n _ALL_\n specifies that all SAS sessions are enabled or disabled for grid execution.\n ","Parameter2":"option-1; ... option-n>","Description2":"Optional Arguments:\n \n SASAPPSERVER=server-value | SERVER=server-value | RESOURCE=server-value\n specifies the name of a SAS Application Server that has been defined in the SAS Metadata Repository.\n The SAS Application Server contains the definition for the logical grid server that defines the grid \n environment.\n\n WORKLOAD=workload-value\n identifies the resource for the job to be executed on the grid. This value specifies an additional\n resource requirement for which Platform Suite for SAS selects the appropriate grid nodes.\n\n JOBNAME=job-name-macro-variable\n specifies the macro variable that contains the name that is assigned to the job that is executed \n on the grid.\n\n JOBOPTS=job-opts-macro-variable\n specifies the macro variable that contains the job options. The job option name/value pairs are\n assigned to job-opts-macro-variable.\n\n \"\" | \"\n disables grid execution for the specified server ID or all server sessions.\n "},{"Name":"GRDSVC_GETADDR","Definition":"Reports the IP address of the grid node on which the SAS session was chosen to execute.","Parameter1":"identifier","Description1":"Identifies the server session that is executing on the grid. The identifier can be \nspecified as follows: \n\n \"\"| \"\n is an empty string that is used to refer to the computer on which the function is executing.\n\n server-ID\n specifies the server session that is executing on a grid.\n "},{"Name":"GRDSVC_GETINFO","Definition":"Reports information about the grid environment.","Parameter1":"identifier","Description1":"Specifies the server session or the SAS Application Server whose details you want to have reported\nto the SAS log. The identifier is specified as follows:\n\n server-ID\n reports details about the specified server ID. The details that are returned by the GRDSRV_INFO\n function reflect the arguments that are specified in the GRDSVC_ENABLE function.\n Requirement:A server-ID cannot exceed eight characters.\n\n _ALL_\n reports details about all server IDs to the SAS log. The details that are returned by the\n GRDSRV_INFO function reflect the arguments that are specified in the GRDSVC_ENABLE function.\n\n SASAPPSERVER=SAS-application-server | SERVER=SAS-application-server | SERVER=SAS-application-server\n reports information about the specified SAS Application Server to the SAS log.\n\n _SHOWID_\n lists each server session and its status: enabled for grid execution, enabled for SMP execution, or disabled.\n "},{"Name":"GRDSVC_GETNAME","Definition":"Reports the name of the grid node on which the SAS grid server session was chosen to execute.","Parameter1":"identifier","Description1":"Identifies the server session that is executing on the grid. The identifier can be \n specified as follows:\n\n \"\" | \"\n is an empty string that is used to refer to the computer at which the statement is executed.\n\n server-ID\n specifies the server session that is executing on a grid.\n You use the same server-ID that you used to sign on to a server session using the RSUBMIT\n statement or the SIGNON statement.\n\n If the function is used in a DATA step, enclose server-ID in double or single quotation marks."},{"Name":"GRDSVC_NNODES","Definition":"Reports the total number of job slots that are available for use on a grid.","Parameter1":"argument;option","Description1":"argument: \n SASAPPSERVER= | SERVER= | RESOURCE=SAS-application-server \n specifies the name of the SAS Application Server that has been defined in the SAS Metadata \n Repository. \n\noption:\n WORKLOAD=workload-value \n identifies the resource for the type of job to be executed on the grid. This value specifies \n the workload requirements for which Platform Suite for SAS selects the grid nodes that contain \n these resources. \n \n The specified workload value should match one of the workload values that is defined in the \n SAS Application Server in the SAS Metadata Repository. \n \n Requirement:If you specify WORKLOAD=, you must also specify the SASAPPSERVER= option. \n Workload values are case sensitive.\n \nExample:\n%let numofnodes=%sysfunc(grdsvc_nnodes(sasappserver=SASApp; workload=em));"},{"Name":"KVERIFY","Definition":"Returns the position of the first character unique to an expression.","Parameter1":"source","Description1":"Is text or a text expression that you want to examine for characters that do not exist in excerpt.","Parameter2":"excerpt","Description2":"Is text or a text expression that defines the set of characters that %KVERIFY uses to examine source."},{"Name":"KTRIM","Definition":"Trims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM.","Parameter1":"text | text expression","Description1":"Text string or text exprression"},{"Name":"QKTRIM","Definition":"Trims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM.","Parameter1":"text | text expression","Description1":"Text string or text exprression"},{"Name":"QKLOWCAS","Definition":"Changes uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS.","Parameter1":"text | text expression","Description1":"Text string or text exprression"},{"Name":"KLOWCASE","Definition":"Changes uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS.","Parameter1":"text | text expression","Description1":"Text string or text exprression"},{"Name":"COT","Definition":"Returns the cotangent.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression and is expressed in radians.\n \nRestriction: argument cannot be 0 or a multiple of PI.\n "},{"Name":"CSC","Definition":"Returns the cosecant.","Parameter1":"argument","Description1":"\n Specifies a numeric constant, variable, or expression and is expressed in radians.\n\n Restriction: argument cannot be 0 or a multiple of PI.\n "},{"Name":"DOSUBL","Definition":"Imports macro variables from the calling environment, and exports macro variables back to the \ncalling environment.","Parameter1":"X","Description1":"Specifies a text string."},{"Name":"FCOPY","Definition":"Copies records from one fileref to another fileref, and returns a value that indicates whether the \nrecords were successfully copied.","Parameter1":"'fileref-1'","Description1":"Specifies an existing fileref from which records are to be copied.","Parameter2":"'fileref-2'","Description2":"Specifies an existing fileref to which records are to be copied."},{"Name":"SEC","Definition":"Returns the secant.","Parameter1":"argument","Description1":"Specifies a numeric constant, variable, or expression and is expressed in radians. \n \nRestriction: argument cannot be an odd multiple of PI/2.\n "},{"Name":"TYPEOF","Definition":"Returns a value that indicates whether the argument is character or numeric.","Parameter1":"column","Description1":"Can have one of the following values:\n \nC\n indicates that the argument is a character value.\n\nN\n indicates that the argument is a numeric value.\n "},{"Name":"TZONEID","Definition":"Returns the current time zone ID."},{"Name":"TZONENAME","Definition":"Returns the current standard or daylight savings time, time zone name."},{"Name":"TZONEOFF","Definition":"Returns the user time zone offset."},{"Name":"TZONES2U","Definition":"Converts a SAS date time value to a UTC date time value.","Parameter1":"datetime","Description1":"Specifies a SAS datetime value.","Parameter2":"time-zone-name","Description2":"Specifies a predefined time zone. Predefined time zone names take into consideration standard and \ndaylight saving time, and rules for daylight savings time for that time zone. \n\nFor a list of time zone names, see Appendix 2, \u201cTime Zone IDs and Time Zone Names,\u201d in \nSAS National Language Support (NLS): Reference Guide"},{"Name":"TZONEU2S","Definition":"Converts a UTC date time value to a SAS date time value.","Parameter1":"datetime","Description1":"Specifies a UTC date time value.","Parameter2":"<time-zone-ID>","Description2":"Specifies a region/area value that is defined by SAS. When you specify a zone ID, the time zone\nthat SAS uses is determined by time zone name and daylight savings time rules. \n\nNote: Time zone IDs are compatible with Java time zone names. \n\nFor a list of zone IDs, see Appendix 2, \u201cTime Zone IDs and Time Zone Names,\u201d in \nSAS National Language Support (NLS): Reference Guide"},{"Name":"CLIBEXIST","Definition":"Returns 0 when the specified caslib name is not found and 1 when the caslib is found.","Parameter1":"session name","Description1":"A valid session name.","Parameter2":"caslib name","Description2":"A valid caslib name."},{"Name":"GETCASURL","Definition":"Returns the value for a URL for connecting to the CAS Server Monitor.","Parameter1":"<session>","Description1":"If 0 parameters are specified, then the SAS SESSREF= option value is used."},{"Name":"GETLCASLIB","Definition":"Returns the caslib that was bound to a CAS LIBNAME engine libref in the CASLIB= option when it was assigned.","Parameter1":"libref","Description1":"Specifies the caslib name that is associated with the library reference."},{"Name":"GETLSESSREF","Definition":"Returns the session reference that is associated with a CAS LIBNAME engine libref.","Parameter1":"libref","Description1":"Specifies the session reference name."},{"Name":"GETLTAG","Definition":"Returns the tag that was associated with a CAS LIBNAME engine libref in the TAG= option when it is assigned.","Parameter1":"libref","Description1":"specifies the tag that is associated with the library reference."},{"Name":"SESSFOUND","Definition":"\n The SAS function SESSFOUND returns 0 when not found and 1 when the session is found. This function\n only has access to sessions connected using SAS Client interfaces. To return a full set of sessions\n known to the CAS server use Proc CAS and the \"listsessions\" action or the CAS statement.\n\n CAS mySess LISTSESSIONS ;\n ","Parameter1":"session-name","Description1":"Name of the CAS session."},{"Name":"GETSESSOPT","Definition":"The SAS function GETSESSOPT returns the value for a Cloud Analytic Services (CAS) session option.","Parameter1":"session-name","Description1":"Name of the CAS session.","Parameter2":"session-option-name","Description2":"\n A CAS session option name. You can list the session option names with this code:\n \n CAS mysess LISTSESSOPTS;\n "},{"Name":"ISDOUBLE","Definition":"Returns true if the type of value (parameter) is double; otherwise, it returns false.\n \n Boolean isDouble (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISINTEGER","Definition":"Returns true if the type of value (parameter) is integer; otherwise, it returns false.\n \n Boolean isInteger (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISDICTIONARY","Definition":"Returns true if the type of value (parameter) is dictionary; otherwise, it returns false.\n \n Boolean isDictionary (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISARRAY","Definition":"Returns true if the type of value (parameter) is array; otherwise, it returns false.\n \n Boolean isArray (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISTABLE","Definition":"Returns true if the type of value (parameter) is table; otherwise, it returns false.\n \n Boolean isTable (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISLIST","Definition":"Returns true if the type of value (parameter) is list; otherwise, it returns false.\n \n Boolean isList (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISSTRING","Definition":"Returns true if the type of value (parameter) is string; otherwise, it returns false.\n \n Boolean isString (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISBLOB","Definition":"Returns true if the type of value (parameter) is blob; otherwise, it returns false.\n \n Boolean isBlob (value);","Parameter1":"value","Description1":"A casl value"},{"Name":"ISTYPE","Definition":"This is a generic version where the type is specified as the first argument.\n \nisType(\"<type>\", value);","Parameter1":"\"<type>\"","Description1":"Type name. The function returns true if this name matches that of the type name for the value parameter.","Parameter2":"value","Description2":"A casl value"},{"Name":"NEWTABLE","Definition":"Creates a new table.\n \n o 1st argument is a list of column names\n o 2nd argument is a list of types for each column\n o any further arguments are rows to be added to the table\n o A table with the given rows is returned. No rows are required.\n\n Example:\n columns = {\"make\", \"MSRP\", \"HP\", \"cylinders\"};\n coltypes = {\"varchar\", \"int64\", \"integer\",\"int64\"};\n row1 = {\"dodge\", 20000, 250, 4};\n row2 = {\"ford\", 30000, 200, 6};\n table = newtable( \"cars\", columns, coltypes, row1, row2,...};\n\nThe name of the table can be specified as the first argument, but is not required. The default name is \"nodeList\".\n ","Parameter1":"<table-name>","Description1":"Name of the new table","Parameter2":"list-column-names","Description2":"List of column names","Parameter3":"list-column-types","Description3":"List of types for each column","Parameter4":"row-1,...row-n","Description4":"Rows (of type list) to be added to the table"},{"Name":"ADD_TABLE_ATTR","Definition":"The add_table_attr adds attributes to a table. The first parameter is the table. Then pairs of values are specified as the key and value. ","Parameter1":"table","Description1":"Name of the table to add attributes to.","Parameter2":"\"key-1\"","Description2":"A specified key","Parameter3":"\"value-1\"","Description3":"A specified value for key-1","Parameter4":"\"key-n\"","Description4":"A specified key-n","Parameter5":"\"value-n\"","Description5":"A specified value for key-n"},{"Name":"DISCARD","Definition":"Discard the variables that are listed as arguments.","Parameter1":"var-1,...var-n","Description1":"Variable(s) to be discarded, separated by commas."},{"Name":"TABCOLUMNS","Definition":"Gets the columns for a table.","Parameter1":"table","Description1":"Name of the table."},{"Name":"TABTYPES","Definition":"Gets the types for a table.","Parameter1":"table","Description1":"Name of the table."},{"Name":"PRINTTABLE","Definition":"This prints a table to the specified location. This function allows better control over the output a table as compared to \"print table\";","Parameter1":"table","Description1":"Name of the table to print.","Parameter2":"\"<fileref>\"","Description2":"fileref can be:\n o ods -- uses the default print location with ODS output when appropriate.\n o log -- uses the default print location, but do not use ODS; uses the internal format routines.\n o <name> -- uses the named fileref location for output.\n o file:<path> -- uses the given path as the location for output. This file is closed after the table has been written.","Parameter3":"column","Description3":"Specifies the number of columns to be printed per line."},{"Name":"ADDROW","Definition":"Adds row to a table.","Parameter1":"table","Description1":"Name of the table.","Parameter2":"row1","Description2":"Row (of type list) to add to the table."},{"Name":"FINDTABLE","Definition":"This function will search the given value for the first table it sees. This is useful when a result from an action has a table result, but you do not know the name, you just know it is there.","Parameter1":"result","Description1":"Table result from an action."},{"Name":"TRACEBACK","Definition":"This will return a string consisting of the traceback from the current function."},{"Name":"DICTIONARY","Definition":"Returns the value of a key from a dictionary. If the value does not exist, then a 0 is returned.","Parameter1":"dictionary","Description1":"Name of the dictionary.","Parameter2":"\"key\"","Description2":"Dictionary key whose value is to be determined."},{"Name":"EXISTS","Definition":"Determines if a key exists in a dictionary.","Parameter1":"dictionary","Description1":"Name of the dictionary.","Parameter2":"\"key\"","Description2":"Dictionary key"},{"Name":"READPATH","Definition":"This will read the contents of the file given into the variable as a string.","Parameter1":"\"file-path\"","Description1":"Path of file to read."},{"Name":"SESSION","Definition":"Creates a session variable.","Parameter1":"\"session-name\"","Description1":"Name of the CAS session.","Parameter2":"port","Description2":"Port number","Parameter3":"\"username\"","Description3":"Username enlosed in quotes.","Parameter4":"nodes","Description4":"Number of nodes"},{"Name":"SORT","Definition":"Returns a list sorted in ascending order.","Parameter1":"list","Description1":"List to sort."},{"Name":"SORT_REV","Definition":"Returns a list sorted in desccending order.","Parameter1":"list","Description1":"List to sort."},{"Name":"GITFN_VERSION","Definition":"Validate that libgit2 is available for use and if available report the version that is being used."},{"Name":"GITFN_CLONE","Definition":"Clone the specified repository into the target directory on SAS server.","Parameter1":"uri","Description1":"Specifies the URI of the repository, such as \"https://github.com/mamonaco1973/itr.git\".","Parameter2":"dir","Description2":"The path of a directory on the SAS server for the repository be cloned into.","Parameter3":"user","Description3":"User name for a secured repository.","Parameter4":"password","Description4":"Password for a secured repository.","Parameter5":"path-public-ssh","Description5":"The path to the public ssh key file.","Parameter6":"path-private-ssh","Description6":"The path to the private ssh key file."},{"Name":"GITFN_STATUS","Definition":"Get the number of status objects associated with the local repository.","Parameter1":"dir","Description1":"The path containing a cloned Git repository on the SAS server."},{"Name":"GITFN_STATUS_GET","Definition":"Get the attribute of a status of object that was obtained from calling GITFN_STATUS on the local repository.","Parameter1":"n","Description1":"The Nth status object to retrieve attributes from.","Parameter2":"dir","Description2":"The path containing a cloned GIT repository on the SAS server.","Parameter3":"attr","Description3":"The attribute to retrieve. Valid attributes are PATH, STATUS and STAGED.","Parameter4":"out-value","Description4":"Returns the value of the specified attribute."},{"Name":"GITFN_STATUSFREE","Definition":"Free the status objects associated with a repository that were acquired with GITFN_STATUS.","Parameter1":"dir","Description1":"The path containing a cloned GIT repository on the SAS server that has previously had GITFN_STATUS called."},{"Name":"GITFN_IDX_ADD","Definition":"Stages 1 to N number of files in preparation for commit.","Parameter1":"dir","Description1":"The path of the local Git Repository.","Parameter2":"file1","Description2":"The relative path of the first file to be staged.","Parameter3":"fileStatus1","Description3":"The status of the file. New, Modified, Deleted, Renamed, or type change.","Parameter4":"fileStatus2, ...","Description4":"The status of the second file, etc. New, Modified, Deleted, Renamed, or type change."},{"Name":"GITFN_IDX_REMOVE","Definition":"Un-stages 1 to N number of files.","Parameter1":"dir","Description1":"The path of the local GIT Repository.","Parameter2":"file1","Description2":"The relative path of the first file to be staged.","Parameter3":"file2, ...","Description3":"The relative path of the first file to be staged, etc."},{"Name":"GITFN_COMMIT","Definition":"Commits staged files to the local repository.","Parameter1":"dir","Description1":"The path of the local GIT Repository.","Parameter2":"updateref","Description2":"Reference to update. In most cases \"HEAD\" should be used.","Parameter3":"authorName","Description3":"Commit author's name.","Parameter4":"authorEmail","Description4":"Commit author's email.","Parameter5":"commitMessage","Description5":"Commit message. Used for providing some details of the commit. Displayed in commit log."},{"Name":"GITFN_PUSH","Definition":"Pushes commits on the local repository to the remote repository.","Parameter1":"dir","Description1":"The path of the local Git Repository.","Parameter2":"username","Description2":"User name used for authentication.","Parameter3":"password","Description3":"Password used for authentication.","Parameter4":"pubSSHKeyPath","Description4":"The path to the public SSH key file.","Parameter5":"privSSHKeyPath","Description5":"The path to the private SSH key file."},{"Name":"GITFN_PULL","Definition":"Pulls changes from the remote repository that were pushed by other users.","Parameter1":"dir","Description1":"The path of the local Git Repository.","Parameter2":"username","Description2":"User name used for authentication.","Parameter3":"password","Description3":"Password used for authentication.","Parameter4":"pubSSHKeyPath","Description4":"The path to the public SSH key file.","Parameter5":"privSSHKey","Description5":"The path to the private SSH key file."},{"Name":"GITFN_COMMIT_LOG","Definition":"Get the number of commit objects associated with the local repository.","Parameter1":"dir","Description1":"The path containing a cloned Git repository on the SAS server."},{"Name":"GITFN_COMMIT_GET","Definition":"Get the attribute of a commit object that was obtained from calling GITFN_COMMIT_LOG on the local repository.","Parameter1":"n","Description1":"The Nth commit object to retrieve attributes from.","Parameter2":"dir","Description2":"The path containing a cloned Git repository on the SAS server.","Parameter3":"attr","Description3":"The attribute to retrieve. Valid attributes are id\", \"author\", \"email\", \"message\", \"parent_ids\", and \"time.\"","Parameter4":"out-value","Description4":"Returns the value of the specified attribute."},{"Name":"GITFN_COMMITFREE","Definition":"Free the commit objects associated with a repository that were acquired with GITFN_COMMIT_LOG.","Parameter1":"dir","Description1":"The path containing a cloned Git repository on the SAS server that has previously had GITFN_COMMIT_LOG called."},{"Name":"GITFN_DIFF","Definition":"Get the number of diffs between two commits.","Parameter1":"dir","Description1":"The path containing a cloned Git repository on the SAS server.","Parameter2":"olderCommitID","Description2":"The older of the two commit IDs to run the diff between.","Parameter3":"newerCommitID","Description3":"The newer of the two commit IDs to run the diff between."},{"Name":"GITFN_DIFF_GET","Definition":"Get the attribute of a diff object that was obtained from calling GITFN_DIFF on the local repository and between two commit ids.","Parameter1":"n","Description1":"The Nth commit object to retrieve attributes from.","Parameter2":"dir","Description2":"The path containing a cloned Git repository on the SAS server.","Parameter3":"attr","Description3":"The attribute to retrieve. Valid attributes are File, Diff_Content, Diff_type.\"","Parameter4":"out-value","Description4":"Returns the value of the specified attribute."},{"Name":"GITFN_DIFF_FREE","Definition":"Free the diff objects associated with a repository and commit ids that were generated with GITFN_DIFF.","Parameter1":"dir","Description1":"The path containing a cloned Git repository on the SAS server that has previously had GITFN_DIFF called.","Parameter2":"olderCommitID","Description2":"The commit ID of the older of the two commits.","Parameter3":"newerCommitID","Description3":"The commit ID of the newer of the two commits."},{"Name":"GITFN_RESET","Definition":"Function to reset the local repository to a specific commit.","Parameter1":"dir","Description1":"The path to the local GIT repository.","Parameter2":"commitID","Description2":"The commit ID to reset to.","Parameter3":"reset_type","Description3":"Type of reset desired. HARD (reset working directory and index discard all local changes including uncommitted), MIXED (leave working directory untouched, reset index), or SOFT (leave working directory and index untouched)."},{"Name":"GITFN_DEL_REPO","Definition":"Function to delete a local Git repository and its contents.","Parameter1":"dir","Description1":"The path to the local GIT repository."},{"Name":"GITFN_NEW_BRANCH","Definition":"Function to create a new Git branch.","Parameter1":"dir","Description1":"The path to the local Git repository.","Parameter2":"id","Description2":"The id of the Git commit level to branch.","Parameter3":"name","Description3":"The name to give the new branch.","Parameter4":"force","Description4":"1 if the branch name specified is already in use, replace the branch location with this commit level."},{"Name":"GITFN_DEL_BRANCH","Definition":"Function to delete a Git branch.","Parameter1":"dir","Description1":"The path to the local Git repository.","Parameter2":"name","Description2":"The name of the Git branch to delete."},{"Name":"GITFN_CO_BRANCH","Definition":"Function to check out a Git branch.","Parameter1":"dir","Description1":"The path to the local Git repository.","Parameter2":"name","Description2":"The name of the Git branch to check out."},{"Name":"GITFN_MRG_BRANCH","Definition":"Function to merge a Git branch.","Parameter1":"path","Description1":"The path to the local Git repository.","Parameter2":"branch","Description2":"The name of the Git branch to merge into the checked-out branch.","Parameter3":"userid","Description3":"The user ID that is invoking the merge.","Parameter4":"email","Description4":"The email address of the user that is invoking the merge."},{"Name":"GITFN_DIFF_IDX_F","Definition":"Function to get the diff of a file that is in the index.","Parameter1":"path","Description1":"The path to the local Git repository.","Parameter2":"file-path","Description2":"The file path relative to the local repository.","Parameter3":"out-diff-content","Description3":"Out variable that holds the content of the diff."},{"Name":"GITFN_RESET_FILE Function","Definition":"Function to reset/discard changes of a file that is in the index.","Parameter1":"path","Description1":"The path to the local Git repository.","Parameter2":"file-path","Description2":"The file path relative to the local repository."}],"#comment":[{},{},{},{},{},{},{},{},{},{},{},{},{}]}} ================================================ FILE: server/data/SASDataSetOptions.json ================================================ {"Keywords":{"Keyword":[{"Name":"ALTER=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns an alter password to a SAS file and enables access to a password-protected \nSAS file."}},{"Name":"BUFNO=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"Help":{"#cdata":"Specifies the number of buffers for processing a SAS data set."}},{"Name":"BUFSIZE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip7":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"Help":{"#cdata":"Specifies a permanent buffer size for output SAS data sets."}},{"Name":"CNTLLEV=","Type":"DATASET_OPTION_V","Values":{"@Value1":"LIB","@Value2":"MEM","@Value3":"REC"},"ToolTips":{"@ToolTip1":"Specifies that concurrent access is controlled at the library level. Library-level control restricts concurrent access to only one update process to the library.","@ToolTip2":"Specifies that concurrent access is controlled at the SAS data set (member) level.","@ToolTip3":"Specifies that concurrent access is controlled at the observation (record) level."},"Help":{"#cdata":"Specifies the level of shared access to SAS data sets."}},{"Name":"COMPRESS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"NO","@Value2":"YES","@Value3":"CHAR","@Value4":"BINARY","@Value5":"FORCE"},"ToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding).","@ToolTip3":"Same as YES, but COMPRESS=CHAR is only accepted by Version 7 and later versions. Note: May not apply to Cloud Analytic Server (CAS).","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression). Note: May not apply to Cloud Analytic Server (CAS).","@ToolTip5":"Specifies that the size of the CHAR variables in the DATA step output table are used when appending new observations."},"Help":{"#cdata":"Compresses observations in an output SAS data set."}},{"Name":"DLDMGACTION=","Type":"DATASET_OPTION_V","Values":{"@Value1":"FAIL","@Value2":"ABORT","@Value3":"REPAIR","@Value4":"NOINDEX","@Value5":"PROMPT"},"ToolTips":{"@ToolTip1":"Stops the step, issues an error message to the log immediately. This is the default for batch mode.","@ToolTip2":"Terminates the step, issues an error message to the log, and terminates the SAS session.","@ToolTip3":"Automatically repairs and rebuilds indexes and integrity constraints, unless the data file is truncated. You use the REPAIR statement in PROC DATASETS to restore a truncated data set. It issues a warning message to the log. This is the default for interactive mode.","@ToolTip4":"Automatically repairs the data file without the indexes and integrity constraints, deletes the index file, updates the data file to reflect the disabled indexes and integrity constraints, and limits the data file to be opened only in INPUT mode.","@ToolTip5":"Displays a dialog box that asks you to select the FAIL, ABORT, REPAIR, or NOINDEX action."},"Help":{"#cdata":"Specifies what type of action to take when a SAS data set in a SAS data library \nis detected as damaged."}},{"Name":"DROP=","Type":"DATASET_OPTION_CV","Help":{"#cdata":"Excludes variables from processing or from output SAS data sets."}},{"Name":"FILECLOSE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"DISP","@Value2":"LEAVE","@Value3":"REREAD","@Value4":"REWIND"},"ToolTips":{"@ToolTip1":"Positions the tape volume according to the disposition specified in the operating environment's control language.","@ToolTip2":"Positions the tape at the end of the file that was just processed. Use FILECLOSE=LEAVE if you are not repeatedly accessing the same files in a SAS program but you are accessing one or more subsequent SAS files on the same tape.","@ToolTip3":"Positions the tape volume at the beginning of the file that was just processed. Use FILECLOSE=REREAD if you are accessing the same SAS data set on tape several times in a SAS program.","@ToolTip4":"Rewinds the tape volume to the beginning. Use FILECLOSE=REWIND if you are accessing one or more previous SAS files on the same tape, but you are not repeatedly accessing the same files in a SAS program."},"Help":{"#cdata":"Specifies how a tape is positioned when a SAS file on the tape is closed."}},{"Name":"FIRSTOBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the number of the first observation to process in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of the first observation to process in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of the first observation to process in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the number of the first observation to process in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the number of the first observation to process as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the number of the first observation to process to 1. This is the default.","@ToolTip7":"Sets the number of the first observation to process to the maximum number of observations in the data set, up to the largest eight-byte, signed integer, which is 2\u2076\u00b3-1, or or approximately 9.2 quintillion observations."},"Help":{"#cdata":"Causes processing to begin at a specified observation."}},{"Name":"GENMAX=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: GENMAX=number-of-generations \n \nRequests generations for a data set and specifies the maximum number of versions. \n\nSyntax Description: \nnumber-of-generations\n requests generations for a data set and specifies the maximum number of versions to maintain. \n The value can be from 0 to 1,000. The default is GENMAX=0, which means that no generation data \n sets are requested."}},{"Name":"GENNUM=","Type":"DATASET_OPTION_V","Values":{"@Value1":"ALL","@Value2":"HIST","@Value3":"REVERT","@Value4":""},"ToolTips":{"@ToolTip1":"Refers to the base version and all historical versions in a generation group.","@ToolTip2":"Refers to all historical versions, but excludes the base version in a generation group.","@ToolTip3":"Deletes the base version and changes the most current historical version, if it exists, to the base version.","@ToolTip4":" is a number that references a specific version from a generation group. Specifying a positive number is an absolute reference to a specific generation number that is appended to a data set's name (that is, gennum=2 specifies MYDATA#002)."},"Help":{"#cdata":"Syntax: GENNUM=ALL | HIST | REVERT | integer \n \nRestricts processing for generation data sets. You use the option in parentheses after the name of each SAS file."}},{"Name":"IDXNAME=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Directs SAS to use a specific index to satisfy the conditions of a WHERE expression."}},{"Name":"IDXWHERE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Tells SAS to choose the best index to optimize a WHERE expression, and to disregard the possibility that a sequential search of the data set might be more resource -efficient.","@ToolTip2":"Tells SAS to ignore all indexes and satisfy the conditions of a WHERE expression with a sequential search of the data set."},"Help":{"#cdata":"Overrides the SAS System decision about whether to use an index to satisfy the conditions \nof a WHERE expression."}},{"Name":"INDEX=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Defines indexes when a SAS data set is created."},"SubOptionsKeywords":"UNIQUE|NOMISS"},{"Name":"IN=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: IN=variable \n \nCreates a Boolean variable that indicates whether the data set contributed data to the current observation. \n\nSyntax Description\nvariable\n names the new variable whose value indicates whether the input data set contributed data to the current \n observation. Within the DATA step, the value of the variable is 1 if the data set contributed to the \n current observation. Otherwise, the value is 0.Creates a variable that indicates whether the data set \n contributed data to the current observation."}},{"Name":"KEEP=","Type":"DATASET_OPTION_CV","Help":{"#cdata":"Syntax: KEEP=variable(s) \n\nFor an input data set, specifies the variables to process; for an output data set, specifies the variables \nto write to the data set.\n\nSyntax Description: \n\nvariable(s)\n lists one or more variable names. You can list the variables in any form that SAS allows."}},{"Name":"LABEL=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies a label for the data set."}},{"Name":"MEMTYPE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"ACCESS","@Value2":"ALL","@Value3":"CATALOG","@Value4":"DATA","@Value5":"FDB","@Value6":"MDDB","@Value7":"PROGRAM","@Value8":"VIEW"},"ToolTips":{"@ToolTip1":"Access descriptor files (created by SAS/ACCESS software)","@ToolTip2":"All member types","@ToolTip3":"SAS catalogs","@ToolTip4":"SAS data files","@ToolTip5":"Financial database","@ToolTip6":"Multidimensional database","@ToolTip7":"Stored compiled SAS programs","@ToolTip8":"SAS views"},"Help":{"#cdata":"[Syntax: (mtype(s))] \n \nRestricts deleting one or more member types. For example, the following PROC DELETE statement \ndeletes all the DATA files in the default data library: \n\n proc delete memtype=view;\n run;"}},{"Name":"OBSBUF=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: OBSBUF=n\n\nDetermines the size of the view buffer for processing a DATA step view.\n\nSyntax Description:\n\nn\n specifies the number of observations that are read into the view buffer at a time.\n\nDefault: 32K bytes of memory are allocated for the default view buffer, which means the default \nnumber of observations that can be read into the view buffer at one time depends on the observation \nlength. Therefore, the default is the number of observations that can fit into 32K bytes. If the "}},{"Name":"OBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"nT","@Value6":"hexX","@Value7":"MIN","@Value8":"MAX"},"ToolTips":{"@ToolTip1":"Specifies a number to indicate when to stop processing observations in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies a number to indicate when to stop processing observations in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies a number to indicate when to stop processing observations in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies a number to indicate when to stop processing observations in multiples of 1,099,511,627,776 (terabytes). Replace n with an integer value.","@ToolTip6":"Specifies the number to indicate when to stop processing observations as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip7":"Sets the number to indicate when to stop processing observations to 0. Use OBS=0 in order to create an empty data set that has the structure, but not the observations, of another data set.","@ToolTip8":"Sets the number to indicate when to stop processing observations to the maximum number of observations in the data set, up to the largest eight-byte, signed integer, which is 2\u2076\u00b3-1, or or approximately 9.2 quintillion observations. This is the default."},"Help":{"#cdata":"Causes processing to end with the nth observation."}},{"Name":"OUTREP=","Type":"DATASET_OPTION_V","Values":{"@Value1":"ALPHA_TRU64","@Value2":"ALPHA_VMS_32","@Value3":"ALPHA_VMS_64","@Value4":"HP_IA64","@Value5":"HP_UX_32","@Value6":"HP_UX_64","@Value7":"INTEL_ABI","@Value8":"LINUX_32","@Value9":"LINUX_IA64","@Value10":"LINUX_X86_64","@Value11":"MIPS_ABI","@Value12":"MVS_32","@Value13":"MVS_64_BFP","@Value14":"OS2","@Value15":"RS_6000_AIX_32","@Value16":"RS_6000_AIX_64","@Value17":"SOLARIS_32","@Value18":"SOLARIS_64","@Value19":"SOLARIS_X86_64","@Value20":"VAX_VMS","@Value21":"VMS_IA64","@Value22":"WINDOWS_32","@Value23":"WINDOWS_64"},"ToolTips":{"@ToolTip1":"Tru64 UNIX","@ToolTip2":"OpenVMS Alpha","@ToolTip3":"OpenVMS Alpha","@ToolTip4":"HP-UX for the Itanium Processor Family Architecture","@ToolTip5":"HP-UX for PA-RISC","@ToolTip6":"HP-UX for PA-RISC, 64-bit","@ToolTip7":"ABI for Intel architecture","@ToolTip8":"Linux for Intel architecture","@ToolTip9":"Linux for Itanium-based systems","@ToolTip10":"Linux for x64","@ToolTip11":"MIPS ABI","@ToolTip12":"31-bit SAS on z/OS","@ToolTip13":"64-bit SAS on z/OS","@ToolTip14":"OS/2 on Intel","@ToolTip15":"RS_6000_AIX AIX","@ToolTip16":"AIX","@ToolTip17":"Solaris for SPARC","@ToolTip18":"Solaris for SPARC","@ToolTip19":"Solaris for x64","@ToolTip20":"OpenVMS VAX","@ToolTip21":"OpenVMS on HP Integrity","@ToolTip22":"32-bit SAS on Microsoft Windows","@ToolTip23":"64-bit SAS on Microsoft Windows (for both Itanium-based systems and x64)"},"Help":{"#cdata":"Syntax: OUTREP=format\n \nSpecifies the data representation for the output SAS data set. \n\nSyntax Description:\nformat\n specifies the data representation, which is the form in which data is stored in a particular \n operating environment. Different operating environments use different standards or conventions \n for storing floating-point numbers (for example, IEEE or IBM mainframe); for character encoding \n (ASCII or EBCDIC); for the ordering of bytes in memory (big Endian or little Endian); for word \n alignment (4-byte boundaries or 8-byte boundaries); for integer data-type length (16-bit, 32-bit, \n or 64-bit); and for doubles (byte-swapped or not). \n \n By default, SAS creates a new SAS data set by using the data representation of the CPU that is \n running SAS. Specifying the OUTREP= option enables you to create a SAS data set with a different \n data representation. For example, in a UNIX environment, you can create a SAS data set that uses \n a Windows data representation."}},{"Name":"POINTOBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Causes SAS software to produce a compressed data set that might be randomly accessed by observation number. This is the default.","@ToolTip2":"Suppresses the ability to randomly access observations in a compressed data set by observation number."},"Help":{"#cdata":"Controls whether a compressed data set may be processed with random access (by \nobservation number) rather than sequential access only."}},{"Name":"PW=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: PW=password \n \nAssigns a read, write, or alter password to a SAS file and enables access to a \npassword-protected SAS file. \n\nSyntax Description\npassword\n must be a valid SAS name, which limits the password to eight characters and is case-insensitive."}},{"Name":"PWREQ=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies to display a dialog box.","@ToolTip2":"Prevents a dialog box from displaying. If a missing or invalid password is entered, the data set is not opened and an error message is written to the SAS log."},"Help":{"#cdata":"Syntax: PWREQ=YES | NO \n \nControls the pop up of a requestor window for a data set password."}},{"Name":"READ=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns a read password to a SAS file and enables access to a read-protected SAS file."}},{"Name":"RENAME=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: RENAME=(old-name-1=new-name-1 ) \n \nSyntax Description: \n\nold-name\n is the variable that you want to rename. \nnew-name\n is the new name of the variable. It must be a valid SAS name. \n\nChanges the name of a variable."}},{"Name":"REPEMPTY=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that a new empty data set with a given name replaces an existing data set with the same name. This is the default.","@ToolTip2":"Specifies that a new empty data set with a given name does not replace an existing data set with the same name."},"Help":{"#cdata":"Syntax: REPEMPTY=YES | NO \n \nSpecifies whether a new, empty data set can overwrite an existing SAS data set that \nhas the same name."}},{"Name":"REPLACE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that a new data set with a given name replaces an existing data set with the same name.","@ToolTip2":"Specifies that a new data set with a given name does not replace an existing data set with the same name."},"Help":{"#cdata":"Syntax: REPLACE=NO | YES \n \nSpecifies whether a new SAS data set that contains data can overwrite an existing data \nset that has the same name."}},{"Name":"REUSE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Tracks and reuses space in compressed SAS data sets. New observations are inserted in the space that is freed when other observations are updated or deleted.","@ToolTip2":"Does not track and reuse space in compressed data sets. New observations are appended to the existing data set."},"Help":{"#cdata":"Syntax: REUSE=NO | YES \n \nSpecifies whether new observations are written to free space in compressed SAS data sets."}},{"Name":"ROLE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"FACT","@Value2":"DIMENSION|DIM"},"ToolTips":{"@ToolTip1":"Identifies the SAS data set as the fact table for a star schema.","@ToolTip2":"Identifies the SAS data set as a dimension table for a star schema"},"Help":{"#cdata":"Syntax: ROLE=NO | YES \n \nIdentifies the fact table for a star schema join. \n\nSyntax Description:\nFACT\n identifies the SAS data set as the fact table for a star schema.\nDIMENSION | DIM\n identifies the SAS data set as a dimension table for a star schema."}},{"Name":"SGIO=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that SAS activate the scatter-read / gather-write feature for a SAS data set. The scatter-read / gather-write feature remains active until your SAS session ends.","@ToolTip2":"Specifies that SAS not activate the scatter-read/gather-write feature for the SAS data set."},"Help":{"#cdata":"Activates the Scatter/Gather I/O feature for a data set."}},{"Name":"SORTEDBY=","Type":"DATASET_OPTION_V","Values":{"@Value1":"by-clause < / collate-name>","@Value2":"_NULL_"},"ToolTips":{"@ToolTip1":"By-clause names the variables and options that you use in a BY statement in a PROC SORT step. collate-name names the collating sequence that is used for the sort.","@ToolTip2":"Removes any existing sort indicator."},"Help":{"#cdata":"Syntax: SORTEDBY=by-clause | _NULL_ \n \nSyntax Description:\nby-clause < / collate-name>\n indicates how the data is currently sorted.Specifies how the data set is currently sorted. \nby-clause\n names the variables and options that you use in a BY statement in a PROC SORT step.collate-name\n names the collating sequence that is used for the sort. By default, the collating sequence is that \n of your operating environment. A slash (/) must precede the collating sequence.\n_NULL_\n removes any existing sort indicator."}},{"Name":"SPILL=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Creates a spill file for non-sequential processing of a DATA step view. This is the default.","@ToolTip2":"Does not create a spill file or reduces the size of a spill file."},"Help":{"#cdata":"Syntax: SPILL=YES | NO\n \nSpecifies whether to create a spill file for non-sequential processing of a DATA step view.\n\nSyntax Description\nYES\ncreates a spill file for non-sequential processing of a DATA step view. This is the default.\nInteraction\nA spill file is never created for sequential processing of a DATA step view.\nNO\ndoes not create a spill file or reduce the size of a spill file."}},{"Name":"TOBSNO=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: TOBSNO=n \n\nSpecifies the number of observations to send in a client/server transfer.\n\nSyntax Description:\nn\n specifies the number of observations to be transmitted."}},{"Name":"TRANTAB=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies a translation table for character conversions."}},{"Name":"TYPE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: TYPE=data-set-type\n\nSpecifies the data set type for a specially structured SAS data set.\n \nSyntax Description: \ndata-set-type\n specifies the special type of data set."}},{"Name":"WHERE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: WHERE=(where-expression-1 ) \n\nSpecifies specific conditions to use to select observations from a SAS data set.\n\nSyntax Description:\nwhere-expression\n is an arithmetic or logical expression that consists of a sequence of operators, operands, \n and SAS functions. An operand is a variable, a SAS function, or a constant. An operator is \n a symbol that requests a comparison, logical operation, or arithmetic calculation. The \n expression must be enclosed in parentheses.logical-operator\n \ncan be AND, AND NOT, OR, or OR NOT."}},{"Name":"WHEREUP=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Evaluates added observations and modified observations against a WHERE expression. Specify WHEREUP=YES when you want any added observations or modified observations to match a specified WHERE expression.","@ToolTip2":"Does not evaluate added observations and modified observations against a WHERE expression."},"Help":{"#cdata":"Syntax: WHEREUP=NO | YES\n\nSpecifies whether to evaluate added observations and modified observations against \na WHERE expression.\n\nSyntax Description:\nNO\n does not evaluate added observations and modified observations against a WHERE expression.\nYES\n evaluates added observations and modified observations against a WHERE expression."}},{"Name":"WRITE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: WRITE=write-password \n \nAssigns a write password to a SAS file and enables access to a write-protected SAS file.\n \nSyntax Description: \nwrite-password\n must be a valid SAS name."}},{"Name":"EXTENDOBSCOUNTER=|EOC=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Requests an enhanced file format in a newly created SAS data file that counts observations beyond the 32-bit limitation. Although this SAS data file is created for an operating environment that stores the number of observations with a 32-bit integer, the data file behaves like a 64-bit file with respect to counters. This is the default. Restrictions: A SAS data file that is created with an extended observation count is incompatible with releases prior to SAS 9.3. If the SAS data file was created in SAS 9.3 or later and EXTENDOBSCOUNTER was set to YES when the SAS data file was created, you must re-create the SAS data file with EXTENDOBSCOUNTER=NO. EXTENDOBSCOUNTER=YES is valid only for an output SAS data file whose internal data representation stores the observation count as a 32-bit integer. EXTENDOBSCOUNTER=YES is ignored for SAS data files with a 64-bit integer. For a table that lists the operating environments and the OUTREP= data representation values that are appropriate with EXTENDOBSCOUNTER=YES, see \u201cWhen Extending the Observation Count Is Supported\u201d in Chapter 26 of SAS Language Reference: Concepts.","@ToolTip2":"Specifies that the maximum observation count in a newly created SAS data file is determined by the long integer size for the operating environment. In operating environments with a 32-bit long integer, the maximum number is 2\u00b3\u00b9\u20131 or approximately two billion observations (2,147,483,647). In operating environments with a 64-bit long integer, the number is 2\u2076\u00b3\u20131 or approximately 9.2 quintillion observations"},"Help":{"#cdata":"Specifies whether to extend the maximum observation count in a new output SAS data file. \n \nDefault: YES\nRestrictions:\n Use with output data files only.\n Use with the BASE engine only."}},{"Name":"ENCODING=","Type":"DATASET_OPTION_V","Values":{"@Value1":"ANY","@Value2":"ASCIIANY","@Value3":"EBCDICANY","@Value4":""},"ToolTips":{"@ToolTip1":"Specifies that no transcoding occurs. Note:ANY is a synonym for binary. Because the data is binary, the actual encoding is irrelevant.","@ToolTip2":"Specifies that no transcoding occurs when the mixed encodings are ASCII encodings.","@ToolTip3":"Specifies that no transcoding occurs when the mixed encodings are EBCDIC encodings.","@ToolTip4":"Replace with a valid encoding value. See Encoding for NLS."},"Help":{"#cdata":"Overrides the encoding to use for reading or writing a SAS data set. \n \nThe value for ENCODING= indicates that the SAS data set has a different encoding from \nthe current session encoding. When you read data from a data set, SAS transcodes the \ndata from the specified encoding to the session encoding. When you write data to a data \nset, SAS transcodes the data from the session encoding to the specified encoding."}},{"Name":"ENCRYPTKEY=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: ENCRYPTKEY=key-value \n \nSpecifies a key value for AES (Advanced Encryption Standard) encryption. \nRange: 1 to 64 bytes\nRestrictions: Use with SAS 9.4 or later only. Use only with AES-encrypted data files.\n\nSyntax: ENCRYPTKEY=key-value \n\nSyntax Description:\nkey-value \n assigns an encrypt key value. You must specify the ENCRYPTKEY= data set option when you are using ENCRYPT=AES. \n The key value can be up to 64 bytes long. To create an ENCRYPTKEY= key value with or without quotation marks, \n follow these rules:\n No quotation marks:\n \u2022use alphanumeric characters and underscores only\n \u2022can be up to 64 bytes long\n \u2022use uppercase and lowercase letters\n \u2022must start with a letter\n \u2022cannot include blank spaces\n \u2022is not case-sensitive\n %let mykey=abcdefghi12;\n encryptkey=&mykey\n encryptkey=key_value\n encryptkey=key_value1\n Single quotation marks:\n \u2022use alphanumeric, special, and DBCS characters\n \u2022can be up to 64 bytes long\n \u2022use uppercase and lowercase letters\n \u2022can include blank spaces, but cannot contain all blanks\n \u2022is case-sensitive\n encryptkey='key_value'\n encryptkey='1234*#mykey'\n Double quotation marks:\n \u2022use alphanumeric, special, and DBCS characters\n \u2022can be up to 64 bytes long\n \u2022use uppercase and lowercase letters\n \u2022can include blank spaces, but cannot contain all blanks \n \u2022is case-sensitive\n encryptkey=\"key_value\"\n encryptkey=\"1234*#mykey\"\n %let mykey=Abcdefghi12;\n encryptkey=\"&mykey\""}},{"Name":"ENCRYPT=","Type":"DATASET_OPTION_V","Values":{"@Value1":"AES","@Value2":"YES","@Value3":"NO"},"ToolTips":{"@ToolTip1":"Encrypts the file by using the AES (Advanced Encryption Standard) algorithm. AES provides enhanced encryption by using SAS/SECURE software, which is included with Base SAS software. You must specify the ENCRYPTKEY= data set option when you are using ENCRYPT=AES. Restriction: The tape engine does not support ENCRYPT=AES. Use ENCRYPT=YES for tape engine encryption. CAUTION: Record all ENCRYPTKEY= values when you are using ENCRYPT=AES. If you forget to record the ENCRYPTKEY= value, you lose your data. SAS cannot assist you in recovering the ENCRYPTKEY= value. The following note is written to the log: Note: If you lose or forget the ENCRYPTKEY= value, there will be no way to open the file or recover the data.","@ToolTip2":"Encrypts the file by using the SAS Proprietary algorithm. This encryption uses passwords that are stored in the data set. At a minimum, you must specify the READ= or the PW= data set option at the same time that you specify ENCRYPT=YES. Because the encryption method uses passwords, you cannot change any password on an encrypted data set without re-creating the data set. CAUTION:Record all passwords when you are using ENCRYPT=YES. If you forget the passwords, you cannot reset it without assistance from SAS. The process is time-consuming and resource-intensive.","@ToolTip3":"Does not encrypt the file."},"Help":{"#cdata":"Specifies whether to encrypt an output SAS data set. \n \nDefault: ENCRYPT=NO\nRestriction: Use with output data sets only."}},{"Name":"APPEND=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that the rows emitted by the DATA step are appended to the CAS table.","@ToolTip2":"Specifies that the rows emitted by the DATA step are not appended to the CAS table."},"Help":{"#cdata":"Syntax: APPEND=YES | NO\n \nSpecifies that the rows emitted by the DATA step are appended to the CAS table."}},{"Name":"CASLIB=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: CASLIB=caslib\n \nSpecifies the name of the CASLIB to use for engine operations involving the dataset.By default, engine \noperations use the active CASLIB. If the libname CASLIB= option was specified, engine operations will \nuse CASLIB= caslib. To override the active CASLIB or the libname CASLIB= option, use the CASLIB= dataset \noption."}},{"Name":"COPIES=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: COPIES=integer\n \nSpecifies the number of replicate copies for a replicated table.\n\nDefault: 1\nRestriction:\nThe number of copies is limited to one less than the number of worker nodes in the server. \n\nTips:\nA larger number of replicate block copies results in greater fault tolerance for node failures \nbecause replicate tables are distributed in memory on a greater number of nodes. \n\nCOPIES=0 results in no fault tolerance in the event of a node failure."}},{"Name":"DATALIMIT=","Type":"DATASET_OPTION_V","Values":{"@Value1":"","@Value2":"","@Value3":"","@Value4":"","@Value5":"ALL"},"ToolTips":{"@ToolTip1":"Specifies the maximum number of bytes to read ","@ToolTip2":"Specifies the maximum number of kilobytes to read.","@ToolTip3":"Specifies the maximum number of megabytes to read.","@ToolTip4":"Specifies the maximum number of gigabytes to read.","@ToolTip5":"Specifies that the entire file can be read, no matter how large it is."},"Help":{"#cdata":"[Syntax: DATALIMIT=integer | integerK | integerM | integerG | ALL]\n \nSpecifies the maximum number of bytes of data that can transferred from the SAS Cloud Analytic Services server to SAS. \n\nValid in: CAS LIBNAME statement\n\nDefault: 100M\nRestriction: This option affects only read access.\nTip:\nThis option can prevent you from accidentally transferring a large amount of data from the server to the client."}},{"Name":"DUPLICATE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that the output table in the Cloud Analytic Services (CAS) is duplicated on all nodes.","@ToolTip2":"Specifies that the output table in the Cloud Analytic Services (CAS) is not duplicated on any node."},"Help":{"#cdata":"DUPLICATE=YES | NO\n \nSpecifies whether the output table in the SAS Cloud Analytic Services is duplicated on all nodes.\n\nDefault: NO\n\nInteraction:\nThe value for the COPIES= Data Set Option is ignored if you use the COPIES= data set option with \nthe DUPLICATE= data set option. "}},{"Name":"ONDEMAND=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that the temporary computed columns are evaluated one row at a time.","@ToolTip2":"Specifies that the temporary computed columns are evaluated collectively up front."},"Help":{"#cdata":"ONDEMAND=YES | NO\n \nSpecifies whether the temporary computed columns are evaluated one row at a time or collectively up front. \nOn demand execution is recommended for situations where you fetch data from the Cloud Analytic Services (CAS) \nto the SAS session, such as when the CAS table is the input data of a DATA step or a procedure. "}},{"Name":"ORDERBY=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: ORDERBY=\n \nSpecifies the variables by which to order the data within a partition. The ordering is hierarchical, \nfor example, ORDERBY=(A B) implies ordering by the values of variable B within the ordered values of \nvariable A. The specified variable(s) must exist and cannot be partitioning variables. The order is \ndetermined based on the raw value of the variables and uses locale-sensitive collation for character \nvariables. By default, values are arranged in ascending order. You can achieve descending order by \npreceding the variable name in the variable-list with the keyword DESCENDING."},"SubOptionsKeywords":"ASCENDING|DESCENDING"},{"Name":"PARTITION=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: PARTITION=(variable-list)\n \nSpecifies the list of partitioning variables for the output table. \n\no Partitioning information is ignored when tables are opened for input. Partitioning by a variable that \n does not exist on output is an error. \no Partition keys are derived based on formatted values in the order of the variable names in the variable-list. \n Key construction is not hierarchical, so PARTITION=(A B) implies that any unique combination of formatted values \n for variables A and B forms a partition of the data. \no Observations that share the same partition key are arranged together on the same worker node in the Cloud \n Analytic Services (CAS). \no Partitioning is also available for tables in SMP CAS servers."}},{"Name":"PROMOTE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Requests that the table created in the Cloud Analytic Services (CAS) is added with a global scope.","@ToolTip2":"Requests that the table created in the Cloud Analytic Services (CAS) is added without a global scope."},"Help":{"#cdata":"PROMOTE=YES | NO\n \nRequests that the table created in the Cloud Analytic Services (CAS) is added with a global scope. \n\nDefault: NO\nRestriction:\nYou can set either PROMOTE= or APPEND= to YES. An error results if you set both to YES at the same time. \n\nRequirement:\nThe caslib target must also have global scope.\n\nNote:\nGlobal scope lets other sessions access the table, subject to access controls. "}},{"Name":"READTRANSFERSIZE=|RTS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"","@Value2":"","@Value3":"","@Value4":""},"ToolTips":{"@ToolTip1":"Specifies the total number of bytes for each read to the server.","@ToolTip2":"Specifies the total number of kilobytes to read.","@ToolTip3":"Specifies the total number of megabytes to read.","@ToolTip4":"Specifies the total number of gigabytes to read."},"Help":{"#cdata":"[Syntax: READTRANSFERSIZE=<(integer ) | K | M | G>]\n \nSpecifies the maximum data transfer size in bytes that can be used when reading a table from SAS Cloud Analytic Services. \n\nDefault: 500MB\n\nRestriction: This option affects only read access.\n\nInteraction:\nREADTRANSFERSIZE= is the maximum amount of data that is transferred with each read request that is made to SAS \nCloud Analytic Services. If the entire result of the read request is smaller than the value of the READTRANSFERSIZE=\noption, only the necessary number of bytes are transferred. This situation can occur if either the table size or the \nvalue of the DATALIMIT= option is smaller than the value of the READTRANSFERSIZE= option."}},{"Name":"SCRIPT=|TEMPEXPRESS=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: SCRIPT=fileref\n \nSpecifies the file reference for the SAS script that defines the temporary computed columns."}},{"Name":"TAG=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: TAG=tagName \n \nSpecifies the tag from which to construct table names in the Cloud Analytic Services (CAS). The tag \noption was first used in the sasiola libname to handle multi-level names. A SAS data set is identified \nby its lib name (libref) and member name, for example, WORK.FOO. Table names in the Cloud Analytic \nServices (CAS) can have more than two levels. \n\nSuppose you wish to work with the CAS table USER.SASSEK.CAS.TEST.SALES_FACT. In order to reference the \nfive-level name we need to use some device to map the LIBREF.MEMBER syntax to USER.SASSEK.CAS.TEST.SALES_FACT. \nWhen the SASIOCA engine construct the name of a table in CAS, the name is constructed as UPPER(tagName).MEMBER. \nIn other words, the tagName replaces the LIBREF. \n\nUse TAG=\"MYTAG\" if you want the table name to be constricted with a tag. By default the TAG is NULL."}},{"Name":"TEMPNAMES=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Syntax: TEMPNAMES=(list of variables)\n \nLists the names of the temporary computed columns that are added to the input table. Temporary computed \ncolumns are only supported for tables opened for input. By default, temporary columns are numeric \n(8-byte doubles). For example, the following SAS code defines three variabls in a simple script and \ncaptures it in the file reference newcols. \n\nThe names of the variables you want to add to the MYCARS.CARS data set are then listed in the TEMPNAMES= option."}},{"Name":"TRANSCODE_FAIL=","Type":"DATASET_OPTION_V","Values":{"@Value1":"ERROR","@Value2":"WARN","@Value3":"SILENT"},"ToolTips":{"@ToolTip1":"Writes an error message to the SAS log. Processing will stop. ","@ToolTip2":"Writes a warning message to the SAS log. Processing will continue.","@ToolTip3":"Transcoding errors are ignored. Processing will continue."},"Help":{"#cdata":"[Syntax: TRANSCODE_FAIL=ERROR | WARN | SILENT]\n \nSpecifies how transcoding errors are reported and whether processing will continue. \n\nInteraction:\nIf you specify both the TRANSCODE_FAIL= LIBNAME and data set options, the data set option has precedence."}},{"Name":"WRITETRANSFERSIZE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"","@Value2":"","@Value3":"","@Value4":""},"ToolTips":{"@ToolTip1":"Specifies the total number of bytes for each write to the server.","@ToolTip2":"Specifies the total number of kilobytes to write.","@ToolTip3":"Specifies the total number of megabytes to write.","@ToolTip4":"Specifies the total number of gigabytes to write."},"Help":{"#cdata":"[Syntax: WRITETRANSFERSIZE=<(integer ) | K | M | G>]\n \nSpecifies the maximum data transfer size in bytes that can be used when writing to a table in SAS Cloud Analytic Services. \n\nDefault: 512KB\n\nRestriction: This option affects only write access."}}],"#comment":[{},{},{}]}} ================================================ FILE: server/data/SASDataStepOptions.json ================================================ {"Keywords":{"Keyword":[{"Name":"DEBUG","Type":"DATASTEP_OPTION","Help":{"#cdata":"Enables you to debug your program interactively by helping to identify logic errors, \nand sometimes data errors."}},{"Name":"NESTING","Type":"DATASTEP_OPTION","Help":{"#cdata":"Specifies that a note will be printed to the SAS log for the beginning and end \nof each DO-END and SELECT-END nesting level. This option enables you to debug \nmismatched DO-END and SELECT-END statements and is particularly useful in large \nprograms where the nesting level is not obvious."}},{"Name":"STACK=","Type":"DATASTEP_OPTION","Help":{"#cdata":"Specifies the maximum number of nested LINK statements."}},{"Name":"VIEW=","Type":"DATASTEP_OPTION","Help":{"#cdata":"Names a view that the DATA step uses to store the input DATA step view."}},{"Name":"SOURCE=","Type":"DATASTEP_OPTION_V","Values":{"@Value1":"SAVE","@Value2":"ENCRYPT","@Value3":"NOSAVE"},"ToolTips":{"@ToolTip1":"Saves the source code that created a stored compiled DATA step program or a DATA step view.","@ToolTip2":"Encrypts and saves the source code that created a stored compiled DATA step program or a DATA step view.","@ToolTip3":"Does not save the source code."},"Help":{"#cdata":"Specifies one of the following source options: SAVE | ENCRYPT | NOSAVE."}},{"Name":"NOLIST","Type":"DATASTEP_OPTION","Help":{"#cdata":"Suppresses the output of all variables to the SAS log when the value of _ERROR_ is 1. \n \nRestriction: NOLIST must be the last option in the DATA statement.]"}},{"Name":"PGM=","Type":"DATASTEP_OPTION_V","Help":{"#cdata":"Names the stored compiled program that SAS creates or executes in the DATA step."}},{"Name":"UNIQUE","Type":"SETKEY_OPTION_S","Help":{"#cdata":"Causes a KEY= search always to begin at the top of the index for the data set that \nis being read."}},{"Name":"END=","Type":"SETSTATEMENT_OPTION_V","Help":{"#cdata":"Creates and names a temporary variable that contains an end-of-file indicator."}},{"Name":"KEY=","Type":"SETSTATEMENT_OPTION_V","Help":{"#cdata":"Provides nonsequential access to observations in a SAS data set, which are based \non the value of an index variable or a key."}},{"Name":"INDSNAME=","Type":"SETSTATEMENT_OPTION_V","Help":{"#cdata":"Creates and names a variable that stores the name of the SAS data set from which \nthe current observation is read."}},{"Name":"NOBS=","Type":"SETSTATEMENT_OPTION_V","Help":{"#cdata":"Creates and names a temporary variable whose value is usually the total number of \nobservations in the input data set or data sets."}},{"Name":"OPEN=","Type":"SETSTATEMENT_OPTION_V","Values":{"@Value1":"IMMEDIATE","@Value2":"DEFER"},"ToolTips":{"@ToolTip1":"Specifies to open any concatenated SAS data sets immidiately.","@ToolTip2":"Specifies to open any concatenated SAS data sets until they are ready to be processed."},"Help":{"#cdata":"[Syntax: OPEN=(IMMEDIATE | DEFER)] \n \nAllows you to delay the opening of any concatenated SAS data sets until they are ready to be processed."}},{"Name":"POINT=","Type":"SETSTATEMENT_OPTION_V","Help":{"#cdata":"Specifies a temporary variable whose numeric value determines which observation is read. POINT= \ncauses the SET statement to use random (direct) access to read a SAS data set."}},{"Name":"_NUMERIC_","Type":"SPECIAL_SASKEYWORD","Help":{"#cdata":"Specifies all numeric variables that are already defined in the current DATA step."}},{"Name":"_CHARACTER_","Type":"SPECIAL_SASKEYWORD","Help":{"#cdata":"Specifies all character variables that are currently defined in the current DATA step."}},{"Name":"_ALL_","Type":"SPECIAL_SASKEYWORD","Help":{"#cdata":"In a DATA step, _ALL_ specifies all variables that are currently defined in the current DATA step. \nIn an ODS statement, it specifies all open ODS output destinations."}},{"Name":"FIRST.","Type":"SPECIAL_SASKEYWORD","Help":{"#cdata":"If you use a BY statement along with a set statement in a data step then SAS creates \ntwo automatic variables, FIRST.variable and LAST.variable, where variable is the \nname of the BY variable. The FIRST.variable has a value 1 for the first observation \nin the BY group and 0 for all other observations in the group."}},{"Name":"LAST.","Type":"SPECIAL_SASKEYWORD","Help":{"#cdata":"If you use a BY statement along with a set statement in a data step then SAS creates \ntwo automatic variables, FIRST.variable and LAST.variable, where variable is the name \nof the BY variable. The FIRST.variable has a value 1 for the first observation in the \nBY group and 0 for all other observations in the group. The LAST.variable has a value \nof 1 for the last observation in the BY group and 0 for all other observations in the \nBY group."}},{"Name":"ALTER=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns an alter password to a SAS file and enables access to a password-protected \nSAS file."}},{"Name":"BUFNO=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"hexX","@Value4":"MIN","@Value5":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the number of buffers in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of buffers as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip4":"Sets the minimum number of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip5":"Sets the number of buffers to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"Help":{"#cdata":"Specifies the number of buffers for processing a SAS data set."}},{"Name":"BUFSIZE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the page size in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the page size in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the page size in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the page size as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the page size of buffers to 0, which causes SAS to use the minimum optimal value for the operating environment. This is the default.","@ToolTip7":"Sets the page size to the maximum possible number in your operating environment, up to the largest four-byte, signed integer, which is 2\u00b3\u00b9-1, or approximately 2 billion."},"Help":{"#cdata":"Specifies a permanent buffer size for output SAS data sets."}},{"Name":"CNTLLEV=","Type":"DATASET_OPTION_V","Values":{"@Value1":"LIB","@Value2":"MEM","@Value3":"REC"},"ToolTips":{"@ToolTip1":"Specifies that concurrent access is controlled at the library level. Library-level control restricts concurrent access to only one update process to the library.","@ToolTip2":"Specifies that concurrent access is controlled at the SAS data set (member) level.","@ToolTip3":"Specifies that concurrent access is controlled at the observation (record) level."},"Help":{"#cdata":"Specifies the level of shared access to SAS data sets."}},{"Name":"COMPRESS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"NO","@Value2":"YES","@Value3":"CHAR","@Value4":"BINARY"},"ToolTips":{"@ToolTip1":"Specifies that the observations in a newly created SAS data set are uncompressed (fixed-length records).","@ToolTip2":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RLE (Run Length Encoding).","@ToolTip3":"Same as YES, but COMPRESS=CHAR is only accepted by Version 7 and later versions.","@ToolTip4":"Specifies that the observations in a newly created SAS data set are compressed (variable-length records) by SAS using RDC (Ross Data Compression)."},"Help":{"#cdata":"Compresses observations in an output SAS data set."}},{"Name":"DLDMGACTION=","Type":"DATASET_OPTION_V","Values":{"@Value1":"FAIL","@Value2":"ABORT","@Value3":"REPAIR","@Value4":"NOINDEX","@Value5":"PROMPT"},"ToolTips":{"@ToolTip1":"Stops the step, issues an error message to the log immediately. This is the default for batch mode.","@ToolTip2":"Terminates the step, issues an error message to the log, and terminates the SAS session.","@ToolTip3":"Automatically repairs and rebuilds indexes and integrity constraints, unless the data file is truncated. You use the REPAIR statement in PROC DATASETS to restore a truncated data set. It issues a warning message to the log. This is the default for interactive mode.","@ToolTip4":"Automatically repairs the data file without the indexes and integrity constraints, deletes the index file, updates the data file to reflect the disabled indexes and integrity constraints, and limits the data file to be opened only in INPUT mode.","@ToolTip5":"Displays a dialog box that asks you to select the FAIL, ABORT, REPAIR, or NOINDEX action."},"Help":{"#cdata":"Specifies what type of action to take when a SAS data set in a SAS data library is detected as damaged."}},{"Name":"ENCRYPT=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Encrypts the file using SAS Proprietary encryption. At a minimum, you must specify the READ= or the PW= data set option at the same time that you specify ENCRYPT=YES.","@ToolTip2":"Does not encrypt the file."},"Help":{"#cdata":"Encrypts SAS data files."}},{"Name":"GENMAX=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Requests generations for a data set and specifies the maximum number of versions."}},{"Name":"GENNUM=","Type":"DATASET_OPTION_V","Help":{"#cdata":"References a specific generation of a data set."}},{"Name":"INDEX=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Defines indexes when a SAS data set is created."}},{"Name":"LABEL=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies a label for the data set."}},{"Name":"OUTREP=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies an operating environment's requirements vector for an output file."}},{"Name":"PW=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns a read, write, or alter password to a SAS file and enables access to a \npassword-protected SAS file."}},{"Name":"PWREQ=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies to display a dialog box.","@ToolTip2":"Prevents a dialog box from displaying. If a missing or invalid password is entered, the data set is not opened and an error message is written to the SAS log."},"Help":{"#cdata":"Controls the pop up of a requestor window for a data set password."}},{"Name":"READ=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns a read password to a SAS file and enables access to a read-protected SAS file."}},{"Name":"REPEMPTY=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that a new empty data set with a given name replaces an existing data set with the same name. This is the default.","@ToolTip2":"Specifies that a new empty data set with a given name does not replace an existing data set with the same name."},"Help":{"#cdata":"Specifies whether a new, empty data set can overwrite an existing SAS data set that has the same name."}},{"Name":"REPLACE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that a new data set with a given name replaces an existing data set with the same name.","@ToolTip2":"Specifies that a new data set with a given name does not replace an existing data set with the same name."},"Help":{"#cdata":"Specifies whether a new SAS data set that contains data can overwrite an existing \ndata set that has the same name."}},{"Name":"REUSE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Tracks and reuses space in compressed SAS data sets. New observations are inserted in the space that is freed when other observations are updated or deleted.","@ToolTip2":"Does not track and reuse space in compressed data sets. New observations are appended to the existing data set."},"Help":{"#cdata":"Specifies whether new observations are written to free space in compressed SAS data sets."}},{"Name":"SPILL=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Creates a spill file for non-sequential processing of a DATA step view. This is the default.","@ToolTip2":"Does not create a spill file or reduces the size of a spill file."},"Help":{"#cdata":"Specifies whether to create a spill file for non-sequential processing of a DATA step view."}},{"Name":"SORTEDBY=","Type":"DATASET_OPTION_V","Values":{"@Value1":"by-clause < / collate-name>","@Value2":"_NULL_"},"ToolTips":{"@ToolTip1":"By-clause names the variables and options that you use in a BY statement in a PROC SORT step. collate-name names the collating sequence that is used for the sort.","@ToolTip2":"Removes any existing sort indicator."},"Help":{"#cdata":"Specifies how the data set is currently sorted."}},{"Name":"TOBSNO=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies the number of observations to be transmitted in each multi-observation \nexchange with a SAS server."}},{"Name":"TRANTAB=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies a translation table for character conversions."}},{"Name":"TYPE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies the data set type for a specially structured SAS data set."}},{"Name":"WRITE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Assigns a write password to a SAS file and enables access to a write-protected SAS file."}},{"Name":"FILECLOSE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"DISP","@Value2":"LEAVE","@Value3":"REREAD","@Value4":"REWIND"},"ToolTips":{"@ToolTip1":"Positions the tape volume according to the disposition specified in the operating environment's control language.","@ToolTip2":"Positions the tape at the end of the file that was just processed. Use FILECLOSE=LEAVE if you are not repeatedly accessing the same files in a SAS program but you are accessing one or more subsequent SAS files on the same tape.","@ToolTip3":"Positions the tape volume at the beginning of the file that was just processed. Use FILECLOSE=REREAD if you are accessing the same SAS data set on tape several times in a SAS program.","@ToolTip4":"Rewinds the tape volume to the beginning. Use FILECLOSE=REWIND if you are accessing one or more previous SAS files on the same tape, but you are not repeatedly accessing the same files in a SAS program."},"Help":{"#cdata":"Specifies how a tape is positioned when a SAS file on the tape is closed."}},{"Name":"FIRSTOBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"hexX","@Value6":"MIN","@Value7":"MAX"},"ToolTips":{"@ToolTip1":"Specifies the number of the first observation to process in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of the first observation to process in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies the number of the first observation to process in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies the number of the first observation to process in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies the number of the first observation to process as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip6":"Sets the number of the first observation to process to 1. This is the default.","@ToolTip7":"Sets the number of the first observation to process to the maximum number of observations in the data set, up to the largest eight-byte, signed integer, which is 2\u2076\u00b3-1, or or approximately 9.2 quintillion observations."},"Help":{"#cdata":"Causes processing to begin at a specified observation."}},{"Name":"IN=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Creates a variable that indicates whether the data set contributed data to the current observation."}},{"Name":"OBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"n","@Value2":"nK","@Value3":"nM","@Value4":"nG","@Value5":"nT","@Value6":"hexX","@Value7":"MIN","@Value8":"MAX"},"ToolTips":{"@ToolTip1":"Specifies a number to indicate when to stop processing observations in multiples of 1 (bytes). Replace n with an integer value.","@ToolTip2":"Specifies the number of buffers in multiples of 1,024 (kilobytes). Replace n with an integer value.","@ToolTip3":"Specifies a number to indicate when to stop processing observations in multiples of 1,048,576 (megabytes). Replace n with an integer value.","@ToolTip4":"Specifies a number to indicate when to stop processing observations in multiples of 1,073,741,824 (gigabytes). Replace n with an integer value.","@ToolTip5":"Specifies a number to indicate when to stop processing observations in multiples of 1,099,511,627,776 (terabytes). Replace n with an integer value.","@ToolTip6":"Specifies the number to indicate when to stop processing observations as a hexadecimal value. Replace hex with an actual hexadecimal value.","@ToolTip7":"Sets the number to indicate when to stop processing observations to 0. Use OBS=0 in order to create an empty data set that has the structure, but not the observations, of another data set.","@ToolTip8":"Sets the number to indicate when to stop processing observations to the maximum number of observations in the data set, up to the largest eight-byte, signed integer, which is 2\u2076\u00b3-1, or or approximately 9.2 quintillion observations. This is the default."},"Help":{"#cdata":"Causes processing to end with the nth observation."}},{"Name":"POINTOBS=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Causes SAS software to produce a compressed data set that might be randomly accessed by observation number. This is the default.","@ToolTip2":"Suppresses the ability to randomly access observations in a compressed data set by observation number."},"Help":{"#cdata":"Controls whether a compressed data set may be processed with random access (by \nobservation number) rather than sequential access only."}},{"Name":"WHERE=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Selects observations that meet the specified condition."}},{"Name":"WHEREUP=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Evaluates added observations and modified observations against a WHERE expression. Specify WHEREUP=YES when you want any added observations or modified observations to match a specified WHERE expression.","@ToolTip2":"Does not evaluate added observations and modified observations against a WHERE expression."},"Help":{"#cdata":"Specifies whether to evaluate added observations and modified observations against \na WHERE expression."}},{"Name":"SGIO=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that SAS activate the scatter-read / gather-write feature for a SAS data set. The scatter-read / gather-write feature remains active until your SAS session ends.","@ToolTip2":"Specifies that SAS not activate the scatter-read/gather-write feature for the SAS data set."},"Help":{"#cdata":"Activates the Scatter/Gather I/O feature for a data set."}},{"Name":"IDXNAME=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Directs SAS to use a specific index to satisfy the conditions of a WHERE expression."}},{"Name":"IDXWHERE=","Type":"DATASET_OPTION_V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Tells SAS to choose the best index to optimize a WHERE expression, and to disregard the possibility that a sequential search of the data set might be more resource- efficient.","@ToolTip2":"Tells SAS to ignore all indexes and satisfy the conditions of a WHERE expression with a sequential search of the data set."},"Help":{"#cdata":"Overrides the SAS System decision about whether to use an index to satisfy the conditions \nof a WHERE expression."}},{"Name":"DROP=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Excludes variables from processing or from output SAS data sets."}},{"Name":"KEEP=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Specifies variables for processing or for writing to output SAS data sets."}},{"Name":"RENAME=","Type":"DATASET_OPTION_V","Help":{"#cdata":"Changes the name of a variable."}}],"#comment":[{},{},{},{},{}]}} ================================================ FILE: server/data/SASDataStepOptions2.json ================================================ {"Keywords":{"#comment":[{},{},{},{}],"Keyword":[{"Name":"ALTER=","Type":"DATAPASSWORD_OPTION_V","Help":{"#cdata":"Assigns an alter password to a SAS data file. The password allows you to protect \nor replace a stored compiled DATA step program or a DATA step view."}},{"Name":"READ=","Type":"DATAPASSWORD_OPTION_V","Help":{"#cdata":"Assigns a read password to a SAS data file. The password allows you to read or \nexecute a stored compiled DATA step program or a DATA step view."}},{"Name":"PW=","Type":"DATAPASSWORD_OPTION_V","Help":{"#cdata":"Assigns a READ and ALTER password, both having the same value."}},{"Name":"SOURCE=","Type":"DATAPASSWORD_OPTION_V","Help":{"#cdata":"Specifies one of the following source options: SAVE (saves source code), ENCRYPT \n(encrypts and saves source code), or NOSAVE (does not save the source code)."},"Values":{"@Value1":"SAVE","@Value2":"ENCRYPT","@Value3":"NOSAVE"},"ToolTips":{"@ToolTip1":"Specifies to save the source code.","@ToolTip2":"Specifies to encrypt and save the source code.","@ToolTip3":"Specifies not to save the source code."}},{"Name":"NOLIST","Type":"DATAVIEWPGM_OPTION_S","Help":{"#cdata":"Suppresses the output of all variables to the SAS log when the value of _ERROR_ is 1."}},{"Name":"_NULL_","Type":"DATASTEP_DEFINITION","Help":{"#cdata":"Specifies that SAS does not create a data set when it executes the DATA step."}},{"Name":"VIEW=","Type":"DATASTEP_DEFINITION","Help":{"#cdata":"Names a view that the DATA step uses to store the input DATA step view."}},{"Name":"PGM=","Type":"DATASTEP_DEFINITION","Help":{"#cdata":"Names the stored compiled program that SAS creates or executes in the DATA step. \nTo create a stored compiled program, specify a slash (/) before the PGM= option. \nTo execute a stored compiled program, specify the PGM= option without a slash (/)."}},{"Name":"UNIQUE","Type":"DATASETINDEX_OPTION_S","Help":{"#cdata":"Specifies that the values of the key variables must be unique."}},{"Name":"NOMISS","Type":"DATASETINDEX_OPTION_S","Help":{"#cdata":"Excludes all observations with missing values from the index."}}]}} ================================================ FILE: server/data/SASDataStepStatements.json ================================================ {"Keywords":{"Keyword":[{"Name":"ABORT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: ABORT ; \n \nStops executing the current DATA step, SAS job, or SAS session."}},{"Name":"DECLARE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DECLARE object variable<(>)>; \n \nDeclares a DATA step component object; creates an instance of and initializes data \nfor a DATA step component object.\n\n"}},{"Name":"DELETE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Stops processing the current observation.\n\nSyntax: DELETE; "}},{"Name":"DESCRIBE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DESCRIBE; \n \nRetrieves source code from a stored compiled DATA step program or a DATA step view."}},{"Name":"ERROR","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: ERROR ; \n \nSets _ERROR_ to 1 and, optionally, writes a message to the SAS log."}},{"Name":"EXECUTE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: EXECUTE; \n \nExecutes a stored compiled DATA step program."}},{"Name":"LIST","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: LIST; \n \nWrites to the SAS log the input data record for the observation that is being processed."}},{"Name":"LOSTCARD","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: LOSTCARD; \n \nResynchronizes the input data when SAS encounters a missing or invalid record in data \nthat has multiple records per observation."}},{"Name":"OUTPUT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: OUTPUT; \n \nWrites the current observation to a SAS data set."}},{"Name":"PUTLOG","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: PUTLOG 'message'; \n \nWrites a message to the SAS log."}},{"Name":"REDIRECT INPUT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: REDIRECT INPUT old-name-1 = new-name-1<... old-name-n = new-name-n>; \n \nThe REDIRECT statement associates the name of the input data set in the source program \nwith the name of another SAS data set."}},{"Name":"REDIRECT OUTPUT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: REDIRECT OUTPUT old-name-1 = new-name-1<... old-name-n = new-name-n>; \n \nThe REDIRECT statement associates the name of the output data set with the name of \nanother SAS data set."}},{"Name":"REMOVE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: REMOVE ; \n \n \nDeletes an observation from a SAS data set."}},{"Name":"REPLACE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: REPLACE <...data-set-name-n>; \n \nReplaces an observation in the same location."}},{"Name":"STOP","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: STOP; \n \nStops execution of the current DATA step."}},{"Name":"WHERE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: WHERE where-expression-1 < logical-operator where-expression-n>; \n \nwhere\n\nlogical-operator can be AND, AND NOT, OR, or OR NOT. \n\nSelects observations from SAS data sets that meet a particular condition."}},{"Name":"CONTINUE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: CONTINUE; \n \nStops processing the current DO-loop iteration and resumes with the next iteration."}},{"Name":"THEN","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: IF expression THEN statement; \n \nPart of an (IF expression THEN) statement."}},{"Name":"DO","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"[Iterative] Executes statements between DO and END repetitively based on the value \nof an index variable.\n\nSyntax:\nDO index-variable=specification-1 <, ... specification-n>;\n... more SAS statements ...\nEND; "}},{"Name":"UNTIL","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"DO UNTIL executes statements in a DO loop repetitively until a condition is true.\n\nSyntax:\nDO UNTIL (expression);\n...more SAS statements...\nEND; "}},{"Name":"WHILE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"DO WHILE executes statements repetitively while a condition is true.\n\nSyntax:\nDO WHILE (expression);\n...more SAS statements...\nEND; "}},{"Name":"END","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Ends a DO group or a SELECT group.\nSyntax: END; "}},{"Name":"GO TO","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Moves execution immediately to the statement label that is specified.\n\nSyntax: GO TO label; "}},{"Name":"GOTO","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"See GO TO statement"}},{"Name":"IF","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Executes a SAS statement for observations that meet specific conditions.\n\nSyntax: IF expression THEN statement;\n .\n\nSyntax: IF expression; \n\n[SUBSETTING] Continues processing only those observations that meet the condition"}},{"Name":"ELSE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Used in combination with an IF-THEN statement. \n\nSyntax:\nIF expression THEN statement;\n "}},{"Name":"LEAVE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: LEAVE; \n \nStops processing the current loop and resumes with the next statement in sequence."}},{"Name":"LINK","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Jumps to a statement label.\n\nSyntax: LINK label; "}},{"Name":"RETURN","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: RETURN; \n \nStops executing statements at the current point in the DATA step and returns to a \npredetermined point in the step."}},{"Name":"SELECT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Executes one of several statements or groups of statements.\n\nSyntax:\nSELECT <(select-expression)>;\n WHEN-1 (when-expression-1 <..., when-expression-n>) statement;\n <... WHEN-n (when-expression-1 <..., when-expression-n>) statement;>\n \nEND; "}},{"Name":"BY","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Controls the operation of a SET, MERGE, MODIFY, or UPDATE statement in the DATA step \nand sets up special grouping variables. \n\nSyntax: BY variable-1\n <... variable-n > ; "}},{"Name":"CARDS","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: CARDS; \n \nIndicates that data lines follow."}},{"Name":"CARDS4","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: CARDS4; \n \nIndicates that data lines that contain semicolons follow."}},{"Name":"DATALINES","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DATALINES; \n \nIndicates that data lines follow."}},{"Name":"DATALINES4","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DATALINES4; \n \nIndicates that data lines that contain semicolons follow."}},{"Name":"FILE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: FILE file-specification ; \n \nSpecifies the current output file for PUT statements."}},{"Name":"FILE PRINT ODS","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: FILE PRINT ODS <=(ODS-suboption(s))> ; \n \nCreates an ODS output object by binding the data component to the table definition \n(template). Optionally, lists the variables to include in the ODS output and \nspecifies options that control the way that the variables are formatted."}},{"Name":"INFILE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Identifies an external file to read with an INPUT statement.\n\nSyntax:\n(1) INFILE file-specification ;\n\n(2) INFILE DBMS-specifications; "}},{"Name":"INPUT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Describes the arrangement of values in the input data record and assigns input values \nto the corresponding SAS variables. Column INPUT reads input values from specified \ncolumns and assigns them to the corresponding SAS variables. Formatted INPUT reads \ninput values with specified informats and assigns them to the corresponding SAS \nvariables. List INPUT scans the input data record for input values and assigns them \nto the corresponding SAS variables. Named INPUT reads data values that appear after \na variable name that is followed by an equal sign and assigns them to corresponding \nSAS variables.\n\nSyntax:\n(1) INPUT <@|@@>;\n\n(2) [Column] INPUT variable <$> start-column <-- end-column> <.decimals> <@ | @@>;\n\n(3) [Formatted] INPUT variable informat. <@ | @@>;\n\n(4) [Formatted] INPUT (variable-list) (informat-list) <@ | @@>;\n\n(5) [Formatted] INPUT (variable-list) ( informat.) <@ | @@>;\n\n(6) [List] INPUT variable <$> <&> <@ | @@>;\n\n(7) [List] INPUT variable <:|&|~> <@ | @@>;\n\n(8) [Named] INPUT variable= <$> <@ | @@>;\n\n(9) [Named] INPUT variable= informat. <@ | @@>; \n\n(10)[Named] INPUT variable= <$> start-column <-- end-column> <.decimals> <@ | @@>; "}},{"Name":"MERGE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Joins observations from two or more SAS data sets into single observations.\n\nSyntax:\nMERGE SAS-data-set-1 <(data-set-options)>\n SAS-data-set-2 <(data-set-options) >\n <... SAS-data-set-n<(data-set-options)>>\n ; "}},{"Name":"MODIFY","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Replaces, deletes, and appends observations in an existing SAS data set in place; \ndoes not create an additional copy.\n\nSyntax:\n(1) MODIFY master-data-set <(data-set-option(s))> transaction-data-set <(data-set-option(s))> \n ; \n BY by-variable; \n\n(2) MODIFY master-data-set <(data-set-option(s))> KEY=index ;\n\n(3) MODIFY master-data-set <(data-set-option(s))> POINT=variable;\n\n(4) MODIFY master-data-set <(data-set-option(s))> ; "}},{"Name":"PUT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Writes lines to the SAS log, to the SAS output window, or to an external location that \nis specified in the most recent FILE statement. Column PUT writes variable values in \nthe specified columns in the output line, Formatted PUT writes variable values with \nthe specified format in the output line. List PUT writes variable values and the \nspecified character strings in the output line. Named PUT writes variable values \nafter the variable name and an equal sign. ODS PUT writes data values to a special \nbuffer from which they can be written to the data component and formatted by ODS.\n\nSyntax:\n(1) PUT <_ODS_><@|@@>; \n(2) [Column PUT] PUT variable start-column <-- end-column> <.decimal-places> <@ | @@>;\n(3) [Formatted PUT] PUT variable format. <@ | @@>; \n(4) [Formatted PUT] PUT (variable-list) (format-list) <@ | @@>;\n(5) [List PUT] PUT variable <@ | @@>; \n(6) [List PUT] PUT 'character-string' <@ | @@>; \n(7) [List PUT] PUT variable <: | ~> format.<@ | @@>; \n(8) [List PUT] PUT variable= <@ | @@>;\n(9) [List PUT] PUT variable= start-column <-- end-column> <.decimal-places> <@ | @@>; "}},{"Name":"SET","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: SET> ; \n \nReads an observation from one or more SAS data sets."}},{"Name":"UPDATE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Updates a master file by applying transactions.\n\nSyntax:\nUPDATE master-data-set<(data-set-options)> transaction-data-set<(data-set-options)>\n \n ;\n BY by-variable"}},{"Name":"ARRAY","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Defines elements of an array.\n\nSyntax:\nARRAY array-name { subscript } <$>\n <(initial-value-list)>; "}},{"Name":"ATTRIB","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: ATTRIB variable-list(s) attribute-list(s) ; \n \nAssociates a format, informat, label, and/or length with one or more variables."}},{"Name":"DROP","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DROP variable-list; \n \nExcludes variables from output SAS data sets."}},{"Name":"FORMAT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Associates formats with variables.\n\nSyntax:\n(1) FORMAT variable-1 <... variable-n> ;\n\n(2) FORMAT variable-1 <... variable-n> format ;\n\n(3) FORMAT variable-1 <... variable-n> format variable-1 <... variable-n> format;\n\nIf you omit DEFAULT=, SAS uses BESTw. as the default numeric format and $w. as the default character format."}},{"Name":"INFORMAT","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Associates informats with variables.\n\nSyntax:\nINFORMAT variable-1 <... variable-n> ;\n\nINFORMAT <... variable-n> ;\n\nINFORMAT variable-1 <... variable-n> informat ; "}},{"Name":"KEEP","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: KEEP variable-list; \n \nIncludes variables in output SAS data sets."}},{"Name":"LABEL","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Assigns descriptive labels to variables.\n\nSyntax:\n(1) LABEL variable-1='label-1' ... ; \n\n(2) LABEL variable-1=' ' ... ; "}},{"Name":"LENGTH","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: LENGTH variable-specification(s); \n \nSpecifies the number of bytes for storing variables."}},{"Name":"MISSING","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: MISSING character(s); \n\nwhere character is the value in your input data that represents a special missing value. \n\nAssigns characters in your input data to represent special missing values for numeric data."}},{"Name":"RENAME","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: RENAME old-name-1=new-name-1 ... ; \n \nSpecifies new names for variables in output SAS data sets."}},{"Name":"RETAIN","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Causes a variable that is created by an INPUT or assignment statement to retain \nits value from one iteration of the DATA step to the next.\n\nSyntax:\nRETAIN \n < ... element-list-n >>; "}},{"Name":"DISPLAY","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: DISPLAY window<.group> ;\n \nDisplays a window that is created with the WINDOW statement."}},{"Name":"WINDOW","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Creates customized windows for your applications.\n\nSyntax:\n(1) WINDOW window field-definition(s);\n(2) WINDOW window group-definition(s); "}},{"Name":"RUN","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"[Syntax: RUN ;] \n \nExecutes the previously entered SAS statements."}},{"Name":"WHEN","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: WHEN-1 (when-expression-1 <..., when-expression-n>) statement; \n \nUsed in a SELECT-END group in a DATA step. SELECT groups contain WHEN statements \nthat identify SAS statements that are executed when a particular condition is \ntrue. Use at least one WHEN statement in a SELECT group."}},{"Name":"OTHERWISE","Type":"DATASTEP_STATEMENT","Help":{"#cdata":"Syntax: <... WHEN-n (when-expression-1 <..., when-expression-n>) statement;> \n \nUsed with a WHEN statement in a SELECT-END group in a DATA step. An optional OTHERWISE statement \nspecifies a statement to be executed if no WHEN condition is met."}}]}} ================================================ FILE: server/data/SASFormats.json ================================================ {"Keywords":{"Keyword":[{"Name":"$LOGVSw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in left-to-right logical order to visual order. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 200 \n Range: 1-32000 \n \nDetails:\nThe $LOGVSw. format is used when you store logical-ordered text on a visual server. \n\nNote: If the $LOGVSw. format is not accessible, then the Hebrew or Arabic portion \nof the data will be reversed. \n \nComparisons:\nThe $LOGVSw. format performs processing that is the opposite of the $LOGVSRw. format."}},{"Name":"$LOGVSRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in right-to-left logical order to visual order. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 200 \n Range: 1-32000 \n \nDetails:\nThe $LOGVSRw. format is used when you store logical-ordered text on a visual server. \nThe Hebrew or Arabic portion of the text is reversed if the $LOGVSw. format is not on \nthe server.\n \nComparisons:\nThe $LOGVSRw. format performs processing that is opposite of the $LOGVSw. format."}},{"Name":"$VSLOGw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in visual order to left-to-right logical order. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 200 \n Range: 1-32000 \n \nDetails:\nThe $VSLOGw. format is used when transferring data that is stored in visual order. \nAn example is transferring data from a UNIX server to a Windows client.\n\nNote: The $VSLOGw. format does not correctly process all combinations of data strings. \n \nComparisons: \nThe $VSLOGw. format performs processing that is opposite to the $VSLOGRw. format."}},{"Name":"$VSLOGRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in visual order to right-to-left logical order. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 200 \n Range: 1-32000 \n \nDetails:\nThe $VSLOGRw. format is used when transferring data that is stored in visual order. \nAn example is transferring data from a UNIX server to a Windows client.\n\nNote: The $VSLOGRw. format does not correctly process all combinations of data strings. \n \nComparisons:\nThe $VSLOGRw. format performs processing that is opposite to the $VSLOGw. format."}},{"Name":"$ASCIIw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts native format character data to ASCII representation. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 1 \n Range: 1-32767 \n \nDetails: \nIf ASCII is the native format, no conversion occurs. \n \nComparisons:\nOn EBCDIC systems, $ASCIIw. converts EBCDIC character data to ASCIIw.\n\nOn all other systems, $ASCIIw. behaves like the $CHARw. format."}},{"Name":"$BIDIw.","Type":"SAS_FORMATS","Help":{"#cdata":"Convert a Logical ordered string to a Visually ordered string, and vice versa by \nreversing the order of Hebrew characters while preserving the order of Latin \ncharacters and numbers. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 1 if w is not specified \n Range: 1-32767 \n\nDetails:\nIn the Windows operating environment, Hebrew and Arabic text is stored in logical order. \nThe text is stored in the order that it is written and not necessarily as it is displayed. \nHowever, in other operating environments, Hebrew text is stored in the same order it is \ndisplayed. SAS users can encounter Hebrew and Arabic text that is reversed. Such situations \ncan occur when you use SAS/CONNECT or other software to transfer SAS data sets or reports \nwith Hebrew and Arabic text from a visual operating environment to a logical one. The $BIDI \nformat is a format that reverses Hebrew and Arabic text while maintaining the order of \nnumbers and Latin-1 words."}},{"Name":"$BINARYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts character data to binary representation. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: The default width is calculated based on the length of the variable to be printed. \n Range: 1-32767 \n \nComparisons:\n\nThe $BINARYw. format converts character values to binary representation. The BINARYw. \nformat converts numeric values to binary representation."}},{"Name":"$CHARw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes standard character data. \n \nSyntax Description:\n\nw \n specifies the width of the output field. You can specify a number or a column range.\n\n Default: 8 if the length of variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nComparisons:\n\nThe $CHARw. format is identical to the $w. and $Fw. formats. \n\nThe $CHARw., $Fw., and $w. formats do not trim leading blanks. To trim leading blanks, \nuse the LEFT function to left align character data before output."}},{"Name":"$EBCDICw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts native format character data to EBCDIC representation. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 1 \n Range: 1-32767 \n \nDetails:\nIf EBCDIC is the native format, no conversion occurs.\n \nComparisons:\nOn ASCII systems, $EBCDICw. converts ASCII character data to EBCDIC.\n\nOn all other systems, $EBCDICw. behaves like the $CHARw. format."}},{"Name":"$HEXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts character data to hexadecimal representation. \n \nSyntax Description:\n\nw \n specifies the width of the output field. \n\n Default: The default width is calculated based on the length of the variable to be printed. \n Range: 1-32767 \n Tip: To ensure that SAS writes the full hexadecimal equivalent of your data, make w twice \n the length of the variable or field that you want to represent. \n Tip: If w is greater than twice the length of the variable that you want to represent, \n $HEXw. pads it with blanks. \n \nDetails:\n\nThe $HEXw. format converts each character into two hexadecimal characters. Each blank \ncounts as one character, including trailing blanks.\n\n \nComparisons:\n\nThe HEXw. format converts real binary numbers to their hexadecimal equivalent."}},{"Name":"$MSGCASEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes character data in uppercase when the MSGCASE system option is in effect. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 1 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails:\nWhen the MSGCASE= system option is in effect, all notes, warnings, and error messages \nthat SAS generates appear in uppercase. Otherwise, all notes, warnings, and error messages \nappear in mixed case. You specify the MSGCASE= system option in the configuration file or \nduring the SAS invocation."}},{"Name":"$OCTALw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts character data to octal representation. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: The default width is calculated based on the length of the variable to be printed. \n Range: 1-32767 \n Tip: Because each character value generates three octal characters, increase the value \n of w by three times the length of the character value. \n\nComparisons:\n\nThe $OCTALw. format converts character values to the octal representation of their character \ncodes. The OCTALw. format converts numeric values to octal representation."}},{"Name":"$QUOTEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes data values that are enclosed in double quotation marks. \n \nSyntax Description:\nw \n specifies the width of the output field. \n\n Default: 2 if the length of the variable is undefined; otherwise, the length of the variable + 2 \n Range: 2-32767 \n Tip: Make w wide enough to include the left and right quotation marks. \n \nDetails:\nThe following list describes the output that SAS produces when you use the $QUOTEw. format.\n\no If your data value is not enclosed in quotation marks, SAS encloses the output in double quotation marks. \no If your data value is not enclosed in quotation marks, but the value contains a single quotation mark, SAS \n o encloses the data value in double quotation marks \n o does not change the single quotation mark.\no If your data value begins and ends with single quotation marks, and the value contains double quotation \nmarks, SAS \n o encloses the data value in double quotation marks \n o duplicates the double quotation marks that are found in the data value \n o does not change the single quotation marks. \no If your data value begins and ends with single quotation marks, and the value contains two single \ncontiguous quotation marks, SAS \n o encloses the value in double quotation marks \n o does not change the single quotation marks.\nIf your data value begins and ends with single quotation marks, and contains both double quotation \nmarks and single, contiguous quotation marks, SAS \n o encloses the value in double quotation marks \n o duplicates the double quotation marks that are found in the data value \n o does not change the single quotation marks. \nIf the length of the target field is not large enough to contain the string and its quotation \nmarks, SAS returns all blanks."}},{"Name":"$REVERJw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes character data in reverse order and preserves blanks. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 1 if w is not specified \n Range: 1-32767 \n \nComparisons:\n\nThe $REVERJw. format is similar to the $REVERSw. format except that $REVERSw. left \naligns the result by trimming all leading blanks."}},{"Name":"$REVERSw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes character data in reverse order and left aligns. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 1 if w is not specified \n Range: 1-32767 \n \nComparisons:\n\nThe $REVERSw. format is similar to the $REVERJw. format except that $REVERJw. does not \nleft align the result."}},{"Name":"$UCS2Bw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in big-endian, 16-bit, universal character set code in \n2 octets (UCS2), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 2-32767 \n \nDetails: \nThe $UCS2Bw. format writes a character string in big-endian, 16-bit, UCS2 (universal \ncharacter set code in two octets), Unicode encoding. It processes character strings \nthat are in the encoding of the current SAS session. \n \nComparison: \nThe $UCS2Bw. format performs processing that is the opposite of the $UCS2BEw. format."}},{"Name":"$UCS2BEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a big-endian, 16-bit, universal character set code in 2 octets (UCS2) \ncharacter string in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 16-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nThe $UCS2BEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in big-endian, 16-bit, UCS2 (universal character \nset code in two octets), Unicode encoding.\n \nComparison:\nThe $UCS2BEw. format performs processing that is the opposite of the $UCS2Bw. format."}},{"Name":"$UCS2Lw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes data in little-endian, 16-bit, universal character set code in 2 octets \n(UCS2), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 16-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 2-32767 \n \nDetails: \nThe $UCS2Lw. format writes a character string in little-endian, 16-bit, UCS2 (universal \ncharacter set code in two octets), Unicode encoding. It processes character strings that \nare in the encoding of the current SAS session.\n \nComparison:\nThe $UCS2Lw. format performs processing that is the opposite of the $UCS2LEw. format."}},{"Name":"$UCS2LEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is encoded in little-endian, 16-bit,\nuniversal character set code in 2 octets (UCS2), in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 16-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nDetails: \nThe $UCS2LEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in little-endian, 16-bit, UCS2 (universal character \nset code in two octets), Unicode encoding.\n \nComparison: \nThe $UCS2LEw. format performs processing that is the opposite of the $UCS2Lw. format."}},{"Name":"$UCS2Xw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in native-endian, 16-bit, universal character set code \nin 2 octets (UCS2) Unicode encoding. \n\nSyntax Description:\nw \n specifies the width of the output field. Specify enough width to accommodate the 16-bit \n size of the Unicode characters. \n Default: 8 \n Range: 2-32767 \n \nDetails:\nThe $UCS2Xw. format writes a character string in 16-bit, UCS2 (universal character set \ncode in two octets), Unicode encoding, by using byte order that is native to the operating \nenvironment.\n \nComparison: \nThe $UCS2Xw. format performs processing that is the opposite of the $UCS2XEw. format. \nIf you are exchanging data within the same operating environment, use the $UCS2Xw. format. \nIf you are exchanging data with a different operating environment, use the $UCS2Bw. format \nor $UCS2Lw. format."}},{"Name":"$UCS2XEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a native-endian, 16-bit, universal character set code in 2 octets (UCS2) \ncharacter string in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 16-bit \n size of the Unicode characters. \n Default: 8 \n Range: 1-32000 \n \nDetails: \nThe $UCS2XEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in native-endian, 16-bit, UCS2 (universal character \nset code in two octets), Unicode encoding.\n \nComparison: \nThe $UCS2XEw. format performs processing that is the opposite of the $UCS2Xw. format."}},{"Name":"$UCS4Bw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in big-endian, 32-bit, universal character set code in \n4 octets (UCS4), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 4 \n Range: 4-32767 \n \nDetails:\nThe $UCS4Bw. format writes a character string in big-endian, 32-bit, UCS4 (universal \ncharacter set code in four octets), Unicode encoding. It processes character strings \nthat are in the encoding of the current SAS session. \n \nComparison: \nThe $UCS4Bw. format performs processing that is the opposite of the $UCS4BEw. format."}},{"Name":"$UCS4BEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a big-endian, 32-bit, universal character set code in 4 octets (UCS4), \ncharacter string in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nThe $UCS4BEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in big-endian, 32-bit, UCS4 (universal character \nset code in four octets), Unicode encoding.\n \nComparison:\nThe $UCS4BEw. format performs processing that is the opposite of the $UCS4Bw. format."}},{"Name":"$UCS4Lw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in little-endian, 32-bit, universal character set code \nin 4 octets, (UCS4), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 4 \n Range: 4-32767 \n \nDetails:\nThe $UCS4Lw. format writes a character string in little-endian, 32-bit, UCS4 (universal \ncharacter set code in four octets), Unicode encoding. It processes character strings that \nare in the encoding of the current SAS session.\n \nComparisons:\nThe $UCS4Lw. format performs processing that is the opposite of the $UCS4LEw. format."}},{"Name":"$UCS4LEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a little-endian, 32-bit, universal character set code in 4 octets (UCS4) \ncharacter string in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nThe $UCS4LEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in little-endian, 32-bit, UCS4 (universal character \nset code in four octets), Unicode encoding.\n \nComparison:\nThe $UCS4LEw. format performs processing that is the opposite of the $UCS4Lw. format."}},{"Name":"$UCS4Xw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in native-endian, 32-bit, universal character set code \nin 4 octets (UCS4), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 4 \n Range: 4-32767 \n \nDetails:\nThe $UCS4Xw. format writes a character string in 32-bit, UCS4 (universal character set \ncode in two octets), Unicode encoding, by using byte order that is native to the operating \nenvironment.\n \nComparisons:\nThe $UCS4Xw. format performs processing that is the opposite of the $UCS4XEw. format. If \nyou are exchanging data within the same operating environment, use the $UCS4Xw. format. \nIf you are exchanging data with a different operating environment, use the $UCS4Bw. format \nor $UCS4Lw. format."}},{"Name":"$UCS4XEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a native-endian, 32-bit, universal character set code in 4 octets (UCS4) \ncharacter string in the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. Specify enough width to accommodate the 32-bit \n size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nThe $UCS4XEw. format writes a character string in the encoding of the current SAS session. \nIt processes character strings that are in native-endian, 32-bit, UCS4 (universal character \nset code in four octets), Unicode encoding.\n \nComparison:\nThe $UCS4XEw. format performs processing that is the opposite of the $UCS4Xw. format."}},{"Name":"$UESCw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is encoded in the current SAS session in Unicode \nescape (UESC) representation. \n\nSyntax Description:\nw \n specifies the width of the input field.\n Default: 8 \n Range: 1-32000 \n \nDetails:\nIf the characters are not available on all operating environments, for example, 0-9, \na-z, A-Z, they must be represented in UESC. $UESCw. can be nested.\n\nComparisons:\nThe $UESCw. format performs processing that is opposite of the $UESCEw. format."}},{"Name":"$UESCEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a Unicode escape (UESC) representation character string in the encoding of \nthe current SAS session. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32000 \n \nDetails:\nIf the data is not supported by the encoding of the current SAS session, the data \nremains in UESC.\n \nComparisons:\nThe $UESCEw. format performs processing that is the opposite of the $UESCw. format."}},{"Name":"$UNCRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is encoded in the current SAS session in numeric \ncharacter representation (NCR). \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32000 \n \nComparison:\nThe $UNCRw. format performs processing that is the opposite of the $UNCREw. format."}},{"Name":"$UNCREw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the numeric character representation (NCR) character string in the encoding \nof the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32000 \n \nDetails: \nNational characters should be represented in NCR.\n \nComparison: \nThe $UNCREw. format performs processing that is the opposite of the $UNCRw. format."}},{"Name":"$UPARENw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is encoded in the current SAS session in Unicode \nparenthesis (UPAREN) representation. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 27-32000 \n \nDetails:\nThe character string is encoded with parentheses and Unicode hexadecimal representation.\n \nComparisons:\nThe $UPARENw. format performs processing that is the opposite of the $UPARENEw. format."}},{"Name":"$UPARENEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is in Unicode parenthesis (UPAREN) in a character \nstring that is encoded in the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32000 \n \nComparisons:\nThe $UPARENEw. format performs processing that is the opposite of the $UPARENw. format."}},{"Name":"$UPCASEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts character data to uppercase. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable. \n Range: 1-32767 \n \nDetails:\n\nSpecial characters, such as hyphens and other symbols, are not altered."}},{"Name":"$UTF8Xw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in universal transformation format (UTF-8) encoding. \n \nSyntax Description: \n\nw \n specifies the width of the output field. Specify enough width to include all of the \n characters in the variable. The width of the characters are dependent on the code point \n value of the individual characters.\n\n Default: 8 \n Range: 2-32767"}},{"Name":"$VARYINGw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes character data of varying length. \n \nSyntax: $VARYINGw. length-variable \n\nSyntax Description: \nw \n specifies the maximum width of the output field for any output line or output file record. \n\n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n\nlength-variable \n specifies a numeric variable that contains the length of the current value of the character \n variable. SAS obtains the value of the length-variable by reading it directly from a field \n that is described in an INPUT statement, reading the value of a variable in an existing SAS \n data set, or calculating its value.\n\n Requirement: You must specify length-variable immediately after $VARYINGw. in a SAS statement. \n Restriction: Length-variable cannot be an array reference. \n Tip: If the value of length-variable is 0, negative, or missing, SAS writes nothing to the \n output field. If the value of length-variable is greater than 0 but less than w, SAS writes \n the number of characters that are specified by length-variable. If length-variable is greater \n than or equal to w, SAS writes w columns. \n \nDetails:\nUse $VARYINGw. when the length of a character value differs from record to record. After \nwriting a data value with $VARYINGw., the pointer's position is the first column after \nthe value."}},{"Name":"$w.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes standard character data. \n \nSyntax Description:\nw \n specifies the width of the output field. You can specify a number or a column range.\n\n Default: 1 if the length of the identifier is undefined; otherwise, the length of the identifier \n Range: 1-32767 \n \nComparisons:\n\nThe $w., $Fw., and the $CHARw. formats are identical, and they do not trim leading blanks. \nTo trim leading blanks, use the LEFT function to left align character data before output."}},{"Name":"EURFRATSw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Austrian schillings to euros."}},{"Name":"EURFRBEFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Belgian francs to euros."}},{"Name":"EURFRCHFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Swiss francs to euros."}},{"Name":"EURFRCZKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Czech koruny to euros."}},{"Name":"EURFRDEMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Deutsche marks to euros."}},{"Name":"EURFRDKKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Danish kroner to euros."}},{"Name":"EURFRESPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Spanish pesetas to euros."}},{"Name":"EURFRFIMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Finnish markkaa to euros."}},{"Name":"EURFRFRFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from French francs to euros."}},{"Name":"EURFRGBPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from British pounds to euros."}},{"Name":"EURFRGRDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Greek drachmas to euros."}},{"Name":"EURFRHUFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Hungarian forints to euros."}},{"Name":"EURFRIEPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Irish pounds to euros."}},{"Name":"EURFRITLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Italian lire to euros."}},{"Name":"EURFRLUFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Luxembourg francs to euros."}},{"Name":"EURFRNLGw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Dutch guilders to euros."}},{"Name":"EURFRNOKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Norwegian krone to euros."}},{"Name":"EURFRPLZw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Polish zlotys to euros."}},{"Name":"EURFRPTEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Portuguese escudos to euros."}},{"Name":"EURFRROLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Romanian lei to euros."}},{"Name":"EURFRRURw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Russian rubles to euros."}},{"Name":"EURFRSEKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Swedish kronor to euros."}},{"Name":"EURFRSITw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Slovenian tolars to euros."}},{"Name":"EURFRTRLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Turkish liras to euros."}},{"Name":"EURFRYUDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount from Yugoslavian dinars to euros."}},{"Name":"EURTOATSw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Austrian schillings."}},{"Name":"EURTOBEFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Belgian francs."}},{"Name":"EURTOCHFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Swiss francs."}},{"Name":"EURTOCZKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Czech koruny."}},{"Name":"EURTODEMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Deutsche marks."}},{"Name":"EURTODKKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Danish kroner."}},{"Name":"EURTOESPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Spanish pesetas."}},{"Name":"EURTOFIMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Finnish markkaa."}},{"Name":"EURTOFRFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to French francs."}},{"Name":"EURTOGBPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to British pounds."}},{"Name":"EURTOGRDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Greek drachmas."}},{"Name":"EURTOHUFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Hungarian forints."}},{"Name":"EURTOIEPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Irish pounds."}},{"Name":"EURTOITLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Italian lire."}},{"Name":"EURTOLUFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Luxembourg francs."}},{"Name":"EURTONLGw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Dutch guilders."}},{"Name":"EURTONOKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Norwegian krone."}},{"Name":"EURTOPLZw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Polish zlotys."}},{"Name":"EURTOPTEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Portuguese escudos."}},{"Name":"EURTOROLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Romanian lei."}},{"Name":"EURTORURw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Russian rubles."}},{"Name":"EURTOSEKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Swedish kronor."}},{"Name":"EURTOSITw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Slovenian tolars."}},{"Name":"EURTOTRLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Turkish liras."}},{"Name":"EURTOYUDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Converts an amount in euros to Yugoslavian dinars."}},{"Name":"$KANJIw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adds shift-code data to DBCS data."}},{"Name":"$KANJIXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Removes shift code data from DBCS data."}},{"Name":"DATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form ddmmmyy, ddmmmyyyy, or dd-mmm-yyyy.\n \nSyntax Description:\nw \n specifies the width of the output field.\n\n Default: 11 \n Range: 5-11 \n Tip: Use a width of 9 to print a 4-digit year without a separator between the day, \n month, and year. Use a width of 11 to print a 4-digit year using a hyphen as a separator \n between the day, month, and year. \n \nDetails:\nThe DATEw. format writes SAS date values in the form ddmmmyy, ddmmmyyyy, or dd-mmm-yyyy, where \n\n dd \n is an integer that represents the day of the month.\n\n mmm \n is the first three letters of the month name.\n\n yy or yyyy \n is a two-digit or four-digit integer that represents the year."}},{"Name":"DATEAMPMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS datetime values in the form ddmmmyy:hh:mm:ss.ss with AM or PM. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 19 \n Range: 7-40 \n Tip: SAS requires a minimum w value of 13 to write AM or PM. For widths between 10 and 12, \n SAS writes a 24-hour clock time. \nd \n specifies the number of digits to the right of the decimal point in the seconds value.\n Requirement: must be less than w \n Range: 0-39 \n Note: If w-d< 17, SAS truncates the decimal values. \n\nDetails:\nThe DATEAMPMw.d format writes SAS datetime values in the form ddmmmyy:hh:mm:ss.ss, where \n dd is an integer that represents the day of the month.\n mmm is the first three letters of the month name.\n yy is a two-digit integer that represents the year.\n hh is an integer that represents the hour.\n mm is an integer that represents the minutes.\n ss.ss is the number of seconds to two decimal places.\n \nComparisons:\nThe DATEAMPMw.d format is similar to the DATETIMEw.d format except that DATEAMPMw.d prints \nAM or PM at the end of the time."}},{"Name":"DATETIMEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS datetime values in the form ddmmmyy:hh:mm:ss.ss. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 16 \n Range: 7-40 \n Tip: SAS requires a minimum w value of 16 to write a SAS datetime value with the date, \n hour, and seconds. Add an additional two places to w and a value to d to return values \n with optional decimal fractions of seconds. \nd \nspecifies the number of digits to the right of the decimal point in the seconds value.\n Requirement: must be less than w \n Range: 0-39 \n Note: If w-d< 17, SAS truncates the decimal values. \n \nDetails:\nThe DATETIMEw.d format writes SAS datetime values in the form ddmmmyy:hh:mm:ss.ss, where \n\n dd is an integer that represents the day of the month.\n mmm is the first three letters of the month name.\n yy is a two-digit integer that represents the year.\n hh is an integer that represents the hour in 24-hour clock time.\n mm is an integer that represents the minutes.\n ss.ss is the number of seconds to two decimal places. \n \nComparisons:\nThe DATEAMPMw.d format is similar to the DATETIMEw.d format except that DATEAMPMw.d \nprints AM or PM at the end of the time."}},{"Name":"DAYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the day of the month. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 2 \n Range: 2-32"}},{"Name":"DDMMYYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form ddmm yy or dd/mm/yy , where a forward slash \nis the separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nw \n specifies the width of the output field. \n\n Default: 8 \n Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the day \n and the month as possible. When w is 7, the date appears as a two-digit year without slashes. \n \nDetails:\nThe DDMMYYw. format writes SAS date values in the form ddmmyy or dd/mm/yy, where \n\n dd is an integer that represents the day of the month.\n / is the separator.\n mm is an integer that represents the month.\n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"DDMMYYxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form ddmm yy or ddXmmXyy, where X represents \na specified separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the day, the month, \n and the year. Valid values for x are:\n B separates with a blank\n C separates with a colon \n D separates with a dash \n N indicates no separator\n P separates with a period \n S separates with a slash.\nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the day and \n the month as possible. When w is 7, the date appears as a two-digit year without separators. \n Interaction: When x has a value of N, the width range changes to 2-8. \n \nDetails:\nThe DDMMYYxw. format writes SAS date values in the form ddmmyy or ddXmmXyy, where \n\n dd is an integer that represents the day of the month.\n X is a specified separator. \n mm is an integer that represents the month. \n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"DOWNAMEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the name of the day of the week. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n Default: 9 \n Range: 1-32 \n Tip: If you omit w, SAS prints the entire name of the day. \n \nDetails:\n\nIf necessary, SAS truncates the name of the day to fit the format width. For example, \nthe DOWNAME2. prints the first two letters of the day name."}},{"Name":"DTDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Expects a SAS datetime value as input and writes date values in the form ddmmmyy \nor ddmmmyyyy. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 7 \n Range: 5-9 \n Tip: Use a width of 9 to print a 4-digit year. \n \nDetails:\nThe DTDATEw. format writes SAS date values in the form ddmmmyy or ddmmmyyyy, where \n\n dd is an integer that represents the day of the month.\n mmm are the first three letters of the month name.\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n \nComparisons:\nThe DTDATEw. format produces the same type of output that the DATEw. format produces. \nThe difference is that the DTDATEw. format requires a SAS datetime value."}},{"Name":"DTMONYYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date part of a SAS datetime value as the month and year in the form mmmyy \nor mmmyyyy. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 5 \n Range: 5-7 \n \nDetails:\nThe DTMONYYw. format writes SAS datetime values in the form mmmyy or mmmyyyy, where \n\n mmm is the first three letters of the month name.\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n \nComparisons:\nThe DTMONYYw. format and the MONYYw. format are similar in that they both write date values. \nThe difference is that DTMONYYw. expects a SAS datetime value as input, and MONYYw. expects \na SAS date value."}},{"Name":"DTWKDATXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date part of a SAS datetime value as the day of the week and the date \nin the form day-of-week, dd month-name yy (or yyyy). \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 29 \n Range: 3-37 \n \nDetails:\nThe DTWKDATXw. format writes SAS date values in the form day-of-week, dd month-name, yy or yyyy, where \n\n day-of-week \n is either the first three letters of the day name or the entire day name.\n\n dd is an integer that represents the day of the month.\n\n month-name is either the first three letters of the month name or the entire month name.\n\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n \nComparisons:\nThe DTWKDATXw. format is similar to the WEEKDATXw. format in that they both write date \nvalues. The difference is that DTWKDATXw. expects a SAS datetime value as input, and \nWEEKDATXw. expects a SAS date value."}},{"Name":"DTYEARw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date part of a SAS datetime value as the year in the form yy or yyyy. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 4 \n Range: 2-4 \n\nComparisons:\nThe DTYEARw. format is similar to the YEARw. format in that they both write date values. \nThe difference is that DTYEARw. expects a SAS datetime value as input, and YEARw. expects \na SAS date value."}},{"Name":"DTYYQCw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date part of SAS a datetime value as the year and the quarter and \nseparates them with a colon (:). \n\nSyntax Description:\n\nw \n specifies the width of the output field.\n Default: 4 \n Range: 4-6 \n \nDetails:\n\nThe DTYYQCw. format writes SAS datetime values in the form yy or yyyy, followed \nby a colon (:) and the numeric value for the quarter of the year."}},{"Name":"EURDFDDw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values in the form dd.mm.yy or dd.mm.yyyy."}},{"Name":"EURDFDEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values in the form ddmmmyy or ddmmmyyyy."}},{"Name":"EURDFDNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values as the day of the week."}},{"Name":"EURDFDTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international datetime values in the form ddmmmyy:hh:mm:ss.ss or ddmmmyyyy \nhh:mm:ss.ss."}},{"Name":"EURDFDWNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values as the name of the day."}},{"Name":"EURDFMNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values as the name of the month."}},{"Name":"EURDFMYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values in the form mmmyy or mmmyyyy."}},{"Name":"EURDFWDXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values as the name of the month, the day, and the year \nin the form dd month-name yy (or yyyy )."}},{"Name":"EURDFWKXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes international date values as the name of the day and date in the form \nday-of-week, dd month-name yy (or yyyy)."}},{"Name":"HDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values in the form yyyy mmmmm dd where dd is the day-of-the-month, \nmmmmm represents the month's name in Hebrew, and yyyy is the year."}},{"Name":"HEBDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values according to the Jewish calendar."}},{"Name":"HHMMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS time values as hours and minutes in the form hh:mm. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 5 \n Range: 2-20 \nd \n specifies the number of digits to the right of the decimal point in the minutes value. \n The digits to the right of the decimal point specify a fraction of a minute.\n Default: 0 \n Range: 0-19 \n Requirement: must be less than w \n \nDetails:\nThe HHMMw.d format writes SAS datetime values in the form hh:mm, where \n\n hh is an integer. \n mm is the number of minutes that range from 00 through 59.\n SAS rounds hours and minutes that are based on the value of seconds in a SAS time value.\n \nComparisons:\nThe HHMMw.d format is similar to the TIMEw.d format except that the HHMMw.d format \ndoes not print seconds.\n\nThe HHMMw.d format and the TIMEw.d format write a leading blank for the single-hour digit. \nThe TODw.d format writes a leading zero for a single-hour digit."}},{"Name":"HOURw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes time values as hours and decimal fractions of hours. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 2 \n Range: 2-20 \nd \n specifies the number of digits to the right of the decimal point in the hour value. \n Therefore, SAS prints decimal fractions of the hour.\n\n Requirement: must be less than w \n Range: 0-19 \n \nDetails:\nSAS rounds hours based on the value of minutes in the SAS time value."}},{"Name":"JULDAYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values as the Julian day of the year."}},{"Name":"JULIANw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as Julian dates in the form yyddd or yyyyddd. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 5 \n Range: 5-7 \n Tip: If w is 5, the JULIANw. format writes the date with a two-digit year. If w is 7, \n the JULIANw. format writes the date with a four-digit year. \n \nDetails:\nThe JULIANw. format writes SAS date values in the form yyddd or yyyyddd, where \n\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n\n ddd is the number of the day, 1-365 (or 1-366 for leap years), in that year."}},{"Name":"MINGUOw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values as Taiwanese dates in the form yyymmdd."}},{"Name":"MMDDYYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form mmdd yy or mm/dd/yy , where a forward \nslash is the separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 8 \n Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the month \n and the day as possible. When w is 7, the date appears as a two-digit year without slashes. \n \nDetails:\nThe MMDDYYw. format writes SAS date values in the form mmddyy or mm/dd/yy, where \n\n mm is an integer that represents the month.\n\n / is the separator.\n\n dd is an integer that represents the day of the month.\n\n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"MMDDYYxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form mmdd yy or mmXddXyy , where X represents \na specified separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the month, the day, \n and the year. Valid values for x are:\n B separates with a blank\n C separates with a colon\n D separates with a dash \n N indicates no separator \n P separates with a period \n S separates with a slash. \nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the month \n and the day as possible. When w is 7, the date appears as a two-digit year without separators. \n Interaction: When x has a value of N, the width range changes to 2-8. \n \nDetails:\nThe MMDDYYxw. format writes SAS date values in the form mmddyy or mmXddXyy, where \n\n mm is an integer that represents the month. \n X is a specified separator.\n dd is an integer that represents the day of the month.\n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"MMSSw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS time values as the number of minutes and seconds since midnight. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n \n Default: 5 \n Range: 2-20 \n Tip: Set w to a minimum of 5 to write a value that represents minutes and seconds. \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n Therefore, the SAS time value includes fractional seconds.\n\n Range: 0-19 \n Restriction: must be less than w"}},{"Name":"MMYYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form mmM yy, where M is the separator and the \nyear appears as either 2 or 4 digits. \n\nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 7 \n Range: 5-32 \n Interaction: When w has a value of 5 or 6, the date appears with only the last two \n digits of the year. When w is 7 or more, the date appears with a four-digit year. \n\nDetails:\nThe MMYYw. format writes SAS date values in the form mmMyy, where\n\n mm is an integer that represents the month.\n\n M is the character separator.\n\n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"MMYYxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form mm yy or mmXyy, where X represents \na specified separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the month and the year. \n Valid values for x are\n C separates with a colon \n D separates with a dash \n N indicates no separator \n P separates with a period\n S separates with a forward slash.\nw \n specifies the width of the output field.\n Default: 7 \n Range: 5-32 \n Interaction: When x is set to N, no separator is specified. The width range is then 4-32, \n and the default changes to 6. \n Interaction: When x has a value of C, D, P, or S and w has a value of 5 or 6, the date \n appears with only the last two digits of the year. When w is 7 or more, the date appears \n with a four-digit year. \n Interaction: When x has a value of N and w has a value of 4 or 5, the date appears with \n only the last two digits of the year. When x has a value of N and w is 6 or more, the date \n appears with a four-digit year. \n \nDetails:\nThe MMYYxw. format writes SAS date values in the form mmyy or mmXyy, where\n mm is an integer that represents the month.\n X is a specified separator.\n yy is a two-digit or four-digit integer that represents the year."}},{"Name":"MONNAMEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the name of the month. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 9 \n Range: 1-32 \n Tip: Use MONNAME3. to print the first three letters of the month name. \n\nDetails:\n\nIf necessary, SAS truncates the name of the month to fit the format width."}},{"Name":"MONTHw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the month of the year. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 2 \n Range: 1-32 \n \nDetails:\n\nThe MONTHw. format writes the month (1 through 12) of the year from a SAS date value."}},{"Name":"MONYYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the month and the year in the form mmmyy or mmmyyyy. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 5 \n Range: 5-7 \n \nDetails:\nThe MONYYw. format writes SAS date values in the form mmmyy or mmmyyyy, where \n\n mmm is the first three letters of the month name.\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n \nComparisons:\nThe MONYYw. format and the DTMONYYw. format are similar in that they both write date \nvalues. The difference is that MONYYw. expects a SAS date value as input, and DTMONYYw. \nexpects a datetime value."}},{"Name":"NENGOw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as Japanese dates in the form e.yymmdd. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 10 \n Range: 2-10 \n \nDetails:\nThe NENGOw. format writes SAS date values in the form e.yymmdd, where\n\n e is the first letter of the name of the emperor (Meiji, Taisho, Showa, or Heisei).\n\n yy is an integer that represents the year. \n\n mm is an integer that represents the month.\n\n dd is an integer that represents the day of the month.\n\nIf the width is too small, SAS omits the period."}},{"Name":"PDJULGw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes packed Julian date values in the hexadecimal format yyyydddF for IBM. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 3-16 \n \nDetails:\nThe PDJULGw. format writes SAS date values in the form yyyydddF, where \n\n yyyy \n is the two-byte representation of the four-digit Gregorian year.\n\n ddd \n is the one-and-a-half byte representation of the three-digit integer that corresponds \n to the Julian day of the year, 1-365 (or 1-366 for leap years). \n\n F \n is the half byte that contains all binary 1s, which assigns the value as positive.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"PDJULIw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes packed Julian date values in the hexadecimal format ccyydddF for IBM. \n \nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 4 \n Range: 3-16 \n \nDetails:\nThe PDJULIw. format writes SAS date values in the form ccyydddF, where\n\n cc \n is the one-byte representation of a two-digit integer that represents the century. \n\n yy \n is the one-byte representation of a two-digit integer that represents the year. The \n PDJULIw. format makes an adjustment for the century byte by subtracting 1900 from the \n 4-digit Gregorian year to produce the correct packed decimal ccyy representation. A \n year value of 1998 is stored in ccyy as 0098, and a year valueof 2011 is stored as 0111.\n\n ddd \n is the one-and-a-half byte representation of the three-digit integer that corresponds \n to the Julian day of the year, 1-365 (or 1-366 for leap years).\n\n F \n is the half byte that contains all binary 1s, which assigns the value as positive. \n\n Note: SAS interprets a two-digit year as belonging to the 100-year span that is \n defined by the YEARCUTOFF= system option."}},{"Name":"QTRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the quarter of the year. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 1 \n Range: 1-32"}},{"Name":"QTRRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the quarter of the year in Roman numerals. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 3 \n Range: 3-32"}},{"Name":"TIMEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS time values as hours, minutes, and seconds in the form hh:mm:ss.ss. \n \nSyntax Description:\nw \n specifies the width of the output field. Default: 8 Range: 2-20 \n Tip: Make w large enough to produce the desired results. To obtain a complete time value \n with three decimal places, you must allow at least 12 spaces: Eight spaces to the left of \n the decimal point, one space for the decimal point itself, and three spaces for the decimal \n fraction of seconds. \nd \n specifies the number of digits to the right of the decimal point in the seconds value.\n Default: 0 \n Range: 0-19 \n Requirement: must be less than w \n \nDetails:\nThe TIMEw.d format writes SAS time values in the form hh:mm:ss.ss, where \n hh is an integer.\n Note: If hh is a single digit, TIMEw.d places a leading blank before the digit. For example, \n the TIMEw.d. format writes 9:00 instead of 09:00. \n mm is the number of minutes, ranging from 00 through 59.\n ss.ss is the number of seconds, ranging from 00 through 59, with the fraction of a second \n following the decimal point.\n \nComparisons:\nThe TIMEw.d format is similar to the HHMMw.d format except that TIMEw.d includes seconds.\n\nThe TIMEw.d format and the HHMMwwrite a leading blank for a single-hour digit. The TODw.d \nformat writes a leading zero for a single-hour digit."}},{"Name":"TIMEAMPMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS time values as hours, minutes, and seconds in the form hh:mm:ss.ss with AM or PM. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 11 \n Range: 2-20 \nd \n specifies the number of digits to the right of the decimal point in the seconds value.\n Default: 0 \n Range: 0-19 \n Requirement: must be less than w \n \nDetails:\nThe TIMEAMPMw.d format writes SAS time values in the form hh:mm:ss.ss with AM or PM, where \n hh is an integer that represents the hour. \n mm is an integer that represents the minutes.\n ss.ss is the number of seconds to two decimal places. \n\nTimes greater than 23:59:59 PM appear as the next day. \nMake w large enough to produce the desired results. To obtain a complete time value with \nthree decimal places and AM or PM, you must allow at least 11 spaces (hh:mm:ss PM). If w \nis less than 5, SAS writes AM or PM only.\n \nComparisons:\nThe TIMEAMPMMw.d format is similar to the TIMEMw.d format except, that TIMEAMPMMw.d prints \nAM or PM at the end of the time.\n\nTIMEw.d writes hours greater than 23:59:59 PM, and TIMEAMPMw.d does not."}},{"Name":"TODw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the time portion of SAS datetime values in the form hh:mm:ss.ss. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-20 \n Tip: SAS writes a zero for a zero hour if the specified width is sufficient. For example, 02:30 or 00:30. \nd \n specifies the number of digits to the right of the decimal point in the seconds value.\n Default: 0 \n Range: 0-19 \n Requirement: must be less than w \n \nDetails:\nThe TODw.d format writes SAS datetime values in the form hh:mm:ss.ss, where \n\n hh is an integer that represents the hour. \n mm is an integer that represents the minutes.\n ss.ss is the number of seconds to two decimal places. \n \nComparisons:\nThe TODw.d format writes a leading zero for a single-hour digit. The TIMEw.d format \nand the HHMMw.d format write a leading blank for a single-hour digit."}},{"Name":"WEEKDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the day of the week and the date in the form day-of-week, \nmonth-name dd, yy (or yyyy). \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 29 \n Range: 3-37 \n \nDetails:\nThe WEEKDATEw. format writes SAS date values in the form day-of-week, month-name dd, \nyy (or yyyy), where \n\n dd is an integer that represents the day of the month.\n\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n\nIf w is too small to write the complete day of the week and month, SAS abbreviates as needed. \n \nComparisons:\nThe WEEKDATEw. format is the same as the WEEKDATXw. format except that WEEKDATXw. prints \ndd before the month's name."}},{"Name":"WEEKDATXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the day of the week and date in the form day-of-week, \ndd month-name yy (or yyyy). \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 29 \n Range: 3-37 \n \nDetails:\nThe WEEKDATXw. format writes SAS date values in the form day-of-week, dd month-name, \nyy (or yyyy), where \n\n dd is an integer that represents the day of the month.\n yy or yyyy is a two-digit or a four-digit integer that represents the year.\n\nIf w is too small to write the complete day of the week and month, then SAS abbreviates as needed.\n \nComparisons:\nThe WEEKDATEw. format is the same as the WEEKDATXw. format, except that WEEKDATEw. prints \ndd after the month's name.\n\nThe WEEKDATXw. format is the same as the DTWKDATXw. format, except that DTWKDATXw. expects \na datetime value as input."}},{"Name":"WEEKDAYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the day of the week. \n \nSyntax Description:\n\n w specifies the width of the output field.\n Default: 1 \n Range: 1-32 \n \nDetails:\nThe WEEKDAYw. format writes a SAS date value as the day of the week (where 1=Sunday, 2=Monday, \nand so on)."}},{"Name":"WEEKUw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a week number in decimal format by using the U algorithm."}},{"Name":"WEEKVw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a week number in decimal format by using the V algorithm."}},{"Name":"WEEKWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Reads the format of the number-of-week value within the year and returns a SAS-date \nvalue using the W algorithm."}},{"Name":"WORDDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values as the name of the month, the day, and the year in the form \nmonth-name dd, yyyy."}},{"Name":"WORDDATXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values as the day, the name of the month, and the year in the form \ndd month-name yyyy."}},{"Name":"YEARw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values as the year. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 4 \n Range: 2-32 \n Tip: If w is less than 4, the last two digits of the year print; otherwise, the year \n value prints as four digits. \n \nComparisons:\nThe YEARw. format is similar to the DTYEARw. format in that they both write date values. \nThe difference is that YEARw. expects a SAS date value as input, and DTYEARw. expects a \nSAS datetime value."}},{"Name":"YYMMw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yyM mm, where M is the separator and the \nyear appears as either 2 or 4 digits. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 1 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n\n Restriction: must be either 0 or 2 \n Tip: If d is 2, then YENw.d writes a decimal point and two decimal digits. If d is 0, \n then YENw.d does not write a decimal point or decimal digits. \n \nDetails:\nThe YENw.d format writes numeric values with a leading yen sign and with a comma that \nseparates every three digits of each value.\n\nThe hexadecimal representation of the code for the yen sign character is 5B on EBCDIC \nsystems and 5C on ASCII systems. The monetary character these codes represent might be \ndifferent in other countries."}},{"Name":"YYMMxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yymm or yyXmm, where X represents \na specified separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the year and the month. \n Valid values for x are:\n C separates with a colon\n D separates with a dash \n N indicates no separator\n P separates with a period \n S separates with a forward slash \nw \n specifies the width of the output field. Default: 7 Range: 5-32 \n Interaction: When x is set to N, no separator is specified. The width range is then 4-32, \n and the default changes to 6. \n Interaction: When x has a value of C, D, P, or S and w has a value of 5 or 6, the date appears \n with only the last two digits of the year. When w is 7 or more, the date appears with a four-digit year. \n Interaction: When x has a value of N and w has a value of 4 or 5, the date appears with only the last \n two digits of the year. When x has a value of N and w is 6 or more, the date appears with a four-digit year. \n \nDetails:\nThe YYMMxw. format writes SAS date values in the form yymm or yyXmm, where\n yy is a two-digit or four-digit integer that represents the year. \n X is a specified separator. \n mm is an integer that represents the month.\n \nComparisons:\nThe YYMMw.d format is similar to the YYMMxw.d format, except the YYMMxw.d format contains a \nseparator such as a dash, colon, slash, or period, between the year and month."}},{"Name":"YYMMDDw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yymmdd or yy-mm- dd, where a dash \nis the separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nw \n specifies the width of the output field. Default: 8 Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the year \n and the month as possible. When w is 7, the date appears as a two-digit year without dashes. \n \nDetails:\nThe YYMMDDw. format writes SAS date values in the form yymmdd or yy-mm-dd, where \n\n yy is a two-digit or four-digit integer that represents the year.\n\n - \n is the separator.\n\n mm is an integer that represents the month.\n\n dd is an integer that represents the day of the month. \n \nComparisons:\nThe YYMMDDw.d format is similar to the YYMMDDxw.d format, except the YYMMDDxw.d format \ncontains separators, such as a colon, slash, or period between the year, month, and day."}},{"Name":"YYMMDDxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yymmdd or yyXmmXdd, where X represents \na specified separator and the year appears as either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the year, the month, and the day. \n Valid values for x are:\n B separates with a blank \n C separates with a colon \n D separates with a dash \n N indicates no separator \n P separates with a period \n S separates with a slash.\nw \n specifies the width of the output field. Default: 8 Range: 2-10 \n Interaction: When w has a value of from 2 to 5, the date appears with as much of the year \n and the month. When w is 7, the date appears as a two-digit year without separators. \n Interaction: When x has a value of N, the width range is 2-8. \n \nDetails:\nThe YYMMDDxw. format writes SAS date values in the form yymmdd or yyXmmXdd, where \n yy is a two-digit or four-digit integer that represents the year.\n X is a specified separator.\n mm is an integer that represents the month.\n dd is an integer that represents the day of the month. \n \nComparisons:\nThe YYMMDDw.d format is similar to the YYMMDDxw.d format, but YYMMDDxw.d format contains \na separator between the year and month, such as a colon, slash, or period."}},{"Name":"YYMONw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yymmm or yyyymmm. \n \nSyntax Description:\nw \n specifies the width of the output field. If the format width is too small to print a \n four-digit year, only the last two digits of the year are printed.\n \n Default: 7 \n Range: 5-32 \n \nDetails:\nThe YYMONw. format abbreviates the month's name to three characters."}},{"Name":"YYQZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form , the year appears as 2 or 4 digits, and \nqq is the quarter of the year. \n \nSyntax Description:\nZ \n specifies that no separator appear between the year and the quarter. \nw \n specifies the width of the output field.\n Default: 4 \n Maximum: 6 \n \nDetails:\nThe YYQZw. format writes SAS date values in the form \n\n is a two-digit or four-digit integer that represents the year. \n Z specifies that there is no separator. \n is an integer (01, 02, 03, or 04) that represents the quarter of the year."}},{"Name":"YYQw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yyQ q, where Q is the separator, the year \nappears as either 2 or 4 digits, and q is the quarter of the year. \n\nSyntax Description:\nw \n specifies the width of the output field. Default: 6 Range: 4-32 \n Interaction: When w has a value of 4 or 5, the date appears with only the last two digits \n of the year. When w is 6 or more, the date appears with a four-digit year. \n \nDetails:\nThe YYQw. format writes SAS date values in the form yyQq, where\n\n yy is a two-digit or four-digit integer that represents the year.\n\n Q is the character separator.\n\n q is an integer (1,2,3, or 4) that represents the quarter of the year.\n \nComparisons:\nThe YYQw. format is similar to the YYQxw. format, but the YYQxw. format has separators \nbetween the YY and Q, such as a dash, slash, period, or colon."}},{"Name":"YYQxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yyq or yy-q, where the x in the format name \nis a character that represents the special character that separates the year and the \nquarter of the year, which can be a hyphen (-), period (.), blank character, slash (/), \ncolon (:), or no separator; the year can be either 2 or 4 digits. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the year and \n the quarter. Valid values for x are:\n C separates with a colon\n D separates with a dash\n N indicates no separator \n P separates with a period \n S separates with a forward slash.\nw \n specifies the width of the output field. Default: 6 Range: 4-32 \n Interaction: When x is set to N, no separator is specified. The width range is then 3-32, \n and the default changes to 5. \n Interaction: When w has a value of 4 or 5, the date appears with only the last two digits \n of the year. When w is 6 or more, the date appears with a four-digit year. \n Interaction: When x has a value of N and w has a value of 3 or 4, the date appears with \n only the last two digits of the year. When x has a value of N and w is 5 or more, the date \n appears with a four-digit year. \n \nComparisons:\nThe YYQw. format is similar to the YYQxw. format, but the YYQxw. format has separators between \nthe YY and Q, such as a dash, slash, period, or colon. \n\nDetails:\nThe YYQxw. format writes SAS date values in the form yyq or yyXq, where\n yy is a two-digit or four-digit integer that represents the year. \n X is a specified separator.\n q is an integer (1,2,3, or 4) that represents the quarter of the year."}},{"Name":"YYQRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yyQ qr, where Q is the separator, the year \nappears as either 2 or 4 digits, and qr is the quarter of the year expressed in \nroman numerals.\n\nSyntax Description: \nw \n specifies the width of the output field. Default: 8 Range: 6-32 \n Interaction: When the value of w is too small to write a four-digit year, the date appears \n with only the last two digits of the year. \n \nDetails:\nThe YYQRw. format writes SAS date values in the form yyQqr, where\n\n yy is a two-digit or four-digit integer that represents the year.\n Q is the character separator.\n qr is a roman numeral (I, II, III, or IV) that represents the quarter of the year.\n \nComparisons:\nThe YYQRw. format is similar to the YYQRxw. format, but the YYQRxw. format has \nseparators between the YY and QR, such as a dash, slash, period, or colon."}},{"Name":"YYQRxw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes SAS date values in the form yy qr or yyXqr, where X represents \na specified separator, the year appears as either 2 or 4 digits, and qr is the \nquarter of the year expressed in Roman numerals. \n\nSyntax Description:\nx \n identifies a separator or specifies that no separator appear between the year and the quarter. \n Valid values for x are: \n C separates with a colon \n D separates with a dash \n N indicates no separator \n P separates with a period \n S separates with a forward slash.\nw \n specifies the width of the output field. Default: 8 Range: 6-32 \n Interaction: When x is set to N, no separator is specified. The width range is then 5-32, \n and the default changes to 7. \n Interaction: When the value of w is too small to write a four-digit year, the date appears \n with only the last two digits of the year. \n \nDetails:\nThe YYQRxw. format writes SAS date values in the form yyqr or yyXqr, where\n\n yy is a two-digit or four-digit integer that represents the year. \n X is a specified separator. \n qr is a roman numeral (I, II, III, or IV) that represents the quarter of the year.\n \nComparisons:\nThe YYQRw. format is similar to the YYQRxw. format, but the YYQRxw. format has separators \nbetween the YY and QR, such as a dash, slash, period, or colon."}},{"Name":"$CPTDWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string in Hebrew text that is encoded in IBM-PC (cp862) to Windows \nHebrew encoding (cp1255)."}},{"Name":"$CPTWDw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a character string that is encoded in Windows (cp1255) to Hebrew DOS (cp862) \nencoding."}},{"Name":"BESTw.","Type":"SAS_FORMATS","Help":{"#cdata":"SAS chooses the best notation. \n \nSyntax Description:\nw \n specifies the width of the output field. \n\n Default: 12 \n Tip: If you print numbers between 0 and .01 exclusively, then use a field width of at \n least 7 to avoid excessive rounding. If you print numbers between 0 and -.01 exclusively, \n then use a field width of at least 8. \n Range: 1-32 \n \nDetails:\nThe BESTw. format is the default format for writing numeric values. When there is no \nformat specification, SAS chooses the format that provides the most information about \nthe value according to the available field width. BESTw. rounds the value, and if SAS \ncan display at least one significant digit in the decimal portion, within the width \nspecified, BESTw. produces the result in decimal. Otherwise, it produces the result \nin scientific notation. SAS always stores the complete value regardless of the format \nthat you use to represent it. \n \nComparisons:\no The BESTw. format writes as many significant digits as possible in the output field, \nbut if the numbers vary in magnitude, the decimal points do not line up. Integers print \nwithout a decimal.\n\no The Dw.p format writes numbers with the desired precision and more alignment than \nthe BESTw. format.\n\no The w.d format aligns decimal points, if possible, but does not necessarily show the \nsame precision for all numbers."}},{"Name":"BINARYw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts numeric values to binary representation. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 8 \n Range: 1-64 \n \nComparisons:\n\nBINARYw. converts numeric values to binary representation. The $BINARYw. format converts \ncharacter values to binary representation."}},{"Name":"COMMAw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a comma that separates every three digits and a period \nthat separates the decimal fraction. \n\nSyntax Description:\nw \n specifies the width of the output field.\n\n Default: 6 \n Range: 1-32 \n Tip: Make w wide enough to write the numeric values, the commas, and the optional decimal point. \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n\n Range: 0-31 \n Requirement: must be less than w \n \nComparisons:\nThe COMMAw.d format is similar to the COMMAXw.d format, but the COMMAXw.d format reverses \nthe roles of the decimal point and the comma. This convention is common in European countries.\n\nThe COMMAw.d format is similar to the DOLLARw.d format except that the COMMAw.d format does \nnot print a leading dollar sign."}},{"Name":"COMMAXw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a period that separates every three digits and a comma \nthat separates the decimal fraction. \n\nSyntax Description:\nw \n specifies the width of the output field.\n \n Default: 6 \n Range: 1-32 \n Tip: Make w wide enough to write the numeric values, the commas, and the optional decimal point. \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n\n Range: 0-31 \n Requirement: must be less than w \n \nComparisons:\nThe COMMAw.d format is similar to the COMMAXw.d format, but the COMMAXw.d format reverses \nthe roles of the decimal point and the comma. This convention is common in European countries."}},{"Name":"Dw.p","Type":"SAS_FORMATS","Help":{"#cdata":"Prints numeric values, possibly with a great range of values, lining up decimal places \nfor values of similar magnitude. \n\nSyntax Description:\nw \n specifies the width of the output field. This argument is optional.\n Default: 12 \n Range: 1-32 \np \n specifies the significant digits.\n Default: 3 \n Range: 0-16 \n Requirement: must be less than w \n \nDetails:\nThe Dw.p format writes numbers so that the decimal point aligns in groups of values \nwith similar magnitude. Larger values of p print the data values with more precision \nand potentially more shifts in the decimal point alignment. Smaller values of p print \nthe data values with less precision and a greater chance of decimal point alignment. \n \nComparisons:\no The BESTw. format writes as many significant digits as possible in the output field, \nbut if the numbers vary in magnitude, the decimal points do not line up.\n\no Dw.p writes numbers with the desired precision and more alignment than BESTw. format"}},{"Name":"DOLLARw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a leading dollar sign, a comma that separates every three \ndigits, and a period that separates the decimal fraction. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 6 \n Range: 2-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Range: 0-31 \n Requirement: must be less than w \n \nDetails:\nThe DOLLARw.d format writes numeric values with a leading dollar sign, a comma that separates \nevery three digits, and a period that separates the decimal fraction.\n\nThe hexadecimal representation of the code for the dollar sign character ($) is 5B on EBCDIC \nsystems and 24 on ASCII systems. The monetary character that these codes represent might be \ndifferent in other countries, but DOLLARw.d always produces one of these codes. \n \nComparisons:\nThe DOLLARw.d format is similar to the DOLLARXw.d format, but the DOLLARXw.d format reverses \nthe roles of the decimal point and the comma. This convention is common in European countries.\n\nThe DOLLARw.d format is the same as the COMMAw.d format except that the COMMAw.d format does \nnot write a leading dollar sign."}},{"Name":"DOLLARXw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a leading dollar sign, a period that separates every three \ndigits, and a comma that separates the decimal fraction. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 6 \n Range: 2-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n Default: 0 \n Range: 2-31 \n Requirement: must be less than w \n \nDetails:\nThe DOLLARXw.d format writes numeric values with a leading dollar sign, a comma that \nseparates every three digits, and a period that separates the decimal fraction.\n\nThe hexadecimal representation of the code for the dollar sign character ($) is 5B on \nEBCDIC systems and 24 on ASCII systems. The monetary character that these codes represent \nmight be different in other countries, but DOLLARXw.d always produces one of these codes. \n \nComparisons:\nThe DOLLARXw.d format is similar to the DOLLARw.d format, but the DOLLARXw.d format reverses \nthe roles of the decimal point and the comma. This convention is common in European countries.\n\nThe DOLLARXw.d format is the same as the COMMAXw.d format except that the COMMAw.d format does \nnot write a leading dollar sign."}},{"Name":"Ew.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values in scientific notation. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 12 \n Range: 7-32 \n \nDetails:\n\nSAS reserves the first column of the result for a minus sign."}},{"Name":"EUROw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a leading euro symbol (E), a comma that separates every \nthree digits, and a period that separates the decimal fraction. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 6 \n Range: 1-32 \n Tip: If you want the euro symbol to be part of the output, be sure to choose an adequate width. \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Default: 0 \n Range: 0-31 \n Requirement: must be less than w \n \nComparisons:\no The EUROw.d format is similar to the EUROXw.d format, but EUROXw.d format reverses the \nroles of the decimal point and the comma. This convention is common in European countries. \n\no The EUROw.d format is similar to the DOLLARw.d format, except that DOLLARw.d format writes \na leading dollar sign instead of the euro symbol.\n\nNote: The EUROXw.d format uses the euro character (U+20AC). If you use the DBCS version of \nSAS and an encoding that does not support the euro character, an error will occur. To prevent \nthis error, change your session encoding to an encoding that supports the euro character."}},{"Name":"EUROXw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a leading euro symbol (E), a period that separates every \nthree digits, and a comma that separates the decimal fraction. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 6 \n Range: 1-32 \n Tip: If you want the euro symbol to be part of the output, be sure to choose an adequate width. \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Default: 0 \n Range: 0-31 \n Requirement: must be less than w \n \nComparisons:\nThe EUROXw.d format is similar to the EUROw.d format, but EUROw.d format reverses the roles of \nthe comma and the decimal point. This convention is common in English-speaking countries.\n\nThe EUROXw.d format is similar to the DOLLARXw.d format, except that DOLLARXw.d format writes \na leading dollar sign instead of the euro symbol.\n\nNote: The EUROXw.d format uses the euro character (U+20AC). If you use the DBCS version of SAS \nand an encoding that does not support the euro character, an error will occur. To prevent this error, \nchange your session encoding to an encoding that supports the euro character. "}},{"Name":"FLOATw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Generates a native single-precision, floating-point value by multiplying a number \nby 10 raised to the dth power. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Requirement: width must be 4 \nd \n specifies the power of 10 by which to multiply the value.\n Default: 0 \n Range: 0-31 \n \nDetails:\nValues that are written by FLOAT4. typically are those meant to be read by some other \nexternal program that runs in your operating environment and that expects these single-\nprecision values. If the value that is to be formatted is a missing value, or if it is \nout-of-range for a native single-precision, floating-point value, a single-precision \nvalue of zero is generated."}},{"Name":"FRACTw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts numeric values to fractions. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n Default: 10 \n Range: 4-32 \n \nDetails:\n\nDividing the number 1 by 3 produces the value 0.33333333. To write this value as 1/3, \nuse the FRACTw. format. FRACTw. writes fractions in reduced form, that is, 1/2 instead \nof 50/100."}},{"Name":"HEXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts real binary (floating-point) values to hexadecimal representation. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-16 \n Tip: If w < 16, the HEXw. format converts real binary numbers to fixed-point integers \n before writing them as hexadecimal characters. It also writes negative numbers in two's \n complement notation, and right aligns digits. If w is 16, HEXw. displays floating-point \n values in their hexadecimal form. \n \nDetails:\nIn any operating environment, the least significant byte written by HEXw. is the rightmost \nbyte. Some operating environments store integers with the least significant digit as the first \nbyte. The HEXw. format produces consistent results in any operating environment regardless of \nthe order of significance by byte.\n\nNote: Different operating environments store floating-point values in different ways. However, \nthe HEX16. format writes hexadecimal representations of floating-point values with consistent \nresults in the same way that your operating environment stores them. \n \nComparisons:\nThe HEXw. numeric format and the $HEXw. character format both generate the hexadecimal equivalent \nof values."}},{"Name":"IBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes native integer binary (fixed-point) values, including negative values. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 1-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default 0 \n Range: 0-10 \n \nDetails:\nThe IBw.d format writes integer binary (fixed-point) values, including negative values that \nare represented in two's complement notation. IBw.d writes integer binary values with consistent \nresults if the values are created in the same type of operating environment that you use to run SAS. \n\nNote: Different operating environments store integer binary values in different ways. This concept \nis called byte ordering."}},{"Name":"IBRw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes integer binary (fixed-point) values in Intel and DEC formats. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 1-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails:\nThe IBRw.d format writes integer binary (fixed-point) values, including negative values that \nare represented in two's complement notation. IBRw.d writes integer binary values that are \ngenerated by and for Intel and DEC operating environments. Use IBRw.d to write integer binary \ndata from Intel or DEC environments on other operating environments. The IBRw.d format in SAS \ncode allows for a portable implementation for writing the data in any operating environment.\n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering."}},{"Name":"IEEEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Generates an IEEE floating-point value by multiplying a number by 10 raised to the dth power. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 8 \n Range: 3-8 \n Tip: If w is 8, an IEEE double-precision, floating-point number is written. If w is 5, 6, or 7, \n an IEEE double-precision, floating-point number is written, which assumes truncation of the \n appropriate number of bytes. If w is 4, an IEEE single-precision floating-point number is written. \n If w is 3, an IEEE single-precision, floating-point number is written, which assumes truncation \n of one byte. \nd \n specifies to multiply the number by 10d.\n Default: 0 \n Range: 0-10 \n \nDetails:\nThis format is useful in operating environments where IEEEw.d is the floating-point representation \nthat is used. In addition, you can use the IEEEw.d format to create files that are used by programs \nin operating environments that use the IEEE floating-point representation.\n\nTypically, programs generate IEEE values in single-precision (4 bytes) or double-precision (8 bytes). \nPrograms perform truncation solely to save space on output files. Machine instructions require that \nthe floating-point number be one of the two lengths. The IEEEw.d format allows other lengths, which \nenables you to write data to files that contain space-saving truncated data."}},{"Name":"NEGPARENw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes negative numeric values in parentheses. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 6 \n Range: 1-32 \n\nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NEGPARENw.d format attempts to right align output values. If the input value is negative, \nNEGPARENw.d displays the output by enclosing the value in parentheses, if the field that you \nspecify is wide enough. Otherwise, it uses a minus sign to represent the negative value. If \nthe input value is non-negative, NEGPARENw.d displays the value with a leading and trailing \nblank to ensure proper column alignment. It reserves the last column for a close parenthesis \neven when the value is positive. \n\nComparisons:\nThe NEGPARENw.d format is similar to the COMMAw.d format in that it separates every three \ndigits of the value with a comma."}},{"Name":"NUMXw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with a comma in place of the decimal point."}},{"Name":"OCTALw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts numeric values to octal representation. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n Default: 3 \n Range: 1-24 \n \nDetails:\n\nIf necessary, the OCTALw. format converts numeric values to integers before displaying \nthem in octal representation. \n \nComparisons:\n\nOCTALw. converts numeric values to octal representation. The $OCTALw. format converts \ncharacter values to octal representation."}},{"Name":"PDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes data in packed decimal format."}},{"Name":"PERCENTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values as percentages. \n \nSyntax Description\n\nw \n specifies the width of the output field.\n Default: 6 \n Range: 4-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Range: 0-31 \n Requirement: must be less than w \n \nDetails:\nThe PERCENTw.d format multiplies values by 100, formats them the same as the BESTw.d format, \nand adds a percent sign (%) to the end of the formatted value, while it encloses negative \nvalues in parentheses. The PERCENTw.d format allows room for a percent sign and parentheses, \neven if the value is not negative."}},{"Name":"PERCENTNw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Produces percentages, using a minus sign for negative values. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 6 \n Range: 4-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Range: 0-31 \n Requirement: must be less than w \n \nDetails:\nThe PERCENTNw.d format multiplies negative values by 100, formats them the same as the \nBESTw.d format, adds a minus sign to the beginning of the value, and adds a percent sign \n(%) to the end of the formatted value. The PERCENTNw.d format allows room for a percent \nsign and a minus sign, even if the value is not negative.\n \nComparisons:\nThe PERCENTNw.d format produces percents by using a minus sign instead of parentheses \nfor negative values. The PERCENTw.d format produces percents by using parentheses for \nnegative values."}},{"Name":"PIBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes positive integer binary (fixed-point) values."}},{"Name":"PIBRw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes positive integer binary (fixed-point) values in Intel and DEC formats."}},{"Name":"PKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes data in unsigned packed decimal format."}},{"Name":"PVALUEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes p-values."}},{"Name":"RBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes real binary data (floating-point) in real binary format."}},{"Name":"ROMANw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values as roman numerals. \n \nSyntax Description:\n\nw \n specifies the width of the output field.\n\n Default: 3 \n Range: 3-32"}},{"Name":"SIZEKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a numeric value in the form nK for kilobytes.\n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 9 \n Range: 2-33 \n\nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Default: 0 \n Range: 0-31 \n \nDetails:\nTo write a numeric value in the form nK by using the SIZEKw.d format, the value of n \nis calculated by dividing the numeric value by 1,024. The symbol K indicates that the \nvalue is a multiple of 1,024."}},{"Name":"SIZEKMGw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a numeric value in the form nKB for kilobytes, nMB for megabytes, \nor nGB for gigabytes.\n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 9 \n Range: 2-33 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Default: 0 \n Range: 0-31 \n \nDetails:\nWhen you specify the SIZEKMGw.d format, SAS determines the best suffix: KB for kilobytes; \nMB for megabytes; or GB for gigabytes; and divides the SAS numeric value by one of the \nfollowing values:\n\n KB 1024 \n MB 1048576 \n GB 1073741824"}},{"Name":"S370FFw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes native standard numeric data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 12 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional.\n Range: 0-31 \n \nDetails:\nThe S370FFw.d format writes numeric data in IBM mainframe format (EBCDIC). The EBCDIC \nnumeric values are represented with one byte per digit. If EBCDIC is the native format, \nS370FFw.d performs no conversion.\n\nIf a value is negative, an EBCDIC minus sign precedes the value. A missing value is \nrepresented as a single EBCDIC period.\n \nComparisons:\no On an EBCDIC system, S370FFw.d behaves like the w.d format. \no On all other systems, S370FFw.d performs the same role for numeric data that the \n$EBCDICw. format does for character data."}},{"Name":"S370FIBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes integer binary (fixed-point) values, including negative values, in IBM\nmainframe format. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 1-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails: \nThe S370FIBw.d format writes integer binary (fixed-point) values that are stored in IBM mainframe \nformat, including negative values that are represented in two's complement notation. S370FIBw.d \nwrites integer binary values with consistent results if the values are created in the same type \nof operating environment that you use to run SAS. \n\nUse S370FIBw.d to write integer binary data in IBM mainframe format from data that are created \nin other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering."}},{"Name":"S370FIBUw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes unsigned integer binary (fixed-point) values in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 1-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails:\nThe S370FIBUw.d format writes unsigned integer binary (fixed-point) values that are stored in IBM \nmainframe format, including negative values that are represented in two's complement notation. \nUnsigned integer binary values are the same as integer binary values, except that all values are \ntreated as positive. S370FIBUw.d writes integer binary values with consistent results if the values \nare created in the same type of operating environment that you use to run SAS.\n\nUse S370FIBUw.d to write unsigned integer binary data in IBM mainframe format from data that are \ncreated in other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering."}},{"Name":"S370FPDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes packed decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 1 \n Range: 1-16 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails: \nUse S370FPDw.d in other operating environments to write packed decimal data in the same \nformat as on an IBM mainframe computer."}},{"Name":"S370FPDUw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes unsigned packed decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 1 \n Range: 1-16 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FPDUw.d in other operating environments to write unsigned packed decimal data \nin the same format as on an IBM mainframe computer. \n\nComparisons:\nThe S370FPDUw.d format is similar to the S370FPDw.d format except that the S370FPDw.d format \nalways uses the absolute value instead of the signed value.\n\nThe S370FPDUw.d format is equivalent to the COBOL notation PIC 9(n) PACKED-DECIMAL, where \nthe n value is the number of digits."}},{"Name":"S370FPIBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes positive integer binary (fixed-point) values in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 1-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails: \nPositive integer binary values are the same as integer binary values, except that all values \nare treated as positive. S370FPIBw.d writes integer binary values with consistent results if \nthe values are created in the same type of operating environment that you use to run SAS.\n\nUse S370FPIBw.d to write positive integer binary data in IBM mainframe format from data that \nare created in other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering."}},{"Name":"S370FRBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes real binary (floating-point) data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 4 \n Range: 2-8 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails:\nA floating-point value consists of two parts: a mantissa that gives the value and an \nexponent that gives the value's magnitude.\n\nUse S370FRBw.d in other operating environments to write floating-point binary data in \nthe same format as on an IBM mainframe computer."}},{"Name":"S370FZDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes zoned decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDw.d in other operating environments to write zoned decimal data in the same \nformat as on an IBM mainframe computer."}},{"Name":"S370FZDLw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes zoned decimal leading-sign data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDLw.d in other operating environments to write zoned decimal leading-sign data \nin the same format as on an IBM mainframe computer.\n \nComparisons: \nThe S370FZDLw.d format is similar to the S370FZDw.d format except that the S370FZDLw.d format \ndisplays the sign of the number in the first byte of the formatted output.\n\nThe S370FZDLw.d format is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN LEADING, \nwhere the n value is the number of digits."}},{"Name":"S370FZDSw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes zoned decimal separate leading-sign data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-32 \nd \n specifies to multiply the number by 10d. This argument is optional.\n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDSw.d in other operating environments to write zoned decimal separate leading-sign \ndata in the same format as on an IBM mainframe computer. \n \nComparisons:\nThe S370FZDSw.d format is similar to the S370FZDLw.d format except that the S370FZDSw.d format \ndoes not embed the sign of the number in the zoned output.\n\nThe S370FZDSw.d format is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN LEADING SEPARATE, \nwhere the n value is the number of digits."}},{"Name":"S370FZDTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes zoned decimal separate trailing-sign data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-32 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDTw.d in other operating environments to write zoned decimal separate trailing-sign \ndata in the same format as on an IBM mainframe computer.\n \nComparisons:\nThe S370FZDTw.d format is similar to the S370FZDSw.d format except that the S370FZDTw.d format \ndisplays the sign of the number at the end of the formatted output. \n\nThe S370FZDTw.d format is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN TRAILING SEPARATE, \nwhere the n value is the number of digits."}},{"Name":"S370FZDUw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes unsigned zoned decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 1-32 \nd \n specifies to multiply the number by 10d. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDUw.d in other operating environments to write unsigned zoned decimal data \nin the same format as on an IBM mainframe computer.\n \nComparisons:\nThe S370FZDUw.d format is similar to the S370FZDw.d format except that the S370FZDUw.d \nformat always uses the absolute value of the number.\n\nThe S370FZDUw.d format is equivalent to the COBOL notation PIC 9(n) DISPLAY, where the \nn value is the number of digits."}},{"Name":"SSNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes Social Security numbers. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 11 \n Restriction: w must be 11 \n \nDetails:\nIf the value is missing, SAS writes nine single periods with dashes between the third \nand fourth periods and between the fifth and sixth periods. If the value contains fewer \nthan nine digits, SAS right aligns the value and pads it with zeros on the left. If the \nvalue has more than nine digits, SAS writes it as a missing value."}},{"Name":"VAXRBw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes real binary (floating-point) data in VMS format. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 8 \n Range: 2-8 \nd \n specifies the power of 10 by which to divide the value.\n Default: 0 \n Range: 0-31 \n \nDetails:\nUse the VAXRBw.d format to write data in native VAX/VMS floating-point notation."}},{"Name":"w.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes standard numeric data one digit per byte. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Range: 1-32 \n Tip: Allow enough space to write the value, the decimal point, and a minus sign, \n if necessary. \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Range: 0-31 \n Requirement: must be less than w \n Tip: If d is 0 or you omit d, w.d writes the value without a decimal point. \n \nDetails:\nThe w.d format rounds to the nearest number that fits in the output field. If w.d is too \nsmall, SAS might shift the decimal to the BESTw. format. The w.d format writes negative \nnumbers with leading minus signs. In addition, w.d right aligns before writing and pads \nthe output with leading blanks.\n \nComparisons:\nThe Zw.d format is similar to the w.d format except that Zw.d pads right-aligned output \nwith 0s instead of blanks."}},{"Name":"WORDFw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values as words with fractions that are shown numerically. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 10 \n Range: 5-32767 \n \nDetails:\nThe WORDFw. format converts numeric values to their equivalent in English words, with \nfractions that are represented numerically in hundredths. For example, 8.2 prints as \neight and 20/100.\n\nNegative numbers are preceded by the word minus. When the value's equivalent in words \ndoes not fit into the specified field, it is truncated on the right and the last character \nprints as an asterisk.\n \nComparisons:\nThe WORDFw. format is similar to the WORDSw. format except that WORDFw. prints fractions \nas numbers instead of words."}},{"Name":"WORDSw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values as words. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 10 \n Range: 5-32767 \n \nDetails:\nYou can use the WORDSw. format to print checks with the amount written out below the payee line.\n\nNegative numbers are preceded by the word minus. If the number is not an integer, the fractional \nportion is represented as hundredths. For example, 5.3 prints as five and thirty hundredths. When \nthe value's equivalent in words does not fit into the specified field, it is truncated on the \nright and the last character prints as an asterisk.\n \nComparisons:\nThe WORDSw. format is similar to the WORDFw. format except that WORDSw. prints fractions as words \ninstead of numbers."}},{"Name":"YENw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric values with yen signs, commas, and decimal points. \n \nSyntax Description:\nw \n specifies the width of the output field.\n Default: 1 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value.\n Restriction: must be either 0 or 2 \n Tip: If d is 2, then YENw.d writes a decimal point and two decimal digits. If d is 0, \n then YENw.d does not write a decimal point or decimal digits. \n \nDetails:\nThe YENw.d format writes numeric values with a leading yen sign and with a comma that \nseparates every three digits of each value.\n\nThe hexadecimal representation of the code for the yen sign character is 5B on EBCDIC \nsystems and 5C on ASCII systems. The monetary character these codes represent might be \ndifferent in other countries."}},{"Name":"Zw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes standard numeric data with leading 0s. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 1 \n Range: 1-32 \n Tip: Allow enough space to write the value, the decimal point, and a minus sign, if necessary. \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n Default: 0 \n Range: 0-31 \n Tip: If d is 0 or you omit d, Zw.d writes the value without a decimal point. \n \nDetails:\nThe Zw.d format writes standard numeric values one digit per byte and fills in 0s to the \nleft of the data value.\n\nThe Zw.d format rounds to the nearest number that will fit in the output field. If w.d is \ntoo large to fit, SAS might shift the decimal to the BESTw. format. The Zw.d format writes \nnegative numbers with leading minus signs. In addition, it right aligns before writing and \npads the output with leading zeros."}},{"Name":"ZDw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes numeric data in zoned decimal format."}},{"Name":"$BASE64Xw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts character data to ASCII text using Base 64 encoding. \n \nSyntax Description:\n\nw \nspecifies the width of the output field.\n\n Default: 1 \n Range: 1-32767 \n \nDetails:\n\nBase 64 is an industry encoding method whose encoded characters are determined by \nusing a positional scheme that uses only ASCII characters. Several Base 64 encoding \nschemes have been defined by the industry for specific uses, such as e-mail or content \nmasking. SAS maps positions 0 - 61 to the characters A - Z, a - z, and 0 - 9. Position \n62 maps to the character +, and position 63 maps to the character /. \n\nThe following are some uses of Base 64 encoding:\n\n o embed binary data in an XML file\n o encode passwords\n o encode URLs\n\nThe '=' character in the encoded results indicates that the results have been padded \nwith zero bits. In order for the encoded characters to be decoded, the '=' must be \nincluded in the value to be decoded."}},{"Name":"$N8601Bw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms using the basic notations \nPnYnMnDTnHnMnS and yyyymmddThhmmss. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nDetails:\nThe $N8601B format writes ISO 8601 duration, datetime, and interval values as character data for \nthe following basic notations: \n\n PnYnMnDTnHnMnS \n yyyymmddThhmmss \n PnYnMnDTnHnMnS/yyyymmddThhmmss \n yyyymmddThhmmssT/PnYnMnDTnHnMnS \n\nThe lowest order component can contain fractions, as in these examples: \n\n p2y3.5m \n p00020304T05.335"}},{"Name":"$N8601BAw.d","Type":"SAS_FORMATS","Help":{"#cdata":"writes ISO 8601 duration, datetime, and interval forms using the basic notations PyyyymmddThhmmss \nand yyyymmddThhmmss. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nDetails:\nThe $N8601BA format writes ISO 8601 duration, datetime, and interval values as character data \nfor the following basic notations: \n\n PyyyymmddThhmmss \n yyyymmddThhmmss \n PyyyymmddThhmmss/yyyymmddThhmmss \n yyyymmddThhmmss/PyyyymmddThhmmss \n\nThe lowest order component can contain fractions, as in these examples: \n\n p00023.5 \n 00020304T05.335"}},{"Name":"$N8601Ew.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms using the extended notations \nPnYnMnDTnHnMnS and yyyy-mm-ddThh:mm:ss. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n\nThe $N8601B format writes ISO 8601 duration, datetime, and interval values as character data \nfor the following basic notations: \n\n PnYnMnDTnHnMnS \n yyyy-mm-ddThh:mm:ss \n PnYnMnDTnHnMnS/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ssT/PnYnMnDTnHnMnS \n\nThe lowest order component can contain fractions, as in these examples: \n\n p2y3.5m \n p0002-03-04T05.335"}},{"Name":"$N8601EAw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms using the extended notations \nPyyyy-mm-ddThh:mm:ss and yyyy-mm-ddThh:mm:ss. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nDetails:\nThe $N8601EA format writes ISO 8601 duration, datetime, and interval values as character \ndata for the following basic notations: \n\n Pyyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss \n Pyyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss/Pyyyy-mm-ddThh:mm:ss \n\nThe lowest order component can contain fractions, as in these examples: \n\n p00023.5 \n 0002-03-04T05.335"}},{"Name":"$N8601EHw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms for the extended notations \nPyyyy-mm-ddThh:mm:ss and yyyy-mm-ddThh:mm:ss, using a hyphen ( - ) for omitted \ncomponents. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n\nDetails: \nThe $N8601H format writes ISO 8601 duration, datetime, and interval values as character data, \nusing a hyphen ( - ) to represent omitted components, for the following extended notations: \n\n Pyyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss \n Pyyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss/Pyyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n\nOmitted datetime components are always displayed, they are never truncated."}},{"Name":"$N8601EXw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms for the extended notations \nPyyyy-mm-ddThh:mm:ss and yyyy-mm-ddThh:mm:ss, using an x for each digit of an \nomitted component. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nDetails:\nThe $N8601H format writes ISO 8601 duration, datetime, and interval values as character data, \nusing a hyphen ( - ) to represent omitted components, for the following extended notations: \n\n Pyyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss \n Pyyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss/Pyyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n\nOmitted datetime components are always displayed, they are never truncated."}},{"Name":"$N8601Hw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms PnYnMnDTnHnMnS and \nyyyy-mm-ddThh:mm:ss, dropping omitted components in duration values and \nusing a hyphen ( - ) for omitted components in datetime values. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nThe $N8601H format writes ISO 8601 durations, intervals, and datetimes in the following forms, \nomitting components in the PnYnMnDTnHnMnS form and using a hyphen ( - ) to represent omitted \ncomponents in the datetime form: \n\n PnYnMnDTnHnMnS \n yyyy-mm-ddThh:mm:ss \n PnYnMnDTnHnMnS/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ssT/PnYnMnDTnHnMnS \n yyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n\nOmitted datetime components are always displayed, they are never truncated."}},{"Name":"$N8601Xw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes ISO 8601 duration, datetime, and interval forms PnYnMnDTnHnMnS and \nyyyy-mm-ddThh:mm:ss, dropping omitted components in duration values and \nusing an x for each digit of an omitted component in datetime values. \n\nSyntax Description:\nw \n specifies the width of the output field. \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the lowest order component. This argument is optional.\n Default: 0 \n Range: 0 - 3 \n \nDetails:\n\nThe $N8601X format writes ISO 8601 durations, intervals, and datetimes in the following forms, \nomitting components in the PnYnMnDTnHnMnS form and using an x to represent omitted components \nin the datetime form: \n\n PnYnMnDTnHnMnS \n yyyy-mm-ddThh:mm:ss \n PnYnMnDTnHnMnS/yyyy-mm-ddThh:mm:ss \n yyyy-mm-ddThh:mm:ssT/PnYnMnDTnHnMnS \n yyyy-mm-ddThh:mm:ss/yyyy-mm-ddThh:mm:ss \n\nOmitted datetime components are always displayed, they are never truncated."}},{"Name":"B8601DAw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values using the IOS 8601 base notation yyyymmdd. \n \nSyntax Description:\nw \n specifies the width of the output field. \n Default: 10 \n Requirement: The width of the output field must be 10. \n\nDetails:\nThe B8601DA format writes the ISO 8601 basic date notation yyyymmdd:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31"}},{"Name":"B8601DNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date from a datetime value using the ISO 8601 basic notation yyyymmdd. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 10 \n Requirement: The width of the input field must be 10. \n\nDetails: \nThe B8601DN format writes the date from a datetime value using the ISO 8601 basic date \nnotation yyyymmdd:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31"}},{"Name":"B8601DTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values in the ISO 8601 basic notation yyyymmddThhmmssffffff. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 19 \n Range: 19 - 26 \nd \n specifies the number of digits to the right of the seconds value that represents a fraction \n of a second. This argument is optional.\n Default: 0 \n Range: 0 - 6 \n \nDetails:\nThe B8601DT format writes ISO 8601 basic datetime notation yyyymmddThhmmssffffff:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 - 23 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n .ffffff are optional fractional seconds, with a precision of up to six digits, \n where each digit is between 0 - ."}},{"Name":"B8601DZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values in the Coordinated Universal Time (UTC) time scale using the \nISO 8601 datetime and time zone basic notation yyyymmddThhmmss+|-hhmm. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 26 \n Range: 20 - 35 \n \nDetails: \nUTC values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe B8602DZ format writes SAS datetime values for the zero meridian date and time using one \nof the following ISO 8601 basic datetime notations:\n\n yyyymmddThhmmss+|-hhmm \n is the form used whenw is large enough to support this time zone notation. \n yyyymmddThhmmssZ \n is the form used when w is not large enough to support the +|-hhmm time zone notation. \n \n where \n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 - 23 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n Z indicates that the time is for zero meridian (Greenwich, England) or UTC time \n +|-hhmm is an hour and minute signed offset from zero meridian time. Note that the offset \n must be +|-hhmm (that is, + or - and four characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero \n meridian. For example, +0200 indicates a two-hour time difference to the east of the zero \n meridian, and -0600 indicates a six-hour time differences to the west of the zero meridian.\n\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"B8601LZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes time values as local time by appending a time zone offset difference between \nthe local time and UTC, using the ISO 8601 basic time notation hhmmss+|-hhmm. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 14 \n Range: 9 - 20 \n \nDetails: \nThe B8602LZ format writes time values without making any adjustments and appends the UTC time \nzone offset for the local SAS session, using the following ISO 8601 basic notation: \n\n hhmmss+|-hhmm \n\nwhere:\n hh is a two-digit hour (zero padded), between 00 - 23 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n +|-hhmm is an hour and minute signed offset from zero meridian time. Note that the offset \n must be +|-hhmm (that is, + or - and five characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero meridian. \n For example, +0200 indicates a two hour time difference to the east of the zero meridian, and -0600 \n indicates a six hour time differences to the west of the zero meridian.\n Restriction: The shorter form +|-hh is not supported. \n\nWhen SAS reads a UTC time by using the B8601TZ informat, and the adjusted time is greater than 24 hours \nor less than 00 hours, SAS adjusts the value so that the time is between 000000 and 235959. If the B8601LZ \nformat attempts to format a time outside of this time range, the time is formatted with stars to indicate \nthat the value is out of range."}},{"Name":"B8601TMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes time values using the ISO 8601 basic notation hhmmssffff. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 8 - 15 \nd \n specifies the number of digits to the right of the seconds value that represent a \n fraction of a second. This argument is optional.\n\n Default: 0 \n Range: 0 - 6 \n \nDetails:\nThe B8601TM format writes SAS time values using the following ISO 8601 basic time notation hhmmssffffff: \n\n hh is a two-digit hour (zero padded), between 00 - 23. \n mm is a two-digit minute (zero padded), between 00 - 59. \n ss is a two-digit second (zero padded), between 00 - 59.\n \nffffff are optional fractional seconds, with a precision of up to six digits, where each digit \nis between 0 - 9."}},{"Name":"B8601TZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts time values to the Coordinated Universal Time (UTC) and writes them using \nthe ISO 8601 basic time notation hhmmss+|-hhmm. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 14 \n Range: 9-20 \n \nDetails:\nUTC time values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe B8602TZ format adjusts the time value to be the time at the zero meridian and writes it in \none of the following ISO 8601 basic time notations:\n\n hhmmss+|-hhmm is the form used when w is large enough to support this time notation. \n hhmmssZ is the form used when w is not large enough to support the +|-hhmm time zone notation. \n \n where \n hh is a two-digit hour (zero padded), between 00 and 23. \n mm is a two-digit minute (zero padded), between 00 and 59. \n ss is a two-digit second (zero padded), between 00 and 59. \n Z indicates that the time is for zero meridian (Greenwich, England) or UTC time. \n +|-hh:mm is an hour and minute signed offset from zero meridian time. Note that the offset must \n be +|-hhmm (that is, + or - and four characters). \n Use + for time zones east of the zero meridian and use - for time zones west of the zero \n meridian. For example, +0200 indicates a two hour time difference to the east of the zero \n meridian, and -0600 indicates a six hour time differences to the west of the zero meridian.\n Restriction: The shorter form +|-hh is not supported. \n\nWhen SAS reads a UTC time by using the B8601TZ informat, and the adjusted time is greater than \n24 hours or less than 00 hours, SAS adjusts the value so that the time is between 000000 and \n240000. If the B8601TZ format attempts to format a time outside of this time range, the time \nis formatted with stars to indicate that the value is out of range."}},{"Name":"BESTDw.p","Type":"SAS_FORMATS","Help":{"#cdata":"Prints numeric values, lining up decimal places for values of similar magnitude, \nand prints integers without decimals. \n\nSyntax Description:\nw \n specifies the width of the output field.\n Default: 12 \n Range: 1-32 \np \n specifies the precision.\n Default: 3 \n Range: 0 to w-1 \n Requirement: must be less than w \n Tip: If p is omitted or is specified as 0, then p is set to 3. \n\nDetails:\nThe BESTDw.p format writes numbers so that the decimal point aligns in groups of values \nwith similar magnitude. Integers are printed without a decimal point. Larger values of \np print the data values with more precision and potentially more shifts in the decimal \npoint alignment. Smaller values of p print the data values with less precision and a \ngreater chance of decimal point alignment. \n\nThe format chooses the number of decimal places to print for ranges of values, even when \nthe underlying values can be represented with fewer decimal places."}},{"Name":"E8601DAw.|IS8601DA.w","Type":"SAS_FORMATS","Help":{"#cdata":"Writes date values using the ISO 8601 extended notation yyyy-mm-dd. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 10 \n Requirement: The width of the output field must be 10. \n \nDetails:\nThe E8601DA format writes a date in the ISO 8601 extended notation yyyy-mm-dd:\n\n yyyy is a four-digit year, such as 2008. \n mm is a two-digit month (zero padded) between 01 and 12. \n dd is a two-digit day of the month (zero padded) between 01 and 31."}},{"Name":"E8601DNw.|IS8601DNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the date from a SAS datetime value using the ISO 8601 extended notation \nyyyy-mm-dd. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 10 \n Requirement: The width of the input field must be 10. \n \nDetails: \nThe E8601DN formats writes the date in the ISO 8601 extended date notation yyyy-mm-dd:\n\n yyyy is a four-digit year, such as 2008. \n mm is a two-digit month (zero padded) between 01 and 12. \n dd is a two-digit day of the month (zero padded) between 01 and 31."}},{"Name":"E8601DTw.d|IS8601DTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values in the ISO 8601 extended notation yyyy-mm-ddThh:mm:ss.ffffff. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 19 \n Range: 19 - 26 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional. \n Default: 0 \n Range: 0 - 6 \n \nDetails:\nThe E8602DT format writes datetime values using the ISO 8601 extended datetime notation yyyy-mm-ddThh:mm:ss.ffffff:\n\n yyyy is a four-digit year, such as 2008. \n mm is a two-digit month (zero padded) between 01 and 12. \n dd is a two-digit day of the month (zero padded) between 01 and 31. \n hh is a two-digit hour (zero padded), between 00 - 23. \n mm is a two-digit minute (zero padded), between 00 - 59. \n ss is a two-digit second (zero padded), between 00 - 59. \n .ffffff are optional fractional seconds, with a precision of up to six digits, where each digit \n is between 0 - 9."}},{"Name":"E8601DZw.|IS8601DZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values in the Coordinated Universal Time (UTC) time scale using the \nSO 8601 datetime and time zone extended notation yyyy-mm-ddThh:mm:ss+|-hh:mm. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 26 \n Range: 20 - 35 \n \nDetails:\nUTC values specify a time and a time zone based on the zero meridian in Greenwich, England. The E8602DZ \nformat writes SAS datetime values using one of the following ISO 8601 extended datetime notations:\n\nyyyy-mm-ddThh:mm:ss+|-hh:mm is the form used when w is large enough to support this time zone notation. \nyyyy-mm-ddThh:mm:ssZ is the form used when w is not large enough to support the +|- hhmm time zone notation. \n \nwhere \n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 - 24 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n Z indicates that the time is for zero meridian (Greenwich, England) or UTC time. \n +|-hh:mm is an hour and minute signed offset from zero meridian time. Note that the offset must \n be +|-hh:mm (that is, + or - and five characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero meridian. \n For example, +02:00 indicates a two hour time difference to the east of the zero meridian, and \n -06:00 indicates a six hour time differences to the west of the zero meridian.\n\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"E8601LZw.|IS8601LZw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes time values as local time, appending the Coordinated Universal Time (UTC) \noffset for the local SAS session, using the ISO 8601 extended time notation \nhh:mm:ss+|-hh:mm. \n\nSyntax Description: \nw \n specifies the width of the output field.\n Default: 14 \n Range: 9 - 20 \n \nDetails: \nThe E8602LZ format writes time values without making any adjustments and appends the UTC time \nzone offset for the local SAS session, using one of the following ISO 8601 extended time notations:\n\n hh:mm:ss+|-hh:mm is the form used when w is large enough to support this time notation. \n hh:mm:ssZ is the form used when w is not large enough to support the +|- hh:mm time zone notation. \n where:\n hh is a two-digit hour (zero padded), between 00 - 23. \n mm is a two-digit minute (zero padded), between 00 - 59. \n ss is a two-digit second (zero padded), between 00 - 59. \n Z indicate zero meridian (Greenwich, England) or UTC time. \n +|-hh:mm is an hour and minute signed offset from zero meridian time. Note that the offset must \n be +|-hh:mm (that is, + or - and five characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero meridian. \n For example, +02:00 indicates a two hour time difference to the east of the zero meridian, and \n -06:00 indicates a six hour time differences to the west of the zero meridian.\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"E8601TMw.d|IS8601TMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes time values using the ISO 8601 extended notation hh:mm:ss.ffffff. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 8 \n Range: 8 - 15 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. This \n argument is optional. \n Default: 0 \n Range: 0 - 6 \n \nDetails:\nThe E8601TM format writes SAS time values using the following ISO 8601 extended time notation: \n\n hh:mm:ss.ffffff \n hh is a two-digit hour (zero padded), between 00 - 23. \n mm is a two-digit minute (zero padded), between 00 - 59. \n ss is a two-digit second (zero padded), between 00 - 59. \n .ffffff are optional fractional seconds, with a precision of up to six digits, where each \n digit is between 0 - 9."}},{"Name":"E8601TZw.d|IS8601TZw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts time values to the Coordinated Universal Time (UTC) and writes the values \nusing the ISO 8601 extended notation hh:mm:ss+|-hh:mm. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 14 \n Range: 9 - 20 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. This \n argument is optional. \n Default: 0 \n Range: 0 - 6 \n \nDetails:\nUTC time values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe E8602TZ format writes time values in one of the following ISO 8601 extended time notations:\n\n hh:mm:ss+|-hh:mm is the form used when w is large enough to support this time zone notation. \n hh:mm:ssZ is the form used when w is not large enough to support the +|- hh:mm time zone notation. \n\nwhere\n hh is a two-digit hour (zero padded), between 00 - 23 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n Z indicate zero meridian (Greenwich, England) or UTC time \n +|-hh:mm is an hour and minute signed offset from zero meridian time. Note that the offset must be \n +|-hh:mm (that is, + or - and five characters). The shorter form +|-hh is not supported.\n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero meridian. \n For example, +02:00 indicates a two hour time difference to the east of the zero meridian, and \n -06:00 indicates a six hour time differences to the west of the zero meridian. \n\nWhen SAS reads a UTC time by using the B8601TZ informat, and the adjusted time is greater than 24 hours \nor less than 00 hours, SAS adjusts the value so that the time is between 00:00:00 and 24:00:00. If the \nE8601TZ format attempts to format a time outside of this time range, the time is formatted with stars \nto indicate that the value is out of range."}},{"Name":"VMSZNw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Generates VMS and MicroFocus COBOL zoned numeric data. \n \nSyntax: VMSZNw.d \n\nw \n specifies the width of the output field\n Default: 1 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n This argument is optional.\n \nDetails:\nThe VMSZNw.d format is similar to the ZDw.d format. Both generate a string of ASCII digits, and the \nlast digit is a special character that denotes the magnitude of the last digit and the sign of the \nentire number. The difference between these formats is in the special character that is used for the \nlast digit. The following table shows the special characters that are used by the VMSZNw.d format. \n\nDesired Special Desired Special\nDigit Character Digit Character \n0 0 -0 p \n1 1 -1 q \n2 2 -2 r \n3 3 -3 s \n4 4 -4 t \n5 5 -5 u \n6 6 -6 v \n7 7 -7 w \n8 8 -8 x \n9 9 -9 y \n\nData formatted using the VMSZNw.d format are ASCII strings.\n\nIf the value to be formatted is too large to fit in a field of the specified width, then the VMSZNw.d \nformat does the following: \n\n o For positive values, it sets the output to the largest positive number that fits in the given width.\n o For negative values, it sets the output to the negative number of greatest magnitude that fits in \n the given width."}},{"Name":"NLDATEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS date value to the date value of the specified locale, and then writes \nthe date value as a date. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the date to fit the \n format width. \n Default: 20 \n Range: 10-200 \n \nComparisons:\nNLDATEw. is similar to DATEw. and WORDDATEw. except that NLDATEw. is locale-specific."}},{"Name":"NLDATEMDw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe value as the name of the month and the day of the month."}},{"Name":"NLDATEMNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS date value to the date value of the specified locale, and then writes \nthe value as the name of the month. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 6-200"}},{"Name":"NLDATEWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS date value to the date value of the specified locale, and then writes \nthe value as the date and the day of the week. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the date and \n the day of the week to fit the format width.\n\n Default: 20 \n Range: 10-200 \n \nComparisons:\nNLDATEWw. is similar to WEEKDATEw. except that NLDATEWw. is locale specific."}},{"Name":"NLDATEWNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe date value as the day of the week. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the day of the week \n to fit the format width.\n\n Default: 10 \n Range: 4-200 \n\nComparisons: \nNLDATEWNw. is similar to DOWNAMEw. except that NLDATEWNw. is locale-specific."}},{"Name":"NLDATEYMw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe date value as the year and the name of the month. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 6-200"}},{"Name":"NLDATEYQw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe date value as the year and the quarter. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 4-200"}},{"Name":"NLDATEYRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe date value as the year. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 2-200"}},{"Name":"NLDATEYWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS date value to the date value of the specified locale, and then writes \nthe date value as the year and the week. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 5-200"}},{"Name":"NLDATMw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS datetime value to the datetime value of the specified locale, and then \nwrites the value as a datetime. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the datetime value to fit \n the format width.\n\n Default: 30 \n Range: 10-200 \n\nComparisons: \nThe NLDATMw. format is similar to the DATETIMEw. format except that the NLDATMw. format is locale-specific."}},{"Name":"NLDATMAPw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS datetime value to the datetime value of the specified locale, and \nthen writes the value as a datetime with a.m. or p.m. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the date-time value\n to fit the format width.\n\n Default: 32 \n Range: 16-200 \n\nComparisons:\nThe NLDATMAPw. format is similar to DATEAMPMw. except that the NLDATMAPw. format is locale-specific."}},{"Name":"NLDATMDTw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the name of the month, day of the month and year. \n\nSyntax Description:\n\nw \n specifies the width of the output field\n\n Default: 20 \n Range: 10-200"}},{"Name":"NLDATMMDw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the name of the month and the day of the month. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 6-200"}},{"Name":"NLDATMMNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the name of the month. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 10 \n Range: 4-200"}},{"Name":"NLDATMTMw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the time portion of a SAS datetime value to the time-of-day value of \nthe specified locale, and then writes the value as a time of day. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 16-200 \n \nComparisons:\nThe NLDATMTMw. format is similar to the TODw. format except that the NLDATMTMw. format \nis locale-specific."}},{"Name":"NLDATMWNw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the day of the week. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 30 \n Range: 16-200"}},{"Name":"NLDATMWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts SAS datetime values to the locale sensitive datetime string as the \nday of the week and the datetime. \n\nSyntax Description: \nw \n specifies the width of the output field. If necessary, SAS abbreviates the day of week \n and datetime to fit the format width.\n\n Default: 30 \n Range: 16-200 \n \nComparisons: \nThe NLDATMWw. format is similar to the TWMDYw. format except that the NLDATMWw. format \nis locale-specific."}},{"Name":"NLDATMYMw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the year and the name of the month. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 6-200"}},{"Name":"NLDATMYQw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the year and the quarter of the year. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 4-200"}},{"Name":"NLDATMYRw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the year. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 2-200"}},{"Name":"NLDATMYWw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts the SAS datetime value to the datetime value of the specified locale, \nand then writes the value as the year and the name of the week. \n\nSyntax Description: \n\nw \n specifies the width of the output field.\n\n Default: 16 \n Range: 5-200"}},{"Name":"NLTIMEw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS time value to the time value of the specified locale, and then \nwrites the value as a time value. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 20 \n Range: 10-200 \n\nComparisons: \nThe NLTIMEw. format is similar to the TIMEw. format except that the NLTIMEw. format \nis locale-specific."}},{"Name":"NLTIMAPw.","Type":"SAS_FORMATS","Help":{"#cdata":"Converts a SAS time value to the time value of a specified locale, and then \nwrites the value as a time value with a.m. or p.m. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 10 \n Range: 4-200 \n \nComparisons:\nThe NLTIMAPw. format is similar to the TIMEAMPMw. format except that the NLTIMAPw. format \nis locale-specific."}},{"Name":"NLBESTw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the best numerical notation based on the locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 12 \n Tip: If you print numbers between 0 and .01 exclusively, then use a field width \n of at least 7 to avoid excessive rounding. If you print numbers between 0 and -.01 \n exclusively, then use a field width of at least 8. \n Range: 1-32 \n \nDetails: \nThe NLBEST format writes the best numerical value based on the locale's decimal point \nand the sign mark's location. NLBEST is similar to the BEST format."}},{"Name":"NLMNYw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the monetary format of the local expression in the specified locale \nusing local currency. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 9 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLMNYw.d format reads integer binary (fixed-point) values, including negative values \nthat are represented in two's-complement notation. The NLMNYw.d format writes numeric values \nby using the currency symbol, the thousands separator, and the decimal separator that is used \nby the locale.\n\nNote: The NLMNYw.d format does not convert currency format, therefore, the value of the \nformatted number should equal the currency of the current locale value. \n \nComparisons:\nThe NLMNYw.d and NLMNYIw.d formats write the monetary format with locale-dependent thousands \nand decimal separators. However, the NLMNYIw.d format uses three-letter international currency \ncodes, such as USD, while NLMNYw.d format uses local currency symbols, such as $.\n\nThe NLMNYw.d format is similar to the DOLLARw.d format except that the NLMNYw.d format \nis locale-specific."}},{"Name":"NLMNYIw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the monetary format of the international expression in the \nspecified locale. \n\nSyntax Description: \nw \n specifies the width of the output field. \n Default: 9 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLMNYIw.d format reads integer binary (fixed-point) values, including negative values \nthat are represented in two's-complement notation. The NLMNYIw.d format writes numeric values \nby using the international currency code, and locale-dependent thousands and decimal separators. \nThe position of international currency code is also locale dependent. \n\nNote: The NLMNYIw.d format does not convert currency format, therefore, the value of the \nformatted number should equal the currency of the current locale value. \n \nComparisons: \nThe NLMNYw.d and NLMNYIw.d formats write the monetary format with locale-dependent thousands \nand decimal separators. However, the NLMNYIw.d format uses three-letter international currency \ncodes, such as USD, while NLMNYw.d format uses local currency symbols, such as $."}},{"Name":"NLNUMw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the numeric format of the local expression in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 1-32 \nd \n specifies to divide the number by 10^d. If the data contains decimal separators, the \n d value is ignored.\n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLMUMw.d format reads integer binary (fixed-point) values, including negative values that \nare represented in two's-complement notation. The NLNUMw.d format writes numeric values by using \nthe thousands separator and the decimal separator that is used by the locale. \n \nComparisons:\nThe NLNUMw.d format writes the numeric value with locale-dependent thousand and decimal separators. \nThe NLNUMIw.d format writes the numeric value with a comma (,) as thousand separator and a period (.) \nas a decimal separator\n\nIf the w or d values are not large enough to generate a formatted number, the NLNUMw.d format uses \nan algorithm that prints the thousands-separator characters whenever possible, even if some decimal \nprecision is lost."}},{"Name":"NLNUMIw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes the numeric format of the international expression in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 1-32 \nd \n specifies to divide the number by 10^d. If the data contains decimal separators, the \n d value is ignored.\n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLMUMIw.d format reads integer binary (fixed-point) values, including negative values \nthat are represented in two's-complement notation. The NLNUMIw.d format writes numeric values \nby using a comma (,) as thousands separator and a period (.) as a decimal separator for all locales.\n \nComparisons:\nThe NLNUMIw.d format writes the numeric data of the international expression in the specified \nlocale. The NLNUMIw.d format writes the numeric value with a comma (,) as thousand separator \nand a period (.) as a decimal separator.\n\nIf the w or d values are not large enough to generate a formatted number, the NLNUMw.d format \nuses an algorithm that prints the thousands-separator characters whenever possible, even if \nsome decimal precision is lost."}},{"Name":"NLPCTw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes percentage data of the local expression in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 4-32 \nd \n specifies to divide the number by 10^d. If the data contains decimal separators, the \n d value is ignored.\n Default: 0 \n Range: 0-31 \n \nComparisons:\nThe NLPCTw.d format writes percentage data of the local expression in the specified locale. \nThe NLPCTw.d format writes the percentage value with locale-dependent thousand and decimal \nseparators. The NLPCTIw.d format writes the percentage value with a comma (,) as thousand \nseparator and a period (.) as a decimal separator.\n\nThe NLPCTw.d format is similar to the PERCENTw.d format except the NLPCTw.d format \nis locale-specific."}},{"Name":"NLPCTIw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes percentage data of the international expression in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 4-32 \nd \n specifies to divide the number by 10^d. If the data contains decimal separators, the \n d value is ignored.\n Default: 0 \n Range: 0-31 \n \nComparisons:\nThe NLPCTIw.d format writes percentage data of the international expression in the specified \nlocale. The NLPCTw.d format writes the percentage value with locale-dependent thousand and \ndecimal separators. The NLPCTIw.d format writes the percentage value with a comma (,) as \nthousand separator and a period (.) as a decimal separator.\n\nThe NLPCTw.d format is similar to the PERCENTw.d format except the NLPCTw.d format \nis locale-specific."}},{"Name":"NLPCTNw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Produces percentages, using a minus sign for negative values.\n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 4-32 \n Tip: The width of the output field must account for the minus sign ( - ), the percent \n sign ( % ), and a trailing blank, whether the number is negative or positive. \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n This argument is optional.\n Range: 0-31 \n Requirement: must be less than w\n \nDetails:\nThe NLPCTNw.d format multiplies negative values by 100, adds a minus sign to the beginning \nof the value, and adds a percent sign (%) to the end of the formatted value."}},{"Name":"NLPCTPw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes locale-specific numeric values as percentages. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default 6 \n Range 4-32 \n Tip: The width of the output field must account for the percent sign (% ). \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n This argument is optional. The thousand separator and decimal symbol for the NLPCTP \n format is locale-specific.\n\n Range: 0-31 \n Requirement: must be less than w \n \nDetails:\nThe NLPCTPw.d format multiplies values by 100, formats them, and adds a percent sign (%) \nto the end of the formatted value. The NLPCTPw.d format is similar to the The PERCENTw.d \nformat except that the thousand separator and decimal symbol for the NLPCTPw.d format is \nlocale-specific."}},{"Name":"NLPVALUEw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes p-values of the local expression in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 6 \n Range: 3-32 \nd \n specifies to divide the number by 10^d. If the data contains decimal separators, the \n d value is ignored.\n Default: 4 \n Range: 1-30"}},{"Name":"NLSTRMONw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a numeric value as a day-of-the-month in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field \n Default: 20 \n Range: 200-1 \nd \n specifies the following: \n 00000001: write abbreviated form. \n 00000010: write capitalized form. \n Default: 0 \n Range: 0-3 \n \nDetails: \nThe NLSTRMONw.d format writes a SAS value, 1-12 as the name-of-the-month in the specified locale. \nThe following examples use the English_UnitedStates locale. \n\n 1 = the first month (January) \n 2 = the second month (February) \n 3 = the third month (March) \n 4 = the fourth month (April) \n 5 = the fifth month (May) \n 6 = the sixth month (June) \n 7 = the seventh month (July) \n 8 = the eight month (August) \n 9 = the ninth month (September) \n 10 = the tenth month (October) \n 11 = the eleventh month (November) \n 12 = the twelfth month (December)"}},{"Name":"NLSTRQTRw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a numeric value as the quarter-of-the-year in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field \n Default: 20 \n Range: 1-200\nd \n specifies the following: \n 00000001: write abbreviated form. \n 00000010: write capitalized form. \n Default: 0 \n Range: 0-3 \n \nDetails:\nThe NLSTRQTRw.d format writes a SAS value, 1-4 as the name-of-the-quarter for the year \nin the specified locale. The following examples use the English_UnitedStates locale. \n\n 1 = 1st quarter \n 2 = 2nd quarter \n 3 = 3rd quarter \n 4 = 4th quarter"}},{"Name":"NLSTRWKw.d","Type":"SAS_FORMATS","Help":{"#cdata":"Writes a numeric value as the day-of-the-week in the specified locale. \n \nSyntax Description: \nw \n specifies the width of the output field \n Default: 20 \n Range: 1-200\nd \n specifies the following: \n 00000001: write abbreviated form. \n 00000010: write capitalized form. \n Default: 0 \n Range: 0-3 \n \nDetails:\nThe NLSTRQTRw.d format writes a SAS value, 1-7 as the name-of-the-week in the specified locale. \nThe following examples use the English_UnitedStates locale. \n\n 1 = First day-of-week (Monday) \n 2 = Second day-of-week (Tuesday) \n 3 = Third day-of-week (Wednesday) \n 4 = Fourth day-of-week (Thursday) \n 5 = Fifth day-of-week (Friday) \n 6 = Sixth day-of-week (Saturday) \n 7 = Seventh day-of-week (Sunday)"}},{"Name":"B8601DXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) datetime value to the user local date and time. \nThen, writes the local date and time by using the ISO 8601 datetime and time zone basic \nnotation yyyymmddThhmmss+hhmm.\n \nSyntax Description:\n \nw\nspecifies the width of the output field.\n\nDefault: 26\nRange: 20\u201335\n\nDetails:\nUTC values specify a date and a time that are based on the zero meridian in Greenwich, England. \nUsing this format, SAS converts a datetime value to the UTC value and determines the user local \ndate and time by using the value of the TIMEZONE= system option. If the TIMEZONE= option is not \nset, then the user local date and time are based on the local date and time. The B8601DX format \nwrites SAS datetime values by using the following ISO 8601 basic datetime notation:\n\n\u2022yyyymmddThhmmss+hhmm\n\nyyyy\nis a four-digit year.\nmm\nis a two-digit month (zero padded) between 01 and 12.\ndd\nis a two-digit day of the month (zero padded) between 01 and 31.\nhh\nis a two-digit hour (zero padded) between 00 and 23.\nmm\nis a two-digit minute (zero padded) between 00 and 59.\nss\nis a two-digit second (zero padded) between 00 and 59.\n+|\u2013hhmm\nis an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hhmm \n(that is, + or \u2013 and four characters).\nUse + for time zones east of the zero meridian, and use \u2013 for time zones west of the zero \nmeridian. For example, +0200 indicates a two-hour time difference to the east of the zero \nmeridian, and \u20130600 indicates a six-hour time difference to the west of the zero meridian. \n\nRestriction: The shorter form +|\u2013hh is not supported."}},{"Name":"B8601LXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values as local time by appending a time zone offset difference between the \nlocal time and UTC, using the ISO 8601 basic notation yyyymmddThhmmss+|\u2013hhmm.\n \nSyntax Description:\nw specifies the width of the output field.\nDefault: 26\nRange: 20\u201335\nDetails:\nThe B8601LX format writes datetime values without making any adjustments, and appends the UTC time \nzone offset for the local SAS session by using the ISO 8601 basic datetime notation:\n\n\u2022yyyymmddThhmmss+|\u2013hhmm\n\nyyyy is a four-digit year.\nmm is a two-digit month (zero padded) between 01 and 12.\ndd is a two-digit day of the month (zero padded) between 01 and 31.\nhh is a two-digit hour (zero padded) between 00 and 23. \nmm is a two-digit minute (zero padded) between 00 and 59. \nss is a two-digit second (zero padded) between 00 and 59.\n+|\u2013hhmm\nis an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hhmm \n(that is, + or \u2013 and four characters).\n\nUse + for time zones east of the zero meridian, and use \u2013 for time zones west of the zero meridian. \nFor example, +0200 indicates a two-hour time difference to the east of the zero meridian, and \u20130600 \nindicates a six-hour time difference to the west of the zero meridian. \n\nRestriction: The shorter form +|\u2013hh is not supported."}},{"Name":"B8601TXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) value to the user local time. Then, writes the local \ntime by using the ISO 8601 basic time notation hhmmss+|-hhmm. \n \nSyntax Description:\nw specifies the width of the output field.\nDefault: 14\nRange: 9\u201320\nDetails:\nUTC values specify a time based on the zero meridian in Greenwich, England. Using this format, \nSAS converts a time value to the UTC value and determines the user local time by using the TIMEZONE= \nsystem option. If the TIMEZONE= option is not set, then the user local time is based on the local \ntime. The B8601TX format writes SAS datetime values by using the following ISO 8601 basic time notation:\n\n\u2022hhmmss+|\u2013hhmm\n\nhh is a two-digit hour (zero padded) between 00 and 23. \nmm is a two-digit minute (zero padded) between 00 and 59.\nss is a two-digit second (zero padded) between 00 and 59.\n+|\u2013hh:mm\nis an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hhmm (that is, \n+ or \u2013 and four characters).\n\nUse + for time zones east of the zero meridian, and use \u2013 for time zones west of the zero meridian. \nFor example, +0200 indicates a two-hour time difference to the east of the zero meridian, and \u20130600 \nindicates a six-hour time difference to the west of the zero meridian. \n\nRestriction: The shorter form +|\u2013hh is not supported."}},{"Name":"E8601DXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) datetime value to the user local date and time. Then, writes \nthe local date and time by using the ISO 8601 datetime and time zone basic notation yyyy-mm-ddThh:mm:ss+hh:mm. \n\nSyntax Description:\nw specifies the width of the output field.\nDefault: 26\nRange: 20\u201335\nDetails:\nUTC values specify a date and time that are based on the zero meridian in Greenwich, England. \nUsing this format, SAS converts a datetime value to the UTC value and determines the user local \ndate and time by using the value of the TIMEZONE= system option. If the TIMEZONE= option is not \nset, the user local date and time are based on the local date and time. The E8601DX format writes \nSAS datetime values by using the following ISO 8601 basic datetime notation:\n\n\u2022yyyy-mm-ddThh:mm:ss+hh:mm \n\nyyyy is a four-digit year. \nmm is a two-digit month (zero padded) between 01 and 12. \ndd is a two-digit day of the month (zero padded) between 01 and 31. \nhh\nis a two-digit hour (zero padded) between 00 and 23.mm\nis a two-digit minute (zero padded) between 00 and 59.ss\nis a two-digit second (zero padded) between 00 and 59.\n+|\u2013hh:mm is an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hh:mm \n(that is, + or \u2013 and four characters). Use + for time zones east of the zero meridian, and use \u2013 for \ntime zones west of the zero meridian. For example, +02:00 indicates a two-hour time difference to \nthe east of the zero meridian, and \u201306:00 indicates a six-hour time difference to the west of the \nzero meridian. \n\nRestriction: The shorter form +|\u2013hh is not supported."}},{"Name":"E8601LXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Writes datetime values as local time by appending a time zone offset difference between the local \ntime and UTC, using the ISO 8601 basic notation yyyy-mm-ddThh:mm:ss+|\u2013hh:mm. \n\nSyntax Description:\nw specifies the width of the output field.\nDefault: 26\nRange: 20\u201335\nDetails:\nThe E8601LX format writes datetime values without making any adjustments, and appends the UTC time \nzone offset for the local SAS session by using the ISO 8601 basic datetime notation:\n\n\u2022yyyy-mm-ddThh:mm:ss+hh:mm\n\nyyyy is a four-digit year. \nmm is a two-digit month (zero padded) between 01 and 12. \ndd is a two-digit day of the month (zero padded) between 01 and 31. \nhh is a two-digit hour (zero padded) between 00 and 23. \nmm is a two-digit minute (zero padded) between 00 and 59. \nss is a two-digit second (zero padded) between 00 and 59.\n+|\u2013hh:mm is an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hh:mm \n(that is, + or \u2013 and four characters).\nUse + for time zones east of the zero meridian, and use \u2013 for time zones west of the zero meridian. \nFor example, +02:00 indicates a two-hour time difference to the east of the zero meridian, and \u201306:00 \nindicates a six-hour time difference to the west of the zero meridian. \n\nRestriction: The shorter form +|\u2013hh is not supported."}},{"Name":"E8601TXw.","Type":"SAS_FORMATS","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) value to the user local time. Then, writes the local time \nby using the ISO 8601 basic time notation hhmmss+|\u2013hhmm. \n\nSyntax Description:\nw specifies the width of the output field.\nDefault: 14\nRange: 9\u201320 \n\nDetails:\nUTC values specify a time based on the zero meridian in Greenwich, England. Using this format, SAS \nconverts a time value to the UTC value and determines the user local time by using the value of the \nTIMEZONE= system option. If the TIMEZONE= option is not set, the user local time is based on the \nlocal time. The E8601TX format writes SAS datetime values by using the following ISO 8601 basic \ntime notation: \u2022hhmmss+|\u2013hhmm \n\nhh is a two-digit hour (zero padded) between 00 and 23. \nmm is a two-digit minute (zero padded) between 00 and 59. \nss is a two-digit second (zero padded) between 00 and 59.\n+|\u2013hh:mm is an hour and minute signed offset from zero meridian time. The offset must be +|\u2013hhmm \n(that is, + or \u2013 and four characters). Use + for time zones east of the zero meridian, and use \u2013 for \ntime zones west of the zero meridian. For example, +0200 indicates a two-hour time difference to the \neast of the zero meridian, and \u20130600 indicates a six-hour time difference to the west of the zero meridian. \n\nRestriction: The shorter form +|-hh is not supported."}}],"#comment":[{},{}]}} ================================================ FILE: server/data/SASFunctions.json ================================================ {"Keywords":{"Keyword":[{"Name":"ARMCONV","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts a SAS System 9 or later ARM log written in simple format to the more readable \nlabel=item format that was used in SAS 8.2."}},{"Name":"ARMEND","Type":"SAS_FUNCTION","Help":{"#cdata":"Indicates the termination of an application."}},{"Name":"ARMGTID","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns a unique identifier to a transaction class."}},{"Name":"ARMINIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Starts the initialization of an application."}},{"Name":"ARMJOIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Reads the six SAS data sets created by the %ARMPROC macro, and creates SAS data sets \nand SQL views that contain common information about applications and transactions."}},{"Name":"ARMPROC","Type":"SAS_FUNCTION","Help":{"#cdata":"Processes an input ARM log, and outputs six SAS data sets that contain the gathered \ninformation from the log."}},{"Name":"ARMSTOP","Type":"SAS_FUNCTION","Help":{"#cdata":"Specifies the end of a transaction instance."}},{"Name":"ARMSTRT","Type":"SAS_FUNCTION","Help":{"#cdata":"Specifies the start of execution of a transaction instance, and returns a unique \nhandle that is passed to %ARMUPDT and %ARMSTOP."}},{"Name":"ARMUPDT","Type":"SAS_FUNCTION","Help":{"#cdata":"Updates a transaction instance that has been previously started."}},{"Name":"ABS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the absolute value."}},{"Name":"ADDR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the memory address of a variable on a 32-bit platform. The value that is \nreturned is numeric. \n\nSyntax: ADDR(variable)\n\nRequired Argument:\nvariable\n specifies a variable name.\n\nInteraction:\nWhen a SAS server is in a locked-down state, the ADDR function does not execute. \n\n"}},{"Name":"ADDRLONG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the memory address of a variable on 32-bit and 64-bit platforms. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the ADDRLONG function does not execute. \n\nSyntax: ADDRLONG(variable)\nRequired Argument:\nvariable\n specifies a variable.\n \nDetails:\nThe return value is a character string that contains the binary representation of the address. \nTo display this value, use the $HEXw. format to convert the binary value to its hexadecimal equivalent. \nIf you store the result in a variable, that variable should be a character variable with a length of \nat least eight characters for portability. If you assign the result to a variable that does not yet \nhave a length defined, that variable is assigned a length of 20 characters."}},{"Name":"AIRY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the Airy function."}},{"Name":"ALLPERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all permutations of the values of several variables in a minimal change order."}},{"Name":"ANYALNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for an alphanumeric character, and returns the first \nposition at which the character is found."}},{"Name":"ANYALPHA","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for an alphabetic character, and returns the first \nposition at which the character is found."}},{"Name":"ANYCNTRL","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a control character, and returns the first position \nat which that character is found."}},{"Name":"ANYDIGIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a digit, and returns the first position at which \nthe digit is found."}},{"Name":"ANYFIRST","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is valid as the first character \nin a SAS variable name under VALIDVARNAME=V7, and returns the first position \nat which that character is found."}},{"Name":"ANYGRAPH","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a graphical character, and returns the first position \nat which that character is found."}},{"Name":"ANYLOWER","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a lowercase letter, and returns the first position at \nwhich the letter is found."}},{"Name":"ANYNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is valid in a SAS variable name \nunder VALIDVARNAME=V7, and returns the first position at which that character \nis found."}},{"Name":"ANYPRINT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a printable character, and returns the first position \nat which that character is found."}},{"Name":"ANYPUNCT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a punctuation character, and returns the first position \nat which that character is found."}},{"Name":"ANYSPACE","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a white-space character (blank, horizontal and vertical \ntab, carriage return, line feed, and form feed), and returns the first position at \nwhich that character is found."}},{"Name":"ANYUPPER","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for an uppercase letter, and returns the first position \nat which the letter is found."}},{"Name":"ANYXDIGIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a hexadecimal character that represents a digit, \nand returns the first position at which that character is found."}},{"Name":"ARCOS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arccosine."}},{"Name":"ARCOSH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the inverse hyperbolic cosine."}},{"Name":"ARSIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arcsine."}},{"Name":"ARSINH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the inverse hyperbolic sine."}},{"Name":"ARTANH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the inverse hyperbolic tangent."}},{"Name":"ATAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arc tangent."}},{"Name":"ATAN2","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arc tangent of the ratio of two numeric variables."}},{"Name":"ATTRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a character attribute for a SAS data set."}},{"Name":"ATTRN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a numeric attribute for a SAS data set."}},{"Name":"BAND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical AND of two arguments. If either argument contains a \nmissing value, then the function returns a missing value and sets _ERROR_ equal \nto 1."}},{"Name":"BETA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the beta function."}},{"Name":"BETAINV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the beta distribution with shape parameters a and b."}},{"Name":"BLACKCLPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates call prices for European options on futures, based on the Black model."}},{"Name":"BLACKPTPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates put prices for European options on futures, based on the Black model."}},{"Name":"BLKSHCLPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates call prices for European options on stocks, based on the Black-Scholes model."}},{"Name":"BLSHIFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical left shift of two arguments. If either argument contains \na missing value, then the function returns a missing value and sets _ERROR_ equal \nto 1."}},{"Name":"BNOT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical NOT of an argument."}},{"Name":"BOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical OR of two arguments. If either argument contains a \nmissing value, then the function returns a missing value and sets _ERROR_ equal \nto 1."}},{"Name":"BRSHIFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical right shift of two arguments. If either argument contains \na missing value, then the function returns a missing value and sets _ERROR_ equal to 1."}},{"Name":"BXOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the bitwise logical EXCLUSIVE OR of two arguments. If either argument contains \na missing value, then the function returns a missing value and sets _ERROR_ equal to 1."}},{"Name":"BYTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns one character in the ASCII or the EBCDIC collating sequence."}},{"Name":"ALLCOMB","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all combinations of the values of n variables taken k at a time in a \nminimal change order."}},{"Name":"ALLCOMBI","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all combinations of the indices of n objects taken k at a time in a \nminimal change order."}},{"Name":"CATS","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes leading and trailing blanks, and returns a concatenated character string."}},{"Name":"CATT","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes trailing blanks, and returns a concatenated character string."}},{"Name":"CATX","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes leading and trailing blanks, inserts delimiters, and returns a concatenated \ncharacter string."}},{"Name":"COMPCOST","Type":"SAS_FUNCTION","Help":{"#cdata":"Sets the costs of operations for later use by the COMPGED function."}},{"Name":"GRAYCODE","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all subsets of n items in a minimal change order."}},{"Name":"LABEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns a variable label to a specified character variable."}},{"Name":"LEXCOMB","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all distinct combinations of the non-missing values of n variables taken \nk at a time in lexicographic order."}},{"Name":"LEXCOMBI","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all combinations of the indices of n objects taken k at a time in \nlexicographic order."}},{"Name":"LEXPERK","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all distinct permutations of the non-missing values of n variables \ntaken k at a time in lexicographic order."}},{"Name":"LEXPERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates all distinct permutations of the non-missing values of several variables \nin lexicographic order."}},{"Name":"LOGISTIC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logistic transformation of the argument. \n \nSyntax: LOGISTIC(argument)\nRequired Argument:\nargument\n is a numeric variable, constant, or expression that specifies the value of a numeric random variable. \n When argument is missing, the LOGISTIC function returns a missing value. \n \nDetails\nThe LOGISTIC function returns the logistic transformation of an argument. It is typically used to \nconvert a log odds value to a value on the probability scale."}},{"Name":"MISSING","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns missing values to the specified character or numeric variables."}},{"Name":"MODULE","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls an external routine without any return code.\n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL MODULE routine does not execute. \n\nSyntax: CALL MODULE( module-name <, argument-1, ..., argument-n>);\n\nRequired Argument:\nmodule-name - is the name of the external module to use.\n\nOptional Arguments:\ncontrol-string\n is an optional control string whose first character must be an asterisk (*), followed by any \n combination of the following characters:\n I\n prints the hexadecimal representations of all arguments to the CALL MODULE routine. You can use \n this option to help diagnose problems that are caused by incorrect arguments or attribute tables. \n If you specify the I option, the E option is implied.\n E\n prints detailed error messages. Without the E option (or the I option, which supersedes it), \n the only error message that the CALL MODULE routine generates is \"Invalid argument to function,\" \n which is usually not enough information to determine the cause of the error. The E option is \n useful for a production environment, whereas the I option is preferable for a development or \n debugging environment.\n H\n provides brief information about the syntax of the CALL MODULE routine, the attribute file format, \n and suggested SAS formats and informats. \n\nargument - is one or more arguments to pass to the requested routine."}},{"Name":"POKE","Type":"SAS_FUNCTION","Help":{"#cdata":"Writes a value directly into memory on a 32-bit platform. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL POKE routine does not execute. \n\nSyntax: CALL POKE(source, pointer <, length> <, floating-point>);\n\nRequired Arguments:\nsource\n specifies a constant, variable, or expression that contains a value to write into memory \npointer\n specifies a numeric expression that contains the virtual address of the data that the CALL POKE routine alters.\n\nOptional Arguments:\nlength\n specifies a numeric constant, variable, or expression that contains the number of bytes to write from the source \n to the address that is indicated by pointer. If you omit length, the action that the CALL POKE routine takes depends \n on whether source is a character value or a numeric value:\n \u2022If source is a character value, the CALL POKE routine copies the entire value of source to the specified memory location.\n \u2022If source is a numeric value, the CALL POKE routine converts source to a long integer and writes into memory the number \n of bytes that constitute a pointer.\n\n z/OS Specifics\n Under z/OS, pointers are 3 or 4 bytes long, depending on the situation. \n\nfloating-point\n specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."}},{"Name":"POKELONG","Type":"SAS_FUNCTION","Help":{"#cdata":"Writes a value directly into memory on 32-bit and 64-bit platforms. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the CALL POKELONG routine does not execute. \n\nSyntax: CALL POKELONG(source, pointer <, length> <, floating-point>);\nRequired Arguments:\nsource\n specifies a character constant, variable, or expression that contains a value to write into memory. \npointer\n specifies a character string that contains the virtual address of the data that the CALL POKELONG routine alters.\n\nOptional Arguments:\nlength\n specifies a numeric SAS expression that contains the number of bytes to write from the source to the address \n that is indicated by the pointer. If you omit length, the CALL POKELONG routine copies the entire value of \n source to the specified memory location. \nfloating-point\n specifies that the value of source is stored as a floating-point number. The value of floating-point can be any number."}},{"Name":"PRXDEBUG","Type":"SAS_FUNCTION","Help":{"#cdata":"Enables Perl regular expressions in a DATA step to send debugging output to the SAS log."}},{"Name":"PRXFREE","Type":"SAS_FUNCTION","Help":{"#cdata":"Frees memory that was allocated for a Perl regular expression."}},{"Name":"PRXNEXT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position and length of a substring that matches a pattern, and iterates \nover multiple matches within one string."}},{"Name":"PRXSUBSTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position and length of a substring that matches a pattern."}},{"Name":"RANBIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a binomial distribution."}},{"Name":"RANCAU","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a Cauchy distribution."}},{"Name":"RANNOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a normal distribution."}},{"Name":"RANPERK","Type":"SAS_FUNCTION","Help":{"#cdata":"Randomly permutes the values of the arguments, and returns a permutation of k out \nof n values."}},{"Name":"RANPERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Randomly permutes the values of the arguments."}},{"Name":"RANPOI","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a Poisson distribution."}},{"Name":"RANTBL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a tabled probability distribution."}},{"Name":"RANTRI","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a triangular distribution."}},{"Name":"RANUNI","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a uniform distribution."}},{"Name":"SET","Type":"SAS_FUNCTION","Help":{"#cdata":"Links SAS data set variables to DATA step or macro variables that have the same \nname and data type."}},{"Name":"SOFTMAX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the softmax value."}},{"Name":"SORTC","Type":"SAS_FUNCTION","Help":{"#cdata":"Sorts the values of character arguments."}},{"Name":"SORTN","Type":"SAS_FUNCTION","Help":{"#cdata":"Sorts the values of numeric arguments."}},{"Name":"STDIZE","Type":"SAS_FUNCTION","Help":{"#cdata":"Standardizes the values of one or more variables."}},{"Name":"STREAMINIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Specifies a seed value to use for subsequent random number generation by the \nRAND function."}},{"Name":"SYMPUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns DATA step information to a macro variable."}},{"Name":"SYMPUTX","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns a value to a macro variable, and removes both leading and trailing blanks."}},{"Name":"VNEXT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name, type, and length of a variable that is used in a DATA step."}},{"Name":"CAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Does not remove leading or trailing blanks, and returns a concatenated character string."}},{"Name":"CATQ","Type":"SAS_FUNCTION","Help":{"#cdata":"Concatenates character or numeric values by using a delimiter to separate items \nand by adding quotation marks to strings that contain the delimiter."}},{"Name":"CDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value from a cumulative probability distribution. \n\nSyntax: CDF(distribution, quantile <, parameter-1, \u2026, parameter-k>) \n\nRequired Arguments:\ndistribution\n Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribuion: BERNOULLI\n Beta distribuion: BETA\n Binomial distribuion: BINOMIAL\n Cauchy distribuion: CAUCHY\n Chi-Square distribuion: CHISQUARE\n Conway-Maxwell-Poisson distribuion: CMP\n Exponential distribuion: EXPONENTIAL\n F distribuion: F\n Gamma distribuion: GAMMA\n Generalized Poisson distribuion: GENPOISSON\n Geometric distribuion: GEOMETRIC\n Hypergeometric distribuion: HYPERGEOMETRIC\n Laplace distribuion: LAPLACE\n Logistic distribuion: LOGISTIC\n Lognormal distribuion: LOGNORMAL\n Negative binomial distribuion: NEGBINOMIAL\n Normal distribuion: NORMAL|GAUSS\n Normal mixture distribuion: NORMALMIX\n Pareto distribuion: PARETO\n Poisson distribuion: POISSON\n T distribuion: T\n Tweedie distribuion: TWEEDIE\n Uniform distribuion: UNIFORM\n Wald (inverse Gaussian) distribuion: WALD|IGAUSS\n Weibull distribuion: WEIBULL\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n\nquantile\n is a numeric constant, variable, or expression that specifies the value of the random variable.\n\nOptional Argument: parameter-1, \u2026 , parameter-k\n are optional constants, variables, or expressions that specify shape, location, or scale parameters appropriate \n for the specific distribution."}},{"Name":"CEIL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the smallest integer that is greater than or equal to the argument, fuzzed \nto avoid unexpected floating-point results."}},{"Name":"CEILZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the smallest integer that is greater than or equal to the argument, using \nzero fuzzing."}},{"Name":"CEXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies the existence of a SAS catalog or SAS catalog entry."}},{"Name":"CHAR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a single character from a specified position in a character string."}},{"Name":"CHOOSEC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character value that represents the results of choosing from a list \nof arguments."}},{"Name":"CHOOSEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a numeric value that represents the results of choosing from a list \nof arguments."}},{"Name":"CINV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the chi-square distribution."}},{"Name":"CLOSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Closes a SAS data set."}},{"Name":"CMISS","Type":"SAS_FUNCTION","Help":{"#cdata":"Counts the number of missing arguments."}},{"Name":"CNONCT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the noncentrality parameter from a chi-square distribution."}},{"Name":"COALESCE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the first non-missing value from a list of numeric arguments."}},{"Name":"COALESCEC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the first non-missing value from a list of character arguments."}},{"Name":"COLLATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string in ASCII or EBCDIC collating sequence."}},{"Name":"COMB","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes the number of combinations of n elements taken r at a time."}},{"Name":"COMPARE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position of the leftmost character by which two strings differ, or returns 0 \nif there is no difference."}},{"Name":"COMPBL","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes multiple blanks from a character string."}},{"Name":"COMPGED","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the generalized edit distance between two strings."}},{"Name":"COMPLEV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the Levenshtein edit distance between two strings."}},{"Name":"COMPOUND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns compound interest parameters."}},{"Name":"COMPRESS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string with specified characters removed from the original string."}},{"Name":"CONSTANT","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes machine and mathematical constants."}},{"Name":"CONVX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the convexity for an enumerated cash flow."}},{"Name":"CONVXP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the convexity for a periodic cash flow stream, such as a bond."}},{"Name":"COS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the cosine."}},{"Name":"COSH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hyperbolic cosine."}},{"Name":"COUNT","Type":"SAS_FUNCTION","Help":{"#cdata":"Counts the number of times that a specified substring appears within a character string."}},{"Name":"COUNTC","Type":"SAS_FUNCTION","Help":{"#cdata":"Counts the number of characters in a string that appear or do not appear in a list \nof characters."}},{"Name":"COUNTW","Type":"SAS_FUNCTION","Help":{"#cdata":"Counts the number of words in a character string."}},{"Name":"CSS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the corrected sum of squares."}},{"Name":"CUROBS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the observation number of the current observation."}},{"Name":"CV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the coefficient of variation. At least two arguments are required."}},{"Name":"DACCDB","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the accumulated declining balance depreciation."}},{"Name":"DACCDBSL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the accumulated declining balance with conversion to a straight-line depreciation."}},{"Name":"DACCSL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the accumulated straight-line depreciation."}},{"Name":"DACCSYD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the accumulated sum-of-years-digits depreciation."}},{"Name":"DACCTAB","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the accumulated depreciation from specified tables."}},{"Name":"DAIRY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the derivative of the AIRY function."}},{"Name":"DATDIF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of days between two dates."}},{"Name":"DATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current date as a SAS date value. \n \nAlias: TODAY \n\nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date \nand time values that are returned for this function are determined by the time zone."}},{"Name":"DATEJUL","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts a Julian date to a SAS date value."}},{"Name":"DATEPART","Type":"SAS_FUNCTION","Help":{"#cdata":"Extracts the date from a SAS datetime value."}},{"Name":"DATETIME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current date and time of day as a SAS datetime value. \n \nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date \nand time values that are returned for this function are determined by the time zone."}},{"Name":"DAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the day of the month from a SAS date value."}},{"Name":"DCLOSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Closes a directory that was opened by the DOPEN function."}},{"Name":"DCREATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the complete pathname of a new, external directory."}},{"Name":"DEPDB","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the declining balance depreciation."}},{"Name":"DEPDBSL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the declining balance with conversion to a straight-line depreciation."}},{"Name":"DEPSL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the straight-line depreciation."}},{"Name":"DEPSYD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sum-of-years-digits depreciation."}},{"Name":"DEPTAB","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the depreciation from specified tables."}},{"Name":"DEQUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes matching quotation marks from a character string that begins with a quotation \nmark, and deletes all characters to the right of the closing quotation mark."}},{"Name":"DEVIANCE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the deviance based on a probability distribution."}},{"Name":"DHMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS datetime value from date, hour, minute, and second values."}},{"Name":"DIF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns differences between an argument and its nth lag. n specifies the number of lags."}},{"Name":"DIGAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the digamma function."}},{"Name":"DIM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of elements in an array. n specifies the dimension, in a multidimensional \narray, for which you want to know the number of elements.\n\nIn CAS, this returns the dimensions of a list variable. For example:\n\n x[10] = 1;\n y = dim(x);\n\n\ny would be set to 10"}},{"Name":"DINFO","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns information about a directory."}},{"Name":"DIVIDE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the result of a division that handles special missing values for ODS output."}},{"Name":"DNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of members in a directory."}},{"Name":"DOPEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Opens a directory, and returns a directory identifier value."}},{"Name":"DOPTNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns directory attribute information."}},{"Name":"DOPTNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of information items that are available for a directory."}},{"Name":"DREAD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of a directory member."}},{"Name":"DROPNOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Deletes a note marker from a SAS data set or an external file."}},{"Name":"DSNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the SAS data set name that is associated with a data set identifier."}},{"Name":"DUR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the modified duration for an enumerated cash flow."}},{"Name":"DURP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the modified duration for a periodic cash flow stream, such as a bond."}},{"Name":"ENVLEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of an environment variable."}},{"Name":"ERF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the (normal) error function."}},{"Name":"ERFC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the complementary (normal) error function."}},{"Name":"EUCLID","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the Euclidean norm of the non-missing arguments."}},{"Name":"EXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies the existence of a SAS library member."}},{"Name":"EXP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the exponential function."}},{"Name":"FACT","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes a factorial."}},{"Name":"FAPPEND","Type":"SAS_FUNCTION","Help":{"#cdata":"Appends the current record to the end of an external file."}},{"Name":"FCLOSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Closes an external file, directory, or directory member."}},{"Name":"FCOL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current column position in the File Data Buffer (FDB)."}},{"Name":"FDELETE","Type":"SAS_FUNCTION","Help":{"#cdata":"Deletes an external file or an empty directory."}},{"Name":"FETCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Reads the next non-deleted observation from a SAS data set into the Data Set Data Vector (DDV)."}},{"Name":"FETCHOBS","Type":"SAS_FUNCTION","Help":{"#cdata":"Reads a specified observation from a SAS data set into the Data Set Data Vector (DDV)."}},{"Name":"FEXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies the existence of an external file that is associated with a fileref."}},{"Name":"FGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Copies data from the File Data Buffer (FDB) into a variable."}},{"Name":"FILEEXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies the existence of an external file by its physical name."}},{"Name":"FILENAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns or deassigns a fileref to an external file, directory, or output device."}},{"Name":"FILEREF","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies whether a fileref has been assigned for the current SAS session."}},{"Name":"FINANCE","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes financial calculations such as depreciation, maturation, accrued interest, net present \nvalue, periodic savings, and internal rates of return."}},{"Name":"FIND","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches for a specific substring of characters within a character string."}},{"Name":"FINDC","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a string for any character in a list of characters."}},{"Name":"FINDW","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the character position of a word in a string, or returns the number of the word \nin a string."}},{"Name":"FINFO","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a file information item."}},{"Name":"FINV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the F distribution."}},{"Name":"FIPNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts two-digit FIPS codes to uppercase state names."}},{"Name":"FIPNAMEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts two-digit FIPS codes to mixed case state names."}},{"Name":"FIPSTATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts two-digit FIPS codes to two-character state postal codes."}},{"Name":"FIRST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the first character in a character string."}},{"Name":"FLOOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest integer that is less than or equal to the argument, fuzzed to avoid \nunexpected floating-point results."}},{"Name":"FLOORZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest integer that is less than or equal to the argument, using zero fuzzing."}},{"Name":"FNONCT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the noncentrality parameter of an F distribution."}},{"Name":"FNOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Identifies the last record that was read, and returns a value that the FPOINT function can use."}},{"Name":"FOPEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Opens an external file and returns a file identifier value."}},{"Name":"FOPTNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of an item of information about a file."}},{"Name":"FOPTNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of information items that are available for an external file."}},{"Name":"FPOINT","Type":"SAS_FUNCTION","Help":{"#cdata":"Positions the read pointer on the next record to be read."}},{"Name":"FPOS","Type":"SAS_FUNCTION","Help":{"#cdata":"Sets the position of the column pointer in the File Data Buffer (FDB)."}},{"Name":"FPUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Moves data to the File Data Buffer (FDB) of an external file, starting at the FDB's current \ncolumn position."}},{"Name":"FREAD","Type":"SAS_FUNCTION","Help":{"#cdata":"Reads a record from an external file into the File Data Buffer (FDB)."}},{"Name":"FREWIND","Type":"SAS_FUNCTION","Help":{"#cdata":"Positions the file pointer to the start of the file."}},{"Name":"FRLEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the size of the last record that was read, or, if the file is opened for output, \nreturns the current record size."}},{"Name":"FSEP","Type":"SAS_FUNCTION","Help":{"#cdata":"Sets the token delimiters for the FGET function."}},{"Name":"FUZZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nearest integer if the argument is within 1E-12 of that integer."}},{"Name":"FWRITE","Type":"SAS_FUNCTION","Help":{"#cdata":"Writes a record to an external file."}},{"Name":"GAMINV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the gamma distribution."}},{"Name":"GAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the gamma function."}},{"Name":"GARKHCLPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates call prices for European options on stocks, based on the Garman-Kohlhagen model."}},{"Name":"GARKHPTPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates put prices for European options on stocks, based on the Garman-Kohlhagen model."}},{"Name":"GCD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the greatest common divisor for one or more integers."}},{"Name":"GEODIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geodetic distance between two latitude and longitude coordinates."}},{"Name":"GEOMEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geometric mean."}},{"Name":"GEOMEANZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geometric mean, using zero fuzzing."}},{"Name":"GETOPTION","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a SAS system or graphics option."}},{"Name":"GETVARC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a SAS data set character variable."}},{"Name":"GETVARN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a SAS data set numeric variable."}},{"Name":"HARMEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the harmonic mean."}},{"Name":"HARMEANZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the harmonic mean, using zero fuzzing."}},{"Name":"HBOUND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the upper bound of an array. n is an optional integer constant that specifies \nthe dimension for which you want to know the upper bound. If no n value is specified, \nthe HBOUND function returns the upper bound of the first dimension of the array."}},{"Name":"HMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS time value from hour, minute, and second values."}},{"Name":"HOLIDAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS date value of a specified holiday for a specified year."}},{"Name":"HOUR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hour from a SAS time or datetime value."}},{"Name":"HTMLDECODE","Type":"SAS_FUNCTION","Help":{"#cdata":"Decodes a string that contains HTML numeric character references or HTML character \nentity references, and returns the decoded string."}},{"Name":"HTMLENCODE","Type":"SAS_FUNCTION","Help":{"#cdata":"Encodes characters using HTML character entity references, and returns the \nencoded string."}},{"Name":"IBESSEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the modified Bessel function."}},{"Name":"IFC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character value based on whether an expression is true, false, \nor missing."}},{"Name":"IFN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a numeric value based on whether an expression is true, false, \nor missing."}},{"Name":"INDEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for a string of characters, and returns the position \nof the string's first character for the first occurrence of the string."}},{"Name":"INDEXC","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for any of the specified characters, and returns \nthe position of that character."}},{"Name":"INDEXW","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character expression for a string that is specified as a word, and returns \nthe position of the first character in the word."}},{"Name":"INPUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value that is produced when SAS converts an expression using the \nspecified informat."}},{"Name":"INPUTC","Type":"SAS_FUNCTION","Help":{"#cdata":"Enables you to specify a character informat at run time."}},{"Name":"INPUTN","Type":"SAS_FUNCTION","Help":{"#cdata":"Enables you to specify a numeric informat at run time."}},{"Name":"INT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the integer value, fuzzed to avoid unexpected floating-point results."}},{"Name":"INTCINDEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the cycle index when a date, time, or datetime interval and value \nare specified."}},{"Name":"INTCK","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the count of the number of interval boundaries between two dates, two \ntimes, or two datetime values."}},{"Name":"INTCYCLE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the date, time, or datetime interval at the next higher seasonal cycle \nwhen a date, time, or datetime interval is specified."}},{"Name":"INTFIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a time interval that is aligned between two dates."}},{"Name":"INTFMT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a recommended SAS format when a date, time, or datetime interval is specified."}},{"Name":"INTGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a time interval based on three date or datetime values."}},{"Name":"INTINDEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the seasonal index when a date, time, or datetime interval and value are \nspecified."}},{"Name":"INTNX","Type":"SAS_FUNCTION","Help":{"#cdata":"Increments a date, time, or datetime value by a given time interval, and returns \na date, time, or datetime value."}},{"Name":"INTRR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the internal rate of return as a fraction."}},{"Name":"INTSEAS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of the seasonal cycle when a date, time, or datetime interval \nis specified."}},{"Name":"INTSHIFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the shift interval that corresponds to the base interval."}},{"Name":"INTTEST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns 1 if a time interval is valid, and returns 0 if a time interval is invalid."}},{"Name":"INTZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the integer portion of the argument, using zero fuzzing."}},{"Name":"IQR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the interquartile range."}},{"Name":"IORCMSG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a formatted error message for _IORC_."}},{"Name":"IRR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the internal rate of return as a percentage."}},{"Name":"JBESSEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the Bessel function."}},{"Name":"JULDATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the Julian date from a SAS date value."}},{"Name":"JULDATE7","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a seven-digit Julian date from a SAS date value."}},{"Name":"KURTOSIS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kurtosis."}},{"Name":"LAG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns values from a queue. n specifies the number of lagged values."}},{"Name":"LARGEST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kth largest non-missing value."}},{"Name":"LBOUND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the lower bound of an array. n is an optional integer constant that specifies \nthe dimension for which you want to know the lower bound. If no n value is specified, \nthe LBOUND function returns the lower bound of the first dimension of the array."}},{"Name":"LCM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the least common multiple."}},{"Name":"LCOMB","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes the logarithm of the COMB function; that is, the logarithm of the number \nof combinations of n objects taken r at a time."}},{"Name":"LEFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Left-aligns a character string by removing leading blanks."}},{"Name":"QLEFT","Type":"SAS_FUNCTION","Help":{"#cdata":"Left-aligns a character string by removing leading blanks."}},{"Name":"LENGTH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a non-blank character string, excluding trailing blanks, \nand returns 1 for a blank character string."}},{"Name":"LENGTHC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a character string, including trailing blanks."}},{"Name":"LENGTHM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the amount of memory (in bytes) that is allocated for a character string."}},{"Name":"LENGTHN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a character string, excluding trailing blanks."}},{"Name":"LFACT","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes the logarithm of the FACT (factorial) function."}},{"Name":"LGAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the natural logarithm of the Gamma function."}},{"Name":"LIBNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns or deassigns a libref for a SAS library."}},{"Name":"LIBREF","Type":"SAS_FUNCTION","Help":{"#cdata":"Verifies that a libref has been assigned."}},{"Name":"LOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the natural (base e) logarithm."}},{"Name":"LOG1PX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the log of 1 plus the argument."}},{"Name":"LOG10","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm to the base 10."}},{"Name":"LOG2","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm to the base 2."}},{"Name":"LOGBETA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm of the beta function."}},{"Name":"LOGCDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm of a left cumulative distribution function. \n \nSyntax: LOGCDF('distribution', quantile <, parameter-1, ..., parameter-k>)\n\nRequired Arguments:\n'distribution' is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n \nquantile\n is a numeric variable, constant, or expression that specifies the value of a random variable.\n\nOptional Argument: \nparameter-1, ..., parameter-k\n are optional shape, location, or scale parameters appropriate for the specific distribution."}},{"Name":"LOGPDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm of a probability density (mass) function. \n \nSyntaxLOGPDF('distribution', quantile, parameter-1, ..., parameter-k)\nRequired Arguments:\n 'distribution' is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n \nquantile\n is a numeric constant, variable, or expression that specifies the value of a random variable.parameter-1, ..., parameter-k\n are optional shape, location, or scale parameters appropriate for the specific distribution."}},{"Name":"LOGSDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the logarithm of a survival function. \n \nSyntax: LOGSDF('distribution', quantile, parameter-1, ..., parameter-k)\nRequired Arguments:\n'distribution' is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n \nquantile\n is a numeric constant, variable, or expression that specifies the value of a random variable. \n \nparameter-1, ..., parameter-k\n are optional shape, location, or scale parameters appropriate for the specific distribution."}},{"Name":"LOWCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in an argument to lowercase."}},{"Name":"QLOWCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in an argument to lowercase. QLOWCASE produces a result with \nspecial characters and mnemonic operators masked."}},{"Name":"LPERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes the logarithm of the PERM function; that is, the logarithm of the number \nof permutations of n objects, with the option of including r number of elements."}},{"Name":"LPNORM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the Lp norm of the second argument and subsequent non-missing arguments."}},{"Name":"MAD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the median absolute deviation from the median."}},{"Name":"MARGRCLPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates call prices for European options on stocks, based on the Margrabe model."}},{"Name":"MARGRPTPRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calculates put prices for European options on stocks, based on the Margrabe model."}},{"Name":"MAX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the largest value. At least two arguments are required."}},{"Name":"MD5","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the result of the message digest of a specified string. \n \nSyntax: MD5(string)\nRequired Argument: \nstring\n specifies a character constant, variable, or expression.\n\nTip: Enclose a literal string of characters in quotation marks. \n\nExample: Generating Results with the MD5 Function\nThis example generates results that are returned by the MD5 function.\n data _null_;\n y=md5('abc');\n z=md5('access method');\n put y=/ y=$hex32.;\n put z=/ z=$hex32.;\n run;\n \nThe output from this program contains unprintable characters."}},{"Name":"MDY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS date value from month, day, and year values."}},{"Name":"MEAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the arithmetic mean (average). At least one non-missing argument is required. \nOtherwise, the function returns a missing value."}},{"Name":"MEDIAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the median value."}},{"Name":"MIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the smalles value. At least two arguments are required."}},{"Name":"MINUTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the minute from a SAS time or datetime value."}},{"Name":"MOD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the remainder from the division of the first argument by the second argument, \nfuzzed to avoid most unexpected floating-point results."}},{"Name":"MODULEC","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls an external routine and returns a character value."}},{"Name":"MODULEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls an external routine and returns a numeric value."}},{"Name":"MODZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the remainder from the division of the first argument by the second argument, \nusing zero fuzzing."}},{"Name":"MONTH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the month from a SAS date value."}},{"Name":"MOPEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Opens a file by directory ID and member name, and returns either the file identifier or a 0."}},{"Name":"MORT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns amortization parameters."}},{"Name":"MSPLINT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the ordinate of a monotonicity-preserving interpolating spline."}},{"Name":"N","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of non-missing numeric values. At least one argument is required."}},{"Name":"NETPV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the net present value as a fraction."}},{"Name":"NLITERAL","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts a character string that you specify to a SAS name literal."}},{"Name":"NMISS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of missing numeric values. At least one argument is required."}},{"Name":"NOTALNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a non-alphanumeric character, and returns the first position \nat which the character is found."}},{"Name":"NOTALPHA","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a nonalphabetic character, and returns the first \nposition at which the character is found."}},{"Name":"NOTCNTRL","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not a control character, and \nreturns the first position at which that character is found."}},{"Name":"NOTDIGIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for any character that is not a digit, and returns the \nfirst position at which that character is found."}},{"Name":"NOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns an observation ID for the current observation of a SAS data set."}},{"Name":"NOTFIRST","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for an invalid first character in a SAS variable name under \nVALIDVARNAME=V7, and returns the first position at which that character is found."}},{"Name":"NOTGRAPH","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a non-graphical character, and returns the first position \nat which that character is found."}},{"Name":"NOTLOWER","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not a lowercase letter, and returns \nthe first position at which that character is found."}},{"Name":"NOTNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for an invalid character in a SAS variable name under \nVALIDVARNAME=V7, and returns the first position at which that character is found."}},{"Name":"NOTPRINT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a nonprintable character, and returns the first \nposition at which that character is found."}},{"Name":"NOTPUNCT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not a punctuation character, \nand returns the first position at which that character is found."}},{"Name":"NOTSPACE","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not a white-space character \n(blank, horizontal and vertical tab, carriage return, line feed, and form feed), \nand returns the first position at \nwhich that character is found."}},{"Name":"NOTUPPER","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not an uppercase letter, and \nreturns the first position at which that character is found."}},{"Name":"NOTXDIGIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a character string for a character that is not a hexadecimal character, \nand returns the first position at which that character is found."}},{"Name":"NPV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the net present value with the rate expressed as a percentage."}},{"Name":"NVALID","Type":"SAS_FUNCTION","Help":{"#cdata":"Checks the validity of a character string for use as a SAS variable name."}},{"Name":"NWKDOM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the date for the nth occurrence of a weekday for the specified month and year."}},{"Name":"OPEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Opens a SAS data set."}},{"Name":"ORDINAL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kth smallest of the missing and nonmissing values. At least two arguments \nare required."}},{"Name":"PATHNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the physical name of an external file or a SAS library, or returns a blank."}},{"Name":"PCTL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the percentile that corresponds to the percentage. n is a digit from 1 to 5 \nwhich specifies the definition of the percentile to be computed."}},{"Name":"PDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value from a probability density (mass) distribution. \n\nSyntax: PDF(distribution, quantile <, parameter-1, ... , parameter-k>)\nRequired Arguments:\ndistribution\n Is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n \nquantile\n is a numeric constant, variable, or expression that specifies the value of the random variable.\n\nOptional Argument: \nparameter-1, ..., parameter-k\n are optional numeric constants, variables, or expressions that specify the values of shape, location, or \n scale parameters that are appropriate for the specific distribution."}},{"Name":"PMF","Type":"SAS_FUNCTION","Help":{"#cdata":"Alias for the PDF function."}},{"Name":"PEEK","Type":"SAS_FUNCTION","Help":{"#cdata":"Stores the contents of a memory address in a numeric variable on a 32-bit platform. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the PEEK function does not execute. \n\nSyntax: PEEK(address <, length>)\nRequired Argument: \naddress\n is a numeric constant, variable, or expression that specifies the memory address.\n\nOptional Argument:\nlength\n is a numeric constant, variable, or expression that specifies the data length.\n \n Default: a 4-byte address pointer\n Range: 2\u20138"}},{"Name":"PEEKC","Type":"SAS_FUNCTION","Help":{"#cdata":"Stores the contents of a memory address in a character variable on a 32-bit platform. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the PEEKC function does not execute. \n\nSyntax: PEEKC(address <, length>)\n\nRequired Argument:\naddress\n is a numeric constant, variable, or expression that specifies the memory address.\n\nOptional Argument: \nlength\n is a numeric constant, variable, or expression that specifies the data length.\n\n Default: 8, unless the variable length has already been set (for example, by the LENGTH statement)\n Range: 1\u201332,767"}},{"Name":"PEEKCLONG","Type":"SAS_FUNCTION","Help":{"#cdata":"Stores the contents of a memory address in a character variable on 32-bit and 64-bit platforms. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the PEEKCLONG function does not execute. \n\nSyntax: PEEKCLONG(address <, length>)\nRequired Argument: \naddress\n specifies a character constant, variable, or expression that contains the binary pointer address.\n\nOptional Argument:\nlength\n is a numeric constant, variable, or expression that specifies the length of the character data.\n\nDefault: 8\nRange: 1\u201332,767\nDetails:\nIf you do not have access to the memory storage location that you are requesting, the PEEKCLONG \nfunction returns an Invalid argument error."}},{"Name":"PEEKLONG","Type":"SAS_FUNCTION","Help":{"#cdata":"Stores the contents of a memory address in a numeric variable on 32-bit and 64-bit platforms. \n \nInteraction:\nWhen a SAS server is in a locked-down state, the PEEKLONG function does not execute. \n\nSyntax: PEEKLONG(address <, length>) \n\nRequired Argument:\naddress\n specifies a character constant, variable, or expression that contains the binary pointer address.\n\nOptional Argument:\nlength\n is a numeric constant, variable, or expression that specifies the length of the character data.\n\n Default: 4 on 32-bit computers; 8 on 64-bit computers\n Range: 1\u20134 on 32-bit computers; 1\u20138 on 64-bit computers\n\nDetails:\nIf you do not have access to the memory storage location that you are requesting, the PEEKLONG function \nreturns an Invalid argument error."}},{"Name":"PERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Computes the number of permutations of n items that are taken r at a time."}},{"Name":"POINT","Type":"SAS_FUNCTION","Help":{"#cdata":"Locates an observation that is identified by the NOTE function."}},{"Name":"POISSON","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a Poisson distribution."}},{"Name":"PROBBETA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a beta distribution."}},{"Name":"PROBBNML","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a binomial distribution."}},{"Name":"PROBBNRM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a probability from a bivariate normal distribution."}},{"Name":"PROBCHI","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a chi-square distribution."}},{"Name":"PROBF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from an F distribution."}},{"Name":"PROBGAM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a gamma distribution."}},{"Name":"PROBHYPR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a hypergeometric distribution."}},{"Name":"PROBIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the standard normal distribution."}},{"Name":"PROBMC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a probability or a quantile from various distributions for multiple \ncomparisons of means."}},{"Name":"PROBNEGB","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a negative binomial distribution."}},{"Name":"PROBNORM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from the standard normal distribution."}},{"Name":"PROBT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the probability from a t distribution."}},{"Name":"PROPCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all words in an argument to proper case."}},{"Name":"PRXCHANGE","Type":"SAS_FUNCTION","Help":{"#cdata":"Performs a pattern-matching replacement."}},{"Name":"PRXMATCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches for a pattern match and returns the position at which the pattern is found."}},{"Name":"PRXPAREN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the last bracket match for which there is a match in a pattern."}},{"Name":"PRXPARSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Compiles a Perl regular expression (PRX) that can be used for pattern matching of \na character value."}},{"Name":"PRXPOSN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string that contains the value for a capture buffer."}},{"Name":"PTRLONGADD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the pointer address as a character variable on 32-bit and 64-bit platforms."}},{"Name":"PUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value using a specified format."}},{"Name":"PUTC","Type":"SAS_FUNCTION","Help":{"#cdata":"Enables you to specify a character format at run time. \n \nSyntax: PUTC(value, format-specification <, w>)\n\nRequired Arguments:\nvalue\n specifies a character value to be formatted.format-specification\n is a character format that you want to apply to value.\n Here are valid format forms:\n \u2022format-name\n \u2022format-name.\n \u2022format-namew. \n \n Except for format-name, you can use \u2013L, \u2013R, and \u2013C in format-specification to left-align, \n right-align, and center your output. For example, you can use 'upcase.-c\u2019 as the value for \n the second argument, format-specification.\n\nOptional Argument:\nw\n is a numeric constant, variable, or expression that specifies a width to apply to the format.\n\n Interaction:\n If you specify a width here, it overrides any width specification in the format."}},{"Name":"PUTN","Type":"SAS_FUNCTION","Help":{"#cdata":"Enables you to specify a numeric format at run time. \n \nSyntax: PUTN(value, format-specification <, w <, d>>)\n\nRequired Arguments: \nvalue\n specifies a numeric value to be formatted. \nformat-specification\n is the numeric format that you want to apply to value.\n Here are valid format forms:\n \u2022format-name\n \u2022format-name.\n \u2022format-namew.\n \u2022format-namew.d\n Except for format-name, you can use \u2013L, \u2013R, and \u2013C in format-specification to left-align, \n right-align, and center your output. For example, you can use 'weekdate.-c\u2019 as the value \n for the second argument, format-specification.\n\nOptional Arguments:\nw\n is a numeric constant, variable, or expression that specifies a width to apply to the format.\n\n Interaction:\n If you specify a width here, it overrides any width specification in the format.\n\nd\n is a numeric constant, variable, or expression that specifies the number of decimal places to use.\n \n Interaction:\n If you specify a number here, it overrides any decimal-place specification in the format."}},{"Name":"PVP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the present value for a periodic cash flow stream (such as a bond), with repayment of \nprincipal at maturity."}},{"Name":"QTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the quarter of the year from a SAS date value."}},{"Name":"QUANTILE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the quantile from a distribution that you specify. \n \nSyntax: QUANTILE(distribution, probability, parameter-1, \u2026, parameter-k)\nRequired Arguments: \ndistribution is a character constant, variable, or expression that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n\nprobability\n is a numeric constant, variable, or expression that specifies the value of a random variable. \nparameter-1, \u2026, parameter-k\n are optional shape, location, or scale parameters appropriate for the specific distribution."}},{"Name":"QUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Adds double quotation marks to a character value."}},{"Name":"RAND","Type":"SAS_FUNCTION","Help":{"#cdata":"Generates random numbers from a distribution that you specify."}},{"Name":"RANEXP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from an exponential distribution."}},{"Name":"RANGAM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a gamma distribution."}},{"Name":"RANGE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the range of the nonmissing values. At least one nonmissing argument is required."}},{"Name":"RANK","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position of a character in the ASCII or EBCDIC collating sequence."}},{"Name":"RENAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Renames a member of a SAS library, an entry in a SAS catalog, an external file, or a directory."}},{"Name":"REPEAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character value that consists of the first argument repeated n+1 times."}},{"Name":"RESOLVE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the resolved value of the argument after it has been processed by the macro facility."}},{"Name":"REVERSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Reverses a character string."}},{"Name":"REWIND","Type":"SAS_FUNCTION","Help":{"#cdata":"Positions the data set pointer at the beginning of a SAS data set."}},{"Name":"RIGHT","Type":"SAS_FUNCTION","Help":{"#cdata":"Right aligns a character expression."}},{"Name":"RMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the root mean square of the nonmissing arguments."}},{"Name":"ROUND","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, or to the nearest \ninteger when the second argument is omitted."}},{"Name":"ROUNDE","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, and returns an \neven multiple when the first argument is halfway between the two nearest multiples."}},{"Name":"ROUNDZ","Type":"SAS_FUNCTION","Help":{"#cdata":"Rounds the first argument to the nearest multiple of the second argument, using \nzero fuzzing."}},{"Name":"SAVING","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the future value of a periodic saving."}},{"Name":"SCAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nth word from a character string."}},{"Name":"SCANQ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nth word from a character expression, ignoring delimiters that are \nenclosed in quotation marks."}},{"Name":"SDF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a survival function. \n \nSyntax: SDF(distribution, quantile, parameter-1, ..., parameter-k)\nRequired Arguments: \ndistribution\n Is a character string that identifies the distribution. Valid distributions are as follows:\n\n Bernoulli distribution: 'BERNOULLI'\n Beta distribution: 'BETA'\n Binomial distribution: 'BINOMIAL'\n Cauchy distribution: 'CAUCHY'\n Chi-Square distribution: 'CHISQUARE'\n Conway-Maxwell-Poisson distribution: 'CMP'\n Exponential distribution: 'EXPONENTIAL'\n F distribution: 'F'\n Gamma distribution: 'GAMMA'\n Generalized Poisson distribution: 'GENPOISSON'\n Geometric distribution: 'GEOMETRIC'\n Hypergeometric distribution: 'HYPERGEOMETRIC'\n Laplace distribution: 'LAPLACE'\n Logistic distribution: 'LOGISTIC'\n Lognormal'LOGNORMAL'\n Negative binomial distribution: 'NEGBINOMIAL'\n Normal distribution: 'NORMAL'|'GAUSS'\n Normal mixture distribution: 'NORMALMIX'\n Pareto distribution: 'PARETO'\n Poisson distribution: 'POISSON'\n T distribution: 'T'\n Tweedie distribution: 'TWEEDIE').\n Uniform distribution: 'UNIFORM'\n Wald (inverse Gaussian) distribution: 'WALD'|'IGAUSS'\n Weibull distribution: 'WEIBULL'\n\n Note: Except for T, F, and NORMALMIX, you can minimally identify any distribution by its first four characters. \n \nquantile\n is a numeric constant, variable, or expression that specifies the value of a random variable. \n \nparameter-1, ..., parameter-k\n are optional shape, location, or scale parameters appropriate for the specific distribution."}},{"Name":"SECOND","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the second from a SAS time or datetime value."}},{"Name":"SIGN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sign of a value."}},{"Name":"SIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sine."}},{"Name":"SINH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hyperbolic sine."}},{"Name":"SKEWNESS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the skewness of the nonmissing arguments. At least 3 arguments are required."}},{"Name":"SLEEP","Type":"SAS_FUNCTION","Help":{"#cdata":"For a specified number of seconds (or fraction thereof), this function suspends the execution of a program that invokes \nit. From the syntax SLEEP(n, unit), n is the number of seconds to suspend (as a constant, variable or \nexpression), unless the unit of time is modified by the second argument. The second parameter, unit, \nis a numeric constant, variable, or expression that specifies the unit of time, as a power of 10, which \nis applied to n. For example, unit=1 corresponds to a second, unit=0.001 to a millisecond, unit=0.000001 \nto a microsecond, and so on. Range: n \u2265 0."}},{"Name":"SMALLEST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the kth smallest nonmissing value."}},{"Name":"SOUNDEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Encodes a string to facilitate searching."}},{"Name":"SPEDIS","Type":"SAS_FUNCTION","Help":{"#cdata":"Determines the likelihood of two words matching, expressed as the asymmetric spelling \ndistance between the two words."}},{"Name":"SQRT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the square root of a value."}},{"Name":"STD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the standard deviation of the nonmissing arguments. At least two nonmissing \narguments are required."}},{"Name":"STDERR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the standard error of the mean of the nonmissing arguments. At least two \nnonmissing arguments are required."}},{"Name":"STFIPS","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts state postal codes to FIPS state codes."}},{"Name":"STNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts state postal codes to uppercase state names."}},{"Name":"STNAMEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts state postal codes to mixed case state names."}},{"Name":"STRIP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character string with all leading and trailing blanks removed."}},{"Name":"SUBPAD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a substring that has a length you specify, using blank padding if necessary."}},{"Name":"SUBSTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Extracts a substring from an argument."}},{"Name":"QSUBSTR","Type":"SAS_FUNCTION","Help":{"#cdata":"%QSUBSTR produces a substring of a character string, masking special characters and \nmnemonic operators."}},{"Name":"SUBSTRN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a substring, allowing a result with a length of zero."}},{"Name":"SUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sum of the nonmissing arguments."}},{"Name":"SUMABS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the sum of the absolute values of the non-missing arguments."}},{"Name":"SYMEXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns an indication of the existence of a macro variable."}},{"Name":"SYMGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a macro variable during DATA step execution."}},{"Name":"SYMGLOBL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns an indication of whether a macro variable is in global scope to the DATA \nstep during DATA step execution."}},{"Name":"SYMLOCAL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns an indication of whether a macro variable is in local scope to the DATA \nstep during DATA step execution."}},{"Name":"SYSMSG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns error or warning message text from processing the last data set or external \nfile function."}},{"Name":"SYSPARM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the system parameter string."}},{"Name":"SYSPROCESSID","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the process ID of the current process."}},{"Name":"SYSPROCESSNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the process name that is associated with a given process ID, or returns \nthe name of the current process."}},{"Name":"SYSPROD","Type":"SAS_FUNCTION","Help":{"#cdata":"Determines whether a product is licensed."}},{"Name":"SYSRC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a system error number."}},{"Name":"SYSTEM","Type":"SAS_FUNCTION","Help":{"#cdata":"Issues an operating environment command during a SAS session, and returns the \nsystem return code."}},{"Name":"TAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the tangent."}},{"Name":"TANH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the hyperbolic tangent."}},{"Name":"TIME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current time of day as a numeric SAS time value. \n \nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date \nand time values that are returned for this function are determined by the time zone."}},{"Name":"TIMEPART","Type":"SAS_FUNCTION","Help":{"#cdata":"Extracts a time value from a SAS datetime value."}},{"Name":"TINV","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a quantile from the t distribution."}},{"Name":"TNONCT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the noncentrality parameter from the Student's t distribution."}},{"Name":"TODAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current date as a numeric SAS date value. \n \nAlias: DATE \n\nInteraction:\nIf the value of the TIMEZONE= system option is set to a time zone name or time zone ID, the date \nand time values that are returned for this function are determined by the time zone."}},{"Name":"TRANSLATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Replaces specific characters in a character string."}},{"Name":"TRANSTRN","Type":"SAS_FUNCTION","Help":{"#cdata":"Replaces all occurrences of a substring found in a character string, allowing a \nzero-length replacement string."}},{"Name":"TRANWRD","Type":"SAS_FUNCTION","Help":{"#cdata":"Replaces or removes all occurrences of a substring in a character string."}},{"Name":"TRIGAMMA","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the trigamma function."}},{"Name":"TRIM","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes trailing blanks from a character string, and returns one blank if the string \nis missing."}},{"Name":"QTRIM","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes trailing blanks from a character string, and returns one blank if the string \nis missing. QTRIM produces a result with special characters and mnemonic operators \nmasked."}},{"Name":"TRIMN","Type":"SAS_FUNCTION","Help":{"#cdata":"Removes trailing blanks from character expressions, and returns a string with a length \nof zero if the expression is missing."}},{"Name":"TRUNC","Type":"SAS_FUNCTION","Help":{"#cdata":"Truncates a numeric value to a specified number of bytes."}},{"Name":"UNIFORM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a random variate from a uniform distribution."}},{"Name":"UPCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in an argument to uppercase."}},{"Name":"QUPCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts all letters in an argument to uppercase. %QUPCASE masks special characters \nand mnemonic operators in its result."}},{"Name":"URLDECODE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a string that was decoded using the URL escape syntax."}},{"Name":"URLENCODE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a string that was encoded using the URL escape syntax."}},{"Name":"USS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the uncorrected sum of squares of the nonmissing arguments. At least one \nnonmissing argument is required."}},{"Name":"UUIDGEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the short or binary form of a Universal Unique Identifier (UUID)."}},{"Name":"VAR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the variance of the nonmissing arguments. At least two nonmissing arguments \nare required."}},{"Name":"VARFMT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format that is assigned to a SAS data set variable."}},{"Name":"VARINFMT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat that is assigned to a SAS data set variable."}},{"Name":"VARLABEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the label that is assigned to a SAS data set variable."}},{"Name":"VARLEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the length of a SAS data set variable."}},{"Name":"VARNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of a SAS data set variable."}},{"Name":"VARNUM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the number of a variable's position in a SAS data set."}},{"Name":"VARRAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether the specified name is an array."}},{"Name":"VARRAYX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether the value of the specified argument is an array."}},{"Name":"VARTYPE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the data type of a SAS data set variable."}},{"Name":"VERIFY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the position of the first character in a string that is not in any of several \nother strings."}},{"Name":"VFORMAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format that is associated with the specified variable."}},{"Name":"VFORMATD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the decimal value of the format that is associated with the specified variable."}},{"Name":"VFORMATDX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the decimal value of the format that is associated with the value of the \nspecified argument."}},{"Name":"VFORMATN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format name that is associated with the specified variable."}},{"Name":"VFORMATNX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format name that is associated with the value of the specified argument."}},{"Name":"VFORMATW","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format width that is associated with the specified variable."}},{"Name":"VFORMATWX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format width that is associated with the value of the specified argument."}},{"Name":"VFORMATX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the format that is associated with the value of the specified argument."}},{"Name":"VINARRAY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether the specified variable is a member of an array."}},{"Name":"VINARRAYX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether the value of the specified argument is a member \nof an array."}},{"Name":"VINFORMAT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat that is associated with the specified variable."}},{"Name":"VINFORMATD","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the decimal value of the informat that is associated with the specified variable."}},{"Name":"VINFORMATDX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the decimal value of the informat that is associated with the value of the \nspecified variable."}},{"Name":"VINFORMATN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat name that is associated with the specified variable."}},{"Name":"VINFORMATNX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat name that is associated with the value of the specified argument."}},{"Name":"VINFORMATW","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat width that is associated with the specified variable."}},{"Name":"VINFORMATWX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat width that is associated with the value of the specified argument."}},{"Name":"VINFORMATX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the informat that is associated with the value of the specified argument."}},{"Name":"VLABEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the label that is associated with the specified variable."}},{"Name":"VLABELX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the label that is associated with the value of the specified argument."}},{"Name":"VLENGTH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the compile-time (allocated) size of the specified variable."}},{"Name":"VLENGTHX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the compile-time (allocated) size for the variable that has a name that is the \nsame as the value of the argument."}},{"Name":"VNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of the specified variable."}},{"Name":"VNAMEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Validates the value of the specified argument as a variable name."}},{"Name":"VTYPE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the type (character or numeric) of the specified variable."}},{"Name":"VTYPEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the type (character or numeric) for the value of the specified argument."}},{"Name":"VVALUE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the formatted value that is associated with the variable that you specify."}},{"Name":"VVALUEX","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the formatted value that is associated with the argument that you specify."}},{"Name":"WEEK","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the week-number value."}},{"Name":"WEEKDAY","Type":"SAS_FUNCTION","Help":{"#cdata":"From a SAS date value, returns an integer that corresponds to the day of the week."}},{"Name":"WHICHC","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches for a character value that is equal to the first argument, and returns the index \nof the first matching value."}},{"Name":"WHICHN","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches for a numeric value that is equal to the first argument, and returns the index \nof the first matching value."}},{"Name":"YEAR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the year from a SAS date value."}},{"Name":"YIELDP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the yield-to-maturity for a periodic cash flow stream, such as a bond."}},{"Name":"YRDIF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the difference in years between two dates."}},{"Name":"YYQ","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a SAS date value from year and quarter year values."}},{"Name":"ZIPCITY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a city name and the two-character postal code that corresponds to a zip code."}},{"Name":"ZIPCITYDISTANCE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the geodetic distance between two zip code locations."}},{"Name":"ZIPFIPS","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts zip codes to two-digit FIPS codes."}},{"Name":"ZIPNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts zip codes to uppercase state names."}},{"Name":"ZIPNAMEL","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts zip codes to mixed case state names."}},{"Name":"ZIPSTATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts zip codes to two-character state postal codes."}},{"Name":"ASCEBC","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts an input character string from ASCII to EBCDIC."}},{"Name":"EBCASC","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts an input character string from EBCDIC to ASCII."}},{"Name":"FILEATTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the attribute information for a specified file."}},{"Name":"FINDFILE","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches a directory for a file."}},{"Name":"GETDVI","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a specified item of information from a device."}},{"Name":"GETJPI","Type":"SAS_FUNCTION","Help":{"#cdata":"Retrieves job-process information."}},{"Name":"GETLOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns information about a DCL logical name."}},{"Name":"GETMSG","Type":"SAS_FUNCTION","Help":{"#cdata":"Translates an OpenVMS error code into text."}},{"Name":"GETQUOTA","Type":"SAS_FUNCTION","Help":{"#cdata":"Retrieves disk quota information."}},{"Name":"GETSYM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of a DCL symbol."}},{"Name":"GETTERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the characteristics of your terminal device."}},{"Name":"NODENAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of the current node."}},{"Name":"PUTLOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Creates an OpenVMS logical-name in your process-level logical name table."}},{"Name":"PUTSYM","Type":"SAS_FUNCTION","Help":{"#cdata":"Creates a DCL symbol in the parent SAS process."}},{"Name":"SETTERM","Type":"SAS_FUNCTION","Help":{"#cdata":"Modifies a characteristic of your terminal device."}},{"Name":"TERMIN","Type":"SAS_FUNCTION","Help":{"#cdata":"Allows simple input from SYS$INPUT."}},{"Name":"TERMOUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Allows simple output to SYS$OUTPUT."}},{"Name":"TTCLOSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Closes a channel that was previously assigned by TTOPEN."}},{"Name":"TTCONTRL","Type":"SAS_FUNCTION","Help":{"#cdata":"Modifies the characteristics of a channel that was previously assigned by TTOPEN."}},{"Name":"TTOPEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Assigns an I/O channel to a terminal."}},{"Name":"TTREAD","Type":"SAS_FUNCTION","Help":{"#cdata":"Reads characters from the channel assigned by TTOPEN."}},{"Name":"TTWRITE","Type":"SAS_FUNCTION","Help":{"#cdata":"Writes characters to the channel assigned by TTOPEN."}},{"Name":"VMS","Type":"SAS_FUNCTION","Help":{"#cdata":"Spawns a subprocess and executes a DCL command."}},{"Name":"BQUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Mask special characters and mnemonic operators in a resolved value at macro execution."}},{"Name":"NRBQUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Mask special characters and mnemonic operators in a resolved value at macro execution."}},{"Name":"EVAL","Type":"SAS_FUNCTION","Help":{"#cdata":"Evaluates arithmetic and logical expressions using integer arithmetic."}},{"Name":"NRQUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"Masks special characters, including & and %, and mnemonic operators in a resolved value \nat macro execution."}},{"Name":"STR","Type":"SAS_FUNCTION","Help":{"#cdata":"Masks special characters, excluding & and %, and mnemonic operators in constant text \nduring macro compilation."}},{"Name":"NRSTR","Type":"SAS_FUNCTION","Help":{"#cdata":"Masks special characters, including & and %, and mnemonic operators in constant text \nduring macro compilation."}},{"Name":"QSCAN","Type":"SAS_FUNCTION","Help":{"#cdata":"Searches for a word and masks special characters and mnemonic operators."}},{"Name":"SUPERQ","Type":"SAS_FUNCTION","Help":{"#cdata":"Masks all special characters and mnemonic operators at macro execution but prevents \nfurther resolution of the value."}},{"Name":"SYSEVALF","Type":"SAS_FUNCTION","Help":{"#cdata":"Evaluates arithmetic and logical expressions using floating-point arithmetic."}},{"Name":"SYSFUNC","Type":"SAS_FUNCTION","Help":{"#cdata":"Execute SAS functions or user-written functions."}},{"Name":"QSYSFUNC","Type":"SAS_FUNCTION","Help":{"#cdata":"Execute SAS functions or user-written functions. %QSYSFUNC masks special characters \nand mnemonic operators such as & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , # blank AND OR \nNOT EQ NE LE LT GE GT IN."}},{"Name":"SYSGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the value of the specified operating environment variable."}},{"Name":"UNQUOTE","Type":"SAS_FUNCTION","Help":{"#cdata":"During macro execution, unmasks all special characters and mnemonic operators \nfor a value."}},{"Name":"CMPRES","Type":"SAS_FUNCTION","Help":{"#cdata":"Compress multiple blanks and remove leading and trailing blanks."}},{"Name":"QCMPRES","Type":"SAS_FUNCTION","Help":{"#cdata":"Compress multiple blanks and remove leading and trailing blanks. QCMPRES produces \na result with special characters and mnemonic operators masked."}},{"Name":"COMPSTOR","Type":"SAS_FUNCTION","Help":{"#cdata":"Compiles macros and stores them in a catalog in a permanent SAS library."}},{"Name":"DATATYP","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the data type of a value."}},{"Name":"DQCASE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character value with standardized capitalization."}},{"Name":"DQGENDER","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a gender determination from the name of an individual."}},{"Name":"DQGENDERINFOGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of the parse definition that is associated with the specified \ngender definition."}},{"Name":"DQGENDERPARSED","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a gender determination from the parsed name of an individual."}},{"Name":"DQIDENTIFY","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a category name from a character value."}},{"Name":"DQLOCALEGUESS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of the locale that is most likely represented by a character value."}},{"Name":"DQLOCALEINFOGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns information about locales."}},{"Name":"DQLOCALEINFOLIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Displays the names of the definitions in a locale and returns a count of those definitions."}},{"Name":"DQMATCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a match code from a character value."}},{"Name":"DQMATCHINFOGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the name of the parse definition that is associated with a match definition."}},{"Name":"DQMATCHPARSED","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a match code from a parsed character value."}},{"Name":"DQPARSE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a parsed character value."}},{"Name":"DQPARSEINFOGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the token names in a parse definition."}},{"Name":"DQPARSETOKENGET","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a token from a parsed character value."}},{"Name":"DQPARSETOKENPUT","Type":"SAS_FUNCTION","Help":{"#cdata":"Inserts a token into a parsed character value and returns the updated parsed \ncharacter value."}},{"Name":"DQPATTERN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a pattern analysis from an input character value."}},{"Name":"DQSCHEMEAPPLY","Type":"SAS_FUNCTION","Help":{"#cdata":"Applies a scheme and returns a transformed value."}},{"Name":"DQSRVARCHJOB","Type":"SAS_FUNCTION","Help":{"#cdata":"Runs an dfPower Architect job on a DataFlux Integration Server and returns a job \nidentifier."}},{"Name":"DQSRVCOPYLOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Copies a job's log file from a DataFlux Integration Server."}},{"Name":"DQSRVDELETELOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Deletes a job's log file from a DataFlux Integration Server."}},{"Name":"DQSRVJOBSTATUS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the status of a job that was submitted to a DataFlux Integration Server."}},{"Name":"DQSRVKILLJOB","Type":"SAS_FUNCTION","Help":{"#cdata":"Terminates a job that is running on a DataFlux Integration Server."}},{"Name":"DQSRVPROFJOBFILE","Type":"SAS_FUNCTION","Help":{"#cdata":"Runs a file-type Profile job on a DataFlux Integration Server and returns a job \nidentifier."}},{"Name":"DQSRVPROFJOBREP","Type":"SAS_FUNCTION","Help":{"#cdata":"Runs a repository-type Profile job on a DataFlux Integration Server and returns \na job identifier."}},{"Name":"DQSRVUSER","Type":"SAS_FUNCTION","Help":{"#cdata":"Authenticates a user on a DataFlux Integration Server."}},{"Name":"DQSTANDARDIZE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a character value after standardizing casing, spacing, and format, and \napplies a common representation to certain words and abbreviations."}},{"Name":"DQTOKEN","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a token from a character value."}},{"Name":"EFFRATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the effective annual interest rate.\n \nSyntax:\nEFFRATE(compounding-interval, rate) \n\nRequired Arguments:\ncompounding-interval \n is a SAS interval. This value represents how often rate compounds. \n\nrate \n is numeric. rate is a nominal annual interest rate (expressed as a percentage) that \n is compounded at each compounding interval."}},{"Name":"MVALID","Type":"SAS_FUNCTION","Help":{"#cdata":"Checks the validity of a character string for use as a SAS member name.\n \nSyntax:\nMVALID(libname, string, memtype<,validmemname>) \n\nRequired Arguments:\nlibname \n specifies a character constant, variable, or expression that associates a SAS library \n with a libref. Leading and trailing blanks are ignored. \nstring \n specifies a character constant, variable, or expression that is checked to determine \n whether its value can be used as a SAS member name. Leading and trailing blanks are ignored. \nmemtype \n specifies a character constant, variable, or expression that is the member type of the \n member name that you are using. Leading and trailing blanks are ignored. The value of \n memtype is not validated. The following member types are available: \n\n ACCESS specifies access descriptor files that are created by SAS/ACCESS. \n CATALOG specifies SAS catalogs. \n DATA specifies SAS data files. \n FDB specifies a financial database. \n ITEMSTOR specifies a SAS data set that consists of pieces of information that can be \n accessed independently. The SAS Registry is an example of an item store. \n MDDB specifies a multidimensional database. \n PROGRAM specifies stored compiled SAS programs. \n VIEW specifies SAS views. \n\nOptional Argument:\nvalidmemname \n specifies a character constant, variable, or expression. The values for validmemname can \n be uppercase or lowercase. Leading and trailing blanks are ignored. The following list \n contains the values that you can use with validmemname: \n COMPAT | COMPATIBLE\n EXTEND \n Default: VALIDMEMNAME= is set to COMPAT."}},{"Name":"NOMRATE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the nominal annual interest rate.\n \nSyntax:\nNOMRATE(compounding-interval, rate) \n\nRequired Arguments:\ncompounding-interval \n is a SAS interval. This value represents how often the returned value is compounded. \nrate \n is numeric. rate is the effective annual interest rate (expressed as a percentage) \n that is compounded at each interval."}},{"Name":"SAVINGS","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the balance of a periodic savings by using variable interest rates.\n \nSyntax:\nSAVINGS(base-date, initial-deposit-date, deposit-amount, deposit-number, \ndeposit-interval, compounding-interval, date-1, rate-2 <,date-2, rate-2,...>) \n\nRequired Arguments: \nbase-date \n is a SAS date. The value that is returned is the balance of the savings at base-date. \ninitial-deposit-date \n is a SAS date. initial-deposit-date is the date of the first deposit. Subsequent deposits \n are at the beginning of subsequent deposit intervals. \ndeposit-amount \n is numeric. All deposits are assumed constant. deposit-amount is the value of each deposit. \ndeposit-number \n is a positive integer. deposit-number is the number of deposits. \ndeposit-interval \n is a SAS interval. deposit-interval is the frequency at which deposits are made. \ncompounding-interval \n is a SAS interval. compounding-interval is the compounding interval. \ndate \n is a SAS date. Each date is paired with a rate. date is the time that rate takes effect. \nrate \n is a numeric percentage. Each rate is paired with a date. rate is the interest rate that \n starts on date."}},{"Name":"SOAPWEB","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a Web service by using basic Web authentication; credentials are provided in the arguments.\n \nSyntax:\nSOAPWEB (IN, URL <,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request. \nURL \n specifies a character value that is the URL of the Web service endpoint. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWEBUSERNAME \n specifies a character value that is a user name for either basic or NTLM Web authentication. \nWEBPASSWORD \n specifies a character value that is a password for either basic or NTLM Web authentication. \n Encodings that are produced by PROC PWENCODE are supported. \nWEBDOMAIN \n specifies a character value that is the domain or realm for the user name and password for NTLM authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging logging output."}},{"Name":"SOAPWEBMETA","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a Web service by using basic Web authentication; credentials for the authentication \ndomain are retrieved from metadata. \n\nSyntax:\nSOAPWEBMETA (IN, URL <,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request. \nURL \n specifies a character value that is the URL of the Web service endpoint. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWEBAUTHDOMAIN \n specifies a character value that is the authentication domain from which to retrieve a user \n name and password from metadata for basic Web authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging logging output."}},{"Name":"SOAPWIPSERVICE","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a SAS registered Web service by using WS-Security authentication; credentials \nare provided in the arguments.\n\nSyntax:\nSOAPWIPSERVICE (IN, SERVICE <,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request. \nSERVICE \n specifies the service name of the endpoint service as the service is stored in the Service Registry. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password for WSSUSERNAME. \n Encodings that are produced by PROC PWENCODE are supported. \nENVFILE \n specifies a character value that is the location of the SAS environments file. \nENVIRONMENT \n specifies a character value that is the environment defined in the SAS environments file to use. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging logging output."}},{"Name":"SOAPWIPSRS","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a SAS registered Web service by using WS-Security authentication; credentials \nare provided in the arguments.\n\nSyntax:\nSOAPWIPSRS (IN, URL, SRSURL<,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains \n the SOAP request. \nURL \n specifies a character value that is the URL of the Web service endpoint. \nSRSURL \n specifies a character value that is the URL of the System Registry Service. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password for WSSUSERNAME. \n Encodings that are produced by PROC PWENCODE are supported. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set \n time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging \n logging output."}},{"Name":"SOAPWS","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a Web service by using WS-Security authentication; credentials are provided \nin the arguments. \n\nSyntax:\nSOAPWS (IN, URL<,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request. \nURL \n specifies a character value that is the URL of the Web service endpoint. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSUSERNAME \n specifies a character value that is a WS-Security user name. \nWSSPASSWORD \n specifies a character value that is a WS-Security password, which is the password for WSSUSERNAME. \n Encodings that are produced by PROC PWENCODE are supported. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging logging output."}},{"Name":"SOAPWSMETA","Type":"SAS_FUNCTION","Help":{"#cdata":"Calls a Web service by using WS-Security authentication; credentials for the provided \nauthentication domain are retrieved from metadata.\n\nSyntax: \nSOAPWSMETA (IN, URL <,options>) \n\nRequired Arguments:\nIN \n specifies a character value that is the fileref. IN is used to input XML data that contains the SOAP request. \nURL \n specifies a character value that is the URL of the Web service endpoint. \n\nOptional Arguments:\nOUT \n specifies a character value that is the fileref where the SOAP response output XML will be written. \nSOAPACTION \n specifies a character value that is a SOAPAction element to invoke on the Web service. \nWSSAUTHDOMAIN \n specifies a character value that is the authentication domain for which to retrieve credentials \n to be used for WS-Security authentication. \nMUSTUNDERSTAND \n specifies a numeric value that is the setting for the mustUnderstand attribute in the SOAP header. \nPROXYPORT \n specifies a numeric value that is an HTTP proxy server port. \nPROXYHOST \n specifies a character value that is an HTTP proxy server host. \nPROXYUSERNAME \n specifies a character value that is an HTTP proxy server user name. \nPROXYPASSWORD \n specifies a character value that is an HTTP proxy server password. Encodings that are produced \n by PROC PWENCODE are supported. \nCONFIGFILE \n specifies a character value that is a Spring configuration file that is used primarily to set time-out values. \nDEBUG \n specifies a character value that is the full path to a file that is used for debugging logging output."}},{"Name":"SQUANTILE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the quantile from a distribution when you specify the right probability (SDF). \n\nSyntax:\n SQUANTILE(dist, probability, parm-1, ... , parm-k) \n\nRequired Arguments \ndist \n is a character constant, variable, or expression that identifies the distribution. \n Valid distributions are as follows: \n Bernoulli BERNOULLI \n Beta BETA \n Binomial BINOMIAL \n Cauchy CAUCHY \n Chi-Square CHISQUARE \n Exponential EXPONENTIAL \n F F \n Gamma GAMMA \n Generalized Poisson GENPOISSON \n Geometric GEOMETRIC \n Hypergeometric HYPERGEOMETRIC \n Laplace LAPLACE \n Logistic LOGISTIC \n Lognormal LOGNORMAL \n Negative binomial NEGBINOMIAL \n Normal NORMAL|GAUSS \n Normal mixture NORMALMIX \n Pareto PARETO \n Poisson POISSON \n T T \n Tweedie TWEEDIE \n Uniform UNIFORM \n Wald (inverse Gaussian) WALD|IGAUSS \n Weibull WEIBULL \n\nprobability \n is a numeric constant, variable, or expression that specifies the value of a random variable. \nparm-1,\u2026,parm-k \n are optional shape, location, or scale parameters that are appropriate for the specific distribution."}},{"Name":"SYSEXIST","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether an operating-environment variable exists \nin your environment.\n\nSyntax:\nSYSEXIST (argument) \n\nRequired Argument:\nargument \n specifies a character variable that is the name of an operating-environment variable that \n you want to test."}},{"Name":"TIMEVALUE","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the equivalent of a reference amount at a base date by using variable \ninterest rates.\n \nSyntax: \nTIMEVALUE(base-date, reference-date, reference-amount, compounding-interval,\n date-1, rate-1 <,date-2, rate-2,...>) \n\nRequired Arguments:\nbase-date \n is a SAS date. The value that is returned is the time value of reference-amount at base-date. \nreference-date \n is a SAS date. reference-date is the date of reference-amount. \nreference-amount \n is numeric. reference-amount is the amount at reference-date. \ncompounding-interval \n is a SAS interval. compounding-interval is the compounding interval. \ndate \n is a SAS date. Each date is paired with a rate. date is the time that rate takes effect. \nrate \n is a numeric percentage. Each rate is paired with a date. rate is the interest \n rate that starts on date."}},{"Name":"INVCDF","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n\nComputes the quantile from any distribution for which you have defined a cumulative \ndistribution function (CDF).\n\nSyntax:\nquantile=INVCDF('CDF-function-name', options-array, cumulative-probability, \nparameter-1, parameter-2, ..., parameter-n); \n\nRequired Arguments:\nquantile \n specifies the quantile that is returned from the INVCDF function. \n'CDF-function-name' \n specifies the name of the CDF function. Enclose CDF-function-name in quotation marks. \n\n Requirement:CDF-function-name must be a function defined using the FCMP procedure. It must \n have a signature as follows: \n function (x, parameter-1, parameter-2, \u2026, parameter-n);\n endsub;\n \noptions-array \n specifies an array of options to use with the INVCDF function. Options-array is used to \n control and monitor the process of inverting the CDF. Options-array can be a missing value (.), \n or it can have up to four of the following elements in the following order: \n initial-value \n specifies the initial guess for the quantile at which the inversion process starts. This is \n useful when you have an idea of the approximate value for quantile. The default for initial-value is 0.1. \n desired-accuracy \n specifies the desired relative accuracy of the quantile. You can specify any value in the range (0,0.1).\n The default for desired-accuracy is 1.0e-8.\n domain-type \n specifies the domain for the CDF function. A missing value or a value of 0 indicates a nonnegative \n support, that is [0,\u221e). Any other value indicates a support over the entire real line, that is (-\u221e,\u221e). \n The default for domain-type is 0. \n return-code \n specifies the return status. If options-array is of dimension 4 or more, then the fourth element contains \n the return status. Return-code can have one of the following values: \n <=0 \n indicates success. If negative, then the absolute value is the number of times the CDF function was \n evaluated in order to compute the quantile. A larger absolute value indicates longer convergence time. \n 1 \n indicates that the quantile could not be computed. \ncumulative-probability \n specifies the cumulative probability value for which the quantile is desired. This must be in the range [0,1). \nparameters \n specifies the parameters of the distribution at which the quantile is desired. You must specify exactly the \n same number of parameters as required by the specified CDF function, and they should appear exactly in the \n same order as required by the specified CDF function."}},{"Name":"ISNULL","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n\nDetermines whether a pointer element of a structure is null.\n\nSyntax:\nnumeric-variable = ISNULL(pointer-element); \n\nRequired Arguments:\nnumeric-variable \n specifies a numeric value. \npointer-element \n specifies a variable that contains the address of another variable."}},{"Name":"LIMMOMENT","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n\nComputes the limited moment of any distribution for which you have defined a cumulative distribution function (CDF). \n\nSyntax:\nimom=LIMMOMENT('CDF-function-name', options-array, order, limit, \n\nparameter-1, parameter-2, parameter-n); \nRequired Arguments \nimom \n specifies the limited moment that is returned from the LIMMOMENT function.\n'CDF-function-name' \n specifies the name of the CDF function. Enclose CDF-function-name in quotation marks. \n\n Requirement:CDF-function-name must be a function defined using the FCMP procedure. It must \n have a signature as follows: \n function (x, parameter-1, parameter-2, \u2026, parameter-n);\n endsub;\n \noptions-array \n specifies an array of options to use with the LIMMOMENT function. Options-array is used to \n control and monitor the process of inverting the CDF. Options-array can be a missing value (.), \n or it can have up to four of the following elements in the following order: \n initial-value \n specifies the initial guess for the quantile at which the inversion process starts. This is \n useful when you have an idea of the approximate value for quantile. The default for initial-value is 0.1. \n desired-accuracy \n specifies the desired relative accuracy of the quantile. You can specify any value in the range (0,0.1).\n The default for desired-accuracy is 1.0e-8.\n domain-type \n specifies the domain for the CDF function. A missing value or a value of 0 indicates a nonnegative \n support, that is [0,\u221e). Any other value indicates a support over the entire real line, that is (-\u221e,\u221e). \n The default for domain-type is 0. \n return-code \n specifies the return status. If options-array is of dimension 4 or more, then the fourth element contains \n the return status. Return-code can have one of the following values: \n <=0 \n indicates success. If negative, then the absolute value is the number of times the CDF function was \n evaluated in order to compute the quantile. A larger absolute value indicates longer convergence time. \n 1 \n indicates that the quantile could not be computed. \norder \n specifies the order of the desired limited moment. This value must be in the range [1,10]. \nlimit \n specifies the upper limit that is used to compute the desired limited moment. This value must be greater than 0. \nparameters \n specifies the parameters of the distribution at which the limited moment is desired. You must specify exactly \n the same number of parameters as required by the specified CDF function, and they should appear exactly in \n the same order as required by the specified CDF function."}},{"Name":"READ_ARRAY","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n \nReads data from a SAS data set into a PROC FCMP array variable.\n\nSyntax:\nrc = READ_ARRAY(data_set_name, array_variable <, 'col_name_1', ..., 'col_name_n'>); \n\nRequired Arguments:\nrc \n is 0 if the function is able to successfully read the data set. \ndata_set_name \n specifies the name of the data set from which the array data will be read. data_set_name must be \n a character literal or variable that contains the member name (libname.memname) of the data set to \n be read from. \narray_variable \n specifies the PROC FCMP array variable into which the data is read. array_variable must be a local \n temporary array variable because the function might need to grow or shrink its size to accommodate \n the size of the data set. \n\nOptional Argument:\ncol_name \n specifies optional names for the specific columns of the data set that will be read. \n If specified, col_name must be a literal string enclosed in quotation marks. col_name cannot be a \n PROC FCMP variable. If column names are not specified, PROC FCMP reads all of the columns in the data set."}},{"Name":"RUN_MACRO","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n\nExecutes a predefined SAS macro.\n\nSyntax:\nrc = RUN_MACRO('macro_name' <, variable_1, ..., variable_n>); \n\nRequired Arguments:\nrc \n is 0 if the function is able to submit the macro. The return code indicates only that the \n macro call was attempted. The macro itself should set the value of a SAS macro variable that \n corresponds to a PROC FCMP variable to determine whether the macro executed as expected. \nmacro_name \n specifies the name of the macro to be run. \n Requirement:macro_name must be a string enclosed in quotation marks or a character variable \n that contains the macro to be executed. \n\nOptional Argument:\nvariable \n specifies optional PROC FCMP variables, which are set by macro variables of the same name. \n These arguments must be PROC FCMP double or character variables. \n \n Before SAS executes the macro, SAS macro variables are defined with the same name and value \n as the PROC FCMP variables. After SAS executes the macro, the macro variable values are copied \n back to the corresponding PROC FCMP variables."}},{"Name":"RUN_SASFILE","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n \nSyntax \nrc = RUN_SASFILE('fileref_name' <, variable-1, ..., variable-n>); \n\nRequired Arguments:\nrc \n is 0 if the function is able to submit a request to execute the code that processes the SAS file. \n The return code indicates only that the call was attempted. \nfileref_name \n specifies the name of the SAS fileref that points to the SAS code. \n Requirement:fileref_name must be a string enclosed in quotation marks or a character variable \n that contains the name of the SAS fileref. \n\nOptional Argument:\nvariable \n specifies optional PROC FCMP variables that will be set by macro variables of the same name. \n These arguments must be PROC FCMP double or character variables. \n \n Before SAS executes the code that references the SAS file, the SAS macro variables are defined \n with the same name and value as the PROC FCMP variables. After execution, these macro variable \n values are copied back to the corresponding PROC FCMP variables."}},{"Name":"SOLVE","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n \nComputes implicit values of a function.\n\nSyntax:\nanswer = SOLVE('function-name', options-array, expected-value, argument-1, ..., argument-n); \n\nRequired Arguments:\nanswer \n specifies the value that is returned from the SOLVE function. \n'function-name' \n specifies the name of the function. Enclose function-name in quotation marks. \noptions-array \n specifies an array of options to use with the SOLVE function. Options-array is used to control and \n monitor the root-finding process. Options-array can be a missing value (.), or it can have up to five \n of the following elements in the following order: \n initial-value \n specifies the starting value for the implied value. The default for the first call is 0.001. If \n the same line of code is executed again, then options-array uses the previously found implied value. \n absolute-criterion \n specifies a value for convergence. The absolute value of the difference between the expected value \n and the predicted value must be less than the value of absolute-criterion for convergence. \n Default:1.0e\u201312 \n relative-criterion \n specifies a value for convergence. When the change in the computed implied value is less than the \n value of relative-criterion, then convergence is assumed. \n Default:1.0e\u20136 \n maximum-iterations \n specifies the maximum number of iterations to use to find the solution. \n Default:100 \n solve-status \n can be one of the following values: \n 0 successful. \n 1 could not decrease the error. \n 2 could not compute a change vector. \n 3 maximum number of iterations exceeded. \n 4 initial objective function is missing. \nexpected-value \n specifies the expected value of the function of interest. \nargument \n specifies the arguments to pass to the function that is being minimized."}},{"Name":"WRITE_ARRAY","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid for PROC FCMP only!]\n \nSyntax:\nrc = WRITE_ARRAY(data_set_name, array_variable <, 'col_name_1', ..., 'col_name_n'>); \n\nRequired Arguments:\nrc \n is 0 if the function is able to successfully write the data set. \ndata_set_name \n specifies the name of the data set to which the array data will be written. data_set_name must \n be a character literal or variable that contains the member name (libname.memname) of the data \n set to be created. \narray_variable \n specifies the PROC FCMP array or matrix variable whose contents will be written to data_set_name. \n\nOptional Argument:\ncol_name \n specifies optional names for the columns of the data set that will be created. \n If specified, col_name must be a literal string enclosed in quotation marks. col_name cannot be \n a PROC FCMP variable. If column names are not specified, the column name will be the array name \n with a numeric suffix."}},{"Name":"GRDSVC_ENABLE","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid in: %SYSFUNC or %QSYSFUNC Macro, DATA step]\n \nEnables or disables one or all SAS sessions on a grid. \n\nSyntax:\ngrdsvc_enable(identifier <, option-1; ... option-n> ) \ngrdsvc_enable(identifier,\"\" | \" ) \n\nRequired Argument:\nidentifier \n specifies one or all server sessions to be enabled or disabled for grid execution. The identifier \n is specified as follows: \n \n server-ID \n specifies the name of a SAS/CONNECT server session to be enabled or disabled for grid execution. \n _ALL_ \n specifies that all SAS sessions are enabled or disabled for grid execution. \n\nOptional Arguments:\nSASAPPSERVER=server-value | SERVER=server-value | RESOURCE=server-value\n specifies the name of a SAS Application Server that has been defined in the SAS Metadata Repository. \n The SAS Application Server contains the definition for the logical grid server that defines the grid environment. \n\nWORKLOAD=workload-value \nidentifies the resource for the job to be executed on the grid. This value specifies an additional \nresource requirement for which Platform Suite for SAS selects the appropriate grid nodes.\n\nJOBNAME=job-name-macro-variable \nspecifies the macro variable that contains the name that is assigned to the job that is executed on the grid. \n\nJOBOPTS=job-opts-macro-variable \n specifies the macro variable that contains the job options. The job option name/value pairs are \n assigned to job-opts-macro-variable. \n\n\"\" | \" \ndisables grid execution for the specified server ID or all server sessions."}},{"Name":"GRDSVC_GETADDR","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid in: %SYSFUNC or %QSYSFUNC Macro, DATA step] \n \nReports the IP address of the grid node on which the SAS session was chosen to execute. \n \nSyntax:\ngrdsvc_getaddr(identifier)\n\nRequired Argument:\nidentifier \n identifies the server session that is executing on the grid. The identifier can be specified \n as follows: \n\n \"\"| \" \n is an empty string that is used to refer to the computer on which the function is executing. \n \n server-ID \n specifies the server session that is executing on a grid."}},{"Name":"GRDSVC_GETINFO","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid in: %SYSFUNC or %QSYSFUNC Macro, DATA step] \n \nReports information about the grid environment.\n\nSyntax:\ngrdsvc_getinfo(identifier)\n\nRequired Argument:\nidentifier \n specifies the server session or the SAS Application Server whose details you want to have reported \n to the SAS log. The identifier is specified as follows: \n \n server-ID \n reports details about the specified server ID. The details that are returned by the GRDSRV_INFO \n function reflect the arguments that are specified in the GRDSVC_ENABLE function. \n Requirement:A server-ID cannot exceed eight characters. \n \n _ALL_ \n reports details about all server IDs to the SAS log. The details that are returned by the \n GRDSRV_INFO function reflect the arguments that are specified in the GRDSVC_ENABLE function. \n \n SASAPPSERVER=SAS-application-server | SERVER=SAS-application-server | SERVER=SAS-application-server\n reports information about the specified SAS Application Server to the SAS log. \n \n _SHOWID_ \n lists each server session and its status: enabled for grid execution, enabled for SMP execution, or disabled."}},{"Name":"GRDSVC_GETNAME","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid in: %SYSFUNC or %QSYSFUNC Macro, DATA step] \n \nReports the name of the grid node on which the SAS grid server session was chosen to execute. \n\nSyntax:\ngrdsvc_getname(identifier)\n\nRequired Argument:\nidentifier \n identifies the server session that is executing on the grid. The identifier can be specified as follows: \n\n \"\" | \" \n is an empty string that is used to refer to the computer at which the statement is executed. \n\n server-ID \n specifies the server session that is executing on a grid. \n You use the same server-ID that you used to sign on to a server session using the RSUBMIT \n statement or the SIGNON statement.\n \n If the function is used in a DATA step, enclose server-ID in double or single quotation marks"}},{"Name":"GRDSVC_NNODES","Type":"SAS_FUNCTION","Help":{"#cdata":"[Valid in: %SYSFUNC or %QSYSFUNC Macro, DATA step] \n \nReports the total number of job slots that are available for use on a grid. \n\nSyntax:\ngrdsvc_nnodes(argument;option) \n\nRequired Argument:\n SASAPPSERVER=SAS-application-server | SERVER=SAS-application-server | RESOURCE=SAS-application-server\n specifies the name of the SAS Application Server that has been defined in the SAS Metadata Repository. \n\nOptional Argument:\n WORKLOAD=workload-value \n identifies the resource for the type of job to be executed on the grid. This value specifies the \n workload requirements for which Platform Suite for SAS selects the grid nodes that contain these \n resources. \n \n The specified workload value should match one of the workload values that is defined in the \n SAS Application Server in the SAS Metadata Repository. \n \n Requirement:If you specify WORKLOAD=, you must also specify the SASAPPSERVER= option. Workload \n values are case sensitive."}},{"Name":"COT","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the cotangent. \n \nSyntax: COT(argument)\nRequired Argument:\nargument\n specifies a numeric constant, variable, or expression and is expressed in radians.\n\n Restriction: argument cannot be 0 or a multiple of PI."}},{"Name":"CSC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the cosecant. \n \nSyntax: CSC(argument) \n\nRequired Argument:\nargument\n specifies a numeric constant, variable, or expression and is expressed in radians.\n \n Restriction: argument cannot be 0 or a multiple of PI."}},{"Name":"DOSUBL","Type":"SAS_FUNCTION","Help":{"#cdata":"Imports macro variables from the calling environment, and exports macro variables back to the calling environment. \n \nSyntax: DOSUBL(x)\nRequired Argument: \nx\n specifies a text string.\n \nDetails:\nThe DOSUBL function enables the immediate execution of SAS code after a text string is passed. \nMacro variables that are created or updated during the execution of the submitted code are exported \nback to the calling environment. \n\nDOSUBL returns a value of zero if SAS code was able to execute, and returns a nonzero value if SAS \ncode was not able to execute."}},{"Name":"FCOPY","Type":"SAS_FUNCTION","Help":{"#cdata":"Copies records from one fileref to another fileref, and returns a value that indicates whether the \nrecords were successfully copied. \n\nSyntax: FCOPY('fileref-1', 'fileref-2')\nRequired Arguments:\n'fileref-1'\n specifies an existing fileref from which records are to be copied.\n'fileref-2'\n specifies an existing fileref to which records are to be copied.\n\nDetails:\nValues That Are Returned by the FCOPY Function\n FCOPY returns these values:\n \u2022a value of 0 if records were copied without errors or warnings\n \u2022a positive value if an error occurred\n \u2022a negative value if a warning was issued\n You can use the SYSMSG function to retrieve error or warning messages, and you can use the SYSRC \n function to retrieve the return code.\n\nUsing Macro Variables with the FCOPY Function\n The following macro variables provide information for the FCOPY function:\n \u2022The &SYSCC and &SYSERR macro variables are set if FCOPY writes an error or warning message to the log.\n \u2022The &SYSCC and &SYSERR macro variables are not set if FCOPY returns a warning return code and there \n is no log output from FCOPY.\n \u2022The &SYSERRORTEXT macro variable is set if FCOPY writes an error message to the log.\n \u2022The &SYSWARNINGTEXT macro variable is set if FCOPY writes a warning message to the log."}},{"Name":"SEC","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the secant. \n \nSyntax: SEC(argument)\n\nRequired Argument:\nargument\n specifies a numeric constant, variable, or expression and is expressed in radians.\n\n Restriction: argument cannot be an odd multiple of PI/2."}},{"Name":"TYPEOF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns a value that indicates whether the argument is character or numeric.\n\nRestriction:\nThe TYPEOF function is used exclusively with the Graph Template Language (GTL) and in WHERE clauses, \nbut not in DATA steps.\n\nSyntax: TYPEOF(column) \n\nRequired Argument:\ncolumn\n can have one of the following values:\n C\n indicates that the argument is a character value.\n N\n indicates that the argument is a numeric value."}},{"Name":"TZONEID|TZID","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current time zone ID.\n\nAlias: TZID \n\nSyntax: TZID=TZONEID() \n\nDetails:\nThe TZONEID function returns a blank value is the TIMEZONE= option is blank or a user-defined time zone is specified."}},{"Name":"TZONENAME","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the current standard or daylight savings time, time zone name.\n\nSyntax: TZONENAME() | TZONENAME\n\nOptional Argument: \ntime-zone-id\n specifies a region/area value that is defined by SAS. When you specify a zone ID, the time zone that SAS uses \n is determined by time zone name and daylight savings time rules.\n\nDetails:\nThe TZONENAME function returns a blank value if the TIMEZONE= option is blank."}},{"Name":"TZONEOFF","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the user time zone offset.\n\nSyntax: TZONEOFF() | TZONEOFF()\n\nOptional Arguments:\ntime-zone-id\n specifies a region/area value that is defined by SAS. When you specify a time zone ID, the time zone \n that SAS uses is determined by time zone name and daylight savings time rules."}},{"Name":"TZONES2U","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts a SAS date time value to a UTC date time value. \n \nSyntax: TZONES2U \n\nOptional Arguments: \ndatetime \n specifies a SAS datetime value. \ntime-zone-name\n specifies a predefined time zone. Predefined time zone names take into consideration standard and daylight saving \n time, and rules for daylight savings time for that time zone."}},{"Name":"TZONEU2S","Type":"SAS_FUNCTION","Help":{"#cdata":"Converts a UTC date time value to a SAS date time value. \n \nSyntax: TZONEU2S \n\nOptional Argument:\ntime-zone-ID\n specifies a region/area value that is defined by SAS. When you specify a zone ID, the time zone that \n SAS uses is determined by time zone name and daylight savings time rules.Note:Time zone IDs are compatible \n with Java time zone names."}},{"Name":"SHA256","Type":"SAS_FUNCTION","Help":{"#cdata":"Returns the result of the message digest of a specified string.\n\nSyntax: SHA256(string) \n\nRequired Argument:\nstring\n specifies a character constant, variable, or expression.\n\nDetails:\n\nThe Basics\n The SHA256 function converts a string, based on the SHA256 algorithm, to a 256-bit hash value. \n\n The SHA256 function does not format its own output. Use the $BINARYw. or $HEXw. formats to view readable results.\n\n z/OS Specifics\n In the z/OS operating environment, because the SHA256 function might be operating on EBCDIC data, the message \n digest is different from the ASCII equivalent. For example, SHA256('ABC') on an EBCDIC system means that SHA256 \n receives the bytes 'C1C2C3'x and the digest is 5202BF40821662BF1AD7D9C9B558056775D9D6BF8AA1C00492BCA8556B02772F, \n whereas on an ASCII system, 'ABC' is '414243'x and the digest is \n B5D4045C3F466FA91FE2CC6ABE79232A1A57CDF104F7A26E716E0A1E2789DF78."}},{"Name":"CLIBEXIST","Type":"CAS_FUNCTION","Help":{"#cdata":"Syntax: CLIBEXIST(session name,caslib name)\n \nReturns 0 when the specified caslib name is not found and 1 when the caslib is found. \n\nArguments:\nsession name\n a valid session name\ncaslib name\n a valid caslib name."}},{"Name":"GETCASURL","Type":"CAS_FUNCTION","Help":{"#cdata":"The SAS function GETCASURL returns the URL value for connecting to the CAS Server Monitor \nfor a CAS server. This function takes no parameters. \n\nRequirements: \no The server name identified by the SAS CASHOST= option is used when constructing the URL. \n For example, \"rdcgrd001.unx.sas.com\". \n \no The SAS SESSREF= option identifies a connection to the server identified by CASHOST=. \n This connection is used to obtain additional URL information. \n\nExample:\n%put httpaddr= %sysfunc(getcasurl());\nhttp://rdcgrd001.unx.sas.com:38281"}},{"Name":"GETLCASLIB","Type":"CAS_FUNCTION","Help":{"#cdata":"Syntax: GETLCASLIB(libref)\n \nReturns the caslib that was bound to a CAS LIBNAME engine libref in the CASLIB= option when it was assigned. \n\nNote:\nIf a caslib is not bound, then the active caslib is returned.\n \nArgument:\nlibref\n specifies the caslib name that is associated with the library reference. "}},{"Name":"GETLSESSREF","Type":"CAS_FUNCTION","Help":{"#cdata":"Syntax: GETLSESSREF (libref) \n\nReturns the session reference that is associated with a CAS LIBNAME engine libref. \n\nArgument:\nlibref\n specifies the session reference name."}},{"Name":"GETLTAG","Type":"CAS_FUNCTION","Help":{"#cdata":"Syntax: GETLTAG(libref) \n\nReturns the tag that was associated with a CAS LIBNAME engine libref in the TAG= option when it is assigned. \n\nNotes:\nIf a tag was not associated, a zero-length string (\"\") is returned. \nThe TAG= option is rarely used. It is useful after loading a server-side file into memory from \na caslib that enables access to subdirectories with CASL. \n\nArgument:\nlibref\nspecifies the tag that is associated with the library reference. "}},{"Name":"SESSFOUND","Type":"CAS_FUNCTION","Help":{"#cdata":"The SAS function SESSFOUND returns 0 when not found and 1 when the session is found. This function only \nhas access to sessions connected using SAS Client interfaces. To return a full set of sessions known \nto the CAS server use Proc CAS and the \"listsessions\" action or the CAS statement. \n\n CAS mySess LISTSESSIONS ;\n\nThe SESSFOUND function has one parameter session name. The result is 0 for not found and 1 for found. \n\nExample:\n\n%put doIExist= %sysfunc(sessfound(mysess));\ndoIExist= 0\n \n%put doIExist= %sysfunc(sessfound(existingSession));"}},{"Name":"GETSESSOPT","Type":"CAS_FUNCTION","Help":{"#cdata":"The SAS function GETSESSOPT returns the value for a Cloud Analytic Services (CAS) session option.\n \nEach CAS session has a set of server-side session options. \n\nThe GETSESSOPT function has two parameters: \n a session name. \n a session option name. You can use CAS mysess LISTSESSOPTS; to list the session option names or read \n them from the CASSESSOPTS= system option documentation.\n\nExample: List the active caslib\n\nSpecify code like the following to return the value of the CASLIB option. \n\n%put caslib = %sysfunc(GETSESSOPT(mysess, caslib)) ;\n \ndata work.one ; \n x = GETSESSOPT(\"mysess\", \"caslib\") ; \n put x= ;\nrun;"}},{"Name":"ISDOUBLE","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is double; otherwise, it returns false.\n \n Boolean isDouble (value);"}},{"Name":"ISINTEGER","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is integer; otherwise, it returns false.\n \n Boolean isInteger (value);"}},{"Name":"ISDICTIONARY","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is dictionary; otherwise, it returns false.\n \n Boolean isDictionary (value);"}},{"Name":"ISARRAY","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is array; otherwise, it returns false.\n \n Boolean isArray (value);"}},{"Name":"ISTABLE","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is table; otherwise, it returns false.\n \n Boolean isTable (value);"}},{"Name":"ISLIST","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is list; otherwise, it returns false.\n \n Boolean isList (value);"}},{"Name":"ISSTRING","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is string; otherwise, it returns false.\n \n Boolean isString (value);"}},{"Name":"ISBLOB","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns true if the type of value (parameter) is blob; otherwise, it returns false.\n \n Boolean isBlob (value);"}},{"Name":"ISTYPE","Type":"CAS_FUNCTION","Help":{"#cdata":"This is a generic version where the type is specified as the first argument.\n \nisType( \"\", value);"}},{"Name":"NEWTABLE","Type":"CAS_FUNCTION","Help":{"#cdata":"Creates a new table. \n \n o 1st argument is a list of column names\n o 2nd argument is a list of types for each column\n o any further arguments are rows to be added to the table \n o A table with the given rows is returned. No rows are required.\n\nExample:\n columns = {\"make\", \"MSRP\", \"HP\", \"cylinders\"};\n coltypes = {\"varchar\", \"int64\", \"integer\",\"int64\"};\n row1 = {\"dodge\", 20000, 250, 4};\n row2 = {\"ford\", 30000, 200, 6};\n table = newtable( \"cars\", columns, coltypes, row1, row2,...};\n \nThe name of the table can be specified as the first argument, but is not required. The default name is \"nodeList\"."}},{"Name":"ADD_TABLE_ATTR","Type":"CAS_FUNCTION","Help":{"#cdata":"The ADD_TABLE_ATTR adds attributes to a table. The first parameter is the table. Then pairs of values are specified as the key and value. \n\n rc = add_table_attr( table, \"Actionset\",\"tkimstat\", \"Action\",\"Summary\");\n\nYou may print the attributes of a table as \n\n print table.attr;"}},{"Name":"DISCARD","Type":"CAS_FUNCTION","Help":{"#cdata":"Discards the variables that are listed as arguments:\n \nx[10] = 1;\ny = 2;\ndiscard(x,y);"}},{"Name":"TABCOLUMNS","Type":"CAS_FUNCTION","Help":{"#cdata":"Gets the columns for a table:\n \n columns = tabcolumns( table);"}},{"Name":"TABTYPES","Type":"CAS_FUNCTION","Help":{"#cdata":"Gets the types for a table.\n \n coltypes = tabtypes( table);\n\nThis and the TABCOLUMNS function are useful when creating a new table from an existing table."}},{"Name":"PRINTTABLE","Type":"CAS_FUNCTION","Help":{"#cdata":"This prints a table to the specified location. This function allows better control over the output a table \nas compared to \"print table\"; \n\n printtable(table, \"\", columns)\n\nfileref can be:\n o ods -- uses the default print location with ODS output when appropriate.\n o log -- uses the default print location, but do not use ODS; uses the internal format routines.\n o -- uses the named fileref location for output.\n o file: -- uses the given path as the location for output. This file is closed after the table has been written.\n\n\ncolumns specifies the number of columns to be printed per line."}},{"Name":"ADDROW","Type":"CAS_FUNCTION","Help":{"#cdata":"Adds row to table.\n \n addrow(table,row1);"}},{"Name":"FINDTABLE","Type":"CAS_FUNCTION","Help":{"#cdata":"This function will search the given value for the first table it sees. This is useful when a result \nfrom an action has a table result, but you do not know the name, you just know it is there. \n\n table = findtable( result);"}},{"Name":"TRACEBACK","Type":"CAS_FUNCTION","Help":{"#cdata":"This will return a string consisting of the traceback from the current function.\n \n tb = traceback();"}},{"Name":"DICTIONARY","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns the value of a key from a dictionary. \n \n y = dictionary(dict, \"name\");\n\nIf the value does not exist, then a 0 is returned."}},{"Name":"EXISTS","Type":"CAS_FUNCTION","Help":{"#cdata":"Determines if a key exists in a dictionary. \n \n y = exists(dict,\"name\");\n\nThis returns TRUE or FALSE."}},{"Name":"READPATH","Type":"CAS_FUNCTION","Help":{"#cdata":"This will read the contents of the file given into the variable as a string."}},{"Name":"SESSIONS","Type":"CAS_FUNCTION","Help":{"#cdata":"Creates a session variable. \n \nThis will get the session named casl:\n \n ses = session(\"casl\");\n\nThis creates a session to \"rdcgrd001\" on port 17766 with user \"username\" and 23 nodes:\n \n ses = session(\"rdcgrd001\", 17766, \"username\", 23);\n\nThe authentication is assumed to be Kerberos."}},{"Name":"SORT","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns a list sorted in ascending order.\n\nExample:\n list = { 9, 4, 5.2};\n slist = sort( list);\n print slist;\n { 4, 5.2 9 };"}},{"Name":"SORT_REV","Type":"CAS_FUNCTION","Help":{"#cdata":"Returns a list sorted in descending order.\n \nExample:\n slist = sort_rev( list);\n print slist; \n { 9, 5.2, 4 }"}},{"Name":"GITFN_VERSION","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: version = GITFN_VERSION();\n\nValidate that libgit2 is available for use and if available report the version that is being used.\n \nReturn Values: -1\n The libgit2 library is not available for use, no Git operations are available.\n\nversion\n The major and minor version of the library, such as 0.27."}},{"Name":"GITFN_CLONE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_CLONE(uri,dir,,, , );\n\nClone the specified repository into the target directory on SAS server.\n\nRequired Arguments\nuri(in)\n Specifies the URI of the repository, such as https://github.com/mamonaco1973/itr.git.\ndir(in)\n The path of a directory on the SAS server for the repository be cloned into.\n \nOptional Arguments\nuser(in)\n User name for a secured repository. Note: When using ssh, the user name must be the ssh user.\npassword(in)\n Password for a secured repository. The password can be encoded with PROC PWENCODE.\npath to the public ssh key file(in)\n The path to the public ssh key file.\npath to the private ssh key file(in)\n The path to the private ssh key file.\n\nReturn Values\n-1 The libgit2 library is not available for use, no Git operations are available.\n0 The clone operation succeeded.\n>0 Git support is available, but the clone operation failed. See the log for the return message \n from the Git server."}},{"Name":"GITFN_STATUS","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_STATUS(dir);\n\nGet the number of status objects associated with the local repository. \n\nRequired Arguments\ndir(in)\n The path containing a cloned Git repository on the SAS server.\nReturn Values\n -1\n The libgit2 library is not available for use, no Git operations are available.\n -2\n Git support is available but the status operation failed. See the log for the return message from the Git server.\n n\n The number of status objects associated with the local repository. This value can be 0 or greater."}},{"Name":"GITFN_STATUS_GET","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_STATUS_GET(n,dir,attr,value);\n \nGet the attribute of a status of object that was obtained from calling GITFN_STATUS on the local repository.\n\nRequired Arguments\nn(in) The Nth status object to retrieve attributes from.\ndir(in) The path containing a cloned GIT repository on the SAS server.\nattr(in) The attribute to retrieve. Valid attributes are PATH, STATUS and STAGED.\nvalue(out) Returns the value of the specified attribute.\n\nReturn Values\n-1 The libgit2 library is not available for use, no Git operations are available.\n-2 GIT support is available but no status objects were found for the specified repository.\n0 Status object and attribute was found. The value was returned.\n1 Status object was found, but the specified attribute is not valid.\n2 Repository status found, but the Nth requested element does not exist."}},{"Name":"GITFN_STATUSFREE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_STATUSFREE(dir);\n \nFree the status objects associated with a repository that were acquired with GITFN_STATUS.\n\nRequired Arguments\ndir(in)\nThe path containing a cloned GIT repository on the SAS server that has previously had GITFN_STATUS called.\nReturn Values\n-1\nThe libgit2 library is not available for use, no GIT operations are available.\n-2\nInternal failure.\n0\nThe free operation was successful.\n1\nNo status information found for the specified repository."}},{"Name":"GITFN_IDX_ADD","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: GITFN_IDX_ADD(dir, file1, fileStatus1, file2, fileStatus2, ...);\n \nStages 1 to N number of files in preparation for commit.\n\nRequired Arguments\ndir(in)\n The path of the local Git Repository.\nfile1(in)\n The relative path of the first file to be staged.\nfileStatus1(in)\n The status of the file. New, Modified, Deleted, Renamed, or type change."}},{"Name":"GITFN_IDX_REMOVE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: GITFN_IDX_REMOVE(dir, file1, file2, ...);\n \nUn-stages 1 to N number of files.\n\nRequired Arguments\ndir(in)\n The path of the local GIT Repository.\nfile1(in)\n The relative path of the first file to be staged."}},{"Name":"GITFN_COMMIT","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: GITFN_COMMIT(dir, updateref, authorName, authorEmail, commitMessage);\n \nCommits staged files to the local repository.\n\nRequired Arguments\ndir(in)\n The path of the local GIT Repository.\nupdateref(in)\n Reference to update. In most cases \"HEAD\" should be used.\nauthorName(in)\n Commit author's name.\nauthorEmail(in)\n Commit author's email.\ncommitMessage(in)\n Commit message. Used for providing some details of the commit. Displayed in commit log."}},{"Name":"GITFN_PUSH","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: GITFN_PUSH(dir, username, password, pubSSHKeyPath, privSSHKeyPath);\n \nPushes commits on the local repository to the remote repository.\n\nRequired Arguments\ndir(in)\n The path of the local Git Repository.\nRequired if authentication is required:\nusername(in)\n User name used for authentication.\npassword(in)\n Password used for authentication.\npubSSHKeyPath(in)\n The path to the public SSH key file.\nprivSSHKeyPath(in)\n The path to the private SSH key file."}},{"Name":"GITFN_PULL","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: GITFN_PULL(dir, username, password, pubSSHKeyPath, privSSHKeyPath);\n\nPulls changes from the remote repository that were pushed by other users.\n\nRequired Arguments\ndir(in)\n The path of the local Git Repository.\nRequired if authentication is required:\nusername(in)\n User name used for authentication.\npassword(in)\n Password used for authentication.\npubSSHKeyPath(in)\n The path to the public SSH key file.\nprivSSHKeyPath(in)\n The path to the private SSH key file."}},{"Name":"GITFN_COMMIT_LOG","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_COMMIT_LOG(dir);\n \nGet the number of commit objects associated with the local repository. \n \nRequired Arguments\ndir(in)\n The path containing a cloned Git repository on the SAS server.\nReturn Values\nn\n The number of commit objects associated with the local repository. \n This value can be 0 or greater."}},{"Name":"GITFN_COMMIT_GET","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_COMMIT_GET(n,dir,attr,value);\n \nGet the attribute of a commit object that was obtained from calling GITFN_COMMIT_LOG on the local repository. \n \nRequired Arguments\nn(in)\n The Nth commit object to retrieve attributes from.\ndir(in)\n The path containing a cloned Git repository on the SAS server.\nattr(in)\n The attribute to retrieve. Valid attributes are id\", \"author\", \"email\", \"message\", \"parent_ids\", and \"time.\"\nvalue(out)\n Returns the value of the specified attribute."}},{"Name":"GITFN_COMMITFREE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_COMMITFREE(dir);\n\nFree the commit objects associated with a repository that were acquired with GITFN_COMMIT_LOG. \n \nRequired Arguments\ndir(in)\n The path containing a cloned Git repository on the SAS server that has previously had GITFN_COMMIT_LOG called.\nReturn Values\n-1 The libgit2 library is not available for use, no Git operations are available.\n-2 Internal failure.\n0 The free operation was successful.\n1 No commit information found for the specified repository."}},{"Name":"GITFN_DIFF","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_DIFF(dir, olderCommitID, newerCommitID);\n \nGet the number of diffs between two commits.\n \nRequired Arguments\ndir(in)\n The path containing a cloned Git repository on the SAS server.\nolderCommitID(in)\n The older of the two commit IDs to run the diff between.\nnewerCommitID(in)\n The newer of the two commit IDs to run the diff between.\nReturn Values\nn\n The number of diff objects associated with the local repository and \n the two commit ids. This value can be 0 or greater."}},{"Name":"GITFN_DIFF_GET","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_DIFF_GET(n,dir,attr,value);\n \nRequired Arguments\nn(in)\n The Nth commit object to retrieve attributes from.\ndir(in)\n The path containing a cloned Git repository on the SAS server.\nattr(in)\n The attribute to retrieve. Valid attributes are File, Diff_Content, Diff_type.\"\nvalue(out)\n Returns the value of the specified attribute."}},{"Name":"GITFN_DIFF_FREE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_DIFF_FREE(dir, olderCommitID, newerCommitID);\n\nFree the diff objects associated with a repository and commit ids that were generated with GITFN_DIFF.\n\nRequired Arguments\ndir(in)\n The path containing a cloned Git repository on the SAS server that has previously had GITFN_DIFF called.\nolderCommitID(in)\n The commit ID of the older of the two commits.\nnewerCommitID(in)\n The commit ID of the newer of the two commits.\nReturn Values\n-1 The libgit2 library is not available for use, no Git operations are available.\n-2 Internal failure.\n0 The free operation was successful.\n1 No diff information found for the specified repository."}},{"Name":"GITFN_RESET","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_RESET(dir, commitID, reset_type);\n \nFunction to reset the local repository to a specific commit.\n\nRequired Arguments\ndir(in) \n The path to the local GIT repository.\ncommitID(in)\n The commit ID to reset to.\nreset_type(in)\n Type of reset desired. HARD (reset working directory and index discard all local changes \n including uncommitted), MIXED (leave working directory untouched, reset index), or SOFT \n (leave working directory and index untouched)\nReturn Values\n0"}},{"Name":"GITFN_DEL_REPO","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: n = GITFN_DEL_REPO(dir);\n \nFunction to delete a local Git repository and its contents. \n \nRequired Arguments\ndir(in)\n The path to the local GIT repository.\nReturn Values\n0 on success.\n-1 on failure."}},{"Name":"GITFN_NEW_BRANCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: branch = GITFN_NEW_BRANCH(dir, id, name, force);\n\nFunction to create a new Git branch.\n \nRequired Arguments\ndir(in)\n The path to the local Git repository.\nid(in)\n The id of the Git commit level to branch.\nname(in)\n The name to give the new branch.\nforce(in)\n 1 if the branch name specified is already in use, replace the branch location with this commit level\nReturn Values\n0 - on success.\n-1 - when an error occurs."}},{"Name":"GITFN_CO_BRANCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_CO_BRANCH(dir, name);\n\nFunction to check out a Git branch.\n \nRequired Arguments\ndir(in)\n The path to the local Git repository.\nname(in)\n The name of the Git branch to check out.\nReturn Values\n0 on success.\n-1 when an error occurs."}},{"Name":"GITFN_MRG_BRANCH","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_MRG_BRANCH(path, branch, userid, email);\n \nFunction to merge a Git branch. \n \nRequired Arguments\npath(in)\n The path to the local Git repository.\nbranch(in)\n The name of the Git branch to merge into the checked-out branch.\nuserid(in)\n The user ID that is invoking the merge.\nemail(in)\n The email address of the user that is invoking the merge.\nReturn Values\nrc = 0: success\nrc = 1: branch already up-to-date\nrc = -1: merge commit failed\nrc = -2: index has conflicts, check log for conflicting files."}},{"Name":"GITFN_DIFF_IDX_F","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_DIFF_IDX_F(path, file path, DIFF_CONTENT);\n\nFunction to get the diff of a file that is in the index.\n\nRequired Arguments\npath(in)\n The path to the local Git repository.\nfile path(in)\n The file path relative to the local repository.\nDIFF_CONTENT(out)\n Out variable that holds the content of the diff.\nReturn Values\nrc - 0 on success.\nrc - 1 on failure."}},{"Name":"GITFN_RESET_FILE","Type":"SAS_FUNCTION","Help":{"#cdata":"Syntax: rc = GITFN_RESET_FILE(path, file path); \n \nRequired Arguments\npath(in)\n The path to the local Git repository.\nfile path(in)\n The file path relative to the local repository.\nReturn Values\nrc - 0 on success.\nrc - 1 on failure."}}],"#comment":[{},{},{},{},{},{},{},{},{}]}} ================================================ FILE: server/data/SASGlobalProcedureStatements.json ================================================ {"Keywords":{"Keyword":[{"Name":"FOOTNOTE","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","NumericSuffixStart":"1","NumericSuffixEnd":"10","Help":{"#cdata":"Syntax: FOOTNOTE <'text' | \"text\" >; \n \nWrites up to 10 lines of text at the bottom of the procedure or DATA step output."}},{"Name":"TITLE","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","NumericSuffixStart":"1","NumericSuffixEnd":"10","Help":{"#cdata":"Syntax: TITLE <'text' | \"text\">; \n \nSpecifies title lines for SAS output."}},{"Name":"NOTE","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","Help":{"#cdata":"Syntax: TITLE <'text' | \"text\">; \n \nSpecifies title lines for SAS output."}},{"Name":"ATTRIB","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: ATTRIB variable-list(s) attribute-list(s) ; \n \nAssociates a format, informat, label, and length with one or more variables."}},{"Name":"AXIS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: AXIS<1...99> ; \n \nControls the location, values, and appearance of the axes in plots and charts. \n\nUsed by: GBARLINE, GCHART, GCONTOUR, GRADAR, G3D procedures"}},{"Name":"SYMBOL","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","Help":{"#cdata":"Syntax: SYMBOL<1...255> \n \n > \n ; \n \nDefines the characteristics of symbols that display the data plotted by a PLOT \nstatement used by PROC GBARLINE, PROC GCONTOUR, and PROC GPLOT. \n\nUsed by: GBARLINE, GCONTOUR, GPLOT procedures"}},{"Name":"PATTERN","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|NumericSuffix","Help":{"#cdata":"Syntax: PATTERN<1...255> \n \n ; \n \nDefines the characteristics of patterns used in graphs. \n\nUsed by: GAREABAR, GCHART, GBARLINE, GCONTOUR, GMAP, GPLOT procedures; SYMBOL \nstatement; Annotate facility."}},{"Name":"LEGEND","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|NumericSuffix","Help":{"#cdata":"Syntax: LEGEND<1...99> ; \n \nControls the location and appearance of legends on two-dimensional plots, contour \nplots, maps, and charts. \n\nUsed by: GAREABAR, GCHART, GBARLINE, GCONTOUR, GMAP, GPLOT procedures"}},{"Name":"RUN","Type":"SAS_GLOBAL_STATEMENT","States":"RUN","DisplayType":"EndSection","Help":{"#cdata":"Syntax: RUN ; \n\nExecutes the previously entered SAS statements. \n\nAlthough the RUN statement is not required between steps in a SAS program, using it creates \na step boundary and can make the SAS log easier to read. \n\nArguments:\n\nCANCEL \n terminates the current step without executing it. SAS prints a message that indicates that the step was not executed. \n CAUTION:\n The CANCEL option does not prevent execution of a DATA step that contains a DATALINES or DATALINES4 statement. \n CAUTION:\n The CANCEL option has no effect when you use the KILL option with PROC DATASETS."}},{"Name":"RUN CANCEL","Type":"SAS_GLOBAL_STATEMENT","States":"RUN","DisplayType":"EndSection","Help":{"#cdata":"Syntax: RUN CANCEL;\n \nTerminates the current step without executing it. SAS prints a message that indicates that the step was not executed. \n\nCAUTION:\n The CANCEL option does not prevent execution of a DATA step that contains a DATALINES or DATALINES4 statement. \nCAUTION:\n The CANCEL option has no effect when you use the KILL option with PROC DATASETS."}},{"Name":"QUIT","Type":"SAS_GLOBAL_STATEMENT","States":"QUIT","DisplayType":"EndSection","Help":{"#cdata":"Quit from the current SAS session."}},{"Name":"SYSECHO","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Fires a global statement complete event and passes a text string back to the IOM client."}},{"Name":"FORMAT","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates formats with variables.\n \nSyntax:\n(1) FORMAT variable-1 <... variable-n> ;\n\n(2) FORMAT variable-1 <... variable-n> format ;\n\n(3) FORMAT variable-1 <... variable-n> format variable-1 <... variable-n> format;\n\nIf you omit DEFAULT=, SAS uses BESTw. as the default numeric format and $w. as the \ndefault character format."}},{"Name":"INFORMAT","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates informats with variables.\n \nSyntax:\n(1) INFORMAT variable-1 <...variable-n> ; \n(2) INFORMAT <... variable-n> ; \n(3) INFORMAT variable-1 <...variable-n> informat ; "}},{"Name":"OPTIONS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: OPTIONS ; \n \nChanges the value of one or more SAS system options."}},{"Name":"LABEL","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Assigns descriptive labels to variables.\n\nSyntax:\n(1) LABEL variable-1='label-1' ... ; \n\n(2) LABEL variable-1=' ' ... ; "}},{"Name":"WHERE","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: WHERE where-expression-1 \n < logical-operator where-expression-n>; \n \nSelects observations from SAS data sets that meet a particular condition."}},{"Name":"FILENAME","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates a SAS fileref with an external file or an output device;\ndisassociates a fileref and external file; lists attributes of external files.\n\nSyntax:\n\n(1) FILENAME fileref 'external-file' \n ;\n\n(2) FILENAME fileref ;\n\n(3) FILENAME fileref CLEAR | _ALL_ CLEAR;\n\n(4) FILENAME fileref LIST | _ALL_ LIST; \n\n(5) FILENAME fileref CATALOG 'catalog' ; \n\n(6) FILENAME fileref CLIPBRD ; \n\n(7) FILENAME fileref EMAIL <'address' >; \n\n(8) FILENAME fileref FTP 'external-file' ; \n\n(9) FILENAME fileref SFTP 'external-file' ; \n\n(10) FILENAME fileref SOCKET 'hostname:portno' ; \n\n(11) FILENAME fileref SOCKET ':portno' SERVER ; \n\n(12) FILENAME fileref URL 'external-file' ; \n\n(13) FILENAME filref WEBDAV 'external-file' ; \n\n(14) FILENAME fileref DDE 'DDE-triplet' ;"}},{"Name":"LIBNAME","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates or disassociates a SAS data library with a libref (a shortcut name); \nclears one or all librefs; lists the characteristics of a SAS data library; \nconcatenates SAS data libraries; implicitly concatenates SAS catalogs.\n\nSyntax:\n\n(1) LIBNAME libref 'SAS-data-library' < options > ;\n\n(2) LIBNAME libref CLEAR | _ALL_ CLEAR;\n\n(3) LIBNAME libref LIST | _ALL_ LIST;\n\n(4) LIBNAME libref (library-specification-1 <... library-specification-n>) < options >; \n\n(5) LIBNAME libref INFOMAPS MAPPATH=\"location\" ; \n\n(6) LIBNAME libref XML <'SAS-library | XML-document-path' > ; \n\n(7) LIBNAME libref SASEDOC 'path' ;\n\n(8) LIBNAME libref \n ;"}},{"Name":"ODS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"ODS statements provide great flexibility in generating, storing, and reproducing SAS \nprocedure and DATA step output."}},{"Name":"PROC","Type":"SAS_GLOBAL_STATEMENT","States":"PROC","DisplayType":"SectionWord","Help":{"#cdata":"Syntax: PROC procedure-name ;\n\nAlias: PROCEDURE\n\nBegins a PROC step. The PROC step consists of a group of SAS statements that call and execute\na procedure, usually with a SAS data set as input."}},{"Name":"PROCEDURE","Type":"SAS_GLOBAL_STATEMENT","States":"PROC","DisplayType":"SectionWord","Help":{"#cdata":"Syntax: PROCEDURE procedure-name ;\n\nAlias: PROC\n\nBegins a PROC step. The PROC step consists of a group of SAS statements that call and execute\na procedure, usually with a SAS data set as input."}},{"Name":"DATA","Type":"SAS_GLOBAL_STATEMENT","States":"DATA","Attributes":"ForceColor|NumericSuffix","DisplayType":"SectionWord","Help":{"#cdata":"Begins a DATA step and provides names for any output SAS data sets, views, or programs. \n \nSyntax: \n \n(1) DATA > \n <... data-set-name-n <(data-set-options-n)>> > ; \n\n(2) DATA _NULL_ > ; \n\n(3) DATA view-name > \n <... data-set-name-n <(data-set-options-n)>> / \n VIEW=view-name <()> ; \n\n(4) DATA data-set-name / PGM=program-name <()> ; \n\n(5) DATA VIEW=view-name <(password-option)> ; \n DESCRIBE; \n \n(6) DATA PGM=program-name <(password-option)> ; \n \n ;> \n "}}]}} ================================================ FILE: server/data/SASGlobalStatements.json ================================================ {"Keywords":{"Keyword":[{"Name":"CATNAME","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Logically combines two or more catalogs into one by associating them with a catref \n(a shortcut name); clears one or all catrefs; lists the concatenated catalogs in \none concatenation or in all concatenations.\n\nSyntax:\n\n(1) CATNAME catref\n < (libref-1.catalog-1 <(ACCESS=READONLY)> \n <...libref-n.catalog-n <(ACCESS=READONLY)>)> ;\n\n(2) CATNAME catref CLEAR | _ALL_ CLEAR;\n\n(3) CATNAME catref LIST | _ALL_ LIST; "}},{"Name":"FILENAME","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates a SAS fileref with an external file or an output device;\ndisassociates a fileref and external file; lists attributes of external files.\n\nSyntax:\n\n(1) FILENAME fileref 'external-file' \n ;\n\n(2) FILENAME fileref ;\n\n(3) FILENAME fileref CLEAR | _ALL_ CLEAR;\n\n(4) FILENAME fileref LIST | _ALL_ LIST; \n\n(5) FILENAME fileref CATALOG 'catalog' ; \n\n(6) FILENAME fileref CLIPBRD ; \n\n(7) FILENAME fileref EMAIL <'address' >; \n\n(8) FILENAME fileref FTP 'external-file' ; \n\n(9) FILENAME fileref SFTP 'external-file' ; \n\n(10) FILENAME fileref SOCKET 'hostname:portno' ; \n\n(11) FILENAME fileref SOCKET ':portno' SERVER ; \n\n(12) FILENAME fileref URL 'external-file' ; \n\n(13) FILENAME filref WEBDAV 'external-file' ; \n\n(14) FILENAME fileref DDE 'DDE-triplet' ; "}},{"Name":"LIBNAME","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Associates or disassociates a SAS data library with a libref (a shortcut name); \nclears one or all librefs; lists the characteristics of a SAS data library; \nconcatenates SAS data libraries; implicitly concatenates SAS catalogs.\n\nSyntax:\n\n(1) LIBNAME libref 'SAS-data-library' < options > ;\n\n(2) LIBNAME libref CLEAR | _ALL_ CLEAR;\n\n(3) LIBNAME libref LIST | _ALL_ LIST;\n\n(4) LIBNAME libref (library-specification-1 <... library-specification-n>) < options >; \n\n(5) LIBNAME libref INFOMAPS MAPPATH=\"location\" ; \n\n(6) LIBNAME libref XML <'SAS-library | XML-document-path' > ; \n\n(7) LIBNAME libref SASEDOC 'path' ;\n\n(8) LIBNAME libref \n ;\n(9) LIBNAME libref JMP \u2018path\u2019 ; \n"}},{"Name":"PAGE","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Skips to a new page in the SAS log.\n\nSyntax: PAGE; "}},{"Name":"SKIP","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Creates a blank line in the SAS log.\n\nSyntax: SKIP ; \n\nwhere n specifies the number of blank lines that you want to create in the log."}},{"Name":"FOOTNOTE","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","NumericSuffixStart":"1","NumericSuffixEnd":"10","Help":{"#cdata":"Writes up to 10 lines of text at the bottom of the procedure or DATA step output.\n\nSyntax: FOOTNOTE <'text' | \"text\" >; "}},{"Name":"TITLE","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","NumericSuffixStart":"1","NumericSuffixEnd":"10","Help":{"#cdata":"Specifies title lines for SAS output.\n \nSyntax: TITLE <'text' | \"text\">; "}},{"Name":"ENDSAS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Terminates a SAS job or session after the current DATA or PROC step executes.\n \nSyntax: ENDSAS; "}},{"Name":"%INCLUDE|%INC","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Brings a SAS programming statement, data lines, or both, into a current SAS program.\n\nSyntax: %INCLUDE source(s) >; "}},{"Name":"LOCK","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: LOCK libref<.member-name<.member-type | .entry-name.entry-type>> ; \n \nAcquires and releases an exclusive lock on an existing SAS file."}},{"Name":"OPTIONS|OPTION","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: OPTIONS ; \n \nChanges the value of one or more SAS system options."}},{"Name":"GOPTIONS|GOPTION","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: GOPTIONS ; \n \nTemporarily sets default values for many graphics attributes and device parameters \nused by SAS/GRAPH procedures."}},{"Name":"RUN","Type":"SAS_GLOBAL_STATEMENT","States":"RUN","DisplayType":"EndSection","Help":{"#cdata":"Syntax: RUN ;\n \nExecutes the previously entered SAS statements. \n\nAlthough the RUN statement is not required between steps in a SAS program, using it creates \na step boundary and can make the SAS log easier to read. \n\nArguments:\n\nCANCEL \n terminates the current step without executing it. SAS prints a message that indicates that the step was not executed. \n CAUTION:\n The CANCEL option does not prevent execution of a DATA step that contains a DATALINES or DATALINES4 statement. \n CAUTION:\n The CANCEL option has no effect when you use the KILL option with PROC DATASETS."}},{"Name":"RUN CANCEL","Type":"SAS_GLOBAL_STATEMENT","States":"RUN","DisplayType":"EndSection","Help":{"#cdata":"Syntax: RUN ;\n \nTerminates the current step without executing it. SAS prints a message that indicates that the \nstep was not executed. \n\nCAUTION:\n The CANCEL option does not prevent execution of a DATA step that contains a DATALINES or DATALINES4 statement. \nCAUTION:\n The CANCEL option has no effect when you use the KILL option with PROC DATASETS."}},{"Name":"%RUN","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: %RUN;\n \nEnds source statements following a %INCLUDE * statement."}},{"Name":"%LIST","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Displays lines that are entered in the current session. \n \nSyntax: %LIST>; \n\nwhere\n\nn - means display line n.\n\nn-m - means display lines n through m; can be written as n:m"}},{"Name":"QUIT","Type":"SAS_GLOBAL_STATEMENT","States":"QUIT","DisplayType":"EndSection","Help":{"#cdata":"Quit from the current SAS session."}},{"Name":"SASFILE","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: SASFILE member-name<.member-type> <(password-option(s))> OPEN | LOAD | CLOSE ; \n \nOpens a SAS data set and allocates enough buffers to hold the entire file in memory. \n\npassword-option(s)\n specifies one or more of the following password options:\n ENCRYPTKEY=key-value\n enables the SASFILE statement to open an AES-encrypted SAS data file. If a SAS data file is encrypted \n with the AES (Advanced Encryption Standard) algorithm, a key value is assigned to the file and must be \n specified in order to access the file. The key value can be up to 64 bytes long.\n \n READ=password\n enables the SASFILE statement to open a read-protected file. The password must be a valid SAS name.\n WRITE=password\n enables the SASFILE statement to use the WRITE password to open a file that is both read-protected \n and write-protected. The password must be a valid SAS name.\n ALTER=password\n enables the SASFILE statement to use the ALTER password to open a file that is both read-protected \n and alter-protected. The password must be a valid SAS name.\n PW=password\n enables the SASFILE statement to use the password to open a file that is assigned for all levels of \n protection. The password must be a valid SAS name."}},{"Name":"PROC","Type":"SAS_GLOBAL_STATEMENT","States":"PROC","DisplayType":"SectionWord","Help":{"#cdata":"Syntax: PROC procedure-name ;\n \nAlias: PROCEDURE\n \nBegins a PROC step. The PROC step consists of a group of SAS statements that call and execute\na procedure, usually with a SAS data set as input."}},{"Name":"PROCEDURE","Type":"SAS_GLOBAL_STATEMENT","States":"PROC","DisplayType":"SectionWord","Help":{"#cdata":"Syntax: PROCEDURE procedure-name ;\n \nAlias: PROC\n \nBegins a PROC step. The PROC step consists of a group of SAS statements that call and execute\na procedure, usually with a SAS data set as input."}},{"Name":"DATA","Type":"SAS_GLOBAL_STATEMENT","States":"DATA","Attributes":"ForceColor|NumericSuffix","DisplayType":"SectionWord","Help":{"#cdata":"Begins a DATA step and provides names for any output SAS data sets, views, or programs. \n \nSyntax: \n \n(1) DATA > \n <... data-set-name-n <(data-set-options-n)>> > ; \n\n(2) DATA _NULL_ > ; \n\n(3) DATA view-name > \n <... data-set-name-n <(data-set-options-n)>> / \n VIEW=view-name <()> ; \n\n(4) DATA data-set-name / PGM=program-name <()> ; \n\n(5) DATA VIEW=view-name <(password-option)> ; \n DESCRIBE; \n \n(6) DATA PGM=program-name <(password-option)> ; \n \n ;> \n "}},{"Name":"ODS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Provides a method for delivering output in a variety of formats, and makes the formatted\n output easy to access."}},{"Name":"CHECKPOINT EXECUTE_ALWAYS","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Indicates to execute the DATA step or PROC step that immediately follows without considering\nthe checkpoint-restart data."}},{"Name":"SYSECHO","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Fires a global statement complete event and passes a text string back to the IOM client."}},{"Name":"DM","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Submits SAS Program Editor, Log, Procedure Output or text editor commands as SAS statements."}},{"Name":"SYMBOL","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|NumericSuffix","Help":{"#cdata":"Defines the characteristics of symbols that display the data plotted by a PLOT statement used\nby PROC GBARLINE, PROC GCONTOUR, and PROC GPLOT."}},{"Name":"AXIS","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|Global|NumericSuffix","Help":{"#cdata":"Controls the location, values, and appearance of the axes in plots and charts."}},{"Name":"LEGEND","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|NumericSuffix","Help":{"#cdata":"Controls the location and appearance of legends on two-dimensional plots, contour plots,\nmaps, and charts."}},{"Name":"PATTERN","Type":"SAS_GLOBAL_STATEMENT","Attributes":"ForceColor|NumericSuffix","Help":{"#cdata":"Defines the characteristics of patterns used in graphs."}},{"Name":"COMMENT","Type":"SAS_GLOBAL_STATEMENT","States":"COMMENT","Attributes":"ForceColor|Global","Help":{"#cdata":"Specifies the purpose of the statement or program."}},{"Name":"RSUBMIT","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: RSUBMIT ; ENDRSUBMIT ; \n RDISPLAY \n RGET ; \n %SYSRPUT macro-variable=value; \n %SYSLPUT macro-variable=value ; \n WAITFOR <_ANY_ | _ALL_> task1...taskn ; \n LISTTASK <_ALL_ | task>; \n KILLTASK <_ALL_ | task1...taskn>; \n \nMarks the beginning of a block of statements that a client session submits to a server\nsession for execution."}},{"Name":"ENDRSUBMIT","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Marks the end of a block of statements that a client session submits to a server \nsession for execution."}},{"Name":"RDISPLAY","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: RDISPLAY <server-ID >;\n \nCreates a Log window to display the lines from the log and an Output window to list \nthe output generated from the execution of the statements within an asynchronous \nRSUBMIT block."}},{"Name":"RGET","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: RGET <server-ID>;\n \nRetrieves the log and output that are created by an asynchronous RSUBMIT and merges \nthem into the Log and Output windows of the client session."}},{"Name":"WAITFOR","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: WAITFOR<_ANY_ | _ALL_> taskname ;\n \nSuspends execution of the current SAS session until the specified tasks finish \nexecuting."}},{"Name":"LISTTASK","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: LISTTASK <_ALL_|task> ; \n \nLists all active connections or tasks and identifies the execution status of each \nconnection or task."}},{"Name":"KILLTASK","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: KILLTASK _ALL_ |task1...taskn ;\n \nFor asynchronous tasks, forces one or more active tasks or server sessions to \nterminate immediately."}},{"Name":"SIGNON","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: SIGNON \n \nInitiates a connection between a client session and a server session."}},{"Name":"SIGNOFF","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: SIGNOFF \n \nEnds the connection between a client session and a server session."}},{"Name":"SYSTASK","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: SYSTASK COMMAND \"operating system command\" \n \n \n \n \n >; \n SYSTASK LIST <_ALL_ | taskname> ; \n SYSTASK KILL taskname ; \n \nExecutes, lists, or terminates asynchronous tasks."}},{"Name":"X","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: X <'command '>; \n \nEnters operating environment mode or allows you to submit a Windows command without ending\nyour SAS session."}},{"Name":"RESETLINE","Type":"SAS_GLOBAL_STATEMENT","Help":{"#cdata":"RESETLINE; \n \nRestarts the program line numbers in the SAS log to 1."}},{"Name":"CAS","Type":"CAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: CAS session-reference-name options;\nwhere:\n\nsession-reference-name is a valid SAS name that is less than 256 characters.\n\nThe CAS statement creates, disconnects or terminates a connection from a SAS client to Cloud Analytic Services (CAS)."}},{"Name":"CASLIB","Type":"CAS_GLOBAL_STATEMENT","Help":{"#cdata":"Syntax: CASLIB caslib-reference-name SESSREF=session-reference \n < LIST | DROP > \n ;\n\nwhere:\n\ncaslib-reference-name\n specifies the name of the caslib. _ALL_ is a valid name with the LIST or DROP options. \n The length can be up to 256 characters.\n\nThe CASLIB statement is used to manage Cloud Analytic Services (CAS) libraries (caslib) in your CAS session. "}}],"#comment":{}}} ================================================ FILE: server/data/SASInformats.json ================================================ {"Keywords":{"Keyword":[{"Name":"$LOGVSw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in left-to-right logical order and then converts \nthe character string to visual order. \n\nw \n specifies the width of the input field.\n\n Default: 200 \n Range: 1-32000 \n \nComparisons:\nThe $LOGVSw. informat performs processing that is opposite to the LOGVSRw. informat."}},{"Name":"$LOGVSRw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in right-to-left logical order and then converts \nthe character string to visual order. \n\nSyntax Description:\n\nw \n specifies the width of the input field.\n\n Default: 200 \n Range: 1-32000 \n \nComparisons: \nThe $LOGVSRw. informat performs processing that is opposite to the $LOGVSw. informat."}},{"Name":"$VSLOGw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in visual order and then converts the character \nstring to left-to-right logical order. \n\nSyntax Description\n\nw \n specifies the width of the input field.\n\n Default: 200 \n Range: 1-32000 \n \nComparisons:\nThe $VSLOGw. informat performs processing that is opposite of the $VSLOGRw. informat."}},{"Name":"$VSLOGRw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in visual order and then converts the character \nstring to right-to-left logical order. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 200 \n Range: 1-32000 \n \nComparisons:\nThe $VSLOGRw. informat performs processing that is opposite of the $VSLOGw. informat."}},{"Name":"$ASCIIw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts ASCII character data to native format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails:\nIf ASCII is the native format, no conversion occurs.\n \nComparisons:\no On an IBM mainframe system, $ASCIIw. converts ASCII data to EBCDIC.\n\no On all other systems, $ASCIIw. behaves like the $CHARw. informat except that the \ndefault length is different.\n\n"}},{"Name":"$BINARYw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts binary data to character data. \n \nSyntax Description: \nw \n specifies the width of the input field. Because eight bits of binary information represent \n one character, every eight characters of input that $BINARYw. reads becomes one character \n value stored in a variable.\n\n If w< 8, $BINARYw. reads the data as w characters followed by 0s. Thus, $BINARY4. reads the \n characters 0101 as 01010000, which converts to an EBCDIC & or an ASCII P. If w> 8 but is not \n a multiple of 8, $BINARYw. reads up to the largest multiple of 8 that is less than w before \n converting the data.\n\n Default: 8 \n Range: 1-32767 \n \nDetails:\nThe $BINARYw. informat does not interpret actual binary data, but it converts a string of \ncharacters that contains only 0s or 1s as if it is actual binary information. Therefore, \nuse only the character digits 1 and 0 in the input, with no embedded blanks. $BINARYw. \nignores leading and trailing blanks.\n\nTo read representations of binary codes for unprintable characters, enter an ASCII or \nEBCDIC equivalent for a particular character as a string of 0s and 1s. The $BINARYw. informat \nconverts the string to its equivalent character value.\n\nComparisons:\nThe BINARYw. informat reads eight characters of input that contain only 0s or 1s as a binary \nrepresentation of one byte of numeric data.\n\nThe $HEXw. informat reads hexadecimal characters that represent the ASCII or EBCDIC equivalent \nof character data."}},{"Name":"$CHARw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads character data with blanks. \n \nSyntax Description:\nw \n specifies the width of the input field.\n\n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails: \nThe $CHARw. informat does not trim leading and trailing blanks or convert a single period \nin the input data field to a blank before storing values. If you use $CHARw. in an INFORMAT \nor ATTRIB statement within a DATA step to read list input, then by default SAS interprets \nany blank embedded within data as a field delimiter, including leading blanks.\n \nComparisons:\nThe $CHARw. informat is almost identical to the $w. informat. However $CHARw. does not trim \nleading blanks or convert a single period in the input data field to a blank, while the \n$w. informat does."}},{"Name":"$CHARZBw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts binary 0s to blanks. \n \nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 1 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails:\nThe $CHARZBw. informat does not trim leading and trailing blanks in character data before \nit stores values.\n \nComparisons:\nThe $CHARZBw. informat is identical to the $CHARw. informat except that $CHARZBw. converts \nany byte that contains a binary 0 to a blank character."}},{"Name":"$EBCDICw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts EBCDIC character data to native format. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Default: 1 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails:\nIf EBCDIC is the native format, no conversion occurs.\n\nNote: Any time a text file originates from anywhere other than the local encoding environment, \nit might be necessary to specify the ENCODING= option on either ASCII or EBCDIC environments.\n\nWhen you read an EBCDIC text file on an ASCII platform, it is recommended that you specify the \nENCODING= option in the FILENAME or INFILE statement. However, if you use the DSD and the DLM= \nor DLMSTR= options in the FILENAME or INFILE statement, the ENCODING= option is a requirement \nbecause these options require certain characters in the session encoding (such as quotation \nmarks, commas, and blanks).\n\nThe use of encoding-specific informats should be reserved for use with true binary files; \nthat is, they contain both character and non-character fields. \n \nComparisons:\no On an IBM mainframe system, $EBCDICw. behaves like the $CHARw. informat.\no On all other systems, $EBCDICw. converts EBCDIC data to ASCII."}},{"Name":"$HEXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts hexadecimal data to character data. \n \nSyntax Description: \nw \n specifies the number of digits of hexadecimal data.\n\n If w=1, $HEXw. pads a trailing hexadecimal 0. If w is an odd number that is greater than 1, \n then $HEXw. reads w-1 hexadecimal characters.\n Default: 2 \n Range: 1-32767 \n \nDetails: \nThe $HEXw. informat converts every two digits of hexadecimal data into one byte of character \ndata. Use $HEXw. to encode hexadecimal values into a character variable when your input method \nis limited to printable characters. \n\nComparisons: \nThe HEXw. informat reads two digits of hexadecimal data at a time and converts them into \none byte of numeric data."}},{"Name":"$OCTALw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts octal data to character data. \n \nSyntax Description: \nw \n specifies the width of the input field in bits. Because one digit of octal data represents \n three bits of binary information, increment the value of w by three for every column of octal \n data that $OCTALw. will read.\n\n Default: 3 \n Range: 1-32767 \n \nDetails:\nEight bits of binary data represent the code for one digit of character data. Therefore, \nyou need at least three digits of octal data to represent one digit of character data, \nwhich includes an extra bit. $OCTALw. treats every three digits of octal data as one digit \nof character data, ignoring the extra bit.\n\nUse $OCTALw. to read octal representations of binary codes for unprintable characters. \nEnter an ASCII or EBCDIC equivalent for a particular character in octal notation. Then \nuse $OCTALw. to convert it to its equivalent character value.\n\nUse only the digits 0 through 7 in the input, with no embedded blanks. $OCTALw. ignores \nleading and trailing blanks.\n \nComparisons:\nThe OCTALw. informat reads octal data and converts them into the numeric equivalents."}},{"Name":"$PHEXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts packed hexadecimal data to character data. \n \nSyntax Description: \nw \n specifies the number of bytes in the input.\n When you use $PHEXw. to read packed hexadecimal data, the length of the variable is the \n number of bytes that are required to store the resulting character value, not w. In general, \n a character variable whose length is implicitly defined with $PHEXw. has a length of 2w-1.\n\n Default: 2 \n Range: 1-32767 \n \nDetails:\nPacked hexadecimal data are like packed decimal data, except that all hexadecimal characters \nare valid. In packed hexadecimal data, the value of the low-order nibble has no meaning. In \npacked decimal data, the value of the low-order nibble indicates the sign of the numeric value \nthat the data represent. The $PHEXw. informat returns a character value and treats the value \nof the sign nibble as if it were X'F', regardless of its actual value.\n \nComparisons: \nThe PDw.d. informat reads packed decimal data and converts them to numeric data."}},{"Name":"$QUOTEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Removes matching quotation marks from character data. \n \nSyntax Description:\n\nw \n specifies the width of the input field.\n\n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767"}},{"Name":"$REVERJw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads character data from right to left and preserves blanks. \n \nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 1 if w is not specified \n Range: 1-32767 \n\nComparisons: \nThe $REVERJw. informat is similar to the $REVERSw. informat except that $REVERSw. informat \nleft aligns the result by removing all leading blanks."}},{"Name":"$REVERSw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads character data from right to left and left, and then left aligns the text. \n \nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 1 if w is not specified \n Range: 1-32767 \n \nComparisons:\nThe $REVERSw. informat is similar to the $REVERJw. informat except that $REVERJw. informat \npreserves all leading and trailing blanks."}},{"Name":"$UCS2Bw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in big-endian, 16-bit, universal character \nset code in 2 octets (UCS2), Unicode encoding, and then converts the character string \nto the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 2-32000 \n \nComparisons:\nThe $UCS2Bw. informat performs processing that is opposite of the $UCS2BEw. informat. If \nyou are processing data within the same operating environment, then use the $UCS2Xw. informat. \nIf you are processing data from different operating environments, then use the $UCS2Bw. and \n$UCS2Lw. informats."}},{"Name":"$UCS2BEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in the encoding of the current SAS session and then \nconverts the character string to big-endian, 16-bit, universal character set code in \n2 octets (UCS2), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nComparisons: \nThe $UCS2BEw. informat performs processing that is opposite of the $UCS2Bw. informat."}},{"Name":"$UCS2Lw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in little-endian, 16-bit, universal character \nset code in 2 octets (UCS2), Unicode encoding, and then converts the character string \nto the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n \n Default: 8 \n Range: 2-32000 \n \nComparisons: \nThe $UCS2Lw. informat performs processing that is opposite of the $UCS2LEw. informat. \nIf you are processing data within the same operating environment, then use the $UCS2Xw. \ninformat. If you are processing data from different operating environments, then use \nthe $UCS2Bw. and $UCS2Lw. informats."}},{"Name":"$UCS2LEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in the encoding of the current SAS session and then \nconverts the character string to little-endian, 16-bit, universal character set code \nin 2 octets (UCS2), Unicode encoding. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nComparisons:\nThe $UCS2LEw. informat performs processing that is opposite of the $UCS2Lw. informat."}},{"Name":"$UCS2Xw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in 16-bit, universal character set code in \n2 octets (UCS2), Unicode encoding, and then converts the character string to the \nencoding of the current SAS session. \n\nSyntax Description: \n w \n specifies the width of the output field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 2-32000 \n \nComparisons: \nThe $UCS2Xw. informat performs processing that is the opposite of the $UCS2XEw. informat. \nIf you are processing data within the same operating environment, then use the $UCS2Xw. \ninformat. If you are processing data from different operating environments, then use the \n$UCS2Bw. and $UCS2Lw. informats."}},{"Name":"$UCS2XEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in the encoding of the current SAS session and then \nconverts the character string to 16-bit, universal character set code in 2 octets \n(UCS2), Unicode encoding. \n\nSyntax Description: \n\n w \n specifies the width of the input field. Specify enough width to accommodate the \n 16-bit size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nComparisons:\nThe $UCS2XEw. informat performs processing that is opposite of the $UCS2Xw. informat."}},{"Name":"$UCS4Bw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in big-endian, 32-bit, universal character \nset code in 4 octets (UCS4), Unicode encoding, and then converts the character \nstring to the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 32-bit size of the Unicode characters.\n\n Default: 4 \n Range: 4-32000 \n \nComparison:\nIf you are processing data within the same operating environment, then use the $UCS4Xw. \ninformat. If you are processing data from different operating environments, then use the \n$UCS4Bw. and $UCS4Lw. informats."}},{"Name":"$UCS4Lw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in little-endian, 32-bit, universal character \nset code in 4 octets (UCS4), Unicode encoding, and then converts the character string \nto the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 32-bit size of the Unicode characters.\n\n Default: 4 \n Range: 4-32000 \n \nComparison: \nIf you are processing data within the same operating environment, then use the $UCS4Xw. \ninformat. If you are processing data from different operating environments, then use the \n$UCS4Bw. and $UCS4Lw. informats."}},{"Name":"$UCS4Xw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in 32-bit, universal character set code in \n4 octets (UCS4), Unicode encoding, and then converts the character string to the \nencoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field. Specify enough width to accommodate the \n 32-bit size of the Unicode characters.\n\n Default: 4 \n Range: 4-32000 \n \nComparisons: \nThe $UCS4Xw. informat performs processing that is the opposite of the $UCS4XEw. informat. \nUse the $UCS4Xw. informat when you are processing data within the same operating environment. \nUse the $UCS4Bw. and $UCS4Lw. informats when you are processing data from different operating \nenvironments."}},{"Name":"$UCS4XEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in the encoding of the current SAS session and then \nconverts the character string to 32-bit, universal character set code in 4 octets \n(UCS4), Unicode encoding. \n\nSyntax Description\n\nw \n specifies the width of the input field. Specify enough width to accommodate the \n 32-bit size of the Unicode characters.\n\n Default: 8 \n Range: 1-32000 \n \nComparisons: \nThe $UCS4XEw. informat performs processing that is the opposite of the $UCS4Xw. informat."}},{"Name":"$UESCw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in Unicode escape (UESC) representation, \nand then converts the character string to the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the output field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails: \nIf the characters are not available on all operating environments, for example, 0-9, a-z, \nA-Z, they must be represented in UESC representation. The $UESCw. informat can be nested.\n \nComparisons: \nThe $UESCw. informat performs processing that is the opposite of the $UESCEw. informat."}},{"Name":"$UESCEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is in the encoding of the current SAS session, and \nthen converts the character string to Unicode escape (UESC). \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails: \nThe $UESCEw. informat can be nested.\n \nComparisons:\nThe $UESCEw. informat performs processing that is opposite of the $UESCw. informat."}},{"Name":"$UNCRw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the numeric character representation (NCR) character string, and then converts \nthe character string to the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails: \nThe input string must contain only characters and NCR. Any national characters must \nbe represented in NCR.\n \nComparison: \nThe $UNCRw. informat performs processing that is opposite of the $UNCREw. informat."}},{"Name":"$UNCREw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string in the encoding of the current SAS session, and then converts \nthe character string to session-encoded NCR (numeric character representation). \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nThe output string will be converted to plain characters and NCR. Any national characters \nwill be converted to NCR.\n \nComparison: \nThe $UNCREw. informat performs processing that is the opposite of the $UNCRw. informat."}},{"Name":"$UPARENw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in UPAREN (Unicode parenthesis) representation, \nand then converts the character string to the encoding of the current SAS session. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails:\nIf the SAS session encoding does not have a corresponding Unicode expression, the expression \nwill remain in encoding of the current SAS session.\n \nComparisons: \nThe $UPARENw. informat performs processing that is opposite of the $UPARENEw. informat."}},{"Name":"$UPARENEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in the current SAS session, and then converts \nthe character string to the encoding of the Unicode parenthesis (UPAREN) representation. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nComparisons:\nThe $UPARENEw. informat performs processing that is opposite of the $UPARENw. informat."}},{"Name":"$UPARENPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in Unicode parenthesis (UPAREN) representation, \nand then converts the character string to the encoding of the current SAS session with \nnational characters remaining in the encoding of the UPAREN representation. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000 \n \nDetails: \nIf the UPAREN expression contains a national character, whose value is greater than \nUnicode 0x00ff, the expression will remain as a UPAREN expression."}},{"Name":"$UPCASEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts character data to uppercase. \n \nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n \nDetails:\nSpecial characters, such as hyphens, are not altered."}},{"Name":"$UTF8Xw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in Unicode transformation format (UTF-8), \nand then converts the character string to the encoding of the current SAS session. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 8 \n Range: 1-32000"}},{"Name":"$VARYINGw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads character data of varying length. \n \nSyntax: $VARYINGw. length-variable \n \nSyntax Description: \nw \n specifies the maximum width of a character field for all the records in an input file. \n Default: 8 if the length of the variable is undefined; otherwise, the length of the variable \n Range: 1-32767 \n\nlength-variable \n specifies a numeric variable that contains the width of the character field in the current \n record. SAS obtains the value of length-variable by reading it directly from a field that \n is described in an INPUT statement or by calculating its value in the DATA step. \n\n Requirement: You must specify length-variable immediately after $VARYINGw. in an INPUT statement. \n Restriction: Length-variable cannot be an array reference. \n Tip: If the value of length-variable is 0, negative, or missing, SAS reads no data from the \n corresponding record. A value of 0 for length-variable enables you to read zero-length records \n and fields. If length-variable is greater than 0 but less than w, SAS reads the number of columns \n that are specified by length-variable. Then SAS pads the value with trailing blanks up to the \n maximum width that is assigned to the variable. If length-variable is greater than or equal to \n w, SAS reads w columns. \n \nDetails:\nUse $VARYINGw. when the length of a character value differs from record to record. After reading \na data value with $VARYINGw., the pointer's position is set to the first column after the value."}},{"Name":"$w.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads standard character data. \n \nSyntax Description: \nw \n specifies the width of the input field. You must specify w because SAS does not supply a \n default value.\n\n Range: 1-32767 \n \nDetails:\nThe $w. informat trims leading blanks and left aligns the values before storing the text. \nIn addition, if a field contains only blanks and a single period, $w. converts the period \nto a blank because it interprets the period as a missing value. The $w. informat treats two \nor more periods in a field as character data.\n \nComparisons:\nThe $w. informat is almost identical to the $CHARw. informat. However, $CHARw. does not trim \nleading blanks nor does it convert a single period in an input field to a blank, while $w. does both."}},{"Name":"$CBw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads standard character data from column-binary files. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: none \n Range: 1-32767 \n \nDetails:\nColumn-binary data storage compresses data so that more than 80 items of data can be \nstored on a single \"virtual\" punch card.\n\nThe $CBw. informat reads standard character data from column-binary files, with each card \ncolumn represented in two bytes. The $CBw. informat translates the data into standard character \ncodes. If the combinations are invalid punch codes, SAS returns blanks and sets the automatic \nvariable _ERROR_ to 1."}},{"Name":"CBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads standard numeric values from column-binary files. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Range: 1-32 \n\nd \n specifies the power of 10 by which to divide the value. SAS uses the d value even \n if the data contain decimal points. This argument is optional.\n \nDetails:\nColumn-binary data storage compresses data so that more than 80 items of data can be \nstored on a single \"virtual\" punch card.\n\nThe CBw.d informat reads standard numeric values from column-binary files and translates \nthe data into standard binary format.\n\nSAS first stores each column of column-binary data you read with CBw.d in two bytes and \nignores the two high-order bits of each byte. If the punch codes are valid, then SAS stores \nthe equivalent numeric value in the variable that you specify. If the combinations are not \nvalid, then SAS assigns the variable a missing value and sets the automatic variable _ERROR_ to 1."}},{"Name":"PUNCH.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads whether a row of column-binary data is punched. \n \nSyntax Description: \nd \n specifies which row in a card column to read. \n Range: 1-12 \n \nDetails:\nColumn-binary data storage compresses data so that more than 80 items of data can be \nstored on a single \"virtual\" punch card.\n\nThis informat assigns the value 1 to the variable if row d of the current card column \nis punched, or 0 if row d of the current card column is not punched. After PUNCH.d reads \na field, the pointer does not advance to the next column."}},{"Name":"ROWw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a column-binary field down a card column. \n \nSyntax Description: \nw \n specifies the row where the field begins. \n Range: 0-12 \nd \n specifies the length in rows of the field. \n Default: 1 \n Range: 1-25 \n \nDetails:\nColumn-binary data storage compresses data so that more than 80 items of data can be stored \non a single \"virtual\" punch card.\n\nThe ROWw.d informat assigns the relative position of the punch in the field to a numeric variable.\n\nIf the field that you specify has more than one punch, then ROWw.d assigns the variable a missing \nvalue and sets the automatic variable _ERROR_ to 1. If the field has no punches, then ROWw.d \nassigns the variable a missing value.\n\nROWw.d can read fields across columns, continuing with row 12 of the new column and going down \nthrough the rest of the rows. After ROWw.d reads a field, the pointer moves to the next row."}},{"Name":"$KANJIw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Removes shift code data from DBCS data. \n \nSyntax Description: \nw \n specifies the width of the input field.\n\n Restriction: The width must be an even number. If it is an odd number, it is truncated. \n The width must be equal to or greater than the length of the shift-code data. \n Range: The minimum width for the informat is 2. \n\nDetails: \nThe $KANJI informat removes shift-code data from DBCS data. The $KANJI informat processes \nhost-mainframe data. $KANJI can be used on other platforms. If you use the $KANJI informat \non non-EBCDIC (non-modal encoding) hosts, the data does not change.\n\nThe data must start with SO and end with SI, unless single-byte blank data are returned. \nThe input data length must be 2 + (SO/SI length)*2."}},{"Name":"$KANJIXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Adds shift code data to DBCS data. \n \nSyntax Description:\nw \n specifies the width of the input field.\n\n Restriction: The width must be an even number. If it is an odd number, it is truncated. \n The width must be equal to or greater than the length of the shift-code data. \n Range: The minimum width for the informat is 2 + (length of shift code used on the current \n DBCSTYPE= setting)*2. \n \nDetails: \nThe $KANJIX informat adds shift-code data to DBCS data that does not have shift-code data. \nIf the input data is blank, shift-code data is not added. The $KANJIX informat processes \nhost-mainframe data, but $KANJIX can be used on other platforms. If you use the $KANJIX informat \non non-EBCDIC (non-modal encoding) hosts, the data does not change."}},{"Name":"ANYDTDTEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads and extracts the date value from various date, time, and datetime forms. \n\nSyntax Description: \n\nw \n specifies the width of the input field. \n Default: 9 \n Range: 5-32"}},{"Name":"ANYDTDTMw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads and extracts datetime values from various date, time, and datetime forms. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 19 \n Range: 1-32"}},{"Name":"ANYDTTMEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads and extracts time values from various date, time, and datetime forms.\n \nSyntax Description: \n\nw \n specifies the width of the input field.\n Default: 8 \n Range: 1-32"}},{"Name":"DATEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values in the form ddmmmyy or ddmmmyyyy. \n \nSyntax Description\n\nw \n specifies the width of the input field. \n Default: 7 \n Range: 7-32 \n Tip: Use a width of 9 to read a 4-digit year. \n \nDetails:\nThe date values must be in the form ddmmmyy or ddmmmyyyy, where \n\n dd \n is an integer from 01 through 31 that represents the day of the month.\n\n mmm \n is the first three letters of the month name.\n\n yy or yyyy \n is a two-digit or four-digit integer that represents the year. \n\nYou can separate the year, month, and day values by blanks or by special characters. Make \nsure the width of the input field allows space for blanks and special characters.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"DATETIMEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values in the form ddmmmyy hh:mm:ss.ss or ddmmmyyyy hh:mm:ss.ss. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 18 \n Range: 13-40 \n \nDetails:\nThe datetime values must be in the following form: ddmmmyy or ddmmmyyyy, followed by a blank \nor special character, followed by hh:mm:ss.ss (the time). In the date,\n\n dd is an integer from 01 through 31 that represents the day of the month.\n mmm is the first three letters of the month name.\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n \nIn the time, \n hh is the number of hours ranging from 00 through 23. \n mm is the number of minutes ranging from 00 through 59.\n ss.ss is the number of seconds ranging from 00 through 59 with the fraction of a second \n following the decimal point.\n\nDATETIMEw. requires values for both the date and the time; however, the ss.ss portion is optional. \nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option. \n\nNote: SAS can read time values with AM and PM in them. \n \nComparisons:\nThe DATETIMEw.d informat reads datetime values with optional separators in the form \n dd-mmm-yy hh:mm:ss.ss AM|PM \n \nand the date and time can be separated by a special character."}},{"Name":"DDMMYYw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values in the form ddmmyy or ddmmyyyy. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 6-32 \n \nDetails:\nThe date values must be in the form ddmmyy or ddxmmxyy, where \n\n dd is an integer from 01 through 31 that represents the day of the month.\n\n mm is an integer from 01 through 12 that represents the month.\n\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n\n x is a separators that can be any special character or a blank.:\n\nIf you use separators, place them between all the values. Blanks can also be placed \nbefore and after the date. Make sure the width of the input field allows space for \nblanks and special characters.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is \ndefined by the YEARCUTOFF= system option."}},{"Name":"EURDFDEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads international date values. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 7 (except Finnish) \n Range: 7-32 (except Finnish) \n\n Note: If you use the Finnish (FIN) language prefix, the w range is 10-32 and the default w is 10. \n \nDetails: \nThe date values must be in the form ddmmmyy or ddmmmyyyy: \n\n dd is an integer from 01-31 that represents the day of the month. \n mmm is the first three letters of the month name. \n yy or yyyy is a two-digit or four-digit integer that represents the year. \n\nYou can place blanks and other special characters between day, month, and year values.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"EURDFDTw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads international datetime values in the form ddmmmyy hh:mm:ss.ss or ddmmmyyyy \nhh:mm:ss.ss. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 18 \n Range: 13-40 \n \nDetails: \nThe date values must be in the form ddmmmyy or ddmmmyyyy, followed by a blank or special \ncharacter, and then the time values as hh:mm:ss.ss. The syntax for the date is represented \nas follows:\n\n dd is an integer from 01-31 that represents the day of the month. \n mmm is the first three letters of the month name.\n yy or yyyy is a two-digit or four-digit integer that represents the year.\n\n The syntax for time is represented as follows: \n hh is the number of hours ranging from 00-23, \n mm is the number of minutes ranging from 00-59, \n ss.ss \n is the number of seconds ranging from 00-59 with the fraction of a second following \n the decimal point.\n\nThe EURDFDTw. informat requires values for both the date and the time; however, the ss.ss \nportion is optional. \n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"EURDFMYw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads month and year date values in the form mmmyy or mmmyyyy. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 5 (except Finnish) \n Range: 5-32 (except Finnish) \n Note: If you use the Finnish (FIN) language prefix, the w range is 7-32 and \n the default value for w is 7. \n \nDetails:\nThe date values must be in the form mmmyy or mmmyyyy: \n\n mmm \n is the first three letters of the month name. \n yy or yyyy \n is a two-digit or four-digit integer that represents the year. \n\nYou can place blanks and other special characters between day, month, and year values. \nA value that is read with EURDFMYw. results in a SAS date value that corresponds to the \nfirst day of the specified month.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"JDATEYMDw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads Japanese Kanji date values in the format yymmmdd or yyyymmmdd. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 12 \n Range: 12-32 \n \nDetails:\nThe date values must be in the form yymmmdd or yyyymmmdd. \n\nYou can separate the year, month, and day values by blanks or by special characters. Note that \nin the example, the date values in the data lines are separated by special characters.\n\nWhen you use this informat, ensure that the width of the input field includes space for blanks \nand special characters.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined by \nthe YEARCUTOFF= system option."}},{"Name":"JNENGOw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads Japanese Kanji date values in the form yymmdd. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 16 \n Range: 16-32 \n \nDetails: \nThe JNENGOw. informat reads Japanese kanji values in the form yymmdd.\n\nYou can separate the year, month, and day values by blanks or by special characters. Note \nthat in the example, the date values in the data lines are separated by special characters.\n\nWhen you use this informat, ensure that the width of the input field includes space for \nblanks and special characters. \n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"JULIANw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads Julian dates in the form yyddd or yyyyddd. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 5 \n Range: 5-32 \n \nDetails:\nThe date values must be in the form yyddd or yyyyddd, where\n\n yy or yyyy \n is a two-digit or four-digit integer that represents the year. \n\n dd or ddd \n is an integer from 01 through 365 that represents the day of the year.\n\nJulian dates consist of strings of contiguous numbers, which means that zeros must pad \nany space between the year and the day values. \n\nJulian dates that contain year values before 1582 are invalid for the conversion to Gregorian dates.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"MINGUOw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads dates in Taiwanese form. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 6-10 \n \nDetails:\nThe general form of a Taiwanese date is yyyymmdd:\n\n yyyy is an integer that represents the year. \n\n mm is an integer from 01 through 12 that represents the month.\n\n dd is an integer from 01 through 31 that represents the day of the month.\n\nThe Taiwanese calendar uses 1912 as the base year (01/01/01 is January 1, 1912). \nDates before 1912 are not valid. Year values do not roll over after 100 years; \ninstead, they continue to increase.\n\nYou can separate the year, month, and day values with any delimiters, such as \nblanks, slashes, or dashes, that are permitted by the YYMMDDw. informat. If \ndelimiters are used, place them between all the values. If you omit delimiters, \nbe sure to use a leading zero for days or months that have a value less than 10."}},{"Name":"MDYAMPMw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values in the form mm-dd-yy hh:mm:ss.ss AM|PM, where a special character such \nas a hyphen (-), period (.), slash (/), or colon (:) separates the month, day, and year; \nthe year can be either 2 or 4 digits. \n \nSyntax Description: \nw \n specifies the width of the output field. \n Default: 19 \n Range: 8-40 \nd \n specifies the number of digits to the right of the decimal point in the seconds value.\n The digits to the right of the decimal point specify a fraction of a second. This argument \n is optional.\n Default: 0 \n Range: 0-39 \n \nDetails: \nThe MDYAMPMw.d format reads SAS datetime values in the following form: \n mm-dd-yy hh:mm<:ss<.ss>> \nwhere: \n mm is an integer from 01 through 12 that represents the month.\n\n dd is an integer from 01 through 31 that represents the day of the month.\n yy or yyyy \n specifies a two-digit or four-digit integer that represents the year.\n hh is the number of hours that range from 00 through 23.\n mm is the number of minutes that range from 00 through 59.\n ss.ss \n is the number of seconds that range from 00 through 59 with the fraction of a second \n following the decimal point.\n Requirement: If a fraction of a second is specified, the decimal point can be represented \n only by a period and is required. \n AM | PM \n specifies either the time period 00:01-12:00 noon (AM) or the time period 12:01 - 12:00 midnight ( PM) \n - or : \n represents one of several special characters, such as the slash (/), hyphen (-), colon (:), \n or a blank character that can be used to separate date and time components. Special characters \n can be used as separators between any date or time component and between the date and the time."}},{"Name":"MMDDYYw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values in the form mmddyy or mmddyyyy. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 6-32 \n \nDetails:\nThe date values must be in the form mmddyy or mmddyyyy, where \n\n mm is an integer from 01 through 12 that represents the month.\n\n dd is an integer from 01 through 31 that represents the day of the month.\n\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n\nYou can separate the month, day, and year fields by blanks or by special characters. \nHowever, if you use delimiters, place them between all fields in the value. Blanks can \nalso be placed before and after the date.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"MONYYw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads month and year date values in the form mmmyy or mmmyyyy. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 5 \n Range: 5-32 \n \nDetails:\nThe date values must be in the form mmmyy or mmmyyyy, where \n\n mmm is the first three letters of the month name.\n\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n\nA value read with the MONYYw. informat results in a SAS date value that corresponds to the \nfirst day of the specified month.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined by \nthe YEARCUTOF= system option."}},{"Name":"MSECw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads TIME MIC values. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Requirement: w must be 8 because the OS TIME macro or the STCK System/370 instruction on \n IBM mainframes each return an eight-byte value. \n \nDetails: \nThe MSECw. informat reads time values that are produced by IBM mainframe operating environments \nand converts the time values to SAS time values.\n\nUse the MSECw. informat to find the difference between two IBM mainframe TIME values, with \nprecision to the nearest microsecond.\n \nComparisons:\nThe MSECw. and TODSTAMPw. informats both read IBM time-of-day clock values, but the \nMSECw. informat assigns a time value to a variable, and the TODSTAMPw. informat assigns \na datetime value."}},{"Name":"NENGOw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads Japanese date values in the form eyymmdd. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Default: 10 \n Range: 7-32 \n \nDetails: \nThe general form of a Japanese date is eyymmdd:\n\n e is the first letter of the name of the imperial era(Meiji, Taisho, Showa, or Heisei).\n\n yy is an integer that represents the year. \n\n mm is an integer from 01 through 12 that represents the month.\n\n dd is an integer from 01 through 31 that represents the day of the month.\n\nThe e value can be separated from the integers by a period. If you omit e, SAS uses the \ncurrent imperial era. You can separate the year, month, and day values by blanks or any \nnonnumeric character. However; if delimiters are used, place them between all the values. \nIf you omit delimiters, be sure to use a leading zero for days or months that are values \nless than 10."}},{"Name":"NLDATEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the date value in the specified locale and then converts the date value to \nthe local SAS date value. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 20 \n Range: 10-200"}},{"Name":"NLDATMw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the datetime value of the specified locale, and then converts the datetime \nvalue to the local SAS datetime value. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 30 \n Range: 10-200"}},{"Name":"NLTIMAPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the time value and uses a.m. and p.m. in the specified locale, and then \nconverts the time value to the local SAS-time value. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 10 \n Range: 4-200"}},{"Name":"NLTIMEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the time value in the specified locale and then converts the time value to \nthe local SAS time value. \n\nSyntax Description: \n\nw \n specifies the width of the input field.\n\n Default: 20 \n Range: 10-200"}},{"Name":"PDJULGw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads packed Julian date values in the hexadecimal form yyyydddF for IBM. \n \nSyntax Description\n\nw \n specifies the width of the input field. \n Default: 4 \n Range: 4 \n \nDetails: \nThe PDJULGw. informat reads IBM packed Julian date values in the form of yyyydddF, \nconverting them to SAS date values, where \n\n yyyy \n is the two-byte representation of the four-digit Gregorian year.\n\n ddd \n is the one-and-a-half byte representation of the three-digit integer that corresponds \n to the Julian day of the year, 1-365 (or 1-366 for leap years). \n\n F \n is the half byte that contains all binary 1s, which assigns the value as positive.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"PDJULIw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads packed Julian dates in the hexadecimal format ccyyddd F for IBM. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 4 \n \nDetails: \nThe PDJULIw. informat reads IBM packed Julian date values in the form ccyydddF, converting \nthem to SAS date values, where\n\n cc \n is the one-byte representation of a two-digit integer that represents the century.\n\n yy \n is the one-byte representation of a two-digit integer that represents the year. The \n PDJULIw informat makes an adjustment to the one-byte century representation by adding \n 1900 to the two-byte ccyy value in order to produce the correct four-digit Gregorian \n year. This adjustment causes ccyy values of 0098 to become 1998, 0101 to become 2001, \n and 0218 to become 2118.\n\n ddd \n is the one-and-a-half bytes representation of the three-digit integer that corresponds \n to the Julian day of the year, 1-365 (or 1-366 for leap years).\n\n F \n is the half byte that contains all binary 1s, which assigns the value as positive."}},{"Name":"PDTIMEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads packed decimal time of SMF and RMF records. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Requirement: w must be 4 because packed decimal time values in RMF and SMF records \n contain four bytes of information. \n \nDetails:\nThe PDTIMEw. informat reads packed decimal time values that are contained in SMF and \nRMF records that are produced by IBM mainframe systems and converts the values to SAS \ntime values. \n\nThe general form of a packed decimal time value in hexadecimal notation is 0hhmmssF, where \n\n 0 is a half byte that contains all 0s.\n\n hh is one byte that represents two digits that correspond to hours. \n\n mm is one byte that represents two digits that correspond to minutes.\n\n ss is one byte that represents two digits that correspond to seconds.\n\n F is a half byte that contains all 1s.\n\nIf a field contains all 0s, PDTIMEw. treats it as a missing value. \nPDTIMEw. enables you to read packed decimal time values from files that are created \non an IBM mainframe on any operating environment."}},{"Name":"RMFDURw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads duration intervals of RMF records. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Requirement: w must be 4 because packed decimal duration values in RMF records \n contain four bytes of information. \n \nDetails: \nThe RMFDURw. informat reads the duration of RMF measurement intervals of RMF records \nthat are produced as packed decimal data by IBM mainframe systems and converts them to \nSAS time values.\n\nThe general form of the duration interval data in an RMF record in hexadecimal notation \nis mmsstttF, where \n\n mm is the one-byte representation of two digits that correspond to minutes.\n\n ss is the one-byte representation of two digits that correspond to seconds.\n\n ttt is the one-and-a-half-bytes representation of three digits that correspond \n to thousandths of a second.\n\n F is a half byte that contains all binary 1s, which assigns the value as positive. \n\nIf the field does not contain packed decimal data, then RMFDURw. results in a missing value.\n \nComparisons: \nBoth the RMFDURw. informat and the RMFSTAMPw. informat read packed decimal information \nfrom RMF records that are produced by IBM mainframe systems.\n\nThe RMFDURw. informat reads duration data and results in a time value.\nThe RMFSTAMPw. informat reads time-of-day data and results in a datetime value."}},{"Name":"RMFSTAMPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time and date fields of RMF records. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Requirement: w must be 8 because packed decimal time and date values in RMF records \n contain eight bytes of information: four bytes of time data that are followed by four \n bytes of date data. \n \nDetails:\nThe RMFSTAMPw. informat reads packed decimal time and date values of RMF records that \nare produced by IBM mainframe systems, and converts the time and date values to SAS \ndatetime values.\n\nThe general form of the time and date information in an RMF record in hexadecimal notation \nis 0hhmmssFccyydddF, where \n\n 0 is the half byte that contains all binary 0s.\n\n hh is the one-byte representation of two digits that correspond to the hour of the day.\n\n mm is the one-byte representation of two digits that correspond to minutes.\n\n ss is 1 byte that represents two digits that correspond to seconds.\n\n cc is the one-byte representation of two digits that correspond to the century.\n\n yy is the one-byte representation of two digits that correspond to the year.\n\n ddd is the one-and-a-half bytes that contain three digits that correspond to the day of the year.\n\n F is the half byte that contains all binary 1s. \n\nThe century indicators 00 correspond to 1900, 01 to 2000, and 02 to 2100.\n\nRMFSTAMPw. enables you to read, on any operating environment, packed decimal time and \ndate values from files that are created on an IBM mainframe."}},{"Name":"SHRSTAMPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date and time values of SHR records. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Requirement: w must be 8 because packed decimal date and time values in SHR records \n contain eight bytes of information: four bytes of date data that are followed by four \n bytes of time data. \n \nDetails:\nThe SHRSTAMPw. informat reads packed decimal date and time values of SHR records that are produced \nby IBM mainframe environments and converts the date and time values to SAS datetime values.\n\nThe general form of the date and time information in an SHR record in hexadecimal notation is \nccyydddFhhmmssth, where \n\n ccyy \n is the two byte representation of the year. The cc portion is the one byte representation of a \n two-digit integer that represents the century. The yy portion is the one byte representation of \n two digits that correspond to the year.\n\n The cc portion is the century indicator where 00 indicates 19yy, 01 indicates 20yy, 02 indicates \n 21yy, and so on. A hexadecimal year value of 0115 is equal to the year 2015.\n\n ddd \n is the one-and-a-half bytes that contain three digits that correspond to the day of the year.\n\n F is the half byte that contains all binary 1s.\n hh is the one byte representation of two digits that correspond to the hour of the day.\n mm is the one byte representation of two digits that correspond to minutes. \n ss is the one byte representation of two digits that correspond to seconds. \n th is the one byte representation of two digits that correspond to a 100th of a second. \n\nThe SHRSTAMPw. informat enables you to read, on any operation environment, packed decimal date \nand time values from files that are created on an IBM mainframe."}},{"Name":"SMFSTAMPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time and date values of SMF records. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Requirement: w must be 8 because time and date values in SMF records contain eight bytes of \n information: four bytes of time data that are followed by four bytes of date data. \n Tip: The time portion of an SMF record is a four-byte integer binary number that represents \n time as the number of hundredths of a second past midnight. \n \nDetails:\nThe SMFSTAMPw. informat reads integer binary time values and packed decimal date values of SMF \nrecords that are produced by IBM mainframe systems and converts the time and date values to SAS \ndatetime values.\n\nThe date portion of an SMF record in hexadecimal notation is ccyydddF, where \n\n cc is the one-byte representation of two digits that correspond to the century.\n\n yy is the one-byte representation of two digits that correspond to the year.\n\n ddd is the one-and-a-half bytes that contain three digits that correspond to the day of the year.\n\n F is the half byte that contains all binary 1s.\n\nThe SMFSTAMPw. informat enables you to read, on any operating environment, integer binary \ntime values and packed decimal date values from files that are created on an IBM mainframe."}},{"Name":"STIMERw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time values and determines whether the values are hours, minutes, or seconds; \nreads the output of the STIMER system option. \n\nSyntax Description: \nw \n specifies the width of the input field.\n \nDetails: \nThe STIMER informat reads performance statistics that the STIMER system option writes to the SAS log.\n\nThe informat reads time values and determines whether the values are hours, minutes, or seconds \nbased on the presence of decimal points and colons: \n\n o If no colon is present, the value is the number of seconds. \n o If a single colon is present, the value before the colon is the number of minutes. The value \n after the colon is the number of seconds. \n o If two colons are present, the sequence of time is hours, minutes, and then seconds.\n \nIn all cases, the result is a SAS time value.\nThe input values for STIMER must be in one of the following forms: \n o ss \n o ss.ss \n o mm:ss \n o mm:ss.ss \n o hh:mm:ss \n o hh:mm:ss.ss\n\nwhere\n ss is an integer that represents the number of seconds.\n mm is an integer that represents the number of minutes.\n hh is an integer that represents the number of hours."}},{"Name":"TIMEw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads hours, minutes, and seconds in the form hh:mm:ss.ss. \n \nSyntax Description: \n w \n specifies the width of the input field.\n Default: 8 \n Range: 5-32 \n \nDetails:\nThe TIMEw. informat reads SAS time values in the following form: \n\n hh:mm:ss<.ss> \n\nwhere\n hh is an integer that represents the number of hours.\n : represents a special character that separates hours, minutes, and seconds.\n mm is the number of minutes that range from 00 through 59.\n \n ss<.ss> \n is an integer that represents the number of seconds, and if needed, tenths of a second. \n Seconds and tenths of a second must always be separated by a period.\n\n AM | PM \n AM indicates time between 12:00 midnight and 11:59 in the morning. PM indicates time \n between 12:00 noon and 11:59 at night.\n\nSeparate hh, mm, and ss with a special character. When the period is used as the special character, \nthe time is interpreted in the order hours, minutes, and seconds. For example, 23.22 is 23 hours and \n22 minutes, not 23 minutes and 22 seconds, or 23 seconds and 22 tenths of a second.\n\nIf you do not enter a value for seconds, SAS assumes a value of 0. \nThe stored value is the total number of seconds in the time value."}},{"Name":"TODSTAMPw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads an eight-byte time-of-day stamp. \n \nSyntax Description\n\nw \n specifies the width of the input field. \n Requirement: w must be 8 because the OS TIME macro or the STCK instruction on IBM \n mainframes each return an eight-byte value. \n \nDetails:\nThe TODSTAMPw. informat reads time-of-day clock values that are produced by IBM mainframe \noperating systems and converts the clock values to SAS datetime values.\n\nIf the time-of-day value is all 0s, TODSTAMPw. results in a missing value.\n\nUse TODSTAMPw. on other operating environments to read time-of-day values that are produced \nby an IBM mainframe."}},{"Name":"TUw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads timer units. \n \nSyntax Description: \n\nw \n specifies the width of the input field.\n Requirement: w must be 4 because the OS TIME macro returns a four-byte value. \n \nDetails: \nThe TUw. informat reads timer unit values that are produced by IBM mainframe operating \nenvironments and converts the timer unit values to SAS time values.\n\nThere are exactly 38,400 software timer units per second. The low-order bit in a timer unit \nvalue represents approximately 26.041667 microseconds.\n\nUse the TUw. informat to read timer unit values that are produced by an IBM mainframe on \nother operating environments."}},{"Name":"WEEKUw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the format of the number-of-week value within the year and returns a SAS date \nvalue by using the U algorithm. \n\nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 11 \n Range: 3-200 \n \nDetails:\nThe WEEKUw. informat reads the format of the number-of-week within the year, and then \nreturns a SAS date value by using the U algorithm. If the input does not contain a year \nexpression, then WEEKUw. uses the current year as the year expression, which is the default. \nIf the input does not contain a day expression, then WEEKUw. uses the first day of the week \nas the day expression, which is the default. \n\nThe U Algorithm calculates the SAS date value using the number-of-week value within the year \n(Sunday is considered the first day of the week). The number-of-week value is represented as \na decimal number in the range 0-53, with a leading zero and maximum value of 53. For example, \nthe fifth week of the year would be represented as 05."}},{"Name":"WEEKVw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the format of the number-of-week value within the year and returns a SAS date \nvalue using the V algorithm. \n\nSyntax Description:\nw \n specifies the width of the input field.\n Default: 11 \n Range: 3-200 \n \nDetails:\nThe WEEKVw. informat reads a format of the number-of-week value. If the input does not \ncontain a year expression, WEEKVw. uses the current year as the year expression, which \nis the default. If the input does not contain a day expression, WEEKVw. uses the first \nday of the week as the day expression, which is the default. \n\nThe V algorithm calculates the SAS date value. The number-of-week value is represented \nas a decimal number in the range 01-53, with a leading zero and maximum value of 53. \nWeeks begin on a Monday and week 1 of the year is the week that includes both January \n4th and the first Thursday of the year. If the first Monday of January is the 2nd, 3rd, \nor 4th, the preceding days are part of the last week of the preceding year. For example, \nthe fifth week of the year would be represented as 06."}},{"Name":"WEEKWw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads the format of the number-of-week value within the year and returns a SAS date \nvalue using the W algorithm. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 11 \n Range: 3-200 \n\nDetails: \nThe WEEKWw. informat reads a format of the number-of-week value. If the input does \nnot contain a year expression, the WEEKWw. informat uses the current year as the year \nexpression, which is the default. If the input does not contain a day expression, the \nWEEKWw. informat uses the first day of the week as the day expression, which is the \ndefault. Algorithm W calculates the SAS date value using the number of the week within \nthe year (Monday is considered the first day of the week). The number-of-week value is \nrepresented as a decimal number in the range 0-53, with a leading zero and maximum \nvalue of 53. For example, the fifth week of the year would be represented as 05."}},{"Name":"YMMDDTTMw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values in the form yy-mm-dd hh:mm:ss.ss, where special characters \nsuch as a hyphen (-), period (.), slash (/), or colon (:) are used to separate the \nyear, month, day, hour, minute, and seconds; the year can be either 2 or 4 digits. \n \nSyntax Description: \nw \n specifies the width of the output field.\n Default: 19 \n Range: 13-40 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. The digits \n to the right of the decimal point specify a fraction of a second. This argument is optional.\n Default: 0 \n Range: 0-39 \n \nDetails:\nThe YMDDTTMw.d format reads SAS datetime values in the following form: \n yy-mm-dd hh:mm:> \n The following list explains the datetime variables: \n yy or yyyy \n specifies a two- or four-digit integer that represents the year.\n\n mm is an integer from 01 through 12 that represents the month. \n dd is an integer from 01 through 31 that represents the day of the month. \n hh is the number of hours ranging from 00 through 23. \n mm is the number of minutes ranging from 00 through 59.\n\n ss.ss is the number of seconds ranging from 00 through 59 with the fraction of a second \n following the decimal point. \n\n Requirement: If a fraction of a second is specified, the decimal point can be represented \n only by a period and is required. \n\n - or : \n represents one of several special characters, such as the slash (/), dash (-), colon (:), \n or a blank character that can be used to separate date and time components. Special characters \n can be used as separators between any date or time component and between the date and the time."}},{"Name":"YYMMDDw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values in the form yymmdd or yyyymmdd. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 6-32 \n \nDetails:\nThe date values must be in the form yymmdd or yyyymmdd, where \n\n yy or yyyy is a two-digit or four-digit integer that represents the year. \n\n mm is an integer from 01 through 12 that represents the month of the year. \n\n dd is an integer from 01 through 31 that represents the day of the month.\n\nYou can separate the year, month, and day values by blanks or by special characters. \nHowever, if delimiters are used, place them between all the values. You can also place \nblanks before and after the date. Make sure the width of the input field allows space \nfor blanks and special characters.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"YYMMNw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values in the form yyyymm or yymm. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 4-6 \n \nDetails:\nThe date values must be in the form yyyymm or yymm, where \n\n yy or yyyy \n is a two-digit or four-digit integer that represents the year. \n\n mm \n is a two-digit integer that represents the month.\n\nThe N in the informat name must be used and indicates that you cannot separate the \nyear and month values by blanks or by special characters. SAS automatically adds a \nday value of 01 to the value to make a valid SAS date variable.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is \ndefined by the YEARCUTOFF= system option."}},{"Name":"YYQw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads quarters of the year in the form yyQ q or yyyyQq. \n \nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 6 (For SAS version 6, the default is 4.) \n Range: 4-32 (For SAS version 6, the range is 4-6.) \n \nDetails:\nThe quarter must be in the form yyQq or yyyyQq, where\n\n yy or yyyy \n is an integer that represents the two-digit or four-digit year.\n\n q \n is an integer (1, 2, 3, or 4) that represents the quarter of the year. You can also \n represent the quarter as 01, 02, 03, or 04. \n\nThe letter Q must separate the year value and the quarter value. The year value, the \nletter Q, and the quarter value cannot be separated by blanks. A value that is read \nwith YYQw. produces a SAS date value that corresponds to the first day of the specified \nquarter.\n\nNote: SAS interprets a two-digit year as belonging to the 100-year span that is defined \nby the YEARCUTOFF= system option."}},{"Name":"$CPTDWw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in Hebrew DOS (cp862) and then converts the \ncharacter string to Windows (cp1255) encoding. \n\nSyntax Description:\nw \n specifies the width of the input field.\n\n Default: 200 \n Range: 1-32000 \n \nComparisons:\nThe $CPTDWw. informat performs processing that is opposite of the $CPTWDw. informat."}},{"Name":"$CPTWDw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a character string that is encoded in Windows (cp1255) and then converts the \ncharacter string to Hebrew DOS (cp862) encoding. \n\nSyntax Description: \n\nw \nspecifies the width of the input field.\n\nDefault: 200 \nRange: 1-32000 \n \nComparisons:\nThe $CPTWDw. informat performs processing that is opposite of the $CPTDWw. informat."}},{"Name":"BINARYw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts positive binary values to integers. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 1-64 \nd \n specifies the power of 10 by which to divide the value. SAS uses the d value even if the \n data contain decimal points. This argument is optional. \n Range: 0-31 \n\nDetails: \nUse only the character digits 1 and 0 in the input, with no embedded blanks. BINARYw.d ignores \nleading and trailing blanks.\n\nBINARYw.d cannot read negative values. It treats all input values as positive (unsigned)."}},{"Name":"BITSw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Extracts bits. \n \nSyntax Description: \nw \n specifies the number of bits to read. \n Default: 1 \n Range: 1-64 \nd \n specifies the zero-based offset. \n Range: 0-63 \n \nDetails:\nThe BITSw.d informat extracts particular bits from an input stream and assigns the numeric \nequivalent of the extracted bit string to a variable. Together, the w and d values specify \nthe location of the string you want to read.\n\nThis informat is useful for extracting data from system records that have many pieces of \ninformation packed into single bytes."}},{"Name":"BZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts blanks to 0s. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain decimal points, \n the d value is ignored. This argument is optional. \n Range: 0-31 \n \nDetails: \nThe BZw.d informat reads numeric values, converts any trailing or embedded blanks to 0s, \nand ignores leading blanks.\n\nThe BZw.d informat can read numeric values that are located anywhere in the field. Blanks \ncan precede or follow the numeric value, and a minus sign must precede negative values. \nThe BZw.d informat ignores blanks between a minus sign and a numeric value in an input field.\n\nThe BZw.d informat interprets a single period in a field as a 0. The informat interprets \nmultiple periods or other nonnumeric characters in a field as a missing value.\n\nTo use BZw.d in a DATA step with list input, change the delimiter for list input with the \nDLM= or DLMSTR= option in the INFILE statement. By default, SAS interprets blanks between \nvalues in the data line as delimiters rather than 0s.\n \nComparisons:\nThe BZw.d informat converts trailing or embedded blanks to 0s. If you do not want to convert \ntrailing blanks to 0s (for example, when reading values in E-notation), use either the w.d \ninformat or the Ew.d informat instead."}},{"Name":"COMMAw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Removes embedded characters. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain decimal \n points, the d value is ignored. This argument is optional. \n Range: 0-31 \n \nDetails:\nThe COMMAw.d informat reads numeric values and removes embedded commas, blanks, dollar \nsigns, percent signs, dashes, and close parentheses from the input data. The COMMAw.d \ninformat converts an open parenthesis at the beginning of a field to a minus sign.\n \nComparisons:\nThe COMMAw.d informat operates like the COMMAXw.d informat, but it reverses the roles of \nthe decimal point and the comma. This convention is common in European countries."}},{"Name":"COMMAXw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Removes embedded characters. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain a comma, \n which represents a decimal point, the d value is ignored. This argument is optional.\n Range: 0-31 \n \nDetails: \nThe COMMAXw.d informat reads numeric values and removes embedded periods, blanks, dollar \nsigns, percent signs, dashes, and close parentheses from the input data. The COMMAXw.d \ninformat converts an open parenthesis at the beginning of a field to a minus sign.\n \nComparisons:\nThe COMMAXw.d informat operates like the COMMAw.d informat, but it reverses the roles of \nthe decimal point and the comma. This convention is common in European countries."}},{"Name":"Ew.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric values that are stored in scientific notation and double-precision \nscientific notation. \n\nSyntax Description: \nw \n specifies the width of the field that contains the numeric value. \n Default: 12 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n If the data contain decimal points, the d value is ignored. This argument is optional. \n Range: 0-31 \n \nComparisons:\nThe Ew.d informat is not used extensively because the SAS informat for standard numeric data, \nthe w.d informat, can read numbers in scientific notation. Use Ew.d to permit only scientific \nnotation in your input data."}},{"Name":"EUROw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric values and removes embedded characters in European currency and \nreverses the comma and decimal point. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contains decimal \n points, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe EUROw.d informat reads numeric values and removes embedded euro symbols (E), commas, \nblanks, percent signs, dashes, and close parentheses from the input data. A decimal point \nis assumed to be a separator between the whole number and the decimal portion. The EUROw.d \ninformat converts an open parenthesis at the beginning of a field to a minus sign. \n \nComparisons:\nThe EUROw.d informat is similar to the EUROXw.d informat, but EUROXw.d reverses the roles \nof the decimal point and the comma. This convention is common in European countries.\n\nIf no commas or periods appear in the input, then the EUROw.d and the EUROXw.d informats \nare interchangeable."}},{"Name":"EUROXw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric values and removes embedded characters in European currency. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contains decimal \n points, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe EUROXw.d informat reads numeric values and removes embedded euro symbols (E), periods, \nblanks, percent signs, dashes, and close parentheses from the input data. A comma is assumed \nto be a separator between the whole number and the decimal portion. The EUROXw.d informat \nconverts an open parenthesis at the beginning of a field to a minus sign. \n \nComparisons:\nThe EUROXw.d informat is similar to the EUROw.d informat, but EUROw.d reverses the roles of \nthe comma and the decimal point. This convention is common in English-speaking countries.\n\nIf no commas or periods appear in the input, the EUROXw.d and the EUROw.d informats are interchangeable."}},{"Name":"FLOATw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a native single-precision, floating-point value and divides it by 10 raised \nto the dth power. \n\nSyntax Description:\nw \n specifies the width of the input field. \n Requirement: w must be 4. \nd \n specifies the power of 10 by which to divide the value. This argument is optional.\n \nDetails:\nThe FLOATw.d informat is useful in operating environments where a float value is not the same \nas a truncated double.\n\nOn the IBM mainframe systems, a four-byte floating-point number is the same as a truncated eight-byte \nfloating-point number. However, in operating environments that use the IEEE floating-point standard, \nsuch as the IBM PC-based operating environments and most UNIX platforms, a four-byte floating-point \nnumber is not the same as a truncated double. Therefore, the RB4. informat does not produce the same \nresults as FLOAT4. Floating-point representations other than IEEE might have this same characteristic. \nValues read with FLOAT4. typically come from some other external program that is running in your \noperating environment."}},{"Name":"HEXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts hexadecimal positive binary values to either integer (fixed-point) or real \n(floating-point) binary values. \n\nSyntax Description: \nw \n specifies the field width of the input value and also specifies whether the final value \n is fixed-point or floating-point.\n\n Default: 8 \n Range: 1-16 \n Tip: If w<16, HEXw. converts the input value to positive integer binary values, treating \n all input values as positive (unsigned). If w is 16, HEXw. converts the input value to real \n binary (floating-point) values, including negative values. \n \nDetails:\nNote: Different operating environments store floating-point values in different ways. \nHowever, HEX16. reads hexadecimal representations of floating-point values with consistent \nresults if the values are expressed in the same way that your operating environment stores them. \n\nThe HEXw. informat ignores leading or trailing blanks."}},{"Name":"IBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads native integer binary (fixed-point) values, including negative values. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Default: 4 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails:\nThe IBw.d informat reads integer binary (fixed-point) values, including negative values \nrepresented in two's complement notation. IBw.d reads integer binary values with consistent \nresults if the values are created in the same type of operating environment that you use to \nrun SAS. \n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering."}},{"Name":"IBRw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads integer binary (fixed-point) values in Intel and DEC formats. \n \nSyntax Description: \nw \n specifies the width of the input field.\n Default: 4 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails:\nThe IBRw.d informat reads integer binary (fixed-point) values, including negative values \nthat are represented in two's complement notation. IBRw.d reads integer binary values that \nare generated by and for Intel and DEC platforms. Use IBRw.d to read integer binary data \nfrom Intel or DEC environments in other operating environments. The IBRw.d informat in SAS \ncode allows for a portable implementation for reading the data in any operating environment.\n\nNote: Different operating environments store integer binary values in different ways. \nThis concept is called byte ordering."}},{"Name":"IEEEw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads an IEEE floating-point value and divides it by 10 raised to the d th power. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 2-8 \n Tip: If w is 8, an IEEE double-precision, floating-point number is read. If w is 5, 6, \n or 7, an IEEE double-precision, floating-point number is read, which assumes truncation \n of the appropriate number of bytes. If w is 4, an IEEE single-precision, floating-point \n number is read. If w is 3, an IEEE single-precision, floating-point number is read, \n which assumes truncation of one byte. \nd \nspecifies the power of 10 by which to divide the value.\n \nDetails:\nThe IEEEw.d informat is useful in operating environments where IEEE is the floating-point \nrepresentation that is used. In addition, you can use the IEEEw.d informat to read files \nthat are created by programs on operating environments that use the IEEE floating-point \nrepresentation.\n\nTypically, programs generate IEEE values in single precision (4 bytes) or double precision \n(8 bytes). Truncation is performed by programs solely to save space on output files. Machine \ninstructions require that the floating-point number be of one of the two lengths. The IEEEw.d \ninformat allows other lengths, which enables you to read data from files that contain space-saving \ntruncated data."}},{"Name":"NLMNYw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads monetary data in the specified locate for the local expression, and converts \nthe data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 9 \n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31\n \nDetails: \nThe NLMNYw.d informat reads monetary data in the specified locale for the local expression, \nand then converts the data to a numeric value. It removes any thousands separators, decimal \nseparators, blanks, the currency symbol, and the close parenthesis from the input data.\n \nComparisons: \nThe NLMNYw.d informat performs processing that is the opposite of the NLMNYIw.d informat.\n\nThe NLMNYw.d informat is similar to the DOLLARw.d informat except that the NLMNYw.d informat \nis locale-specific."}},{"Name":"NLMNYIw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads monetary data in the specified locale for the international expression, and \nthen converts the data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 9 \n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLMNYIw.d informat reads monetary data in the specified locale for the international \nexpression, and then converts the data to a numeric value. It removes any thousands separators, \ndecimal separators, blanks, the currency symbol, and the close parenthesis from the input data.\n \nComparisons:\nThe NLMNYIw.d informat performs processing that is the opposite of the NLMNYw.d informat."}},{"Name":"NLNUMw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric data in the specified locale for local expressions, and then converts \nthe data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6\n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLNUMw.d) informat reads numeric data in the specified locale for local expressions, \nand then converts the data to a numeric value. It removes any thousands separators, decimal \nseparators, blanks, the currency symbol, and the close parenthesis from the input data.\n \nComparisons:\nThe NLNUMw.d informat performs processing that is opposite to the NLNUMIw.d informat."}},{"Name":"NLNUMIw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric data in the specified locale for international expressions, and then \nconverts the data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6\n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLNUMIw.d informat reads numeric data in the specified locale for international \nexpressions, and then converts the data to a numeric value. It removes any thousands \nseparators, decimal separators, blanks, the currency symbol, and the close parenthesis \nfrom the input data.\n\nComparisons: \nThe NLNUMIw.d informat performs processing that is opposite to the NLNUMw.d informat."}},{"Name":"NLPCTw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads percentage data in the specified locale for local expressions, and then \nconverts the data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6\n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails:\nThe NLPCTw.d informat reads percentage data in the specified locale for local expressions, \nand then converts the data to a numeric value. It divides the value by 100 and removes any \nthousands separators, decimal separators, blanks, the percent sign, and the close parenthesis \nfrom the input data.\n \nComparisons: \nThe NLPCTw.d informat performs processing that is opposite of the NLPCTIw.d informat. The \nNLPCTw.d informat is similar to the PERCENTw.d informat except that the NLPCTw.d informat \nis locale-specific."}},{"Name":"NLPCTIw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads percentage data in the specified locale for international expressions, and \nthen converts the data to a numeric value. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6\n Range: 1-32 \nd \n optionally specifies whether to divide the number by 10^d. If the data contains decimal \n separators, the d value is ignored. \n Default: 0 \n Range: 0-31 \n \nDetails: \nThe NLPCTIw.d informat reads percentage data in the specified locale for international \nexpressions, and then converts the data to a numeric value. It divides the value by 100 \nand removes any thousands separators, decimal separators, blanks, the percent sign, and \nthe close parentheses from the input data.\n \nComparisons: \nThe NLPCTIw.d informat performs processing that is opposite of the NLPCTw.d informat."}},{"Name":"NUMXw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric values with a comma in place of the decimal point. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 12 \n Range: 1-32 \nd \n specifies the number of digits to the right of the decimal. If the data contain decimal \n points, the d value is ignored. This argument is optional. \n Range: 0-31 \n \nDetails: \nThe NUMXw.d informat reads numeric values and interprets a comma as a decimal point.\n \nComparisons: \nThe NUMXw.d informat is similar to the w.d informat except that it reads numeric values \nthat contain a comma in place of the decimal point."}},{"Name":"OCTALw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts positive octal values to integers. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 3 \n Range: 1-24 \nd \n specifies the power of 10 by which to divide the value. This argument is optional.\n Range: 1-31 \n Restriction: must be greater than or equal to the w value. \n \nDetails: \nUse only the digits 0 through 7 in the input, with no embedded blanks. The OCTALw.d \ninformat ignores leading and trailing blanks.\n\nOCTALw.d cannot read negative values. It treats all input values as positive (unsigned)."}},{"Name":"PDw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads data that are stored in IBM packed decimal format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-16 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails:\nThe PDw.d informat is useful because many programs write data in packed decimal format for \nstorage efficiency, fitting two digits into each byte and using only a half byte for a sign. \n\nNote: Different operating environments store packed decimal values in different ways. However, \nPDw.d reads packed decimal values with consistent results if the values are created on the same \ntype of operating environment that you use to run SAS. \n\nThe PDw.d format writes missing numerical data as -0. When the PDw.d informat reads -0, it \nstores it as 0."}},{"Name":"PERCENTw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads percentages as numeric values. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain decimal \n points, the d value is ignored. This argument is optional. \n Range: 0-31 \n \nDetails:\nThe PERCENTw.d informat converts the numeric portion of the input data to a number using \nthe same method as the COMMAw.d informat. If a percent sign (%) follows the number in the \ninput field, PERCENTw.d divides the number by 100."}},{"Name":"PIBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads positive integer binary (fixed-point) values. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails:\nAll values are treated as positive. PIBw.d reads positive integer binary values with \nconsistent results if the values are created in the same type of operating environment \nthat you use to run SAS.\n\nNote: Different operating environments store positive integer binary values in different \nways. This concept is called byte ordering."}},{"Name":"PIBRw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads positive integer binary (fixed-point) values in Intel and DEC formats. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails:\nAll values are treated as positive. PIBRw.d reads positive integer binary values that have \nbeen generated by and for Intel and DEC operating environments. Use PIBRw.d to read positive \ninteger binary data from Intel or DEC environments on other operating environments. The \nPIBRw.d informat in SAS code allows for a portable implementation for reading the data in \nany operating environment. \n\nNote: Different operating environments store positive integer binary values in different \nways. This concept is called byte ordering."}},{"Name":"PKw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads unsigned packed decimal data. \n \nSyntax Description:\n\nw \n specifies the number of bytes of unsigned packed decimal data, each of which contains two digits.\n Default: 1 \n Range: 1-16 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails: \nEach byte of unsigned packed decimal data contains two digits.\n \nComparisons: \nThe PKw.d informat is the same as the PDw.d informat, except that PKw.d treats the sign \nhalf of the field's last byte as part of the value, not as the sign of the value."}},{"Name":"RBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric data that are stored in real binary (floating-point) notation. \n \nSyntax Description:\nw \nspecifies the width of the input field.\n\nd \nspecifies the power of 10 by which to divide the input value. This argument \nis optional. If you specify d, the RBw.d informat divides the input value by \nthe 10d value. SAS uses the d value even if the input data contains decimal points.\n\nDetails:\nThe RBw.d informat reads numeric data that is stored in native real-binary (floating-point) \nnotation. Numeric data for scientific calculations is often stored in floating-point notation. \n(SAS stores all numeric values in floating-point notation.) A floating-point value consists of \ntwo parts: a mantissa that gives the value and an exponent that gives the value's magnitude.\n\nIt is usually impossible to key in floating-point binary data directly from a terminal, but \nmany programs write floating-point binary data. Use caution if you are using the RBw.d \ninformat to read floating-point data created by programs other than SAS because the RBw.d \ninformat is designed to read-only double-precision data."}},{"Name":"S370FFw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads EBCDIC numeric data. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 12 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-31 \n \nDetails:\nThe S370FFw.d informat reads numeric data that are represented in EBCDIC and converts the data \nto native format. If EBCDIC is the native format, S370FFw.d performs no conversion.\n\nS370FFw.d reads EBCDIC numeric values that are represented with one byte per digit. Use S370FFw.d \non other operating environments to read numeric data from IBM mainframe files.\n\nS370FFw.d reads numeric values located anywhere in the input field. EBCDIC blanks can precede \nor follow a numeric value with no effect. If a value is negative, an EBCDIC minus sign should \nimmediately precede the value. S370FFw.d reads values with EBCDIC decimal points and values in \nscientific notation, and it interprets a single EBCDIC period as a missing value.\n \nComparisons:\nThe S370FFw.d informat performs the same role for numeric data that the $EBCDICw.d informat \ndoes for character data. That is, on an IBM mainframe system, S370FFw.d has the same effect \nas the standard w.d informat. On all other systems, using S370FFw.d is equivalent to using \n$EBCDICw.d as well as using the standard w.d informat."}},{"Name":"S370FIBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads integer binary (fixed-point) values, including negative values, \nin IBM mainframe format. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional.\n\n Range: 0-10 \n \nDetails:\nThe S370FIBw.d informat reads integer binary (fixed-point) values that are stored in \nIBM mainframe format, including negative values that are represented in two's complement \nnotation. S370FIBw.d reads integer binary values with consistent results if the values \nare created in the same type of operating environment that you use to run SAS.\n\nUse S370FIBw.d for integer binary data that are created in IBM mainframe format for \nreading in other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. \nThis concept is called byte ordering."}},{"Name":"S370FIBUw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads unsigned integer binary (fixed-point) values in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. SAS uses the d value even \n if the data contain decimal points. This argument is optional.\n Range: 0-10 \n \nDetails: \nThe S370FIBUw.d informat reads unsigned integer binary (fixed-point) values that are \nstored in IBM mainframe format, including negative values that are represented in two's \ncomplement notation. Unsigned integer binary values are the same as integer binary values, \nexcept that all values are treated as positive. S370FIBUw.d reads integer binary values \nwith consistent results if the values are created in the same type of operating environment \nthat you use to run SAS.\n\nUse S370FIBUw.d for unsigned integer binary data that are created in IBM mainframe format \nfor reading in other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. \nThis concept is called byte ordering. \n \nComparisons:\nThe S370FIBUw.d informat is equivalent to the COBOL notation PIC 9(n) BINARY, where n \nis the number of digits.\n\nThe S370FIBUw.d and S370FPIBw.d informats are identical.\nS370FPIBw.d, S370FIBUw.d, and S370FIBw.d are used to read big endian integers in any \noperating environment."}},{"Name":"S370FPDw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads packed data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-16 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nPacked decimal data contain two digits per byte, but only one digit in the input field \nrepresents the sign. The last half of the last byte indicates the sign: a C or an F for \npositive numbers and a D for negative numbers.\n\nUse S370FPDw.d to read packed decimal data from IBM mainframe files on other operating \nenvironments."}},{"Name":"S370FPDUw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads unsigned packed decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-16 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails: \nPacked decimal data contain two digits per byte. The last half of the last byte, which \nindicates the sign for signed packed data, is always F for unsigned packed data. \n\nUse S370FPDUw.d on other operating environments to read unsigned packed decimal data \nfrom IBM mainframe files.\n \nComparisons:\nThe S370FPDUw.d informat is similar to the S370FPDw.d informat except that the S370FPDUw.d \ninformat rejects all sign digits except F.\n\nThe S370FPDUw.d informat is equivalent to the COBOL notation PIC 9(n) PACKED-DECIMAL, \nwhere the n value is the number of digits."}},{"Name":"S370FPIBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads positive integer binary (fixed-point) values in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 1-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-10 \n \nDetails:\nPositive integer binary values are the same as integer binary values, except that all values \nare treated as positive. S370FPIBw.d reads integer binary values with consistent results if \nthe values are created in the same type of operating environment that you use to run SAS. \n\nUse S370FPIBw.d for positive integer binary data that are created in IBM mainframe format for \nreading in other operating environments. \n\nNote: Different operating environments store integer binary values in different ways. This \nconcept is called byte ordering. \n\nComparisons:\nIf you use SAS on an IBM mainframe, S370FPIBw.d and PIBw.d are identical. \nS370FPIBw.d, S370FIBUw.d, and S370FIBw.d are used to read big endian integers in any \noperating environment."}},{"Name":"S370FRBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads real binary (floating-point) data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 2-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-10 \n \nDetails: \nReal binary values are represented in two parts: a mantissa that gives the value, and \nan exponent that gives the value's magnitude.\n\nUse S370FRBw.d to read real binary data from IBM mainframe files on other operating environments. \nIf you use SAS on an IBM mainframe, S370FRBw.d and RBw.d are identical."}},{"Name":"S370FZDw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain decimal \n points, the d value is ignored. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails: \nZoned decimal data are similar to standard decimal data in that every digit requires \none byte. However, the value's sign is stored in the last byte, along with the last digit.\n\nUse S370FZDw.d on other operating environments to read zoned decimal data from IBM mainframe files.\n\nComparisons:\nIf you use SAS on an IBM mainframe, S370FZDw.d and ZDw.d are identical."}},{"Name":"S370FZDLw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal leading-sign data in IBM mainframe format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDLw.d on other operating environments to read zoned decimal data from IBM \nmainframe files.\n \nComparisons:\nZoned decimal leading-sign data is similar to standard zoned decimal data except that the \nsign of the value is stored in the first byte of zoned decimal leading-sign data, along with \nthe first digit.\n\nThe S370FZDLw.d informat is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN LEADING, \nwhere the n value is the number of digits."}},{"Name":"S370FZDSw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal separate leading-sign data in IBM mainframe format. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Default: 8 \n Range: 2-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDSw.d on other operating environments to read zoned decimal data from IBM \nmainframe files.\n\nComparisons:\nZoned decimal separate leading-sign data is similar to standard zoned decimal data except \nthat the sign of the value is stored in the first byte of zoned decimal leading sign data, \nand the first digit of the value is stored in the second byte.\n\nThe S370FZDSw.d informat is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN LEADING \nSEPARATE, where the n value is the number of digits."}},{"Name":"S370FZDTw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal separate trailing-sign data in IBM mainframe format. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Default: 8 \n Range: 2-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDTw.d on other operating environments to read zoned decimal data from IBM \nmainframe files.\n \nComparisons:\nZoned decimal separate trailing-sign data are similar to zoned decimal separate leading-sign \ndata except that the sign of the value is stored in the last byte of zoned decimal separate \ntrailing-sign data.\n\nThe S370FZDTw.d informat is equivalent to the COBOL notation PIC S9(n) DISPLAY SIGN TRAILING \nSEPARATE, where the n value is the number of digits."}},{"Name":"S370FZDUw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads unsigned zoned decimal data in IBM mainframe format. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Default: 8 \n Range: 2-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse S370FZDUw.d on other operating environments to read unsigned zoned decimal data from \nIBM mainframe files.\n \nComparisons: \nThe S370FZDUw.d informat is similar to the S370FZDw.d informat except that the S370FZDUw.d \ninformat rejects all sign digits except F.\n\nThe S370FZDUw.d informat is equivalent to the COBOL notation PIC 9(n) DISPLAY, where the n \nvalue is the number of digits."}},{"Name":"TRAILSGNw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a trailing plus (+) or minus (-) sign. \n \nSyntax Description:\n\nw \n specifies the width of the input field.\n\n Default: 6 \n Range: 1-32 \n \nDetails: \nIf the data contains a decimal point, the TRAILSGN informat honors the number of decimal \nplaces that are in the input data. If the data contains a comma, the TRAILSGN informat \nreads the value, ignoring the comma."}},{"Name":"VAXRBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads real binary (floating-point) data in VMS format. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 4 \n Range: 2-8 \nd \n specifies the power of 10 by which to divide the value. This argument is optional.\n Range: 0-10 \n \nDetails:\nUse the VAXRBw.d informat to read floating-point data from VMS files on other operating environments.\n \nComparisons:\nIf you use SAS that is running under VMS, the VAXRBw.d and the RBw.d informats are identical."}},{"Name":"w.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads standard numeric data. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. If the data contain decimal \n points, the d value is ignored. This argument is optional. \n Range: 0-31 \n \nDetails:\nThe w.d informat reads numeric values that are located anywhere in the field. Blanks can \nprecede or follow a numeric value with no effect. A minus sign with no separating blank \nshould immediately precede a negative value. The w.d informat reads values with decimal \npoints and values in scientific E-notation, and it interprets a single period as a missing value.\n \nComparisons: \nThe w.d informat is identical to the BZw.d informat, except that the w.d informat ignores \ntrailing blanks in the numeric values. To read trailing blanks as 0s, use the BZw.d informat.\n\nThe w.d informat can read values in scientific E-notation exactly as the Ew.d informat does."}},{"Name":"YENw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Removes embedded yen signs, commas, and decimal points. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. \n Requirement: d must be 0 or 2 \n Tip: If the d is 2, then YENw.d reads a decimal point and two decimal digits. If d is 0, \n YENw.d reads the value without a decimal point. \n \nDetails:\nThe hexadecimal representation of the code for the yen sign character is 5B on EBCDIC \nsystems and 5C on ASCII systems. The monetary character that these codes represent might \nbe different in other countries."}},{"Name":"ZDw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal data. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 1-31 \n \nDetails:\nThe ZDw.d informat reads zoned decimal data in which every digit requires one byte and in \nwhich the last byte contains the value's sign along with the last digit.\n\nNote: Different operating environments store zoned decimal values in different ways. However, \nZDw.d reads zoned decimal values with consistent results if the values are created in the same \ntype of operating environment that you use to run SAS. \n\nYou can enter positive values in zoned decimal format from a personal computer. Some keying \ndevices enable you to enter negative values by overstriking the last digit with a minus sign.\n \nComparisons:\nLike the w.d informat, the ZDw.d informat reads data in which every digit requires one byte. \nUse ZDVw.d or ZDw.d to read zoned decimal data in which the last byte contains the last digit \nand the sign.\n\nThe ZDw.d informat functions like the ZDVw.d informat with one exception: ZDVw.d validates the \ninput string and disallows invalid data."}},{"Name":"ZDBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal data in which zeros have been left blank. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 0-31 \n \nDetails:\nThe ZDBw.d informat reads zoned decimal data that are produced in IBM 1410, 1401, and 1620 \nform, where 0s are left blank rather than being punched."}},{"Name":"ZDVw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads and validates zoned decimal data. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Range: 1-31 \n \nDetails:\nThe ZDVw.d informat reads data in which every digit requires one byte and in which the last \nbyte contains the value's sign along with the last digit. It also validates the input string \nand disallows invalid data.\n\nZDVw.d is dependent on the operating environment. For example, on IBM mainframes, ZDVw.d requires \nan F for all high-order nibbles except the last. (In contrast, the ZDw.d informat ignores the \nhigh-order nibbles for all bytes except for the nibbles that are associated with the sign.) The \nlast high-order nibble accepts values ranging from A-F, where A, C, E, and F are positive values \nand B and D are negative values. The low-order nibble on IBM mainframes must be a numeric digit \nthat ranges from 0-9, as with ZD.\n\nNote: Different operating environments store zoned decimal values in different ways. However, \nthe ZDVw.d informat reads zoned decimal values with consistent results if the values are created \nin the same type of operating environment that you use to run SAS. \n \nComparisons:\nThe ZDVw.d informat functions like the ZDw.d informat with one exception: ZDVw.d validates the \ninput string and disallows invalid data."}},{"Name":"$BASE64Xw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Converts ASCII text to character data by using Base 64 encoding. \n \nSyntax Description:\nw \n specifies the width of the input field. \n Default: 1 \n Range: 1-32767 \n \nDetails:\nBase 64 is an industry encoding method whose encoded characters are determined by using a \npositional scheme that uses only ASCII characters. Several Base 64 encoding schemes have \nbeen defined by the industry for specific uses, such as e-mail or content masking. SAS maps \npositions 0-61 to the characters A-Z, a-z, and 0-9. Position 62 maps to the character +, and \nposition 63 maps to the character /. \n\nThe following are some uses of Base 64 encoding:\n\n o embed binary data in an XML file \n o encode passwords \n o encode URLs\n\nThe '=' character in the encoded results indicates that the results have been padded with \nzero bits. In order for the encoded characters to be decoded, the '=' must be included in \nthe value to be decoded."}},{"Name":"$N8601Bw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads complete, truncated, and omitted forms of ISO 8601 duration, datetime, and \ninterval values that are specified in either the basic or extended notations. \n\nSyntax Description: \nw \n specifies the width of the input field. \n \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional.\n\n Default: 0 \n Range: 0 - 3 \n \nComparisons: \nThe $N8601B informat reads durations, intervals, and datetimes that are specified in either \nthe basic or extended notation. The $N8601E informat reads valid durations, intervals, and \ndatetimes that are specified only in the extended notation. Use the $N8601E informat when you \nneed to ensure compliance with the extended notation."}},{"Name":"$N8601Ew.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads ISO 8601 duration, datetime, and interval values that are specified in the \nextended notation. \n\nSyntax Description: \nw \n specifies the width of the input field. \n \n Default: 50 \n Range: 1 - 200 \n Requirement: The minimum length for a duration value or a datetime value is 16. The minimum \n length for an interval value is 16. \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional.\n\n Default: 0 \n Range: 0 - 3 \n \nComparisons:\nThe $N8601E informat reads only valid durations, intervals, and datetimes that are specified \nin the extended notation. The $N8601B informat reads valid durations, intervals, and datetimes \nthat are specified in either the basic or extended notation. Use the $N8601E informat when you \nneed to ensure compliance with the extended notation."}},{"Name":"B8601DAw.|ND8601DAw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values that are specified in the ISO 8601 basic notation yyyymmdd. \n \nSyntax Description: \nw \n specifies the width of the input field.\n\n Default: 10 \n Requirement: The width of the output field must be 10. \n \nDetails: \nThe B8602DA informat reads date values that are specified in the ISO 8601 basic date \nnotation yyyymmdd:\n\n yyyy is a four-digit year, such as 2008\n \n mm is a two-digit month (zero padded) between 01 and 12\n \n dd is a two-digit day of the month (zero padded) between 01 and 31"}},{"Name":"B8601DNw.|ND8601DNw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values that are specified the ISO 8601 basic notation yyyymmdd and returns \nSAS datetime values where the time portion of the value is 000000. \n\nSyntax Description:\nw \n specifies the width of the input field.\n\n Default: 10 \n Requirement: The width of the input field must be 10. \n \nDetails:\nThe B8602DN informat reads date values that are specified in the ISO 8601 basic date \nnotation yyyymmdd and returns the date in a SAS datetime value:\n\nyyyy is a four-digit year, such as 2008.\n \nmm is a two-digit month (zero padded) between 01 and 12.\n \ndd is a two-digit day of the month (zero padded) between 01 and 31."}},{"Name":"B8601DTw.d|ND8601DTw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values that are specified in the ISO 8601 basic notation yyyymmddThhmmssffffff. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 19 \n Range: 19-26 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. This argument is optional.\n\n Default: 0 \n Range: 0-6 \n \nDetails:\nThe B8602DT informat reads datetime values that are specified in the ISO 8601 basic datetime \nnotation yyyymmddThhmmssffffff:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 - 23 \n mm is a two-digit minute (zero padded), between 00 - 59 \n ss is a two-digit second (zero padded), between 00 - 59 \n ffffff are optional fractional seconds, with a precision of up to six digits, \n where each digit is between 0 - 9"}},{"Name":"B8601DZw.d|ND8601DZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values that are specified in the Coordinated Universal Time (UTC) \ntime scale using the ISO 8601 datetime basic notation yyyymmddThhmmss+|-hhmm or \nyyyymmddThhmmssffffffZ. \n\nSyntax Description:\nw \n specifies the width of the input field. \n Default: 26 \n Range: 20-35 \nd \n specifies the number of digits to the right of the seconds value, which represents \n a fraction of a second. This argument is optional. \n Default: 0 \n Range: 0-6 \n \nDetails:\nUTC values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe B8602DZ informat reads datetime values that are specified in one of the following ISO 8601 \nbasic datetime notations: \n\n yyyymmddThhmmss+|-hhmm \n yyyymmddThhmmssffffffZ \n\nwhere: \n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 and 24 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59 \n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit is between 0 and 9.\n\n Z indicates that the time is for zero meridian (Greenwich, England) or UTC time. \n +|-hhmm \n is an hour and minute signed offset from zero meridian time. Note that the offset must be \n +|-hhmm (that is, + or - and four characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero meridian. \n For example, +0200 indicates a two hour time difference to the east of the zero meridian, and -0600 \n indicates a six hour time differences to the west of the zero meridian.\n\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"B8601TMw.d|ND8601TMw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time values that are specified in the ISO 8601 basic notation hhmmssffffff. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 8-15 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional. \n Default: 0 \n Range: 0-6 \n \nDetails:\nThe B8601TM informat reads time values that are specified in the ISO 8601 basic time notation hhmmssffffff:\n\n hh is a two-digit hour (zero padded), between 00 and 23 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59 \n \n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit is between 0 - 9"}},{"Name":"B8601TZw.d|ND8601TZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time values that are specified in the ISO 8601 basic time notation hhmmssfffff+|-hhmm \nor hhmmssffffffZ. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 14 \n Range: 9-20 \nd \n (optional) specifies the number of digits to the right of the decimal point in the seconds value. \n Default: 0 \n Range: 0 - 6 \n \nDetails:\nUTC time values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe B8602TZ informat reads time values that are specified in the following ISO 8601 basic time notations: \n\n hhmmssffffff+|-hhmm \n hhmmssffffffZ \n\nwhere:\n hh is a two-digit hour (zero padded), between 00 and 23 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59\n\n ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit is between 0 and 9\n\n Z indicates that the time is for zero meridian (Greenwich, England) or UTC time\n +|-hh:mm \n is an hour and minute signed offset from zero meridian time. Note that the offset must \n be +|-hhmm (that is, + or - and four characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero \n meridian. For example, +0200 indicates a two hour time difference to the east of the zero\n meridian, and -0600 indicates a six hour time differences to the west of the zero meridian.\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"E8601DAw.|IS8601DAw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values that are specified in the ISO 8601 extended notation yyyy-mm-dd. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 10 \n Requirement: The width of the input field must be 10. \n \nDetails: \nThe E8601DA informat reads date values that are specified in the ISO 8601 extended date notation yyyy-mm-dd:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31"}},{"Name":"E8601DNw.|IS8601DNw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads date values that are specified in the ISO 8601 extended notation yyyy-mm-dd \nand returns SAS datetime values where the time portion of the value is 000000. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 10 \n Requirement: The width of the input field must be 10. \n \nDetails: \nThe E8601DN informat reads date values that are specified in the ISO 8601 extended date \nnotation is yyyy-mm-dd and returns the date in a SAS datetime value:\n\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31"}},{"Name":"E8601DTw.d|IS8601DTw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values that are specified in the ISO 8601 extended notation \nyyyy-mm-ddThh:mm:ss.ffffff. \n\nSyntax Description:\nw \n specifies the width of the input field. \n Default: 19 \n Range: 19-26 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional. \n Default: 0 \n Range: 0-6 \n \nDetails:\nThe E8601DT informat reads datetime values that are specified in the ISO 8601 extended \ndatetime notationyyyy-mm-ddThh:mm:ss.ffffff:\n\n yyyy is a four-digit year, such as 2008. \n mm is a two-digit month (zero padded) between 01 and 12. \n dd is a two-digit day of the month (zero padded) between 01 and 31. \n hh is a two-digit hour (zero padded), between 00 and 23. \n mm is a two-digit minute (zero padded), between 00 and 59. \n ss is a two-digit second (zero padded), between 00 and 59.\n\n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit \n is between 0 and 9."}},{"Name":"E8601DZw.d|IS8601DZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values that are specified in the Coordinated Universal Time (UTC) \ntime scale using the ISO 8601 datetime extended notation hh:mm:ss+|-hh:mm.fffff \nor hh:mm:ss.fffffZ. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 26 \n Range: 20-35 \nd \n specifies the number of digits to the right of the decimal point in the value for the '\n lowest order component. This argument is optional. \n Default: 0 \n Range: 0-6 \n \nDetails: \nUTC values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe E8602DZ informat reads datetime values contain UTC time offsets and that are specified \nin one of the following ISO 8601 extended datetime notations: \n\n yyyy-mm-ddThh:mm:ss.ffffff+|-hh:mm \n yyyy-mm-ddThh:mm:ss.ffffffZ \n\nwhere\n yyyy is a four-digit year, such as 2008 \n mm is a two-digit month (zero padded) between 01 and 12 \n dd is a two-digit day of the month (zero padded) between 01 and 31 \n hh is a two-digit hour (zero padded), between 00 and 24 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59\n\n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit is between 0 and 9\n\n Z indicates that the time is UTC time at the zero meridian (Greenwich, England) \n\n +|-hh:mm \n is an hour and minute signed offset from zero meridian time. Note that the offset must \n be +|-hh:mm (that is, + or - and five characters). \n\n Use + for time zones east of the zero meridian and use - for time zones west of the zero \n meridian. For example, +02:00 indicates a two hour time difference to the east of the zero\n meridian, and -06:00 indicates a six hour time differences to the west of the zero meridian.\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"E8601LZw.d|IS8601LZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads Coordinated Universal Time (UTC) values that are specified in the ISO 8601 \nextended notation hh:mm:ss+|-hh:mm.fffff or hh:mm:ss.fffffZ and converts them \nto the local time. \n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 14 \n Range: 9-20 \n Requirement: To read a time with the Z time zone indicator, the width of the input field \n must be 9 if data follows on the same line of data. \nd \n specifies the number of digits to the right of the decimal point in the value for the lowest \n order component. This argument is optional. \n Default: 0 \n Range: 0-6 \n \nDetails:\nUTC values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe E8602LZ informat reads UTC time values that are specified in one of the following ISO 8601 \nextended time notations and return a SAS time value for the local time: \n\n hh:mm:ss.ffffff+|-00:00 \n hh:mm:ss.ffffffZ \n\nwhere\n hh is a two-digit hour (zero padded), between 00 and 23 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59\n\n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit \n is between 0 and 9\n\n Z indicate zero meridian or UTC time.\n\n +|-hh:mm \n is an hour and minute signed offset from zero meridian or UTC time. Note that the offset \n must be +|-hh:mm (that is, + or - and five characters). \n\n Use the + for time zones east of the zero meridian and use the - for time zones west of \n the zero meridian.\n Restriction: The shorter form +|-hh is not supported."}},{"Name":"E8601TMw.d|IS8601TMw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time values that are specified in the ISO 8601 extended notation hh:mm:ss.ffffff. \n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 8 \n Range: 8-15 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n This argument is optional.\n Default: 0 \n Range: 0-6 \n \nDetails: \nThe E8601TM informat reads time values that are specified in the following ISO 8601 extended \ntime notation: \n\n hh:mm:ss.ffffff \n \nwhere\n hh is a two-digit hour (zero padded), between 00 and 23 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ss is a two-digit second (zero padded), between 00 and 59\n\n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each digit \n is between 0 and 9"}},{"Name":"E8601TZw.d|IS8601TZw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads time values that are specified in the ISO 8601 extended time notation \nhh:mm:ss+|-hh:mm.ffffff or hh:mm:ssZ.\n\nSyntax Description: \nw \n specifies the width of the input field. \n Default: 14 \n Range: 9-20 \n Requirement: To read a time with the Z time zone indicator, the width of the input field\n must be 9 if data follows on the same line of data. \n\nd \n (optional) specifies the number of digits to the right of the decimal point in the value \n for the lowest order component. \n Default: 0 \n Range: 0-6 \n \nDetails:\nUTC time values specify a time and a time zone based on the zero meridian in Greenwich, England. \nThe E8602TZ informat reads UTC time values that are specified in one of the following ISO 8601 \nextended notations: \n\n hh:mm:ss+|-hh:mm.ffffff \n hh:mm:ss \n\nThe following list explains the UTC time variables:\n\n hh is a two-digit hour (zero padded), between 00 and 23 \n mm is a two-digit minute (zero padded), between 00 and 59 \n ssis a two-digit second (zero padded), between 00 and 59\n\n .ffffff \n are optional fractional seconds, with a precision of up to six digits, where each \n digit is between 0 - 9\n\n Z indicate zero meridian or UTC time\n\n +|-hh:mm \n is an hour and minute signed offset from zero meridian. Note that the offset must\n be +|-hh:mm (that is, + or - and five characters). \n\n Use the + for time zones east of the zero meridian and use the - for time zones west \n of the zero meridian. \n Restriction: The shorter form +|-hh is not supported."}},{"Name":"S370FZDBw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads zoned decimal data in which zeros have been left blank. \n \nSyntax Description\n\nw \n specifies the width of the input field. \n Default: 8 \n Range: 1-32 \nd \n specifies the power of 10 by which to divide the value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails:\nUse the S370ZFDBw.d informat on other operating environments to read zoned decimal \ndata from IBM mainframe files."}},{"Name":"SIZEKMGw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads numeric data that is appended to the letters K, M, or G.\n \nSyntax Description: \nw \n specifies the width of the input field. \n Default: 6 \n Range: 4-35 \nd \n specifies the number of digits to the right of the decimal point in the numeric \n value. This argument is optional. \n Default: 0 \n Range: 0-31 \n \nDetails: \nThe SAS data value that results when the SIZEKMGw.d informat reads a number that contains \na K, M, or G is the number multiplied by the following values:\n\n K 1024 \n M 1048576 \n G 1073741824"}},{"Name":"VMSZNw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads VMS and MicroFocus COBOL zoned numeric data. \n \nSyntax Description: \nw \n specifies the width of the output field.\nd \n specifies the number of digits to the right of the decimal point in the numeric value. \n This argument is optional.\n \nDetails:\nThe VMSZNw.d informat is similar to the ZDw.d informat. Both read a string of ASCII digits, \nand the last digit is a special character denoting the magnitude of the last digit and the \nsign of the entire number. The difference between the VMSZNw.d informat and the ZDw.d informat \nis in the special character used for the last digit. The following table shows the special \ncharacters used by the VMSZNw.d informat. \n\nDesired Special Desired Special\nDigit Character Digit Character \n0 0 -0 p \n1 1 -1 q \n2 2 -2 r \n3 3 -3 s \n4 4 -4 t \n5 5 -5 u \n6 6 -6 v \n7 7 -7 w \n8 8 -8 x \n9 9 -9 y \n\nData formatted using the VMSZNw.d informat are ASCII strings."}},{"Name":"B8601CIw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads an IBM date and time value that includes a century marker, in the form cyymmddhhmmss.\n \nSyntax: B8601CIw.d\n\nSyntax Description:\nw specifies the width of the input field. \n Default:16 \n Range:10\u201326 \nd specifies the number of digits to the right of the decimal point in the seconds value. \n Default:0 \n Range:0\u20136\n \nDetails:\nThe B8601CI informat reads time values that are specified in the following IBM time notation: \n cyymmddhhmmss \nc is a single digit that represents a century: \n 0 indicates the years 1900\u20131999. \n 1 indicates the years 2000\u20132099. \n 2 indicates the years 2100\u20132199. \n n indicates the years 00\u201399 in a century that is determined by performing a calculation \n on a year greater than 2199. To determine the century marker, subtract 1900 from the year \n and divide the result by 100. Discard the remainder. The remaining integer is the century \n marker. For example, to determine the century marker for the year 2382, perform this \n calculation: (2382-1900)/100=4.82. Discard .82. The century marker is 4. \n\nyy is a two-digit year between 00 and 99. \nmm is a two-digit month (zero padded) between 01 and 12. \ndd is a two-digit day of the month (zero padded) between 01 and 31. \nhh is a two-digit hour (zero padded) between 00 and 23. \nmm is a two-digit minute (zero padded) between 00 and 59. \nss is a two-digit second (zero padded) between 00 and 59. \nfff are optional fractional seconds, with a precision of up to three digits, where \n each digit is between 0 and 9."}},{"Name":"B8601DJw.d","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads a Java date and time value that is in the form yyyymmddhhmmss.\n \nSyntax: B8601DJw.d\n\nSyntax Description:\nw \n specifies the width of the input field. \n Default:16 \n Range:10\u201326 \nd \n specifies the number of digits to the right of the decimal point in the seconds value. \n Default:0 \n Range:0\u20136\n \nDetails:\nThe B8601DJ informat reads a date and time value that is specified in the following Java \ndate and time notation: \n\n yyyymmddhhmmss \n \nyyyy\n is a four-digit year between 0000 and 9999. \nmm\n is a two-digit month (zero padded) between 01 and 12. \ndd\n is a two-digit day of the month (zero padded) between 01 and 31. \nhh\n is a two-digit hour (zero padded) between 00 and 23. \nmm\n is a two-digit minute (zero padded) between 00 and 59. \nss\n is a two-digit second (zero padded) between 00 and 59. \nffffff\n are optional fractional seconds, with a precision of up to six digits, where each \n digit is between 0 and 9."}},{"Name":"HHMMSSw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads hours, minutes, and seconds in the form hh:mm:ss or hhmmss.\n \nSyntax: HHMMSSw. \n\nSyntax Description:\nw \n specifies the width of the input field. \n Default:8 \n Range:1\u201320\n \nDetails:\nThe HHMMSSw. informat reads SAS time values in one of the following forms: \n o hh:mm:ss\n o hhmmss\nhh\n is an integer that represents the number of hours. \n: \n represents a special character that separates hours, minutes, and seconds. \nmm\n is an integer that represents the number of minutes. \nss\n is an integer that represents the number of seconds. Fractional seconds are ignored."}},{"Name":"B8601DXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) datetime value to the user local date and time. Then, \nreads the local date and time by using the ISO 8601 datetime and time zone basic notation \nyyyymmddThhmmss+|-hhmm."}},{"Name":"B8601LXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values as local time by appending a time zone offset difference between the local \ntime and UTC, using the ISO 8601 basic notation yyyymmddThhmmss+|\u2013hhmm."}},{"Name":"B8601TXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) value to the user local time. Then, reads the local \ntime by using the ISO 8601 basic time notation hhmmss+|\u2013hhmm."}},{"Name":"E8601DXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) datetime value to the user local date and time. Then, \nreads the local date and time by using the ISO 8601 datetime and time zone extended notation \nyyyy-mm-ddThh:mm:ss+|-hh:mm."}},{"Name":"E8601LXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Reads datetime values as local time by appending a time zone offset difference between the local \ntime and UTC, using the ISO 8601 extended notation yyyy-mm-ddThh:mm:ss+|-hh:mm."}},{"Name":"E8601TXw.","Type":"SAS_INFORMAT","Help":{"#cdata":"Adjusts a Coordinated Universal Time (UTC) value to the user local time. Then, reads the local \ntime by using the ISO 8601 extended time notation hh:mm:ss+|-hh:mm."}}],"#comment":[{},{}]}} ================================================ FILE: server/data/SASMacroFunctions.json ================================================ {"Keywords":{"Keyword":[{"Name":"%BQUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %BQUOTE (character string | text expression)]\n \nMask special characters and mnemonic operators in a resolved value at macro execution."}},{"Name":"%DEQUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"Removes matching quotation marks from a character string that begins with a quotation mark, \nand deletes all characters to the right of the closing quotation mark."}},{"Name":"%NRBQUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %NRBQUOTE (character string | text expression)]\n \nMask special characters and mnemonic operators in a resolved value at macro execution."}},{"Name":"%EVAL","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %EVAL (arithmetic or logical expression)]\n\nEvaluates arithmetic and logical expressions using integer arithmetic."}},{"Name":"%INDEX","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %INDEX (source, string)]\n \nReturns the position of the first character of a string."}},{"Name":"%LENGTH","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %LENGTH (character string | text expression)]\n\nReturns the length of a string."}},{"Name":"%QUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QUOTE (character string | text expression)]\n \nMask special characters and mnemonic operators in a resolved value at macro execution.\nUnmatched quotation marks (\" \") and parentheses ( () ) must be marked with a preceding %."}},{"Name":"%NRQUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %NRQUOTE (character string | text expression)]\n \nMask special characters and mnemonic operators in a resolved value at macro execution.\nUnmatched quotation marks (\" \") and parentheses ( () ) must be marked with a preceding %."}},{"Name":"%SCAN","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SCAN(argument, n<, delimiters>)] \n \nSearch for a word that is specified by its position in a string."}},{"Name":"%QSCAN","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QSCAN(argument, n<, delimiters>)]\n\nMasks special characters and mnemonic operators in its result."}},{"Name":"%STR","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %STR (character-string)]\n\nMask special characters and mnemonic operators in constant text at macro compilation.\nUnmatched quotation marks (\" \") and parentheses ( () ) must be marked with a preceding %."}},{"Name":"%NRSTR","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %NRSTR (character-string)]\n\nMask special characters and mnemonic operators in constant text at macro compilation.\nUnmatched quotation marks (\" \") and parentheses ( () ) must be marked with a preceding %."}},{"Name":"%SUBSTR","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SUBSTR (argument, position<, length>)] \n \nProduce a substring of a character string."}},{"Name":"%QSUBSTR","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QSUBSTR (argument, position<, length>)]\n\nProduce a substring of a character string. %QSUBSTR masks special characters and mnemonic \noperators in its result."}},{"Name":"%SUPERQ","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SUPERQ (argument)] \n \nMasks all special characters and mnemonic operators at macro execution but prevents resolution \nof the value."}},{"Name":"%SYMEXIST","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYMEXIST (argument)]\n\nReturns an indication as to whether the named macro variable exists."}},{"Name":"%SYMGLOBL","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYMGLOBL(macro-variable-name)] \n \nReturns an indication as to whether the named macro variable is global in scope."}},{"Name":"%SYMLOCAL","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYMLOCAL(macro-variable-name)]\n\nReturns an indication as to whether the named macro variable is local in scope."}},{"Name":"%SYSEVALF","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYSEVALF(expression<, conversion-type>)]\n\nEvaluates arithmetic and logical expressions using floating point arithmetic."}},{"Name":"%SYSFUNC","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYSFUNC (function(argument(s))<, format>)] \n \nExecute SAS functions or user-written functions."}},{"Name":"%QSYSFUNC","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QSYSFUNC (function(argument(s))<, format>)]\n\nExecute SAS functions or user-written functions. Masks special characters and mnemonic operators \nin its result."}},{"Name":"%SYSGET","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYSGET(environment-variable)]\n\nReturns the value of a specified host environment variable."}},{"Name":"%SYSPROD","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYSPROD (product)]\n\nReports whether a SAS software product is licensed at the site."}},{"Name":"%UNQUOTE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %UNQUOTE (character string | text expression)]\n\nUnmasks all special characters and mnemonic operators for a value."}},{"Name":"%UPCASE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %UPCASE (character string | text expression)]\n \nConverts characters to uppercase."}},{"Name":"%LOWCASE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %LOWCASE (character string | text expression)]\n\nConverts characters to lowercase. LOWCASE returns a result without quotation marks, even if the \nargument has quotation marks."}},{"Name":"%QLOWCASE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QLOWCASE (character string | text expression)]\n\nConverts characters to lowercase.\nQLOWCASE produces a result with the following special characters and mnemonic operators masked\nso the macro processor interprets them as text instead of as elements of the macro language:\n& % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT"}},{"Name":"%QUPCASE","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %QUPCASE (character string | text expression)] \n \nConvert characters to uppercase. %QUPCASE masks special characters and mnemonic operators \nin its result."}},{"Name":"%PUT","Type":"MACRO_FUNCTION","Help":{"#cdata":"Returns a value using a specified format."}},{"Name":"%TPLOT","Type":"MACRO_FUNCTION","Help":{"#cdata":"The %TPLOT macro creates a triangular plot that graphically displays genetic marker \ntest results. The plot has colors and shapes representing p-value ranges for tests \nof the following quantities: linkage disequilibrium between pairs of markers, Hardy-\nWeinberg equilibrium (HWE) for individual markers, and associations between markers \nand a dichotomous trait (such as disease status)."}},{"Name":"%SYSMACEXEC","Type":"MACRO_FUNCTION","Help":{"#cdata":"Returns an indication of the execution status of a macro.\n \nSyntax: \n%SYSMACEXEC(macro_name) \n\nRequired Argument:\nmacro_name \n the name of a macro or a text expression that yields the name of the macro. \n\nDetails:\nThe %SYSMACEXEC function returns the number 1 if the macro is currently executing. \nOtherwise, if the macro is not executing, the number 0 is returned."}},{"Name":"%SYSMACEXIST","Type":"MACRO_FUNCTION","Help":{"#cdata":"Returns an indication of the existence of a macro definition in the WORK.SASMACR \ncatalog. Otherwise, the returned value is 0.\n \nSyntax \n%SYSMACEXIST(macro-name) \nRequired Argument \nmacro-name \nthe name of a macro or a text expression that yields the name of a macro. \nDetails \nThe %SYSMACEXIST function returns the number 1 if a definition for the macro exists in the WORK.SASMACR catalog. If there is not a macro definition, the returned value is 0."}},{"Name":"%SYSMEXECDEPTH","Type":"MACRO_FUNCTION","Help":{"#cdata":"Returns the nesting depth of macro execution from the point of the call to %SYSMEXECDEPTH.\n \nSyntax:\n%SYSMEXECDEPTH\n\nDetails:\nTo retrieve the nesting level of the currently executing macro, use the %SYSMEXECDEPTH. \nThis function returns a number indicating the depth of the macro in nested macro calls. \n\nThe following are the %SYSMEXECDEPTH return value descriptions: \n 0 open code \n >0 nesting level"}},{"Name":"%SYSMEXECNAME","Type":"MACRO_FUNCTION","Help":{"#cdata":"Returns the name of the macro executing at a requested nesting level.\n \nSyntax:\n%SYSMEXECNAME (n) \n\nRequired Argument:\nn \n The nesting level at which you are requesting the macro name. \n 0 open code \n >0 nesting level"}},{"Name":"%CMPRES","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %CMPRES (text | text expression)\n\nCompresses multiple blanks and removes leading and trailing blanks."}},{"Name":"%QCMPRES","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %QCMPRES (text | text expression)\n\nCompresses multiple blanks and removes leading and trailing blanks.\n\n%QCMPRES masks the result so special characters and mnemonic operators are treated \nas text instead of being interpreted by the macro facility."}},{"Name":"%COMPSTOR","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %COMPSTOR (PATHNAME=SAS-data-library)\n\nCompiles macros and stores them in a catalog in a permanent SAS library."}},{"Name":"%DATATYP","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax:%DATATYP (text | text expression)\n\nReturns the data type (numeric or char) of a value."}},{"Name":"%LEFT","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %LEFT(text | text expression)\n \nLeft-aligns an argument by removing leading blanks."}},{"Name":"%QLEFT","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %QLEFT(text | text expression)\n\nLeft-aligns an argument by removing leading blanks.\n\nQLEFT masks the result so special characters and mnemonic operators are treated as \ntext instead of being interpreted by the macro facility."}},{"Name":"%SYSRC","Type":"MACRO_FUNCTION","Help":{"#cdata":"[Syntax: %SYSRC(character-string)]\n\nReturns a value corresponding to an error condition."}},{"Name":"%TRIM","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %TRIM(text | text expression)\n\nTrim trailing blanks."}},{"Name":"%QTRIM","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %QTRIM(text | text expression)\n \nTrim trailing blanks. Masks special characters and mnemonic operators."}},{"Name":"%VERIFY","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %VERIFY(source, excerpt)\n \nReturns the position of the first character unique to an expression."}},{"Name":"%DQLOAD","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %DQLOAD(DQLOCALE=(locale1 ...localeN), DQSETUPLOC=`file-specification', )\n \nSets system option values and loads locales into memory."}},{"Name":"%DQPUTLOC","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %DQPUTLOC(locale, , \n \nDisplays current information on a specified locale in the SAS log."}},{"Name":"%DQUNLOAD","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %DQUNLOAD \n \nUnloads all locales to increase the amount of free memory."}},{"Name":"%KLOWCASE","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %KLOWCASE (text | text expression) \n\nChanges uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS. \n\n%KLOWCASE returns a result without quotation marks, even if the argument has quotation marks. \n%QKLOWCAS produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT IN \n\nAutocall macros are included in a SAS library. This library might not be installed at your site \nor might be a site-specific version. If you cannot access this macro or if you want to find out \nif the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%QKLOWCAS","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %QKLOWCAS (text | text expression) \n\nChanges uppercase alphabetic characters to their lowercase equivalents. If the argument \nmight contain a special character or mnemonic operator, listed below, use %QKLOWCAS. \n\n%KLOWCASE returns a result without quotation marks, even if the argument has quotation marks. \n%QKLOWCAS produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ^ ~ ; , blank AND OR NOT EQ NE LE LT GE GT IN \n\nAutocall macros are included in a SAS library. This library might not be installed at your site \nor might be a site-specific version. If you cannot access this macro or if you want to find out \nif the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%KTRIM","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %KTRIM (text | text expression) \n \nTrims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM. \n\nQKTRIM produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ? ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN \n \nAutocall macros are included in a SAS library. This library might not be installed at your \nsite or might be a site-specific version. If you cannot access this macro or if you want to \nfind out if the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%QKTRIM","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %QKTRIM (text | text expression) \n \n \nTrims trailing blanks. If the argument contains a special character or mnemonic operator, \nlisted below, use %QKTRIM. \n\nQKTRIM produces a result with the following special characters and mnemonic operators masked \nso the macro processor interprets them as text instead of as elements of the macro language: \n\n & % ' \" ( ) + - * / < > = \u00ac ? ~ ; , # blank AND OR NOT EQ NE LE LT GE GT IN \n \nAutocall macros are included in a SAS library. This library might not be installed at your \nsite or might be a site-specific version. If you cannot access this macro or if you want to \nfind out if the library is a site-specific version, see your on-site SAS support personnel."}},{"Name":"%KVERIFY","Type":"MACRO_FUNCTION","Help":{"#cdata":"Syntax: %KVERIFY (source, excerpt) \n\nReturns the position of the first character unique to an expression. \n\nArguments:\nsource \n is text or a text expression that you want to examine for characters that do not exist in excerpt. \nexcerpt \n is text or a text expression that defines the set of characters that %KVERIFY uses to examine source."}}],"#comment":[{},{},{},{},{}]}} ================================================ FILE: server/data/SASMacroStatements.json ================================================ {"Keywords":{"Keyword":[{"Name":"%ABORT","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %ABORT | RETURN | > ;]\n\nABEND causes abnormal termination of the current macro and SAS job or session.\n\nABORT causes your macro, windowing environment, and interactive line mode to stop \nprocessing immediately and return you to your operating environment. n is an integer \nvalue that enables you to specify a condition code that SAS returns to the operating \nenvironment when it stops executing."}},{"Name":"%COPY","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %COPY macro-name< /options(s)>]\n\nCopies specified items from a SAS macro library."}},{"Name":"%DISPLAY","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %DISPLAY window<.group> ;]\n \nDisplays a macro window.\n\nNOINPUT specifies that you cannot input values into fields displayed in the window.\n\nBLANK clears the display.\n\nBELL rings your terminal's bell, if available, when the window is displayed.\n\nDELETE deletes the display of the window after processing passes from the %DISPLAY \nstatement on which the option appears."}},{"Name":"%DO","Type":"MACRODEFONLY","Help":{"#cdata":"The %DO statement designates the beginning of a section of a macro definition that \nis treated as a unit until a matching %END statement is encountered. This macro \nsection is called a %DO group. %DO groups can be nested.\n\nA simple %DO statement often appears in conjunction with %IF-%THEN/%ELSE statements \nto designate a section of the macro to be processed depending on whether the %IF \ncondition is true or false.\n\nSyntax:\n%DO; \n text and macro language statements \n%END;"}},{"Name":"%DO %UNTIL","Type":"MACRODEFONLY","Help":{"#cdata":"Executes a section of a macro repetitively until a condition is true.\n \nSyntax: \n\n%DO %UNTIL (expression); \n text and macro language statements \n%END;"}},{"Name":"%DO %WHILE","Type":"MACRODEFONLY","Help":{"#cdata":"Executes a section of a macro repetitively while a condition is true.\n \nSyntax: \n\n%DO %WHILE (expression); \n text and macro language statements \n%END;"}},{"Name":"%END","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %END;]\n \nEnds a %DO group."}},{"Name":"%GLOBAL","Type":"OPENCODE","Help":{"#cdata":"[Syntax: %GLOBAL macro-variable(s); | %GLOBAL / READONLY macro-variable=value;] \n\nCreates macro variables that are available during the execution of an entire SAS session. \n\nRequired Argument:\nmacro-variable(s)\n is the name of one or more macro variables or a text expression that generates one or more macro variable names. \n You cannot use a SAS variable list or a macro expression that generates a SAS variable list in a %GLOBAL statement.\n\nOptional Argument:\nREADONLY macro-variable=value\n creates a new read only global macro variable.Note:The READONLY option can be used to create a single new macro variable (local or global).\n\nmacro-variable\n is the name of a macro variable or a text expression that produces a macro variable name. The name must be a new macro variable name. \nvalue\n is a character string or a text expression."}},{"Name":"%GOTO","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %GOTO label;]\n \nBranches macro processing to the specified label."}},{"Name":"%IF","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %IF expression %THEN action; <%ELSE action;>]\n \nConditionally process a portion of a macro."}},{"Name":"%THEN","Type":"MACRODEFONLY","Help":{"#cdata":"Conditionally process a portion of a macro."}},{"Name":"%ELSE","Type":"MACRODEFONLY","Help":{"#cdata":"Conditionally process a portion of a macro."}},{"Name":"%INPUT","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %INPUT ;]\n \nSupplies values to macro variables during macro execution."}},{"Name":"%LET","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %LET macro-variable =;]\n \nCreates a macro variable and assigns it a value."}},{"Name":"%LOCAL","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %LOCAL macro-variable(s); | %LOCAL / READONLY macro-variable=value;]\n \nCreates macro variables that are available only during the execution of the macro \nwhere they are defined. \n\nRequired Argument:\nmacro-variable(s)\n is the name of one or more macro variables or a text expression that generates one or more macro \n variable names. You cannot use a SAS variable list or a macro expression that generates a SAS \n variable list in a %LOCAL statement. \n \nOptional Argument:\nREADONLY macro-variable=value\n creates a new read only local macro variable.Note:The READONLY option can be used to create a single \n new macro variable (local or global). \nmacro-variable \n is the name of a macro variable or a text expression that produces a macro variable name. The name \n must be a new macro variable name. \nvalue\n is a character string or a text expression."}},{"Name":"%MACRO","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %MACRO macro-name <(parameter-list)>;]\n \nBegins a macro definition."}},{"Name":"%MEND","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %MEND ;]\n \nEnds a macro definition."}},{"Name":"%PUT","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %PUT ; ]\n \nWrites text or macro variable information to the SAS log."}},{"Name":"%RETURN","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %RETURN; ]\n \nExecution causes normal termination of the currently executing macro."}},{"Name":"%SYMDEL","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %SYMDEL macro-variable(s);]\n \nDeletes the specified variables(s) from the macro global symbol table."}},{"Name":"%SYSCALL","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %SYSCALL call-routine<(call-routine-argument(s))>;]\n\nInvokes a SAS call routine."}},{"Name":"%SYSEXEC","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %SYSEXEC ;]\n \nIssues operating environment commands."}},{"Name":"%WHILE","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %DO %WHILE(expression);]\n \nExecutes a section of a macro repetitively while a condition is true."}},{"Name":"%UNTIL","Type":"MACRODEFONLY","Help":{"#cdata":"[Syntax: %DO %UNTIL(expression);]\n \nExecutes a section of a macro repetitively until a condition is true."}},{"Name":"%SYSLPUT","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %SYSLPUT macro-variable=>;]\n \nCreates a new macro variable or modifies the value of an existing macro variable \non a remote host or server."}},{"Name":"%SYSRPUT","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %SYSRPUT local-macro-variable=remote-macro-variable;]\n \nAssigns the value of a macro variable on a remote host to a macro variable on the \nlocal host."}},{"Name":"%WINDOW","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"[Syntax: %WINDOW window-namefield-definition(s);]\n \nDefines customized windows."}},{"Name":"%INCLUDE","Type":"VALIDANYWHERE","Help":{"#cdata":"Syntax: %INCLUDE source(s) >;\n \nBrings a SAS programming statement, data lines, or both, into a current SAS program."}},{"Name":"%LIST","Type":"VALIDANYWHERE","Help":{"#cdata":"Displays lines that are entered in the current session.\n \nSyntax: %LIST>; \n\nwhere\n\nn - means display line n.\n\nn-m - means display lines n through m; can be written as n:m"}},{"Name":"%RUN","Type":"VALIDANYWHERE","Help":{"#cdata":"Syntax: %RUN;\n \nEnds source statements following a %INCLUDE * statement."}},{"Name":"%SYSMSTORECLEAR","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"Syntax: %SYSMSTORECLEAR;\n \nUse the %SYSMSTORECLEAR statement to close the stored compiled macro catalog and to clear \nthe previous libref when switching between SASMSTORE= libraries. \n\nNote: If any stored compiled macro from the library specified by the SASMSTORE= system \noption is still executing, the following will occur: \n\n o an ERROR diagnostic message will be issued \n o the library will not be closed \n o the libref will not be cleared"}},{"Name":"%SYSMACDELETE","Type":"OPENCODE_OR_MACRODEF","Help":{"#cdata":"Syntax: %SYSMACDELETE macro_name ;\n \nRequired Argument:\nmacro_name \n the name of a macro or a text expression that produces a macro variable name. \n\nOptional Argument:\nNOWARN \n specifies that no warning diagnostic message should be issued. \n\nDetails:\nThe %SYSMACDELETE statement deletes the macro definition of the specified macro from the \nWORK.SASMACR catalog. If no definition for the macro exists in the WORK.SASMACR catalog, \na WARNING diagnostic message is issued. If the macro is currently being executed, an \nERROR diagnostic message is issued."}}],"#comment":{}}} ================================================ FILE: server/data/SASProcedures.json ================================================ {"Keywords":{"Keyword":[{"Name":"ACCESS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ACCESS options; \n\nCreate and Update Statements: \n CREATE libref.member-name.ACCESS|VIEW ; \n \n UPDATE libref.member-name.ACCESS|VIEW ; \n \nDatabase-Description Statements:\n PATH= 'path-and-filename<.PC-filename-extension>' | <'>filename<'> | fileref; \n \n...Editing Statements\nRUN; \n\nSAS still supports this legacy procedure. However, to access your relational DBMS data more directly, \nit is recommended that you use the SAS/ACCESS LIBNAME statement or the SQL pass-through facility."}},{"Name":"ACECLUS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ACECLUS PROPORTION=p | THRESHOLD=t ; \n BY variables ; \n FREQ variable ; \n VAR variables ; \n WEIGHT variable ; \n\nThe ACECLUS (approximate covariance estimation for clustering) procedure obtains \napproximate estimates of the pooled within-cluster covariance matrix when the \nclusters are assumed to be multivariate normal with equal covariance matrices.\nNeither cluster membership nor the number of clusters needs to be known. PROC \nACECLUS is useful for preprocessing data to be subsequently clustered by the \nCLUSTER or FASTCLUS procedure."}},{"Name":"ADAPTIVEREG","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ADAPTIVEREG ; \n BY variables ; \n CLASS variables ; \n FREQ variable ; \n MODEL dependent <(options)> = ; \n OUTPUT <=name>> \u2026 <=name>> ; \n PARTITION ; \n SCORE >\u2026> ; \n WEIGHT variable ; \n\n[SAS/STAT 12.1 Experimental Procedure]\n\nThe ADAPTIVEREG procedure fits multivariate adaptive regression splines as defined by Friedman (1991b). \nThe method is a nonparametric regression technique that combines both regression splines and model \nselection methods. It does not assume parametric model forms and does not require specification of \nknot values for constructing regression spline terms. Instead, it constructs spline basis functions \nin an adaptive way by automatically selecting appropriate knot values for different variables and \nobtains reduced models by applying model selection techniques."}},{"Name":"ALLELE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ALLELE ; \n BY variables ; \n POP variable ; \n VAR variables ; \n WITH variables ; \n \nThe ALLELE procedure performs preliminary analyses on genetic marker data. These \nanalyses serve to characterize the markers themselves or the population from which \nthey were sampled, and can also serve as the basis for joint analyses on markers and \ntraits. A genetic marker is any heritable unit that obeys the laws of transmission \ngenetics, and the analyses presented here assume the marker genotypes are determined \nwithout error. With an underlying assumption of random sampling, the analyses rest on \nthe multinomial distribution of marker alleles, and many standard statistical techniques \ncan be invoked with little modification. The ALLELE procedure uses the notation and \nconcepts described by Weir (1996); this is the reference for all equations and methods \nnot otherwise cited."}},{"Name":"ANOVA","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC ANOVA ; \n CLASS variables ; \n MODEL dependents=effects ; \n ABSORB variables ; \n BY variables ; \n FREQ variable ; \n MANOVA ; \n MEANS effects ; \n REPEATED factor-specification ; \n TEST E=effect ;\n \nThe ANOVA procedure performs analysis of variance (ANOVA) for balanced data from a wide \nvariety of experimental designs. In analysis of variance, a continuous response variable, \nknown as a dependent variable, is measured under experimental conditions identified by \nclassification variables, known as independent variables. The variation in the response \nis assumed to be due to effects in the classification, with random error accounting for \nthe remaining variation."}},{"Name":"APPEND","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC APPEND BASE=SAS-data-set SAS-data-set> \n ;\n \nThe APPEND procedure adds the observations from one SAS data set to the end of another \nSAS data set. \n\nGenerally, the APPEND procedure functions the same as the APPEND statement in the \nDATASETS procedure. The only difference between the APPEND procedure and the APPEND \nstatement in PROC DATASETS is the default for libref in the BASE= and DATA= arguments. \nFor PROC APPEND, the default is either WORK or USER. For the APPEND statement, the \ndefault is the libref of the procedure input library."}},{"Name":"AUTHLIB","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC AUTHLIB ; \n CREATE ;\n MODIFY ;\n REMOVE ;\n REPAIR ADD | UPDATE | DELETE LOCATION | METADATA ;\n REPORT ;\n TABLES ;\n \n \nThe AUTHLIB procedure is a utility procedure that manages metadata-bound libraries. With PROC AUTHLIB, \nyou can do the following: \n \u2022 create a metadata-bound library by binding a physical library to metadata within a SAS Metadata Repository\n \u2022 modify password values for a metadata-bound library\n \u2022 repair metadata-bound libraries by recovering security information, secured library objects, \n and secured table objects\n \u2022 remove the physical security information and metadata objects that protect a metadata-bound library\n \u2022 report inconsistencies between physical library contents and corresponding metadata objects within \n a specified metadata-bound library"}},{"Name":"BCHOICE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC BCHOICE ;\n BY variables;\n CLASS variable <(options)> <\u2026variable <(options)> > ;\n MODEL response <(response-options)> = ;\n RANDOM random-effects ;\n PREDDIST OUTPRED=SAS-data-set ; \n RESTRICT <'label'> fixed-effect operand operator ; \n RESTRICT <'label'> fixed-effect constraint-list; \n\nThe BCHOICE (Bayesian choice) procedure performs Bayesian analysis for discrete choice models. Discrete \nchoice models are used in marketing research to model decision makers' choices among alternative products \nand services. The decision maker might be people, households, companies and so on, and the alternatives might \nbe products, services, actions, or any other options or items about which choices must be made (Train 2009). \nThe collection of alternatives that are available to the decision makers is called a choice set."}},{"Name":"BOXPLOT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC BOXPLOT options ; \n BY variables ; \n ID variables ; \n INSET keywords ; \n INSETGROUP keywords ; \n PLOT analysis-variable*group-variable <(block-variables)> <=symbol-variable> ; \n\nThe BOXPLOT procedure creates side-by-side box-and-whiskers plots of measurements \norganized in groups. A box-and-whiskers plot displays the mean, quartiles, and minimum \nand maximum observations for a group."}},{"Name":"BTL","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC BTL ; \n BY variables ; \n CLASS variables ; \n MARKER variables ; \n MODEL dependent <= fixed-effects> ; \n PARMEST ; \n PARMS (value-list) ... ; \n RANDOM random-effects ; \n REPEATED ; \n WEIGHT variable ; \n\nThe BTL procedure analyzes marker and trait data in order to find and characterize \nbinary trait loci (BTL). Mixed model analysis of variance is used to find a locus or \nloci associated with a trait, and a maximum likelihood model is used to estimate the \nrecombination and penetrance parameters for a given set of BTL. "}},{"Name":"CASECONTROL","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CASECONTROL ; \n BY variables ; \n STRATA variables ; \n TRAIT variable ; \n VAR variables ; \n \nMarker information can be used to help locate the genes that affect susceptibility \nto a disease. The CASECONTROL procedure is designed for the interpretation of marker \ndata when random samples are available from the populations of unrelated individuals \nwho are either affected or unaffected by the disease. Several tests are available in \nPROC CASECONTROL that compare marker allele and/or genotype frequencies in the two \npopulations, with frequency differences indicating an association of the marker with \nthe disease. Although such an association can point to the proximity of the marker \nand disease genes in the genome, it can also reflect population structure, so care \nis needed in interpreting the results; association does not necessarily imply linkage."}},{"Name":"CALENDAR","Type":"SAS_PROCEDURE","Help":{"#cdata":"[Syntax: PROC CALENDAR ; \n START variable; \n BY variable-1 <... variable-n> ; \n CALID variable ; \n DUR variable; \n FIN variable; \n HOLISTART variable; \n HOLIDUR variable; \n HOLIFIN variable; \n HOLIVAR variable;\n MEAN variable(s) ; \n OUTSTART day-of-week; \n OUTDUR number-of-days; \n OUTFIN day-of-week; \n SUM variable(s) ; \n VAR variable(s); ]\n \nThe CALENDAR procedure displays data from a SAS data set in a monthly calendar format."}},{"Name":"CALIS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CALIS ; \n ...CALIS statements\n ...SAS Programming statements\n RUN;\n QUIT;\n \nThe CALIS procedure deals with structural equation modeling, an important statistical tool in social \nand behavioral sciences. Structural equations express relationships among a system of variables that \ncan be either observed variables (manifest variables) or unobserved hypothetical variables (latent \nvariables). You can use the CALIS procedure to estimate parameters and test hypotheses for constrained \nand unconstrained problems in various situations."}},{"Name":"CALLRFC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CALLRFC; \n CALL 'function-name' > \n > \n > \n > \n >> \n ; \n \n DESCRIBE 'function-name' ; \n \nThe CALLRFC procedure executes Remote Function Calls (RFC) or RFC-compatible functions \non an SAP System. \n\nAny Advanced Business Applications Programming (ABAP) function modules called by the \nCALLRFC procedure must be:\n\n o RFC enabled \n o have no dialog boxes \n o synchronous"}},{"Name":"CANCORR","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CANCORR ; \n WITH variables ; \n BY variables ; \n FREQ variable ; \n PARTIAL variables ; \n VAR variables ; \n WEIGHT variable ; \n \nThe CANCORR procedure performs canonical correlation, partial canonical correlation, \nand canonical redundancy analysis. \n\nCanonical correlation is a generalization of multiple correlation for analyzing the \nrelationship between two sets of variables. In multiple correlation, you examine the \nrelationship between a linear combination of a set of explanatory variables, X, and \na single response variable, Y. In canonical correlation, you examine the relationship \nbetween linear combinations of the set of X variables and linear combinations of a set \nof Y variables. These linear combinations are called canonical variables or canonical \nvariates. Either set of variables can be considered explanatory or response variables, \nsince the statistical model is symmetric in the two sets of variables. Simple and \nmultiple correlation are special cases of canonical correlation in which one or both \nsets contain a single variable."}},{"Name":"CANDISC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CANDISC ; \n CLASS variable ; \n BY variables ; \n FREQ variable ; \n VAR variables ; \n WEIGHT variable ; \n\nCanonical discriminant analysis is a dimension-reduction technique related to principal \ncomponent analysis and canonical correlation. The methodology used in deriving the canonical \ncoefficients parallels that of a one-way MANOVA. MANOVA tests for equality of the mean \nvector across class levels. Canonical discriminant analysis finds linear combinations of \nthe quantitative variables that provide maximal separation between classes or groups. \nGiven a classification variable and several quantitative variables, the CANDISC procedure \nderives canonical variables, linear combinations of the quantitative variables that summarize \nbetween-class variation in much the same way that principal components summarize total variation."}},{"Name":"CATALOG","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC CATALOG CATALOG=catalog ; \n CONTENTS ; \n COPY OUT=catalog ; \n SELECT entry-1 <...entry-n> ; \n EXCLUDE entry-1 <...entry-n> ; \n \n CHANGE old-name-1=new-name-1 <...old-name-n=new-name-n> ; \n EXCHANGE name-1=other-name-1 <...name-n=other-name-n> ; \n DELETE entry-1 <...entry-n> ; \n MODIFY entry (DESCRIPTION=<<'>entry-description<'>>); \n SAVE entry-1 <...entry-n> ; \n \nPROC CATALOG is an interactive, statement-driven procedure that enables you to do \nthe following:\n\n o create a listing of the contents of a catalog \n o copy a catalog or selected entries within a catalog \n o rename, exchange, or delete entries within a catalog \n o change the name of a catalog entry \n o modify, by changing or deleting, the description of a catalog entry"}},{"Name":"CATMOD","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC CATMOD ; \n DIRECT ; \n MODEL response-effect=design-effects ; \n CONTRAST 'label' row-description <, , row-description> ; \n BY variables ; \n FACTORS factor-description <, , factor-description> ; \n LOGLIN effects ; \n POPULATION variables ; \n REPEATED factor-description <, , factor-description> ; \n RESPONSE ; \n RESTRICT parameter=value < parameter=value> ; \n WEIGHT variable ; \n \nThe CATMOD procedure performs categorical data modeling of data that can be \nrepresented by a contingency table. PROC CATMOD fits linear models to functions \nof response frequencies, and it can be used for linear modeling, log-linear \nmodeling, logistic regression, and repeated measurement analysis. PROC CATMOD \nuses the following estimation methods: \n\n o weighted least squares (WLS) estimation of parameters for a wide range of \n general linear models \n\n o maximum likelihood (ML) estimation of parameters for log-linear models and \n the analysis of generalized logits"}},{"Name":"CHART","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CHART ; \n BLOCK variable(s) ; \n BY variable-1 <... variable-n> ; \n HBAR variable(s) ; \n PIE variable(s) ; \n STAR variable(s) ; \n VBAR variable(s) ;\n \nThe CHART procedure produces vertical and horizontal bar charts, block charts, \npie charts, and star charts. These types of charts graphically display values \nof a variable or a statistic associated with those values. The charted variable \ncan be numeric or character.\n\nPROC CHART is a useful tool that lets you visualize data quickly, but if you need \nto produce presentation-quality graphics that include color and various fonts, then \nuse SAS/GRAPH software. The GCHART procedure in SAS/GRAPH software produces the same \ntypes of charts as PROC CHART does. In addition, PROC GCHART can produce donut charts."}},{"Name":"CIMPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CIMPORT destination=libref | member-name ;\n EXCLUDE SAS file(s) | catalog entry(s); \n SELECT SAS file(s) | catalog entry(s); \n \nThe CIMPORT procedure imports a transport file that was created (exported) by the \nCPORT procedure. PROC CIMPORT restores the transport file to its original form as \na SAS catalog, SAS data set, or SAS library. Transport files are sequential files \nthat each contain a SAS library, a SAS catalog, or a SAS data set in transport format. \nThe transport format that PROC CPORT writes is the same for all environments and for \nmany releases of SAS."}},{"Name":"CLUSTER","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CLUSTER METHOD = name ; \n BY variables ; \n COPY variables ; \n FREQ variable ; \n ID variable ; \n RMSSTD variable ; \n VAR variables ;\n \nThe CLUSTER procedure hierarchically clusters the observations in a SAS data set \nby using one of 11 methods. The data can be coordinates or distances. If the data \nare coordinates, PROC CLUSTER computes (possibly squared) Euclidean distances. If \nyou want non-Euclidean distances, use the DISTANCE procedure to compute an appropriate \ndistance data set that can then be used as input to PROC CLUSTER."}},{"Name":"COMPARE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC COMPARE ;\n BY variable-1 <... variable-n> ; \n ID variable-1 <... variable-n> ; \n VAR variable(s); \n WITH variable(s); \n\nThe COMPARE procedure compares the contents of two SAS data sets, selected variables \nin different data sets, or variables within the same data set."}},{"Name":"CONTENTS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CONTENTS >;\n \nThe CONTENTS procedure shows the contents of a SAS data set and prints the directory \nof the SAS library. \n\nGenerally, the CONTENTS procedure functions the same as the CONTENTS statement in the \nDATASETS procedure. The differences between the CONTENTS procedure and the CONTENTS \nstatement in PROC DATASETS are as follows:\n\nThe default for libref in the DATA= option in PROC CONTENTS is WORK. For the CONTENTS \nstatement, the default is the libref of the procedure input library.\n\nPROC CONTENTS can read sequential files. The CONTENTS statement cannot."}},{"Name":"CONVERT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CONVERT product-specification ;\n \nThe CONVERT procedure converts a BMDP or OSIRIS system file or an SPSS export\nfile to a SAS data set. It produces one output data set, but no printed output.\nThe new data set contains the same information as the input system file;\nexceptions are noted in Output Data Sets. The BMDP, OSIRIS and SPSS engines\nprovide more extensive capabilities.\n\nBecause the BMDP, OSIRIS and SPSS products are maintained by other companies or\norganizations, changes can be made that make the system files incompatible with\nthe current version of PROC CONVERT. SAS upgrades PROC CONVERT only to support\nchanges that are made to these products when a new version of SAS is available."}},{"Name":"COPY","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC COPY OUT=libref-1 IN=libref-2 \n \n )> >;\n EXCLUDE SAS-file-1 <...SAS-file-n> ; \n SELECT SAS-file-1 <...SAS-file-n> >; \n\nThe COPY procedure copies one or more SAS files from a SAS library."}},{"Name":"CORR","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CORR ; \n BY variables ; \n FREQ variable ; \n ID variables ; \n PARTIAL variables ; \n VAR variables ; \n WEIGHT variable ; \n WITH variables ;\n \nThe CORR procedure computes Pearson correlation coefficients, three nonparametric \nmeasures of association, and the probabilities associated with these statistics. \nThe correlation statistics include the following: \n\n o Pearson product-moment correlation \n o Spearman rank-order correlation \n o Kendall's tau-b coefficient \n o Hoeffding's measure of dependence, D\n o Pearson, Spearman, and Kendall partial correlation"}},{"Name":"CORRESP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CORRESP ; \n TABLES column-variables ; \n VAR variables ; \n BY variables ; \n ID variable ; \n SUPPLEMENTARY variables ; \n WEIGHT variable ;\n\nThe CORRESP procedure performs simple correspondence analysis and multiple correspondence \nanalysis (MCA). You can use correspondence analysis to find a low-dimensional graphical \nrepresentation of the rows and columns of a crosstabulation or contingency table. Each \nrow and column is represented by a point in a plot determined from the cell frequencies. \nPROC CORRESP can also compute coordinates for supplementary rows and columns. \n\nPROC CORRESP can read two kinds of input: raw categorical responses on two or more \nclassification variables or a two-way contingency table. The correspondence analysis \nplot is displayed with ODS Graphics."}},{"Name":"CPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC CPORT source-type=libref | member-name;\n EXCLUDE SAS file(s) | catalog entry(s); \n SELECT SAS file(s) | catalog entry(s) ; \n TRANTAB NAME=translation-table-name ;\n \nThe CPORT procedure writes SAS data sets, SAS catalogs, or SAS libraries to sequential \nfile formats (transport files). Use PROC CPORT with the CIMPORT procedure to move files \nfrom one environment to another. Transport files are sequential files that each contain \na SAS library, a SAS catalog, or a SAS data set in transport format. The transport format \nthat PROC CPORT writes is the same for all environments and for many releases of SAS. In \nPROC CPORT, export means to put a SAS library, a SAS catalog, or a SAS data set into \ntransport format. PROC CPORT exports catalogs and data sets, either singly or as a SAS \nlibrary. PROC CIMPORT restores (imports) the transport file to its original form as a \nSAS catalog, SAS data set, or SAS library."}},{"Name":"DATASETS","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"The DATASETS procedure is a utility procedure that manages your SAS files. \n \nWith PROC DATASETS, you can do the following:\n\n o copy SAS files from one SAS library to another \n o rename SAS files \n o repair SAS files \n o delete SAS files \n o list the SAS files that are contained in a SAS library \n o list the attributes of a SAS data set, such as: \n o the date when the data was last modified \n o whether the data is compressed \n o whether the data is indexed \n o manipulate passwords on SAS files \n o append SAS data sets \n o modify attributes of SAS data sets and variables within the data sets \n o create and delete indexes on SAS data sets \n o create and manage audit files for SAS data sets \n o create and delete integrity constraints on SAS data sets"}},{"Name":"DBF","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DBF ; \n \nNames the input SAS data set. Use this option if you are creating a DBF file\nfrom a SAS data set. If you use the DATA= option, do not use the OUT= option.\nIf you omit the DATA= option, SAS software creates an output SAS data set\nfrom the DBF file."}},{"Name":"DBLOAD","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DBLOAD ;\n CREATE; \n DBN= database-name; \n ACCDESC= libref.access-descriptor; \n DELETE variable-identifier <...variable-identifier-n>; \n INDEX variable-identifier = Y|N <...variable-identifier-n= Y|N>; \n LABEL; \n LEVEL variable-identifier = n <...variable-identifier-n= n>; \n LIST list-selection; \n LOAD; \n QUIT; \n RENAME variable-identifier = name <...variable-identifier-n = name-n>; \n RESET ALL|variable-identifier <...variable-identifier-n>; \n S2KLEN variable-identifier = n <...variable-identifier-n = n>; \n S2KLOAD; \n S2KMODE= M|S; \n S2KPW= password; \n VIEWDESC= libref.view-descriptor; \n WHERE SAS-where-expression; \n\nThe DBLOAD procedure enables you to create and load a SYSTEM 2000 database\nusing data from a SAS data file, from a view created with the SQL procedure, or\nfrom a SYSTEM 2000 database or another DBMS (using a view descriptor created by\nusing the ACCESS procedure)."}},{"Name":"DELETE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DELETE DATA=SAS-file-1 \n ( \n \n \n );\n \nThe DELETE procedure deletes SAS files from the disk or tape on which it is stored. Use PROC DELETE \nto do the following: \n\n \u2022delete either permanent or temporary SAS files\n \u2022delete a list of data sets with a numeric suffix, such as\n proc delete data=x1-x3;\n run;\n \u2022delete all SAS files of the same type using MEMTYPE=\n \u2022delete generation data sets using GENNUM=\n \u2022delete AES encrypted data sets when using GENNUM=ALL and ENCRYPTKEY= options \n \nOne of the benefits of using PROC DELETE instead of the DELETE statement in the DATASETS procedure \nis that it does not use the in-memory directory to delete SAS data sets. \n\nThe DELETE procedure produces no printed output. As a result, the DELETE procedure is faster."}},{"Name":"DIF","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DIF options;\n\nConverts a DIF file to SAS data set or a SAS data set to a DIF file."}},{"Name":"DISCRIM","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DISCRIM ; \n CLASS variable ; \n BY variables ; \n FREQ variable ; \n ID variable ; \n PRIORS probabilities ; \n TESTCLASS variable ; \n TESTFREQ variable ; \n TESTID variable ; \n VAR variables ; \n WEIGHT variable ; \n\nFor a set of observations containing one or more quantitative variables and a classification \nvariable defining groups of observations, the DISCRIM procedure develops a discriminant criterion\nto classify each observation into one of the groups. The derived discriminant criterion from this \ndata set can be applied to a second data set during the same execution of PROC DISCRIM. The data \nset that PROC DISCRIM uses to derive the discriminant criterion is called the training or \ncalibration data set."}},{"Name":"DISPLAY","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DISPLAY CATALOG=libref.catalog.entry.type ;\n \nThe DISPLAY procedure executes SAS/AF applications. These applications are composed \nof a variety of entries that are stored in a SAS catalog and that have been built with \nthe BUILD procedure in SAS/AF software. For complete documentation on building SAS/AF \napplications, see SAS Guide to Applications Development.\n\nYou can use the DISPLAY procedure to execute an application that runs in NODMS batch mode. \nBe aware that any SAS programming statements that you submit with the DISPLAY procedure \nthrough the SUBMIT block in SCL are not submitted for processing until PROC DISPLAY has \nexecuted.\n\nIf you use the SAS windowing environment, you can use the AF command to execute an \napplication. SUBMIT blocks execute immediately when you use the AF command. You can \nuse the AFA command to execute multiple applications concurrently."}},{"Name":"DISTANCE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DISTANCE ; \n BY variables ; \n COPY variables ; \n FREQ variable ; \n ID variable ; \n VAR level(variables ) ; \n WEIGHT variable ; \n\nThe DISTANCE procedure computes various measures of distance, dissimilarity, or \nsimilarity between the observations (rows) of a SAS data set. These proximity \nmeasures are stored as a lower triangular matrix or a square matrix in an output \ndata set (depending on the SHAPE= option) that can then be used as input to the \nCLUSTER, MDS, and MODECLUS procedures. The input data set might contain numeric \nor character variables, or both, depending on which proximity measure is used."}},{"Name":"DOCUMENT","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC DOCUMENT ; \n COPY path<(where-expression)> <, path-2<(where-expression-2)>> \n <, ...path-n<(where-expression-n)>> TO path ; \n DELETE path<(where-expression)> <, path-2<(where-expression-2)>> \n <, ...path-n<(where-expression-n)>> < / LEVELS= ALL | value>; \n DIR ; \n DOC ; \n DOC CLOSE; \n HIDE path <, path-2, ...path-n>; \n IMPORT DATA= data-set-name | GRSEG=grseg TO path ; \n LINK path TO path ; \n LIST path<(where-expression)> <, path-2<(where-expression-2)>> \n <, ...path-n<(where-expression-n)>> ; \n MAKE path <, path-2, ...path-n> ; \n MOVE path<(where-expression)> <, path-2<(where-expression-2)>> \n <, ...path-n<(where-expression-n)>> TO path ; \n NOTE path <'text'> ; \n OBANOTE output-object <'text'> ; \n OBBNOTE output-object <'text'> ; \n OBFOOTN output-object <'text'>; \n OBPAGE output-object ; \n OBSTITLE output-object <'text'> ; \n OBTEMPL output-object; \n OBTITLE output-object <'text'>; \n RENAME path-1 TO path-2; \n REPLAY path<(where-expression)> <, path-2<(where-expression-2)>> \n <, ...path-n<(where-expression-n)>> ; \n SETLABEL path 'label'; \n UNHIDE path <, path-2, ...path-n>; \nQUIT; \n\nIn ODS documents, the DOCUMENT procedure enables you to rearrange, duplicate, or remove \noutput from the results of a procedure or a database."}},{"Name":"DSTRANS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DSTRANS DSI_TO_DS2 | IN=data-step-file OUT=ds2-filename OUTDIR=ds2-pathname; \n SUBMIT; \n ENDSUBMIT; \n \n The DSTRANS procedure translates a subset of SAS DATA step code into DS2 language statements. \n Then, if necessary, you can revise your program to take advantage of DS2 functionality and \n submit your program in a Base SAS session using the DS2 procedure."}},{"Name":"EXPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC EXPORT DATA=SAS-data-set <(SAS-data-set-options)> \n OUTFILE=\"filename\" | OUTTABLE=\"tablename\" ; \n ;>... \n ;> \n\nThe GBARLINE procedure produces bar-line charts. Bar-line charts are vertical bar \ncharts with one or more plot overlays. These charts graphically represent the value \nof a statistic calculated for one or more variables in an input SAS data set. The \ncharted variables can be either numeric or character.\n\nThe procedure calculates these statistics: \n o sum\n o mean\n o frequency or cumulative frequency\n o percentage or cumulative percentage."}},{"Name":"GCHART","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GCHART \n \n output-catalog> \n ; \n BLOCK chart-variable(s) ; \n HBAR | HBAR3D | VBAR | VBAR3D chart-variable(s) ; \n PIE | PIE3D | DONUT chart-variable(s) ; \n STAR chart-variable(s) ; \n\nThe GCHART procedure produces six types of charts: block charts, horizontal and vertical \nbar charts, pie and donut charts, and star charts. These charts graphically represent the \nvalue of a statistic calculated for one or more variables in an input SAS data set. The \ncharted variables can be either numeric or character."}},{"Name":"GCONTOUR","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GCONTOUR \n output-catalog> ; \n PLOT y*x=z ; \n\nThe GCONTOUR procedure enables you to generate two-dimensional plots representing \nthree-dimensional relationships. \n\nWith PROC GCONTOUR, you can do the following actions:\n\n o use AXIS statements to customize the axes \n o use line styles and patterns to emphasize the contour levels \n o use reference lines to see how (x,y) combinations align to z values \n o use SYMBOL statements to customize labels or highlight data trends"}},{"Name":"GDEVICE","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GDEVICE SAS-catalog> ; \n ADD new-device-entry required-parameters ; \n COPY device-entry SAS-catalog> ; \n DELETE device-entry; \n FS; \n LIST device-entry | _ALL_ | _NEXT_ | _PREV_ | DUMP>; \n MODIFY device-entry parameter(s);\n QUIT | END | STOP; \n RENAME device-entry NEWNAME=entry-name; \n\nThe GDEVICE procedure is a tool for examining and changing the parameters of the graphics \ndevice driver catalog entries used with SAS/GRAPH software. With the GDEVICE procedure, you \ncan use either the GDEVICE windows or GDEVICE procedure statements to:\n\n o list the device entries stored in any DEVICES catalog \n o view the parameters for any device entry \n o create and modify new device entries \n o copy, modify, rename, or delete existing device entries."}},{"Name":"GEE","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GEE ; \n BY variables; \n CLASS variable <(options)> \u2026> ; \n ESTIMATE <'label'> estimate-specification ; \n FREQ | FREQUENCY variable; \n LSMEANS ; \n MISSMODEL ; \n MODEL response = ; \n OUTPUT ; \n REPEATED SUBJECT=subject-effect ; \n WEIGHT variable; \n \nThe GEE procedure implements the generalized estimating equations (GEE) approach (Liang and Zeger 1986), \nwhich extends the generalized linear model to handle longitudinal data (Stokes, Davis, and Koch 2012; \nFitzmaurice, Laird, and Ware 2011; Diggle et al. 2002). For longitudinal studies, missing data are common, \nand they can be caused by dropouts or skipped visits. If missing responses depend on previous responses, \nthe usual GEE approach can lead to biased estimates. So the GEE procedure also implements the weighted \nGEE method to handle missing responses that are caused by dropouts in longitudinal studies (Robins and \nRotnitzky 1995; Preisser, Lohman, and Rathouz 2002). The GEE procedure in SAS/STAT 14.1 does not support \nthe weighted GEE method for the multinomial distribution for polytomous responses."}},{"Name":"GENMOD","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GENMOD ; \n ASSESS | ASSESSMENT VAR=(effect) | LINK ; \n BAYES ; \n BY variables ; \n CLASS variable <(options)>> ; \n CONTRAST 'label' contrast-specification ; \n DEVIANCE variable = expression ; \n EFFECTPLOT > ; \n ESTIMATE 'label' effect values <,...effect values> ; \n EXACT <'label'> ; \n EXACTOPTIONS options ; \n FREQ | FREQUENCY variable ; \n FWDLINK variable = expression ; \n INVLINK variable = expression ; \n LSMEANS ; \n LSMESTIMATE model-effect <'label'> values <, ...<'label'> values > < / options> ; \n MODEL response = ; \n OUTPUT ; \n Programming statements ; \n REPEATED SUBJECT=subject-effect ; \n SLICE model-effect ; \n STORE item-store-name ; \n STRATA variable <(option)> > ; \n WEIGHT | SCWGT variable ; \n VARIANCE variable = expression ; \n ZEROMODEL ; \n\nThe GENMOD procedure fits generalized linear models, as defined by Nelder and Wedderburn \n(1972). The class of generalized linear models is an extension of traditional linear models \nthat allows the mean of a population to depend on a linear predictor through a nonlinear \nlink function and allows the response probability distribution to be any member of an \nexponential family of distributions."}},{"Name":"GEOCODE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GEOCODE ; \n \nGeocoding is the process of adding geographic coordinates (latitude and longitude values) \nto an address. \n\nThe coordinates typically represent the center of a ZIP code, a city, an address, or any \ngeographic region. After geocoding, the coordinates can be used to display a point on a map \nor to calculate distances. Geocoding also enables you to add attributes values such as census \nblocks to an address."}},{"Name":"GFONT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GFONT NAME=SAS/GRAPH font| device-resident font | system font mode \n ; \n\nThe GFONT procedure displays fonts and creates SAS/GRAPH fonts for use in SAS/GRAPH \nprograms. These fonts can contain standard Roman alphabet characters, foreign language \ncharacters, symbols, logos, or figures. \n\nYou can use the GFONT procedure output when you want to do the following tasks:\n\n o review the characters that are available in SAS/GRAPH fonts \n o examine the default device-resident font for your device \n o see the character codes associated with font characters \n o view the hexadecimal values associated with font characters \n o modify the color and height of font characters \n o draw reference lines around font characters"}},{"Name":"GINSIDE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GINSIDE \n DATA=points-data-set\n MAP=map-data-set \n \n \n \n \n ; \n ID d-variable(s); \n\nThe GINSIDE procedure compares a data set of X and Y coordinates to a map dataset containing \nmap polygons. The procedure determines whether the X and Y coordinates for each point fall \ninside of or outside of the map polygons. If the point falls inside of a polygon, then the \nID variable is set to the ID value of that polygon. For example, if a map contains states, \nthen the ID variable of the output data set is set to the state that contains the point. The \nGINSIDE procedure can be used with the SAS/GRAPH map data sets and the results can be used to \nannotate onto a map with the GMAP procedure."}},{"Name":"GKPI","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GKPI ; \n DIAL|HBULLET|HSLIDER|HTRAFFICLIGHT|SPEEDOMETER| VTRAFFICLIGHT|VBULLET|VSLIDER \n ACTUAL=data-value BOUNDS=bound-value-list ; \n\nThe GKPI procedure creates graphical key performance indicator (KPI) charts. KPIs \nare metrics that help a business monitor its performance and measure its progress \ntoward specific goals. \n\nThe procedure produces five KPI chart types:\n\n o slider (vertical or horizontal) \n o bullet graph (vertical or horizontal) \n o dial \n o speedometer \n o traffic light (vertical or horizontal).\n\nThe GKPI procedure produces a two or three-dimensional KPI chart based on a series \nof segment boundaries and an actual KPI value that you specify. If you specify a \ntarget value, the KPI chart also displays the target value. The procedure uses a \nset of default colors for the KPI chart, but you can specify your own colors."}},{"Name":"GLIMMIX","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GLIMMIX ; \n BY variables ; \n CLASS variables ; \n CODE ; \n CONTRAST 'label' contrast-specification <, contrast-specification> <, ...> ; \n COVTEST <'label'> ; \n EFFECT effect-specification ; \n ESTIMATE 'label' contrast-specification <(divisor=n)>\n <, 'label' contrast-specification <(divisor=n)>> <, ...> ; \n FREQ variable ; \n ID variables ; \n LSMEANS fixed-effects ; \n LSMESTIMATE fixed-effect <'label'> values \n <, <'label'> values > <, ...> ; \n MODEL response<(response-options)> = ; \n MODEL events/trials = ; \n NLOPTIONS ; \n OUTPUT <=name>>...\n <=name>> ; \n PARMS (value-list) ... ; \n RANDOM random-effects ; \n SLICE model-effect ; \n STORE item-store-name ; \n WEIGHT variable ; \n Programming statements ; \n\nThe GLIMMIX procedure fits statistical models to data with correlations or nonconstant variability \nand where the response is not necessarily normally distributed. These models are known as generalized \nlinear mixed models (GLMM)."}},{"Name":"GLM","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GLM ; \n CLASS variables ; \n MODEL dependent-variables=independent-effects ; \n ABSORB variables ; \n BY variables ; \n FREQ variable ; \n ID variables ; \n WEIGHT variable ; \n CONTRAST 'label' effect values <...effect values> ; \n ESTIMATE 'label' effect values <...effect values> ; \n LSMEANS effects ; \n MANOVA ; \n MEANS effects ; \n OUTPUT keyword=names <...keyword=names> ; \n RANDOM effects ; \n REPEATED factor-specification ; \n STORE item-store-name ; \n TEST E=effect ; \n\nThe GLM procedure uses the method of least squares to fit general linear models. Among \nthe statistical methods available in PROC GLM are regression, analysis of variance, analysis \nof covariance, multivariate analysis of variance, and partial correlation."}},{"Name":"GLMMOD","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GLMMOD ; \n BY variables ; \n CLASS variables ; \n FREQ variable ; \n MODEL dependents=independents / ; \n WEIGHT variable ; \n\nThe GLMMOD procedure constructs the design matrix for a general linear model; it \nessentially constitutes the model-building front end for the GLM procedure. You can \nuse the GLMMOD procedure in conjunction with other SAS/STAT software regression \nprocedures or with SAS/IML software to obtain specialized analyses for general \nlinear models that you cannot obtain with the GLM procedure."}},{"Name":"GLMPOWER","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GLMPOWER ; \n BY variables ; \n CLASS variables ; \n CONTRAST 'label' effect values <...effect values> ; \n MODEL dependents = independents ; \n PLOT ; \n POWER ; \n WEIGHT variable ; \n\nPower and sample size analysis optimizes the resource usage and design of a study, \nimproving chances of conclusive results with maximum efficiency. The GLMPOWER procedure \nperforms prospective power and sample size analysis for linear models, with a variety of \ngoals: \n\n o determining the sample size required to get a significant result with adequate \n probability (power) \n\n o characterizing the power of a study to detect a meaningful effect \n\n o conducting what-if analyses to assess sensitivity of the power or required sample \n size to other factors"}},{"Name":"GLMSELECT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GLMSELECT ; \n BY variables ; \n CLASS variable <(v-options)> > ; \n CODE ; \n EFFECT name = effect-type ( variables ) ; \n FREQ variable ; \n MODEL variable = ; \n MODELAVERAGE ; \n OUTPUT > <...keyword=name> ; \n PARTITION ; \n PERFORMANCE ; \n SCORE ; \n STORE item-store-name ; \n WEIGHT variable ; \n\nA variety of model selection methods are available, including the LASSO method of Tibshirani (1996) \nand the related LAR method of Efron et al. (2004). The procedure offers extensive capabilities for \ncustomizing the selection with a wide variety of selection and stopping criteria, from traditional \nand computationally efficient significance-level-based criteria to more computationally intensive \nvalidation-based criteria. The procedure also provides graphical summaries of the selection search."}},{"Name":"GMAP","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GMAP \n DATA=response-data-set | feature-table \n \n \n \n output-catalog> \n \n \n ; ID id-variable(s) | geo-variable; \n AREA response-variable ; \n BLOCK response-variable(s) ; \n CHORO response-variable(s) ; \n PRISM response-variable(s); \n SURFACE response-variable(s) ; \n\nThe GMAP procedure produces two-dimensional (choropleth) or three-dimensional (block, \nprism, and surface) maps that show variations of a variable value with respect to an \narea. A wide assortment of map data sets is available with SAS/GRAPH software."}},{"Name":"GOPTIONS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GOPTIONS ; \n \nThe GOPTIONS procedure provides information about the values of graphics options \nand the global statement definitions that are currently in effect in your session. \nThe values displayed are either the defaults of the current device driver or user-\ndefined values that have been assigned in your SAS session. You can use the GOPTIONS \nprocedure to do the following tasks:\n\n o list the current values of all of the graphics options or of one specified option\n o display the values of all of the AXIS, FOOTNOTE, LEGEND, PATTERN, SYMBOL, and TITLE \n definitions that are currently in effect\n o list the current values of all of the graphics options or of one specified option\n o display the values of all of the AXIS, FOOTNOTE, LEGEND, PATTERN, SYMBOL, and TITLE \n definitions that are currently in effect"}},{"Name":"GPLOT","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GPLOT \n output-catalog> \n ; \n BUBBLE plot-request(s) ; \n BUBBLE2 plot-request(s) ; \n PLOT plot-request(s) ; \n PLOT2 plot-request(s) ; \n \nThe GPLOT procedure plots the values of two or more variables on a set of coordinate axes \n(X and Y). The coordinates of each point on the plot correspond to two variable values in \nan observation of the input data set. The procedure can also generate a separate plot for \neach value of a third (classification) variable. It can also generate bubble plots in which \ncircles of varying proportions representing the values of a third variable are drawn at the \ndata points."}},{"Name":"GPROJECT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GPROJECT ; \n ID id-variable(s); \n \nThe GPROJECT procedure processes traditional map data sets by converting spherical coordinates \n(longitude and latitude) into Cartesian coordinates for use by the GMAP procedure. The process \nof converting coordinates from spherical to Cartesian is called projecting. Many of the map data \nsets that are available with SAS/GRAPH contain unprojected longitude and latitude coordinates. \nWhen these coordinates are plotted by the GMAP procedure, which is designed to plot points on a \ntwo-dimensional plane, the resulting map is often reversed and distorted as a result of forcing \nthe spherical map coordinates onto a flat plane."}},{"Name":"GRADAR","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GRADAR output-catalog> \n ; \n CHART chart-variable ; \n\nThe GRADAR procedure creates radar charts that show the relative frequency of data measures \nin quality control or market research problems. Radar charts are sometimes also called star \ncharts."}},{"Name":"GREDUCE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GREDUCE ; \n ID id-variable(s); \n\nThe GREDUCE procedure processes map data sets so that they can draw simpler maps with fewer \nboundary points. It creates an output map data set that contains all of the variables in the \ninput map data set plus a new variable named DENSITY. For each observation in the input map \ndata set, the procedure determines the significance of that point for maintaining a semblance \nof the original shape and gives the observation a corresponding DENSITY value."}},{"Name":"GREMOVE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GREMOVE \n ; \n BY variable-l <...variable-n> ; \n ID variable(s); \n\nThe GREMOVE procedure processes a map data set that is used as input. It does not produce any \ngraphics output. Instead, it produces an output data set that typically becomes the input map \ndata set for the GMAP procedure (see The GMAP Procedure). The GREMOVE procedure combines unit \nareas defined in a map data set into larger unit areas by removing shared borders between the \noriginal unit areas. For example, Map before Removing Borders (GRMUSMAP(a)) and Map after\nRemoving Borders (GRMUSMAP(b)) show combined unit areas in a typical map data set by removing \nstate boundaries to create regional census divisions."}},{"Name":"GREPLAY","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GREPLAY \n output-catalog> input-catalog> \n \n ; \n BYLINE; \n CC color-map-catalog; \n CCOPY color-map-entry<.CMAP>; \n CDEF color-map-entry ; \n CDELETE color-map-entry(s) | _ALL_ ; \n CMAP color-map-entry; \n COPY entry-id(s) | _ALL_ ; \n DELETE entry-id(s) | _ALL_ ; \n DEVICE device-name; \n FS; \n GOUT output-catalog; \n GROUP entry-id(s); \n IGOUT input-catalog ; \n LIST required-argument; \n MODIFY modify-pair(s); \n MOVE entry-id-1 AFTER | BEFORE entry-id-2; \n NOBYLINE; \n PREVIEW template-entry(s) | _ALL_ ; \n QUIT | END | STOP; \n REPLAY entry-id(s) | _FIRST_ | _LAST_ | _ALL_ ; \n TC template-catalog; \n TCOPY template-entry<.TEMPLATE>; \n TDEF template-entry < panel definition(s)> \n ; \n TDELETE template-entry(s) | _ALL_ ; \n TEMPLATE template-entry; \n TREPLAY select-pair(s); \n\nThe GREPLAY procedure displays and manages graphics output that is stored in SAS catalogs. \nThe GREPLAY procedure also creates templates and color maps that you can use when you replay \nyour graphics output. The GREPLAY procedure operates in line mode, batch mode, and in the SAS \nwindowing environments."}},{"Name":"GROOVY","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GROOVY ; \n ADD classpath options; \n EVALUATE <(LOAD | PARSEONLY | NORUN)> \u201cGroovy statement string\u201d ; \n EXECUTE <(LOAD | PARSEONLY | NORUN)> Groovy file name | fileref ; \n SUBMIT <(LOAD | PARSEONLY | NORUN)> ; \n Groovy statements\n ENDSUBMIT;\n CLEAR;\nQUIT;\n\nGroovy is a dynamic language that runs on the Java Virtual Machine (JVM). PROC GROOVY \nenables SAS code to execute Groovy code on the JVM. PROC GROOVY can run Groovy statements \nthat are written as part of your SAS code, and it can run statements that are in files that \nyou specify with PROC GROOVY commands. It can parse Groovy statements into Groovy Class \nobjects, and run these objects or make them available to other PROC GROOVY statements or \nJava DATA Step Objects. You can also use PROC GROOVY to update your CLASSPATH environment \nvariable with additional CLASSPATH strings or filerefs to jar files."}},{"Name":"GSLIDE","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC GSLIDE ; \n \nThe GSLIDE procedure is useful for creating text slides for presentations. You can overlay \ntext slides on other graphics output with the GREPLAY procedure. The GSLIDE procedure produces \ngraphics output that consists of text and straight lines that are generated by TITLE, FOOTNOTE, \nand NOTE statements. In addition, the procedure provides an easy way to add titles, notes, and \nfootnotes to output that is produced entirely with an Annotate data set."}},{"Name":"GTILE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GTILE ; \n FLOW | TILE | TOGGLE size-variable TILEBY=(variable) | (variable-list) ; \n\nThe GTILE procedure creates charts that consist of a rectangle or a square divided into \ntile-shaped segments. These charts represent the relative sizes of tiles to one another \nand to the whole. The GTILE procedure provides three statements you can use to define the \nlayout in order to visualize your data. The statements require one numeric variable. This \nvariable defines the top level of the chart.\n\nThe TILEBY= statement is followed by any number of numeric or character variables that \nare delineated by a comma or a blank space. By providing multiple TILEBY variables, and \nspecifying either a JAVA or ACTIVEX device with the DEVICE= option, you can use the GTILE \nprocedure to create interactive charts.These charts enable you to display subsets (or levels) \nof your data. You can assign an additional numeric variable as a color variable using the \nCOLORVAR= option."}},{"Name":"GIMPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC GIMPORT FILEREF=cgm-fileref | 'external-file' \n FILETYPE=CGM \n FORMAT=BINARY | CHARACTER | CLEARTEXT \n output-catalog>; \n \nIdentifies the input file to be processed, and specifies its file type and format. \nOptionally specifies an output catalog."}},{"Name":"HPCANDISC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPCANDISC ; \n BY variables ; \n CLASS variable ; \n FREQ variable ;\n ID variables; \n PERFORMANCE performance-options; \n VAR variables ; \n WEIGHT variable ; \n\nThe HPCANDISC procedure is a high-performance procedure that performs canonical discriminant analysis. \nIt is a high-performance version of the CANDISC procedure in SAS/STAT software. PROC HPCANDISC runs in \neither single-machine mode or distributed mode. \n\nNote: Distributed mode requires SAS High-Performance Statistics."}},{"Name":"HPCLUS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPCLUS < options > ;\n INPUT variables < options > ;\n ID variables ;\n FREQ variable ;\n SCORE < options > ;\n CODE < options > ;\n PERFORMANCE performance-options ; \n \nThe HPCLUS procedure executes high-performance clustering. Clustering is a common step in the data\nexploration stage. The HPCLUS procedure takes only numeric variables. \n\nThe HPCLUS procedure performs an cluster analysis on the basis of distances computed from one or more\nvariables. The observations are divided into clusters such that every observation belongs to one and only one\ncluster."}},{"Name":"HPF","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPF options ; \n BY variables ; \n FORECAST variable-list / options ; \n ID variable INTERVAL= interval options ; \n IDM options ; \n\nThe HPF (High-Performance Forecasting) procedure provides a quick and automatic\nway to generate forecasts for many time series or transactional data in one\nstep. The procedure can forecast millions of series at a time, with the series\norganized into separate variables or across BY groups."}},{"Name":"HPFARIMASPEC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFARIMASPEC options ; \n FORECAST options ; \n INPUT options ; \n ESTIMATE options ; \n\nThe HPFARIMASPEC procedure is used to create an ARIMA (autoregressive\nintegrated moving average) model specification file. The output of this\nprocedure is an XML file that stores the intended ARIMA model specification."}},{"Name":"HPFDIAGNOSE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFDIAGNOSE options ; \n ADJUST variable = ( variable-list ) / options ; \n ARIMAX options ; \n BY variables ; \n ESM option ; \n EVENT event-names ; \n FORECAST variables ; \n ID variable INTERVAL=interval options ; \n IDM options ; \n INPUT variables ; \n TRANSFORM options ; \n TREND options ; \n UCM options ; \n\nThe HPFDIAGNOSE procedure provides a comprehensive set of tools for automated\nunivariate time series model identification. Time series data can have\noutliers, structural changes, and calendar effects. In the past, finding a good\nmodel for time series data usually required experience and expertise in time\nseries analysis."}},{"Name":"HPFENGINE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFENGINE options ; \n ADJUST variable = ( variable-list ) / options ; \n BY variables ; \n CONTROL variable-list / options ; \n EXTERNAL variable-list / options ; \n FORECAST variable-list / options ; \n ID variable INTERVAL= interval options ; \n INPUT variable-list / options ; \n SCORE ; \n STOCHASTIC variable-list / options ; \n\nThe HPFENGINE procedure provides an automatic way to generate forecasts for\nmany time series or transactional data in one step. The procedure can\nautomatically choose the best forecast model from a user-defined model list \nor a default model list. Specifications for the candidate forecast models are\nindependent of any data series. You can generate the specifications or choose\nthem from a default set."}},{"Name":"HPFESMSPEC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFESMSPEC options ; \n ESM options ; \n\nThe HPFESMSPEC procedure creates model specifications files for exponential\nsmoothing models (ESM). \n\nYou can specify many types of exponential models with this procedure. In\nparticular, any model that can be analyzed using the HPF procedure can be\nspecified."}},{"Name":"HPFEVENTS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFEVENTS ; \n BY variables ; \n EVENTCOMB variable= variable-list / options ; \n EVENTDATA options ; \n EVENTDEF variable= do-list / options ; \n EVENTDUMMY options ; \n EVENTGROUP variable=( list ) ; \n EVENTKEY event-keyword < / options > ; \n ID variable INTERVAL= interval options ; \n VAR variables ;\n\nThe HPFEVENTS procedure provides a way to create and manage events associated\nwith time series for the purpose of analysis. The procedure can create events,\nread events from an events data set, write events to an events data set, and\ncreate dummy variables based on those events if date information is provided."}},{"Name":"HPFEXMSPEC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFEXMSPEC options ; \n EXM options ; \n\nThe HPFEXMSPEC procedure creates model specifications files for external models\n(EXM). External model specifications are used for forecasts that are provided\nexternal to the system. These external forecasts might have originated from an\nexternal statistical model from another software package, might have been\nprovided by an outside organization (for example, a marketing organization or\ngovernment agency), or might be based on judgment."}},{"Name":"HPFIDMSPEC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFIDMSPEC options ; \n IDM options ;\n\nThe HPFIDMSPEC procedure creates model specifications files for intermittent\ndemand models (IDM)."}},{"Name":"HPFMM","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFMM ; \n BAYES bayes-options ; \n BY variables ; \n CLASS variable <(options)>... > ; \n FREQ variable ; \n ID variables ; \n MODEL response<(response-options)> = ; \n MODEL events/trials = ; \n MODEL + ; \n OUTPUT <=name>>...\n <=name>> ; \n PERFORMANCE performance-options ; \n PROBMODEL ; \n RESTRICT <'label'> constraint-specification <, ..., constraint-specification>\n > ; \n WEIGHT variable ; \n \nThe HPFMM procedure is a high-performance counterpart of the FMM procedure that fits statistical models to \ndata for which the distribution of the response is a finite mixture of univariate distributions\u2014that is, \neach response comes from one of several random univariate distributions that have unknown probabilities.\nYou can use PROC HPFMM to model the component distributions in addition to the mixing probabilities."}},{"Name":"HPFSELECT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFSELECT options ; \n DELETE specification-list ; \n DIAGNOSE options ; \n FORECASTOPTIONS options ; \n SELECT options ; \n SPECIFICATION specification-list ; \n\nThe HPFSELECT procedure enables you to control the forecasting model selection\nprocess by defining lists of candidate forecasting models. Using model\nselection lists created by the HPFSELECT procedure, you can control which\nforecasting model or models SAS High-Performance Forecasting software uses to\nforecast particular time series."}},{"Name":"HPFUCMSPEC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPFUCMSPEC options ; \n AUTOREG options ; \n BLOCKSEASON options ; \n CYCLE options ; \n DEPLAG options ; \n FORECAST options ; \n INPUT options ; \n IRREGULAR options ; \n LEVEL options ; \n SEASON options ; \n SLOPE options ; \n\nThe HPFUCMSPEC procedure is used to create an unobserved component model (UCM)\nspecification file. The output of this procedure is an XML file that stores the\nintended UCM specification. This XML specification file can be used for\ndifferent purposes\u2014for example, it can be used to populate the model repository\nused by the HPFENGINE procedure (see Chapter 5, The HPFENGINE Procedure ). You\ncan specify any UCM that can be analyzed by using the UCM procedure; see\nChapter 29, The UCM Procedure (SAS/ETS User's Guide). Moreover, the model\nspecification can include series transformations such as or Box-Cox\ntransformations. Apart from minor modifications to accommodate series\ntransformations, the model specification syntax of the HPFUCMSPEC procedure is\nsimilar to that of the UCM procedure."}},{"Name":"HPGENSELECT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPGENSELECT < options > ;\n CLASS variable < (options) >: : : < variable < (options) > > < / global-options > ;\n CODE < options > ;\n MODEL response< (response-options) > = < effects > < / model-options > ;\n MODEL events/trials< (response-options) > = < effects > < / model-options > ;\n OUTPUT \n < keyword < =name > >. . .\n < keyword < =name > > < / options > ;\n PERFORMANCE performance-options ;\n SELECTION selection-options ;\n FREQ variable ;\n ID variables ;\n WEIGHT variable ; \n \nThe HPGENSELECT procedure is a high-performance procedure that fits generalized linear models on the\nSAS appliance. \n\nThe HPGENSELECT procedure fits a broader class of regression models than exponential family generalized\nlinear models; the procedure permits several link functions and can handle zero-modified models for count\ndata as well as ordinal and nominal data with more than two response categories (multinomial data)."}},{"Name":"HPMIXED","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPMIXED ; \n BY variables ; \n CLASS variables ; \n EFFECT name = effect-type ( variables ) ; \n ID variables ; \n MODEL dependent = ; \n RANDOM random-effects ; \n REPEATED repeated-effect ;\n PARMS <(value-list) ...> ; \n TEST fixed-effects ; \n CONTRAST 'label' contrast-specification <, contrast-specification> <, ...> ; \n ESTIMATE 'label' contrast-specification <(divisor=n)>\n <, 'label' contrast-specification <(divisor=n)>> <, ...> ; \n LSMEANS fixed-effects ; \n NLOPTIONS ; \n OUTPUT \n <=name>>...\n <=name>> ; \n WEIGHT variable ; \n\nThe HPMIXED procedure uses a number of specialized high-performance techniques to fit linear \nmixed models with variance component structure. The HPMIXED procedure is specifically designed \nto cope with estimation problems involving a large number of fixed effects, a large number of \nrandom effects, or a large number of observations."}},{"Name":"HPPLS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPPLS ; \n BY variables ; \n CLASS variables ; \n MODEL response-variables = predictor-effects ; \n OUTPUT >\u2026> ;\n PARTITION ;\n PERFORMANCE ;\n ID variables ; \n\nThe HPPLS procedure is a high-performance version of the PLS procedure in SAS/STAT software, which fits \nmodels by using any one of a number of linear predictive methods, including partial least squares (PLS).\nOrdinary least squares regression, as implemented in SAS/STAT procedures such as the GLM and REG procedures, \nhas the single goal of minimizing sample response prediction error, and it seeks linear functions of the\npredictors that explain as much variation in each response as possible. The HPPLS procedure implements \ntechniques that have the additional goal of accounting for variation in the predictors, under the \nassumption that directions in the predictor space that are well sampled should provide better prediction \nfor new observations when the predictors are highly correlated. All the techniques that the HPPLS procedure \nimplements work by extracting successive linear combinations of the predictors, called factors (also called \ncomponents, latent vectors, or latent variables), which optimally address one or both of these two \ngoals: explaining response variation and explaining predictor variation. In particular, the method of \npartial least squares balances the two objectives by seeking factors that explain both response and \npredictor variation."}},{"Name":"HPPRINCOMP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPPRINCOMP ; \n BY variables ; \n CODE ;\n FREQ variable ; \n ID variables ; \n OUTPUT >\u2026> ; \n PARTIAL variables ; \n PERFORMANCE performance-options;\n VAR variables ; \n WEIGHT variable ; \n\nThe HPPRINCOMP procedure is a high-performance procedure that performs principal component analysis. \nIt is a high-performance version of the PRINCOMP procedure in SAS/STAT software, but it provides \nadditional iterative methods to calculate the principal components."}},{"Name":"HPQUANTSELECT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPQUANTSELECT ; \n BY variables ; \n CLASS variable <(v-options)> > ; \n CODE ; \n EFFECT name = effect-type (variables ) ; \n MODEL variable = ; \n OUTPUT > <\u2026keyword<=name>> ; \n PARTITION ; \n WEIGHT variable ; \n\nThe QUANTSELECT procedure compares most closely to the GLMSELECT and QUANTREG procedures. PROC GLMSELECT \nperforms effect selection in the framework of general linear models. PROC QUANTREG supports a variety of \nestimation and inference methods for quantile regression but does not directly provide effect selection \nfacilities. The QUANTSELECT procedure, as a counterpart of PROC GLMSELECT for quantile regression, fills \nthis gap."}},{"Name":"HPTMINE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPTMINE < options > ;\n VARIABLE variable ;\n DOC_ID variable ;\n PARSE < parse-options > ;\n SVD < svd-options > ;\n PERFORMANCE performance-options ;\n \nThe HPTMINE procedure is a high-performance procedure that analyzes large-scale textual\ndata. PROC HPTMINE provides the SAS High-Performance Analytics platform an essential capability\nfor text mining and supports a wide range of fundamental text analysis features, which include tokenizing,\nstemming, part-of-speech tagging, noun group extraction, default or customized stop or start lists, entity\nparsing, multiword tokens, synonym lists, term weighting, term-by-document matrix creation, and dimension\nreduction by term filtering and singular value decomposition (SVD)."}},{"Name":"HPTMSCORE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HPTMSCORE < options > ;\n VARIABLE variable ;\n DOC_ID variable ;\n PERFORMANCE performance-options ;\n \nFor high-performance text mining, scoring is the process of applying the parsing and SVD projections to\nnew textual data. The HPTMSCORE procedure performs this scoring of new documents, and its primary\noutput is a document data set Outdocpro, which holds the reduced dimensional representation of the score\ncollection. PROC HPTMSCORE uses some of the output data sets of the HPTMINE procedure as input\ndata to ensure consistency between scoring and training. During scoring, the new textual data must be\nparsed with the same settings that the training data were parsed with, indexed using only the subset of terms\nthat were used during training, and projected onto the reduced dimensional subspace of the singular value\ndecomposition that was derived from the training data. The three data sets, Outconfig, Outterms and Svdu,\nwhich were created with PROC HPTMINE facilitate this process and serve as input to PROC HPTMSCORE\nwith the CONFIG=, TERMS=, and SVDU= options, respectively. The purpose of these three data sets are\nsummarized below under their respective options."}},{"Name":"HAPLOTYPE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HAPLOTYPE ; \n BY variables ; \n ID variables ; \n TRAIT variable ; \n VAR variables ; \n\nA haplotype is a combination of alleles at multiple loci on a single chromosome. A pair \nof haplotypes constitutes the multilocus genotype. Haplotype information has to be inferred \nbecause data are usually collected at the genotypic, not haplotype pair, level. For homozygous \nmarkers, there is no problem. If one locus has alleles A and a, and a second locus has alleles \nB and b, the observed genotype AaBB must contain two haplotypes of type AB; genotype AaBB must \ncontain haplotypes AB and aB, and so on. Haplotypes and their frequencies can be obtained directly. \nWhen both loci are heterozygous, however, there is ambiguity; a variety of combinations of haplotypes \ncan generate the genotype, and it is not possible to determine directly which two haplotypes constitute \nany individual genotype. For example, the genotype AaBb might be of type AB/ab with haplotypes AB and\nab, or of type Ab/aB with haplotypes Ab and aB. The HAPLOTYPE procedure uses the expectation-maximization \n(EM) algorithm to generate maximum likelihood estimates of haplotype frequencies given a multilocus \nsample of genetic marker genotypes under the assumption of Hardy-Weinberg equilibrium (HWE). These \nestimates can then be used to assign the probability that each individual possesses a particular \nhaplotype pair. A Bayesian approach for haplotype frequency estimation is also implemented in \nPROC HAPLOTYPE."}},{"Name":"HTSNP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HTSNP ; \n BY variables ; \n FREQ variable ; \n VAR variables ; \n \nSingle nucleotide polymorphism (SNP) is the most abundant form of genetic variation \nand accounts for about 90% of human DNA polymorphism. There is roughly one SNP per 1 \nkilobase in the human genome. Studies of human haplotype variations that use SNPs over \nlarge genomic regions suggest the presence of discrete blocks with limited haplotype \ndiversity punctuated by recombination hot spots. The intrablock linkage disequilibrium \n(LD) decreases only gradually with distance, while the interblock LD decays much more \nrapidly. Within each block, because of high LD, some allele(s) might always be coexistent \nwith a particular allele at another locus such that (1) little haplotype diversity exists \nin the block, and (2) not all SNPs will be essential in characterizing the haplotype \nstructure in the block. Therefore, the most common haplotypes could usually be captured \nby a small subset of SNPs, termed haplotype tagging SNPs (htSNPs) by Johnson et al. (2001)."}},{"Name":"HTTP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HTTP options;\n \nPROC HTTP issues HTTP requests. PROC HTTP reads as input the entire body from a fileref and \nwrites output to a fileref. PROC HTTP can also read custom request headers from a fileref \nand write response headers to a fileref."}},{"Name":"ICPHREG","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ICPHREG ; \n BASELINE ; \n BY variables; \n CLASS variable <(options)> \u2026> ; \n FREQ variable ; \n HAZARDRATIO <'label'> variable ; \n MODEL (t1, t2)= effects ; \n OUTPUT ; \n TEST ; \n STRATA variable; \n\nThe ICPHREG procedure is designed to fit proportional hazards regression models to interval-censored data. \nIt can also fit proportional hazards regression models to failure time data that are uncensored, right \ncensored, or left censored. \n\nThe ICPHREG procedure enables you to use a variety of configurations with respect to the baseline function \nto fit a proportional hazards model; these configurations include a piecewise constant model (Friedman 1982) \nand a cubic spline model (Royston and Parmar 2002). To estimate the regression coefficients and the baseline \nparameters, the ICPHREG procedure maximizes the full likelihood instead of the Cox partial likelihood. Standard\nerrors of the estimates are obtained by inverting the observed information matrix, which is derived from the \nfull likelihood."}},{"Name":"ICLIFETEST","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ICLIFETEST ; \n BY variables; \n FREQ variable; \n STRATA variables; \n TEST variable ; \n TIME (variable,variable ); \n \nThe ICLIFETEST procedure performs nonparametric survival analysis for interval-censored data. You can use \nthe ICLIFETEST procedure to compute nonparametric estimates of the survival functions and to examine the \nequality of the survival functions through statistical tests."}},{"Name":"IMPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC IMPORT DATAFILE=\"filename\" | TABLE=\"tablename\" \n OUT=SAS-data-set <(SAS-data-set-options)> \n ; \n \nThe IMPORT procedure reads data from an external data source and writes it to a SAS \ndata set. Base SAS can import delimited files. In delimited files, a delimiter--such \nas a blank, comma, or tab--separates columns of data values. If you license SAS/ACCESS \nInterface to PC Files, additional external data sources can include such files as \nMicrosoft Access Database, Excel files, and Lotus spreadsheets. See the SAS/ACCESS \nInterface to PC Files for more information."}},{"Name":"IMSTAT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC IMSTAT ; \n AGGREGATE variable-name (aggregate-variable-options) ;\n ARM ITEM=item-variable TRAN=transaction-variable ;\n ASSESS / Y=response-variable ; \n BOXPLOT ;\n CLUSTER ;\n CORR ;\n CROSSTAB row*column ;\n DECISIONTREE target-variable ;\n DISTINCT ;\n FORECAST timestamp-variable ;\n FREQUENCY variable-list ;\n GENMODEL dependent-variable <(class-variables)> = model-effects ;\n GLM dependent-variable <(class-variables)> = model-effects ;\n GROUPBY ;\n HISTOGRAM ;\n HYPERGROUP ;\n KDE variable-list ;\n LOGISTIC dependent-variable <(class-variables)> = model-effects ;\n MDSUMMARY variable-list options>;\n NEURAL ;\n OPTIMIZE ;\n PERCENTILE ;\n RANDOMWOODS target-variable ;\n REGCORR ;\n SUMMARY ;\n TEXTPARSE TXT=text-variable ID=document-ID ;\n TOPK ;\n TRANSFORM (request1) <(request2) ...> ;\n \nThe analytic statements of the IMSTAT procedure are used to perform in-memory analytics \nwith a SAS LASR Analytic Server. All analyses are performed on in-memory tables."}},{"Name":"INBREED","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC INBREED ; \n BY variables ; \n CLASS variable ; \n GENDER variable ; \n MATINGS individual-list1 / mate-list1 <,..., individual-listn / mate-listn> ; \n VAR variables ; \n\nThe INBREED procedure calculates the covariance or inbreeding coefficients for a pedigree. \nPROC INBREED is unique in that it handles very large populations."}},{"Name":"INFOMAPS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC INFOMAPS ;\n DELETE INFOMAP \"information-map-name\" ;\n EXPORT FILE=fileref | \"physical-location\" ; \n IMPORT FILE=fileref |\"physical-location\"; \n INSERT DATAITEM \n COLUMN=\"data-source-ID\".\"column-name\" | EXPRESSION=\"expression-text\" | \n HIERARCHY=\"dimension\".\"hierarchy\" | MEASURE=\"OLAP-measure\" ;\n INSERT DATASOURCE SASSERVER=\"application-server-name\" TABLE=\"library\".\"table\" ; \n | INSERT DATASOURCE SASSERVER=\"application-server-name\" CUBE=<\"schema\".>\"cube\" <_ALL_> ; \n INSERT FILTER CONDITION=\"conditional-expression\" ; \n INSERT FOLDER \"folder-name\" ; \n INSERT IDENTITY_PROPERTY PROPERTY=property-keyword ; \n INSERT RELATIONSHIP CONDITION=\"conditional-expression\" LEFT_TABLE=\"data-source-ID-1\" \n RIGHT_TABLE=\"data-source-ID-2\" ;\n LIST ; \n MOVE DATAITEM \"data-item-ID\" | ID_LIST=(\"data-item-ID-1\" <... \"data-item-ID-n\">) \n NEW_LOCATION=\"new-folder-location\" ; \n MOVE FILTER \"filter-ID\" | ID_LIST=(\"filter-ID-1\" <... \"filter-ID-n\">) \n NEW_LOCATION=\"new-folder-location\" ; \n MOVE FOLDER \"folder-name\" NEW_LOCATION=\"new-folder-location\" \n ; \n NEW INFOMAP \"information-map-name\" ; \n SAVE >; \n SET STORED_PROCESS NAME=\"stored-process-name\" ; \n UPDATE DATAITEM \"data-item-ID\" ;\n UPDATE DATASOURCE \"data-source-ID\" ; \n UPDATE FILTER \"filter-ID\" ; \n UPDATE FOLDER \"folder-name\" ;\n UPDATE INFOMAP \"information-map-name\" ;\n UPDATE RELATIONSHIP \"relationship-ID\" ;\n \nThe INFOMAPS procedure enables you to create information maps programmatically. You can \nalso use the procedure to modify an existing information map by adding new data sources, \ndata items, filters, folders, or relationships. Or you can change the definitions of any \nexisting data item, filter, data source, folder, or relationship within an information map."}},{"Name":"IRT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC IRT ; \n BY variables;\n COV covariance parameters; \n EQUALITY equality-constraints; \n FACTOR factor-variables-relations; \n FREQ variable; \n GROUP variable; \n MODEL model-specification; \n VAR variables; \n VARIANCE variance parameters; \n WEIGHT variable;\n \nThe item response theory (IRT) model was first proposed in the field of psychometrics for the purpose of ability \nassessment. It is most widely used in education to calibrate and evaluate items in tests, questionnaires, and other \ninstruments and to score subjects on their abilities, attitudes, or other latent traits. Today, all major psychological \nand educational tests are built using IRT, because the methodology can significantly improve measurement accuracy and \nreliability while providing potential significant reductions in assessment time and effort, especially via computerized \nadaptive testing. In a computerized adaptive test, items are optimally selected for each subject. Different subjects \nmight receive entirely different items during the test. IRT plays an essential role in selecting the most appropriate \nitems for each subject and equating scores for subjects who receive different subsets of items. Notable examples of \nthese tests include the Scholastic Aptitude Test (SAT), Graduate Record Examination (GRE), and Graduate Management \nAdmission Test (GMAT)."}},{"Name":"KDE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC KDE ; \n BIVAR variable-list ; \n UNIVAR variable-list ; \n BY variables ; \n FREQ variable ; \n WEIGHT variable ;\n\nThe KDE procedure performs univariate and bivariate kernel density estimation. Statistical \ndensity estimation involves approximating a hypothesized probability density function from \nobserved data. Kernel density estimation is a nonparametric technique for density estimation \nin which a known density function (the kernel) is averaged across the observed data points \nto create a smooth approximation. PROC KDE uses a Gaussian density as the kernel, and its \nassumed variance determines the smoothness of the resulting estimate. Refer to Silverman \n(1986) for a thorough review and discussion."}},{"Name":"HADOOP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC HADOOP ; \n HDFS ; \n MAPREDUCE ; \n PIG ; \n PROPERTIES ;\n\nThe HADOOP procedure enables SAS to interact with Hadoop data by running Apache Hadoop code. \nApache Hadoop is an open-source framework, written in Java, that provides distributed data \nstorage and processing of large amounts of data."}},{"Name":"ISHIKAWA","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ISHIKAWA options ;\n \nThe Ishikawa diagram, also known as a cause-and-effect diagram or fishbone diagram, \nis one of the seven basic tools for quality improvement in Japanese industry. It is \nused to display the factors that affect a particular quality characteristic or problem. \n\nAn Ishikawa diagram is typically the result of a brainstorming session to improve a \nproduct, process, or service. The main goal is represented by a main arrow or trunk, \nand primary factors are represented as sub-arrows or branches. Secondary factors are \nthen added as stems, tertiary factors as leaves, and so on."}},{"Name":"IML","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC IML ;\n ...IML statements/functions/call-routines \n RUN;\n\nwhere n1 and n2 are specified in kilobytes. \n\nThe SYMSIZE= and WORKSIZE= options in the PROC IML statement give you control over \nthe size of memory allocated to the symbol space and the size of each extent of \nworkspace. If you do not specify these options, PROC IML uses host dependent defaults. \n \nSAS/IML software gives you access to a powerful and flexible programming language \n(Interactive Matrix Language) in a dynamic, interactive environment. The fundamental \nobject of the language is a data matrix. You can use SAS/IML software interactively \n(at the statement level) to see results immediately, or you can store statements in \na module and execute them later. The programming is dynamic because necessary \nactivities such as memory allocation and dimensioning of matrices are performed \nautomatically."}},{"Name":"JSON","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC JSON OUT=fileref | \"external-file\" ; \n EXPORT SAS-data-set <(SAS-data-set-option(s))> ; \n WRITE VALUES value(s) ; \n WRITE OPEN type; \n WRITE CLOSE;\n \nThe JSON procedure reads data from a SAS data set and writes it to an external file in JSON1 \nrepresentation. You can control the exported data with several options that remove content \nand affect the format. In addition to exporting data from a SAS data set, PROC JSON provides \nstatements that enable you to write additional data to the external file and control JSON \ncontainers."}},{"Name":"KRIGE2D","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC KRIGE2D options ; \n BY variables ; \n COORDINATES | COORD coordinate-variables ; \n GRID grid-options ; \n PREDICT | PRED | P predict-options ; \n MODEL model-options ; \n RESTORE restore-options ; \n\nPROC KRIGE2D can handle anisotropic and nested semivariogram models. Eight semivariogram \nmodels are supported: the Gaussian, exponential, spherical, power, cubic, pentaspherical, \nsine hole effect, and Mat\u00e9rn models. A single nugget effect is also supported. You can \nspecify the correlation model by naming the form and supplying the associated parameters, \nor by using the contents of an item store file that was previously created by PROC VARIOGRAM."}},{"Name":"LATTICE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC LATTICE ; \n BY variables ; \n VAR variables \n\nThe LATTICE procedure computes the analysis of variance and analysis of simple covariance \nfor data from an experiment with a lattice design. PROC LATTICE analyzes balanced square \nlattices, partially balanced square lattices, and some rectangular lattices. \n\nIn balanced square lattices, the number of treatments is equal to the square of the number \nof units per block. Incomplete blocks are grouped to form mutually orthogonal replications. \nThe number of replicates in the basic plan is always 1 plus the number of units per block."}},{"Name":"LIFEREG","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC LIFEREG ; \n BAYES ; \n BY variables ; \n CLASS variables ; \n ESTIMATE <'label'> estimate-specification <(divisor=n)>\n <, \u2026<'label'> estimate-specification <(divisor=n)>> ; \n EFFECTPLOT > ; \n INSET ; \n LSMEANS ; \n LSMESTIMATE model-effect <'label'> values <(divisor=n)>\n <, \u2026<'label'> values <(divisor=n)>> ; \n MODEL response = ; \n OUTPUT ; \n PROBPLOT ; \n SLICE model-effect ; \n STORE item-store-name ; \n TEST ; \n WEIGHT variable ; \n\nThe LIFEREG procedure fits parametric models to failure time data that can be uncensored, \nright censored, left censored, or interval censored. The models for the response variable \nconsist of a linear effect composed of the covariates and a random disturbance term. The \ndistribution of the random disturbance can be taken from a class of distributions that \nincludes the extreme value, normal, logistic, and, by using a log transformation, the \nexponential, Weibull, lognormal, log-logistic, and three-parameter gamma distributions.."}},{"Name":"LIFETEST","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC LIFETEST ; \n BY variables ; \n FREQ variable ; \n ID variables ; \n STRATA variable <(list)> <...variable <(list)>> ; \n TEST variables ; \n TIME variable <*censor(list)> ; \n\nThe LIFETEST procedure deals with lifetime or survival data analysis. \n\nA common feature of lifetime or survival data is the presence of right-censored observations \ndue either to withdrawal of experimental units or to termination of the experiment. For such \nobservations, you know only that the lifetime exceeded a given value; the exact lifetime remains\nunknown. Such data cannot be analyzed by ignoring the censored observations because, among other \nconsiderations, the longer-lived units are generally more likely to be censored. The analysis \nmethodology must correctly use the censored observations as well as the uncensored observations."}},{"Name":"LOESS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC LOESS ; \n MODEL dependents=regressors ; \n OUTPUT > <\u2026keyword <=name>> ; \n ID variables ; \n BY variables ; \n WEIGHT variable ; \n SCORE DATA=SAS-data-set ; \n\nThe LOESS procedure implements a nonparametric method for estimating regression surfaces pioneered \nby Cleveland, Devlin, and Grosse (1988), Cleveland and Grosse (1991), and Cleveland, Grosse, and \nShyu (1992)."}},{"Name":"LOGISTIC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC LOGISTIC ; \n BY variables ; \n CLASS variable <(options)> \u2026> ; \n CODE ; \n CONTRAST 'label' effect values<, effect values, \u2026> ; \n EFFECT name = effect-type ( variables ) ; \n EFFECTPLOT > ; \n ESTIMATE <'label'> estimate-specification ; \n EXACT <'label'> ; \n EXACTOPTIONS options ; \n FREQ variable ; \n ID variable ;\n LSMEANS ; \n LSMESTIMATE model-effect lsmestimate-specification ; \n MODEL variable <(variable_options)> = ; \n MODEL events/trials = ;\n NLOPTIONS options;\n ODDSRATIO <'label'> variable ; \n OUTPUT > ;\n ROC <'label'> ; \n ROCCONTRAST <'label'> ; \n SCORE ; \n SLICE model-effect ; \n STORE item-store-name ; \n STRATA effects ; \n TEST equation1 <,equation2, \u2026> ;\n UNITS > ; \n WEIGHT variable ; \n\nBinary responses (for example, success and failure), ordinal responses (for example, normal, \nmild, and severe), and nominal responses (for example, major TV networks viewed at a certain \nhour) arise in many fields of study. Logistic regression analysis is often used to investigate \nthe relationship between these discrete responses and a set of explanatory variables."}},{"Name":"MAPIMPORT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MAPIMPORT OUT= map-data-set DATAFILE= 'path-to-shapefile' ; \n EXCLUDE 'field-identifier(s)'; \n ID 'field-identifier(s)'; \n RENAME 'field-identifier-1' = variable-name-1 < ... 'field-identifier-n' = variable-name-n>; \n SELECT 'field-identifier(s)'; \n\nThe MAPIMPORT procedure enables you to import ESRI shapefiles (spatial data formats) and \nprocess the SHP files into SAS/GRAPH traditional map data sets. \n\nThe MAPIMPORT procedure does not produce any graphics output. Instead, it produces an output \nmap data set, which can be used with the GMAP procedure."}},{"Name":"MCMC","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MCMC ; \n ARRAY arrayname [ dimensions ] <$> ; \n BEGINCNST/ENDCNST ; \n BEGINNODATA/ENDNODATA ; \n BY variables ; \n MODEL variable ~distribution ; \n PARMS parameter <=> number ; \n PREDDIST <'label'> OUTPRED=SAS-data-set ; \n PRIOR/HYPERPRIOR parameter ~ distribution ; \n Programning statements ; \n RANDOM random-effects-specification ; \n UDS subroutine-name ( subroutine-argument-list) ; \n\nThe MCMC procedure is a general purpose Markov chain Monte Carlo (MCMC) simulation procedure \nthat is designed to fit Bayesian models. Bayesian statistics is different from traditional \nstatistical methods such as frequentist or classical methods."}},{"Name":"MDS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MDS ; \n VAR variables ; \n INVAR variables ; \n ID | OBJECT variable ; \n MATRIX | SUBJECT variable ; \n WEIGHT variables ; \n BY variables ; \n\nMultidimensional scaling (MDS) refers to a class of methods. These methods estimate coordinates \nfor a set of objects in a space of specified dimensionality. The input data are measurements of \ndistances between pairs of objects."}},{"Name":"MEANS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MEANS ;\n BY variable-1 <... variable-n>; \n CLASS variable(s) ; \n FREQ variable; \n ID variable(s); \n OUTPUT \n \n ; \n TYPES request(s); \n VAR variable(s) < / WEIGHT=weight-variable>; \n WAYS list; \n WEIGHT variable;\n \nThe MEANS procedure provides data summarization tools to compute descriptive statistics for \nvariables across all observations and within groups of observations. For example, PROC MEANS \n\n o calculates descriptive statistics based on moments \n o estimates quantiles, which includes the median \n o calculates confidence limits for the mean \n o identifies extreme values \n o performs a t test."}},{"Name":"METADATA","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC METADATA \n IN = \"XML-formatted-method-call\" | fileref \n
; \n\nThe METADATA procedure sends an XML string to the SAS Metadata Server."}},{"Name":"MI","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MI ; \n BY variables ; \n CLASS variables ; \n EM ; \n FCS ; \n FREQ variable ; \n MCMC ; \n MNAR options ;\n MONOTONE ; \n TRANSFORM transform ( variables ) <...transform ( variables ) > ; \n VAR variables ;\n \nThe MI procedure performs multiple imputation of missing data. Missing values are an issue in a \nsubstantial number of statistical analyses. Most SAS statistical procedures exclude observations \nwith any missing variable values from the analysis."}},{"Name":"MIANALYZE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MIANALYZE ; \n BY variables ; \n CLASS variables ; \n MODELEFFECTS effects ; \n TEST <, ..., <> > ; \n STDERR variables ; \n\nThe MIANALYZE procedure combines the results of the analyses of imputations and generates valid \nstatistical inferences. Multiple imputation provides a useful strategy for analyzing data sets \nwith missing values."}},{"Name":"MIGRATE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MIGRATE IN=libref-2 OUT=libref-1 \n ;\n \nThe MIGRATE procedure migrates members in a SAS library to the current SAS version. \n\nThe procedure migrates a library from most SAS 6, SAS 7, SAS 8, and SAS 9 operating \nenvironments to the current release of SAS. The migration must occur within the same \nengine family; for example, V6, V7, or V8 can migrate to V9, but V6TAPE must migrate \nto V9TAPE. \n\nThe procedure migrates the following library members:\n\ndata sets with alternate collating sequence, audit trails, compression, created and \nmodified datetimes, deleted observations, encryption, generations, indexes, integrity \nconstraints, and passwords\n\nin many cases, views, catalogs, item stores, and MDDBs (see What Are the Specific \nConsiderations for Each Member Type?)"}},{"Name":"MIXED","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MIXED ; \n BY variables ; \n CLASS variables ; \n CODE ;\n ID variables ; \n MODEL dependent = ; \n RANDOM random-effects ; \n REPEATED ; \n PARMS (value-list) ... ; \n PRIOR < / options> ; \n CONTRAST 'label' \n <| random-effect values ...>, ... ; \n ESTIMATE 'label' \n <| random-effect values ...> ; \n LSMEANS fixed-effects ; \n LSMESTIMATE model-effect lsmestimate-specification < / options> ; \n SLICE model-effect ; \n STORE item-store-name ; \n WEIGHT variable ;\n\nThe MIXED procedure fits a variety of mixed linear models to data and enables you to \nuse these fitted models to make statistical inferences about the data. A mixed linear \nmodel is a generalization of the standard linear model used in the GLM procedure, the \ngeneralization being that the data are permitted to exhibit correlation and nonconstant \nvariability. The mixed linear model, therefore, provides you with the flexibility of \nmodeling not only the means of your data (as in the standard linear model) but their \nvariances and covariances as well."}},{"Name":"MODEL","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC MODEL options ; \n programming Statements... \n PROC-MODEL-specific statements...\n ...\n\nThe MODEL procedure analyzes models in which the relationships among the variables comprise \na system of one or more nonlinear equations. Primary uses of the MODEL procedure are estimation, \nsimulation, and forecasting of nonlinear simultaneous equation models."}},{"Name":"MODECLUS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MODECLUS ; \n BY variables ; \n FREQ variable ; \n ID variable ; \n VAR variables ; \n\nThe MODECLUS procedure clusters observations in a SAS data set by using any of several algorithms \nbased on nonparametric density estimates."}},{"Name":"MULTTEST","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC MULTTEST ; \n BY variables ; \n CLASS variable ; \n CONTRAST 'label' values ; \n FREQ variable ; \n ID variables ;\n STRATA variable ; \n TEST name (variables ) ; \n\nThe MULTTEST procedure addresses the multiple testing problem. This problem arises when you perform \nmany hypothesis tests on the same data set. Carrying out multiple tests is often reasonable because \nof the cost of obtaining data, the discovery of new aspects of the data, and the many alternative \nstatistical methods."}},{"Name":"NESTED","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC NESTED ; \n CLASS variables ; \n VAR variables ; \n BY variables ; \n\nThe NESTED procedure performs random-effects analysis of variance for data from an \nexperiment with a nested (hierarchical) structure. \n\nNote that PROC NESTED is appropriate for models with only classification effects; \nit does not handle models that contain continuous covariates. For random effects \nmodels with covariates, use either the GLM or MIXED procedure."}},{"Name":"NLIN","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC NLIN ; \n BOUNDS inequality <, ..., inequality> ; \n BY variables ; \n CONTROL variable <=values> <...variable <=values>> ; \n DER. parameter=expression ; \n DER. parameter.parameter=expression ; \n ID variables ; \n MODEL dependent=expression ; \n OUTPUT OUT=SAS-data-set keyword=names <...keyword=names> ; \n PARAMETERS <,..., parameter-specification> \n < / PDATA=SAS-data-set> ; \n PROFILE parameter < . . . parameter > < / options > ;\n RETAIN variable <=values> <...variable <=values>> ; \n Programming Statements ; \n\nThe NLIN procedure fits nonlinear regression models and estimates the parameters \nby nonlinear least squares or weighted nonlinear least squares. You specify the \nmodel with programming statements. This gives you great flexibility in modeling \nthe relationship between the response variable and independent (regressor) variables. \nIt does, however, require additional coding compared to model specifications in \nlinear modeling procedures such as the REG, GLM, and MIXED procedures."}},{"Name":"NLMIXED","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC NLMIXED ; \n ARRAY array specification ; \n BOUNDS boundary constraints ; \n BY variables ; \n CONTRAST 'label' expression <,expression> ; \n ESTIMATE 'label' expression ; \n ID names ; \n MODEL model specification ; \n PARMS parameters and starting values ; \n PREDICT expression OUT=SAS-data-set ; \n RANDOM random effects specification ; \n REPLICATE variable ; \n Program statements ; \n\nThe NLMIXED procedure fits nonlinear mixed models\u2014-that is, models in which both fixed and \nrandom effects enter nonlinearly. These models have a wide variety of applications, two of \nthe most common being pharmacokinetics and overdispersed binomial data. PROC NLMIXED enables \nyou to specify a conditional distribution for your data (given the random effects) having \neither a standard form (normal, binomial, Poisson) or a general distribution that you code \nusing SAS programming statements."}},{"Name":"NPAR1WAY","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PROC NPAR1WAY ; \n BY variables ; \n CLASS variable ; \n EXACT statistic-options ; \n FREQ variable ; \n OUTPUT < OUT=SAS-data-set > < output-options > ; \n STRATA variables < options > ; \n VAR variables ; \n\nPROC NPAR1WAY performs tests for location and scale differences based on the following \nscores of a response variable: Wilcoxon, median, Van der Waerden (normal), Savage, \nSiegel-Tukey, Ansari-Bradley, Klotz, Mood, and Conover. Additionally, PROC NPAR1WAY \nprovides tests that use the raw input data as scores. When the data are classified \ninto two samples, tests are based on simple linear rank statistics. When the data are \nclassified into more than two samples, tests are based on one-way ANOVA statistics. \nBoth asymptotic and exact p-values are available for these tests. PROC NPAR1WAY also \nprovides Hodges-Lehmann estimation, including exact confidence limits for the location \nshift."}},{"Name":"OPERATE","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC OPERATE ;\n Library Management Commands \n Server Management Commands \n User Management Commands \n\nYou can use the OPERATE procedure in any SAS method of processing\n(noninteractive mode, interactive-line mode, batch mode, or windowing\nenvironment) to manage a server, the server libraries, and the server users."}},{"Name":"OPTGRAPH","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC OPTGRAPH options ; \n DATA_ADJ_MATRIX_VAR column1 <,column2,...> ; \n DATA_LINKS_VAR < options > ; \n DATA_MATRIX_VAR column1 <,column2,...> ; \n DATA_NODES_VAR < options > ; \n BICONCOMP < options > ; \n CENTRALITY < options > ; \n CLIQUE < options > ; \n COMMUNITY < options > ; \n CONCOMP < options > ; \n CORE < options > ; \n CYCLE < options > ; \n EIGENVECTOR < options > ; \n LINEAR_ASSIGNMENT < options > ; \n MINCUT < options > ; \n MINSPANTREE < options > ; \n NETFLOW_MINCOST < options > ; \n REACH < options > ; \n SHORTPATH < options > ; \n SUMMARY < options > ; \n TRANSITIVE_CLOSURE < options > ; \n TSP < option > ; \n PERFORMANCE < options > ; \n\nThe OPTGRAPH procedure can be used to analyze relationships between entities. These relationships \nare typically defined by using a graph. A graph, G = (N,A), is defined over a set N of nodes and \na set A of arcs. A node is an abstract representation of some entity (or object), and an arc defines \nsome relationship (or connection) between two nodes. The terms node and vertex are often interchanged \nwhen describing an entity. The term arc is often interchanged with the term edge or link when describing \na connection."}},{"Name":"OPTIONS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC OPTIONS ;\n \nThe OPTIONS procedure lists the current settings of SAS system options in the SAS log. \n\nSAS system options control how SAS formats output, handles files, processes data sets, \n'interacts with the operating environment, and does other tasks that are not specific \nto a single SAS program or data set. You can change the settings of SAS system options \nby using one of the following methods:\n\n o the SAS command \n o the option in a configuration or autoexec file \n o the SAS OPTIONS statement \n o the OPTLOAD and OPTSAVE procedures \n o the SAS System Options window \n o the DMOPTSAVE and DMOPTLOAD commands \n o in other ways, depending on your operating environment."}},{"Name":"OPTLOAD","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC OPTLOAD ;\n \nThe OPTLOAD procedure reads SAS system option settings that are stored in the SAS \nregistry or a SAS data set and puts them into effect. \n\nYou can load SAS system option settings from a SAS data set or registry key by using \none of these methods:\n\n o the DMOPTLOAD command from a command line in the SAS windowing environment. \n For example, DMOPTLOAD key= \"core\\options\".\n\n o the PROC OPTLOAD statement"}},{"Name":"OPTSAVE","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC OPTSAVE ;\n \nPROC OPTSAVE saves the current SAS system option settings in the SAS registry or in a \nSAS data set. \n\nSAS system options can be saved across SAS sessions. You can save the settings of the \nSAS system options in a SAS data set or registry key by using one of these methods:\n\n o the DMOPTSAVE command from a command line in the SAS windowing environment. Use the \n command like this: DMOPTSAVE .\n\n o the PROC OPTSAVE statement."}},{"Name":"ORTHOREG","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC ORTHOREG ; \n CLASS variables ; \n MODEL dependent-variable=independent-effects ; \n BY variables ; \n EFFECT name = effect-type ( variables ) ; \n EFFECTPLOT > ; \n ESTIMATE <'label'> estimate-specification < / options> ; \n LSMEANS ; \n LSMESTIMATE model-effect lsmestimate-specification < / options> ; \n SLICE model-effect ; \n STORE item-store-name ; \n TEST ; \n WEIGHT variable ; \n\nThe ORTHOREG procedure fits general linear models by the method of least squares. Other \nSAS/STAT software procedures, such as GLM and REG, fit the same types of models, but PROC \nORTHOREG can produce more accurate estimates than other regression procedures when your data \nare ill conditioned. Instead of collecting crossproducts, PROC ORTHOREG uses Gentleman-Givens \ntransformations to update and compute the upper triangular matrix R of the QR decomposition of \nthe data matrix, with special care for scaling (Gentleman; 1972, 1973). This method has the \nadvantage over other orthogonalization methods (for example, Householder transformations) of \nnot requiring the data matrix to be stored in memory."}},{"Name":"PHREG","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PHREG ; \n ASSESS keyword ; \n BASELINE ; \n BAYES ; \n BY variables ; \n CLASS variable <(options)> <...variable <(options)> > ; \n CONTRAST <'label'> effect values <,..., effect values> ; \n FREQ variable ; \n EFFECT name = effect-type ( variables ) ; \n ESTIMATE <'label'> estimate-specification ; \n HAZARDRATIO <'label'> variable ; \n ID variables ; \n LSMEANS ; \n LSMESTIMATE model-effect lsmestimate-specification ; \n MODEL response <*censor(list)> = ; \n OUTPUT ; \n programming statements ; \n \n RANDOM variable ;\n SLICE model-effect ; \n STORE item-store-name ; \n STRATA variable <(list)> <...variable <(list)>> < / option> ; \n TEST equation <,..., equation >< / options> ; \n WEIGHT variable ; \n\nThe analysis of survival data requires special techniques because the data are almost always \nincomplete and familiar parametric assumptions might be unjustifiable. Investigators follow \nsubjects until they reach a prespecified endpoint (for example, death). However, subjects \nsometimes withdraw from a study, or the study is completed before the endpoint is reached. \nIn these cases, the survival times (also known as failure times) are censored; subjects \nsurvived to a certain time beyond which their status is unknown. The uncensored survival \ntimes are sometimes referred to as event times. Methods of survival analysis must account \nfor both censored and uncensored data."}},{"Name":"PLAN","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC PLAN ; \n FACTORS factor-selections ; \n OUTPUT OUT=SAS-data-set ; \n TREATMENTS factor-selections ;\n\nThe PLAN procedure constructs designs and randomizes plans for factorial experiments, \nespecially nested and crossed experiments and randomized block designs."}},{"Name":"PLOT","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC PLOT ;\n BY variable-1 <... variable-n> ; \n PLOT plot-request(s) ; \n \nThe PLOT procedure plots the values of two variables for each observation in an input \nSAS data set. The coordinates of each point on the plot correspond to the two variables' \nvalues in one or more observations of the input data set."}},{"Name":"PLS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PLS ; \n BY variables ; \n CLASS variables ; \n EFFECT name = effect-type ( variables ) ; \n ID variables ; \n MODEL dependent-variables = effects ; \n OUTPUT OUT=SAS-data-set ;\n\nThe PLS procedure fits models by using any one of a number of linear predictive \nmethods, including partial least squares (PLS). Ordinary least squares regression, \nas implemented in SAS/STAT procedures such as PROC GLM and PROC REG, has the single \ngoal of minimizing sample response prediction error, seeking linear functions of the \npredictors that explain as much variation in each response as possible. The techniques \nimplemented in the PLS procedure have the additional goal of accounting for variation \nin the predictors, under the assumption that directions in the predictor space that are \nwell sampled should provide better prediction for new observations when the predictors \nare highly correlated. All of the techniques implemented in the PLS procedure work by \nextracting successive linear combinations of the predictors, called factors (also called \ncomponents, latent vectors, or latent variables), which optimally address one or both \nof these two goals\u2014explaining response variation and explaining predictor variation. \nIn particular, the method of partial least squares balances the two objectives, seeking \nfactors that explain both response and predictor variation."}},{"Name":"PLM","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PLM SOURCE=item-store-specification ; \n EFFECTPLOT > ; \n ESTIMATE <'label'> estimate-specification <(divisor=n)>\n <, ...<'label'> estimate-specification <(divisor=n)>> ; \n FILTER expression ; \n LSMEANS ; \n LSMESTIMATE model-effect <'label'> values \n <, ...<'label'> values > ; \n SCORE DATA=SAS-data-set \n >...> ; \n SHOW options ; \n SLICE model-effect ; \n TEST ; \n WHERE expression ; \n\n(New in SAS/STAT 9.22!)\n\nThe PLM procedure performs postfitting statistical analyses for the contents of a SAS item \nstore that was previously created with the STORE statement in some other SAS/STAT procedure. \nAn item store is a special SAS-defined binary file format used to store and restore information \nwith a hierarchical structure."}},{"Name":"PMENU","Type":"SAS_PROCEDURE","Attributes":"InteractivePROC","Help":{"#cdata":"Syntax: PROC PMENU catalog> ; \n MENU menu-bar; ITEM command ; \n ITEM 'menu-item' ; \n DIALOG dialog-box 'command-string field-number-specification'; \n CHECKBOX #line @column 'text-for-selection' ; \n RADIOBOX DEFAULT=button-number; RBUTTON #line @column 'text-for-selection' \n ; \n TEXT #line @column field-description ; \n MENU pull-down-menu; \n SELECTION selection 'command-string'; \n SEPARATOR; \n SUBMENU submenu-name SAS-file; \n \n The PMENU procedure defines menus that can be used in DATA step windows, macro windows, \n both SAS/AF and SAS/FSP windows, or in any SAS application that enables you to specify \n customized menus."}},{"Name":"PRINCOMP","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PRINCOMP ; \n BY variables ; \n FREQ variable ; \n ID variables ; \n PARTIAL variables ; \n VAR variables ; \n WEIGHT variable ; \n\nThe PRINCOMP procedure performs principal component analysis. As input you can use raw data, \na correlation matrix, a covariance matrix, or a sum-of-squares-and-crossproducts (SSCP) matrix. \nYou can create output data sets containing eigenvalues, eigenvectors, and standardized or \nunstandardized principal component scores."}},{"Name":"PRINQUAL","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PRINQUAL ; \n TRANSFORM transform(variables )\n ) ...> ; \n ID variables ; \n FREQ variable ; \n WEIGHT variable ; \n BY variables ; \n\nThe PRINQUAL procedure performs principal component analysis (PCA) of qualitative, quantitative, \nor mixed data."}},{"Name":"PRINT","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC PRINT ; \n BY variable-1 <... variable-n>; \n PAGEBY BY-variable; \n SUMBY BY-variable; \n\n ID variable(s) ;\n KEYLEGEND <\"name\u20131\" ...\"name-n\"> ;\n OPENSTREETMAP;\n SCATTER X=variable Y=variable ;\n SERIES X=variable Y=variable ;\n TEXT X=variable Y=variable TEXT=variable ;\n\nStarting with SAS 9.4M6, Base SAS offers an enhanced SGMAP mapping procedure. The SGMAP procedure \nadds the GRADLEGEND and SERIES statements, and numerous options. The CHOROMAP statement is at production \nlevel. The SGMAP procedure can now render maps with unprojected longitude and latitude coordinates. \nIt can also render maps whose data is prepared by any number of Base SAS mapping procedures such as \nGPROJECT. Prior to SAS 9.4M6, GRPROJECT and other mapping data preparation procedures were provided \nwith SAS/GRAPH, and required a SAS/GRAPH installation to run them. Starting with SAS 9.4M6, the GINSIDE, \nGPROJECT, GREDUCE, and GREMOVE procedures that prepare data for mapping moved from SAS/GRAPH to Base SAS. \nAfter your map data sets are obtained and prepared, use the SGMAP procedure to create maps and then overlay \nplots such as bubble, scatter, series, or text plots. With the enhanced SGMAP procedure, automatic legends \nare now generated, and the option that disables them is provided. Continuous or discrete legends are now \npossible, as well as legend customization, grouping capability, and the ability to customize polygon borders \nand series plot lines."}},{"Name":"DATAMETRICS","Type":"SAS_PROCEDURE","Help":{"#cdata":"Syntax: PROC DATAMETRICS DATA=input-data-set-name OUT=output-data-set\n \n \n ;\n IDENTITIES ;\n ;\n \nPROC DATAMETRICS implements data profile capabilities that help you recognize patterns, \nidentify sparsity in the data, generate frequency distributions, and calculate basic statistics. \nData profiling analysis can be applied to any data set that is accessible to SAS. The following \nanalysis capabilities are included:\n\n o standard profile metrics\n o frequency distribution per column, limiting results to top n, bottom n\n o row and columns counts\n o pattern analysis\n o identification analysis"}}],"#comment":[{},{},{},{},{},{},{},{},{},{},{},{},{}]}} ================================================ FILE: server/data/SQLKeywords.json ================================================ {"Keywords":{"Keyword":[{"Name":"SELECT","Help":{"#cdata":"Syntax: SELECT object-item <, ...object-item> > \n FROM from-list \n \n > \n \n >; \n \nSelects columns and rows of data from tables and views."},"Type":"SQL_KEYWORD"},{"Name":"DISTINCT","Help":{"#cdata":"Eliminates duplicate rows."},"Type":"SQL_KEYWORD"},{"Name":"INTO","Help":{"#cdata":"Stores the value of one or more columns for use later in another PROC SQL query \nor SAS statement."},"Type":"SQL_KEYWORD"},{"Name":"FROM","Help":{"#cdata":"Specifies source tables or views."},"Type":"SQL_KEYWORD"},{"Name":"WHERE","Help":{"#cdata":"Subsets the output based on specified conditions."},"Type":"SQL_KEYWORD"},{"Name":"GROUP","Help":{"#cdata":"[Syntax: GROUP BY group-by-item <, ..., group-by-item] \n \nSpecifies how to group the data for summarizing."},"Type":"SQL_KEYWORD"},{"Name":"HAVING","Help":{"#cdata":"[HAVING sql-expression] \n \nSubsets grouped data based on specified conditions."},"Type":"SQL_KEYWORD"},{"Name":"ORDER","Help":{"#cdata":"[ORDER BY order-by-item <, ... order-by-item >;]\n \nSpecifies the order in which rows are displayed in a result table."},"Type":"SQL_KEYWORD"},{"Name":"LEFT","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee LEFT OUTER JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"RIGHT","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee RIGHT OUTER JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"BETWEEN","Help":{"#cdata":"[SQL expression operator] \n \nSelects rows where column values are within a range of values. \n\nSyntax:\nsql-expression BETWEEN sql-expression AND sql-expression"},"Type":"SQL_KEYWORD"},{"Name":"AND","Help":{"#cdata":"[SQL expression operator] \n \nIndicates logical AND."},"Type":"SQL_KEYWORD"},{"Name":"OR","Help":{"#cdata":"[SQL expression operator] \n \nIndicates logical OR."},"Type":"SQL_KEYWORD"},{"Name":"NOT","Help":{"#cdata":"[SQL expression operator] \n \nIndicates logical NOT."},"Type":"SQL_KEYWORD"},{"Name":"CONTAINS","Help":{"#cdata":"[SQL expression operator] \n \nTests whether a string is part of a column's value."},"Type":"SQL_KEYWORD"},{"Name":"EXISTS","Help":{"#cdata":"[SQL expression operator] \n \nSyntax: EXISTS (query-expression) \n \nTests if a subquery returns one or more rows. "},"Type":"SQL_KEYWORD"},{"Name":"LIKE","Help":{"#cdata":"[SQL expression operator] \n \nTests for a matching pattern. \n\nSyntax: \nsql-expression LIKE sql-expression "},"Type":"SQL_KEYWORD"},{"Name":"ASC","Help":{"#cdata":"Orders the data in ascending order."},"Type":"SQL_KEYWORD"},{"Name":"DESC","Help":{"#cdata":"Orders the data in descending order."},"Type":"SQL_KEYWORD"},{"Name":"INNER","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee LEFT INNER JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"OUTER","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee LEFT OUTER JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"FULL","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee FULL JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"CROSS","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee CROSS JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"UNION","Help":{"#cdata":"[SQL expression keyword] \n \nUsed in connection with JOIN expressions.\n\nExample:\nSELECT * FROM employee UNION JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"},{"Name":"INTERSECT","Help":{"#cdata":"[SQL set operator keyword] \n \nProduces rows that are common to both query results."},"Type":"SQL_KEYWORD"},{"Name":"CORRESPONDING","Help":{"#cdata":"[SQL set operator keyword] \n \nCauses PROC SQL to match the columns in table-expressions by name and not by \nordinal position."},"Type":"SQL_KEYWORD"},{"Name":"EXCEPT","Help":{"#cdata":"[SQL set operator keyword] \n \nProduces rows that are part of the first query only."},"Type":"SQL_KEYWORD"},{"Name":"ALL","Help":{"#cdata":"[SQL set operator keyword] \n \nThe set operators automatically eliminate duplicate rows from their output tables. \nThe optional ALL keyword preserves the duplicate rows, reduces the execution by one \nstep, and thereby improves the query-expression's performance."},"Type":"SQL_KEYWORD"},{"Name":"CASE","Help":{"#cdata":"Selects result values that satisfy specified conditions. \n \nSyntax:\n CASE \n WHEN when-condition THEN result-expression \n <...WHEN when-condition THEN result-expression> \n \n END"},"Type":"SQL_KEYWORD"},{"Name":"WHEN","Help":{"#cdata":"[Used in a CASE expression] \n \nSyntax:\n CASE \n WHEN when-condition THEN result-expression \n <...WHEN when-condition THEN result-expression> \n \n END"},"Type":"SQL_KEYWORD"},{"Name":"THEN","Help":{"#cdata":"[Used in a CASE expression] \n \nSyntax:\n CASE \n WHEN when-condition THEN result-expression \n <...WHEN when-condition THEN result-expression> \n \n END"},"Type":"SQL_KEYWORD"},{"Name":"ELSE","Help":{"#cdata":"[Used in a CASE expression] \n \nSyntax:\n CASE \n WHEN when-condition THEN result-expression \n <...WHEN when-condition THEN result-expression> \n \n END"},"Type":"SQL_KEYWORD"},{"Name":"END","Help":{"#cdata":"[Used in a CASE expression] \n \nSyntax:\n CASE \n WHEN when-condition THEN result-expression \n <...WHEN when-condition THEN result-expression> \n \n END"},"Type":"SQL_KEYWORD"},{"Name":"UNIQUE","Help":{"#cdata":"Specifies that the values of the column must be unique. This constraint is identical \nto DISTINCT."},"Type":"SQL_KEYWORD"},{"Name":"PRIMARY","Help":{"#cdata":"PRIMARY KEY\n \nSpecifies that the column is a primary key column, that is, a column that does \nnot contain missing values and whose values are unique."},"Type":"SQL_KEYWORD"},{"Name":"KEY","Help":{"#cdata":"PRIMARY KEY\n \nSpecifies that the column is a primary key column, that is, a column that does \nnot contain missing values and whose values are unique."},"Type":"SQL_KEYWORD"},{"Name":"REFERENCES","Help":{"#cdata":"Syntax: REFERENCES table-name \n \nSpecifies that the column is a foreign key, that is, a column whose values are linked \nto the values of the primary key variable in another table (the table-name that is \nspecified for REFERENCES)."},"Type":"SQL_KEYWORD"},{"Name":"FOREIGN","Help":{"#cdata":"\n \n\n Removes the foreign key constraint that is referenced by constraint-name. "},"Type":"SQL_KEYWORD"},{"Name":"AS","Help":{"#cdata":"[Syntax: ...AS query-expression ...] \n \nSQL keyword"},"Type":"SQL_KEYWORD"},{"Name":"IN","Help":{"#cdata":"[Syntax: SELECT column_name(s)\nFROM table_name\nWHERE column_name IN (value1,value2,...); \n\nThe IN operator allows you to specify multiple values in a WHERE clause."},"Type":"SQL_KEYWORD"},{"Name":"JOIN","Help":{"#cdata":"Combines records from two or more tables.\n \nExample:\nSELECT * FROM employee LEFT OUTER JOIN department \n ON employee.DepartmentID = department.DepartmentID;"},"Type":"SQL_KEYWORD"}],"#comment":{}}} ================================================ FILE: server/data/Statements/ABORT.json ================================================ {"Keywords":{"Keyword":[{"Name":"ABEND","Type":"S","Help":{"#cdata":"Causes abnormal termination of the current SAS job or session. Results depend on \nthe method of operation: \n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log that states that execution was terminated by \n the ABEND option of the ABORT statement\n o does not execute any subsequent statements or check syntax\n o returns control to the operating environment; further action is based on how your \n operating environment and your site treat jobs that end abnormally.\n\no windowing environment and interactive line mode \n\n o causes your windowing environment and interactive line mode to stop processing \n immediately and return you to your operating environment."}},{"Name":"CANCEL","Type":"S","Help":{"#cdata":"Causes the execution of the submitted statements to be canceled. Results depend \non the method of operation: \n\no batch mode and noninteractive mode\n\n o the entire SAS program and SAS system are terminated\n o an error message is written to the SAS log\n\no windowing environment and interactive line mode \n\n o clears only the current submitted program\n o other subsequent submitted programs are not affected\n o an error message is written to the SAS log\n\no workspace server and stored process server \n\n o clears only the currently submitted program\n o other subsequent submit calls are not affected\n o an error message is written to the SAS log\n\no SAS IntrNet application server \n\n o creates a separate execution for each request and submits the request code. \n A CANCEL argument in the request code clears the current submitted code but \n does not terminate the execution or the SAS session."}},{"Name":"CANCEL FILE","Type":"S","Help":{"#cdata":"Causes only the contents of the autoexec file or %INCLUDE file to be cleared by \nthe ABORT statement. Other submitted source statements will be executed after \nthe autoexec or %INCLUDE file."}},{"Name":"RETURN","Type":"S","Help":{"#cdata":"Causes the immediate normal termination of the current SAS job or session. Results \ndepend on the method of operation:\n\no batch mode and noninteractive mode \n\n o stops processing immediately\n o sends an error message to the SAS log stating that execution was terminated by the \n RETURN option in the ABORT statement\n o does not execute any subsequent statements or check syntax\n o returns control to your operating environment with a condition code indicating an error \n\no windowing environment \n\n o causes your windowing environment and interactive line mode to stop processing immediately\n and return you to your operating environment."}},{"Name":"n","Type":"S","Help":{"#cdata":"Is an integer value that enables you to specify a condition code: \n \n o when used with the CANCEL argument, the value is placed in the SYSINFO automatic macro variable \n o when not used with the CANCEL argument, the error code that is returned by SAS is ERROR. The value \n of ERROR depends on the operating system. The condition code n is returned to the operating system \n as the final SAS system exit code."}},{"Name":"NOLIST","Type":"S","Help":{"#cdata":"Suppresses the output of all variables to the SAS log. \n \nRequirement: NOLIST must be the last option in the ABORT statement."}}]}} ================================================ FILE: server/data/Statements/ARRAY.json ================================================ {"Keywords":{"Keyword":[{"Name":"_NUMERIC_","Type":"S","Help":{"#cdata":"Specifies all numeric variables."}},{"Name":"_CHARACTER_","Type":"S","Help":{"#cdata":"Specifies all character variables."}},{"Name":"_ALL_","Type":"V","Help":{"#cdata":"Specifies all variables."}},{"Name":"_TEMPORARY_","Type":"S","Help":{"#cdata":"Creates a list of temporary data elements."}}]}} ================================================ FILE: server/data/Statements/ATTRIB.json ================================================ {"Keywords":{"Keyword":[{"Name":"FORMAT=","Type":"V","Help":{"#cdata":"[Syntax: FORMAT=format] \n \nAssociates a format with variables in variable-list."}},{"Name":"INFORMAT=","Type":"V","Help":{"#cdata":"[Syntax: INFORMAT=informat] \n \nAssociates an informat with variables in variable-list."}},{"Name":"LABEL=","Type":"V","Help":{"#cdata":"[Syntax: LABEL='label'] \n \nAssociates a label with variables in variable-list."}},{"Name":"LENGTH=","Type":"V","Help":{"#cdata":"[Syntax: LENGTH=<$>length] \n \nSpecifies the length of variables in variable-list."}},{"Name":"TRANSCODE=","Type":"V","Values":{"@Value1":"YES","@Value2":"NO"},"ToolTips":{"@ToolTip1":"Specifies that character variables can be transcoded.","@ToolTip2":"Specifies that character variables are not transcoded."},"Help":{"#cdata":"Specifies whether character variables can be transcoded."}}]}} ================================================ FILE: server/data/Statements/AXIS.json ================================================ {"Keywords":{"Keyword":[{"Name":"COLOR=","Type":"C","Help":{"#cdata":"[Syntax: COLOR=axis-color] \n \nSpecifies the color for all axis components (the axis line, all tick marks, and all text) unless \nyou include a more explicit AXIS statement color specification."}},{"Name":"CTEXT=","Type":"C","Help":{"#cdata":"[Syntax: CTEXT=color] \n \nSpecifies the color for all axis text (AXIS label and major tick mark value descriptions)."}},{"Name":"CAXIS=","Type":"C","Help":{"#cdata":"[Syntax: CAXIS=color] \n \nSpecifies the color for axis line and major and minor tick marks."}},{"Name":"INTERVAL=","Type":"V","Values":{"@Value1":"EVEN","@Value2":"UNEVEN","@Value3":"PARTIAL"},"ToolTips":{"@ToolTip1":"Specifying the option INTERVAL=EVEN and LOGBASE=10 permits only base10 values to be specified for the ORDER option.","@ToolTip2":"Specifying the option INTERVAL=UNEVEN and LOGBASE=10, permits non-base10 values to be specified for the ORDER option, while retaining a logarithmic scale for the axis.","@ToolTip3":"Alias for UNEVEN. They have the same effect."},"Help":{"#cdata":"The INTERVAL option affects the LOGBASE option in the AXIS statement."}},{"Name":"LABEL=","Type":"V","Help":{"#cdata":"[Syntax: LABEL=(text-argument(s)) | NONE] \n \nModifies an axis label. Text-argument(s) defines the appearance or the text of an \naxis label, or both. NONE suppresses the axis label. Text-argument(s) can be one \nor more of these: \n\n\"text-string\" \nprovides up to 256 characters of label text. By default, the text of the axis label \nis either the variable name or a previously assigned variable label. Enclose each \nstring in quotes. Separate multiple strings with blanks.\n\ntext-description-suboption \nmodifies a characteristic such as the font, color, or size of the text string(s) \nthat follows it. Text-description-suboption can be:\n\n ANGLE=degrees \n \n COLOR=text-color \n \n FONT=font | NONE \n \n HEIGHT=text-height \n \n JUSTIFY=LEFT | CENTER | RIGHT\n \n ROTATE=degrees"},"SubOptionsKeywords":"NONE|ANGLE=|COLOR=|HEIGHT=|JUSTIFY=|ROTATE="},{"Name":"LABEL=NONE","Type":"V","Help":{"#cdata":"Suppresses the axis label."}},{"Name":"LENGTH=","Type":"V","Help":{"#cdata":"[Syntax: LENGTH=axis length ] \n \nSpecifies the length of the axis in number of units. If you request a length that \ncannot fit the display, a warning message is written to the log and your graph may \nproduce unexpected results."}},{"Name":"LOGBASE=","Type":"V","Values":{"@Value1":"","@Value2":"E","@Value3":"PI"},"ToolTips":{"@ToolTip1":"Base must be greater than 1.","@ToolTip2":"Logbase=e (Logbase=2.718281828)","@ToolTip3":"Logbase=\u03c0 (Logbase=3.141592653)"},"Help":{"#cdata":"Scales the axis values logarithmically according to the value specified. Base must \nbe greater than 1. The number of minor tick marks is a function of the logbase, \nand is calculated as the logbase minus 2."}},{"Name":"LOGSTYLE=","Type":"V","Values":{"@Value1":"EXPAND","@Value2":"POWER"},"ToolTips":{"@ToolTip1":"Specifies that the values displayed are the values of the base raised to successive powers and that the minor tick marks are logarithmically placed.","@ToolTip2":"Specifies that the values displayed are the powers to which the base is raised (for example, 1, 2, 3, 4, 5, and so on)."},"Help":{"#cdata":"Specifies whether the values displayed on the logarithmic axis are the values of the \nbase or the values of the power. LOGSTYLE= is meaningful only when you use LOGBASE=."}},{"Name":"MAJOR=NONE","Type":"V","Help":{"#cdata":"Suppresses all major tick marks, although the values represented by those tick marks \nare still displayed."}},{"Name":"MAJOR=","Type":"V","Help":{"#cdata":"[Syntax: MAJOR=(tick-mark-suboption(s) ) | NONE] \n \nModifies the major tick marks. Tick-mark-suboption(s) defines the color, size, and \nnumber of the major tick marks."},"SubOptionsKeywords":"COLOR=|HEIGHT=|NUMBER=|WIDTH="},{"Name":"MINOR=","Type":"V","Help":{"#cdata":"[Syntax: MINOR=(tick-mark-suboption(s) ) | NONE] \n \nModifies the minor tick marks that appear between major tick marks. Tick-mark-suboption(s) \ndefines the color, number, or size of the minor tick marks."},"SubOptionsKeywords":"COLOR=|HEIGHT=|NUMBER=|WIDTH="},{"Name":"MINOR=NONE","Type":"V","Help":{"#cdata":"Suppresses all minor tick marks."}},{"Name":"NOBRACKETS","Type":"S","Help":{"#cdata":"Suppresses the printing of group brackets drawn around the values on the group axis \nin a bar chart. NOBRACKETS applies only to the group axis of bar charts."}},{"Name":"NOPLANE","Type":"S","Help":{"#cdata":"Removes either the horizontal or vertical three-dimensional axis plane in bar charts \nproduced by the HBAR3D and VBAR3D statements. NOPLANE affects only the axis to which \nthe AXIS statement applies."}},{"Name":"OFFSET=","Type":"V","Help":{"#cdata":"[Syntax: OFFSET=(<,n2>) | (><,n2>)] \n \nSpecifies the distance from the first and last major tick marks or bars to the ends \nof the axis line.\n\nThe value of (n1) is the distance from the beginning (origin) of the axis line to the \nfirst tick mark or middle of the first bar. The value of (n2) is the distance from the \nend of the axis line to the last tick mark or middle of the last bar."}},{"Name":"ORDER=","Type":"V","Help":{"#cdata":"[Syntax: ORDER=(value-list)] \n \nSpecifies the order in which data values appear on the axis. The values specified by \nthe ORDER= option are the major tick mark values. You can modify the appearance of \nthese values with the VALUE= option."}},{"Name":"ORIGIN=","Type":"V","Help":{"#cdata":"[Syntax: ORIGIN=(<,y>) | (><,y>)] \n \nSpecifies the x coordinate and the y coordinate of the origin of the axis. The origin \nof the horizontal axis is the left end of the axis, and the origin of the vertical axis \nis the bottom of the axis. The ORIGIN= option explicitly positions the axis anywhere on \nthe graphics output area."}},{"Name":"REFLABEL=","Type":"V","Help":{"#cdata":"[Syntax: REFLABEL=(text-argument(s)) | NONE] \n \nCreates and defines the appearance of a reference-line label. Text-argument(s) \ndefines the appearance or the text of the label, or both."}},{"Name":"REFLABEL=NONE","Type":"V","Help":{"#cdata":"Suppresses the reference-line label."}},{"Name":"STAGGER","Type":"S","Help":{"#cdata":"Offsets the axis values on a horizontal axis. This option is useful when values \noverlap on an axis. When specifying the Java and ActiveX devices, the STAGGER \noption must sometimes be used in conjunction with the ORDER statement."}},{"Name":"SPLIT=","Type":"V","Help":{"#cdata":"[Syntax: SPLIT=\"split-char\"] \n \nSpecifies the split character that the AXIS statement uses to break axis values \ninto multiple lines. Split-char can be any character value that can be specified \nin a SAS character variable. The split character must be embedded in the variable \nvalues in the data set or in an associated format."}},{"Name":"STYLE=","Type":"V","Help":{"#cdata":"[Syntax: STYLE=line-type] \n \nSpecifies a line type for the axis line. Valid values for line-type are 0 through 46.\nIf you specify STYLE=0, the axis line is not drawn. The default is 1, a solid line."}},{"Name":"VALUE=","Type":"V","Help":{"#cdata":"[Syntax: VALUE=(text-argument(s) ) | NONE] \n \nModifies the major tick mark values. That is, this option modifies the text that \nlabels the major tick marks on the axis. Text-argument(s) defines the appearance \nor the text of a major tick mark value, or both."}},{"Name":"VALUE=NONE","Type":"V","Help":{"#cdata":"Suppresses the major tick mark values, although the major tick marks are still displayed."}},{"Name":"WIDTH=","Type":"V","Help":{"#cdata":"[Syntax: WIDTH=thickness-factor] \n \nSpecifies the thickness of the axis line. Thickness increases directly with the value \nof thickness-factor. By default, WIDTH=1."}}]}} ================================================ FILE: server/data/Statements/CAS.json ================================================ {"Keywords":{"#comment":[{},{},{},{},{},{},{}],"Keyword":[{"Name":"AUTHDOMAIN=","Type":"V","Help":{"#cdata":"Syntax: AUTHDOMAIN=authentication-domain | \"authentication-domain\"\n \nSpecifies the name of an authentication domain object registered on the SAS Metadata Server \nthat associates user credentials with an identity."}},{"Name":"AUTHINFO=","Type":"V","Help":{"#cdata":"Syntax: AUTHINFO=authentication-info-file\n \nSpecifies an authinfo or netrc file that includes authentication information.\n\nDefault: File $HOME/.authinfo on Linux hosts. \nNote: An authinfo file is required only when running batch jobs."}},{"Name":"DISCONNECT","Type":"S","Help":{"#cdata":"Disconnects SAS from the session.\n\nNote: The session name is preserved for use with the RECONNECT option. \n\nTip: The TIMEOUT= value determines the lifetime of a disconnected session. The session time-out starts \nwhen the number of connections becomes zero and no actions are executing. After the time-out value expires, \nthe session is terminated."}},{"Name":"HOST=","Type":"V","Help":{"#cdata":"Syntax: HOST=\"host-name\"\n \nSpecifies the machine for the control node of the server. \n\nDefault: Macro variable _CASHOST_, if set. Otherwise, SAS system option CASHOST. \n\nInteraction: This option overrides macro variable _CASHOST_ and SAS system option CASHOST."}},{"Name":"PORT=","Type":"V","Help":{"#cdata":"Syntax: PORT=number\n \nSpecifies the port on which the control node of the SAS Cloud Analytic Services server listens \nfor client connections. \n\nDefault: Macro variable _CASPORT_, if set. Otherwise, SAS system option CASPORT. \n\nRange: 1-65535 \n\nInteraction: This option overrides macro variable _CASPORT_ and SAS system option CASPORT."}},{"Name":"RECONNECT","Type":"S","Help":{"#cdata":"Reconnects to a session using a session name.\n \nTip:\nIf the session is not known to SAS, connect using the session UUID. Do not specify the RECONNECT keyword \nin that case. See UUID=\"session-uuid\"."}},{"Name":"TERMINATE|CLEAR","Type":"S","Help":{"#cdata":"Syntax: TERMINATE|CLEAR\n \nTerminates the SAS Cloud Analytic Services session.\n\nNote When you terminate the last session that was created, SAS system option CASNAME (alias SESSREF) \n and macro variable _SESSREF_ are not updated. They continue to reference the terminated session until \n a new session is created or they are manually set. See CASNAME= System Option. \n\nTip: Use _ALL_ instead of session-name to terminate all of the sessions in your SAS client."}},{"Name":"USER=|CASUSER=","Type":"V","Help":{"#cdata":"Syntax: USER=user-ID | CASUSER=user-ID\n\nSpecifies the user ID to use for connecting to the SAS Cloud Analytic Services server.\n\nDefault: SAS system option CASUSER=, if set. \n\nRequirement: User-ID must match a user ID in your authinfo file. \n\nInteraction: This option overrides SAS system option CASUSER=.\n\nNote:\nWhen you use SAS Studio, the user credentials that you used to sign on are used to authenticate \nyour connection to CAS. The USER= option is not needed in that case. The USER= option or SAS \nsystem option CASUSER= is used when submitting code to CAS from the command line, in batch mode."}},{"Name":"UUID=","Type":"V","Help":{"#cdata":"Syntax: UUID=\"session-uuid\"\n \nSpecifies the UUID of an existing session to which you want to connect.\n\nRequirements: session-uuid must be 36 characters in length and must be enclosed in quotation marks. \n You must also specify the HOST= and PORT= options to connect to a session. \n \nTip: You can view the UUID for a session with the LIST command option."}},{"Name":"UUIDMAC=","Type":"V","Help":{"#cdata":"Syntax: UUIDMAC=macro-variable-name\n \nSpecifies a SAS macro variable name into which the UUID of the session is stored.\n\nTip: The UUIDMAC= option is useful if you want subsequent SAS steps to connect to the session by specifying the UUID."}},{"Name":"LIST","Type":"S","Help":{"#cdata":"Writes to the SAS log information about a session in your SAS client. The information includes the session \nname, the session state, the host and port of the SAS Cloud Analytic Services server to which it is \nconnected, and the session UUID.\n\nNote: The server is not accessed for the information. \nTips: Use _ALL_ instead of session-name to list information about all of the sessions in your SAS client. \n\n To list information about all of the sessions in all of your SAS clients, use LISTSESSIONS."}},{"Name":"LISTHISTORY","Type":"S","Help":{"#cdata":"Syntax: LISTHISTORY \n \nPrints to the SAS log the action history for the current session.\n\nhistory_count\n specifies the number of the most recent actions that are to be listed. \nRange: 0\u20131999999999\nNote: 0 is equivalent to _ALL_\n\n_ALL_\n lists all of the actions that have been executed in the current session. \n \nDefault:\nLists the last 10 actions that were executed in the current session. "},"SubOptionsKeywords":"_ALL_"},{"Name":"LISTSESSIONS","Type":"S","Help":{"#cdata":"Writes to the SAS log information about all of the current user's sessions that are known to the SAS Cloud Analytic \nServices server. The information includes the session name, the session UUID, the session state, \nthe method that was used for user authentication, and the user ID.\n\nRequirement: A connection to a session is required to use the LISTSESSIONS option. \n\nExample: Use session Casauto to list all of your sessions.\n\n cas casauto listsessions;\n\n For each session that is found, a note containing information about that session is written to \n the SAS log."}},{"Name":"LISTSESSOPTS","Type":"S","Help":{"#cdata":"Lists the session options. \n \nExample: List the session option settings for session Casauto:\n\n cas casauto LISTSESSOPTS;"}},{"Name":"SESSOPTS=","Type":"V","Help":{"#cdata":"Syntax: SESSOPTS=(session-option(s)) \n\nSpecifies one or more session options as option=value pairs separated by a space and enclosed in \nparentheses. You can specify the following session options:\n\n APPTAG= specifies the string to prefix to log messages.\n AUTOCORRECT= automatically corrects misspelled procedure names and keywords, and global statement names.\n CASLIB= specifies the caslib name to set as the active caslib.\n COMPOPT= specifies the type of code generation optimizations to use in the SAS language compiler.\n COLLATE= specifies the collating sequence for sorting.\n DATASTEPFMTERR= specifies how the DATA step reacts when SAS cannot find a specified variable format.\n DATASTEPMSGSUMLEVEL= specifies the DATA step message summary level.\n DATASTEPREPLACETABLE= specifies whether a DATA step can replace an existing table. \n DATASTMTCHK= specifies which SAS statement keywords are prohibited from being specified as a one-level \n DATA step name to protect against overwriting an input data set. \n DKRICOND= specifies the error level to report when a variable is missing from an input data set during \n the processing of a DROP=, KEEP=, or RENAME= data set option.\n DKROCOND= specifies the error level to report when a variable is missing from an output data set during \n the processing of a DROP=, KEEP=, or RENAME= data set option. \n DQLOCALE specifies the default 5-letter SAS Quality Knowledge Base (QKB) ISO locale code to use as the \n default locale for data quality (DQ) operations. \n DQSETUPLOC specifies the name of the default SAS Quality Knowledge Base (QKB) to use for data quality operations.\n ERRORS= specifies the maximum number of observations for which SAS issues complete error messages. \n EVENTDS specifies one or more data sets that define events.\n FMTCASLIB specifies the caslib where persisted format libraries are retained. \n INVALIDDATA= specifies the value that SAS assigns to a variable when invalid numeric data is encountered.\n INTERVALDS specifies one or more interval-name=value pairs, where the value is the name of a data set that \n contains user-defined intervals.\n LOCALE= specifies the locale to use for sorting and formatting.\n LOGFLUSHTIME= specifies the log flush time, in milliseconds. \n MAXTABLEMEM= specifies the maximum amount of physical memory, in bytes, to allocate for a table.\n MESSAGELEVEL= specifies the log message level.\n METRICS= specifies whether to include detailed performance metrics reports in the SAS log. \n NWORKERS= specifies the number of worker nodes for a new session.\n TIMEOUT= specifies the SAS Cloud Analytic Services session time-out in seconds for a new or existing session.\n TIMEZONE= specifies the time zone offset, in hours, from UTC."},"SubOptionsKeywords":"\n |APPTAG=|AUTOCORRECT=|CASLIB=|COLLATE=|DATASTEPREPLACETABLE=|DATASTMTCHK=|DKRICOND=|DKROCOND=|ERRORS=|FMTCASLIB|\n |INVALIDDATA=|LOCALE=|LOGFLUSHTIME=|MAXTABLEMEM=|MESSAGELEVEL=|METRICS=|NWORKERS=|TIMEOUT=|TIMEZONE=|VARINITCHK=|\n |DATASTEPMSGSUMLEVEL=|DATASTEPFMTERR=|DQLOCALE|DQSETUPLOC|EVENTDS|INTERVALDS|\n "},{"Name":"ADDFMTLIB","Type":"S","Help":{"#cdata":"Syntax: ADDFMTLIB FMTLIBNAME=format-library-name TABLE=table-name \n \nSyntax: ADDFMTLIB FMTLIBNAME=format-library-name PATH=path \n \n \nAdds a session format library. By default, the format library is appended to the format library search list.\n \nExample: cas mysess ADDFMTLIB fmtlibname=myfmtlib caslib=name table=name ; \n\n o FMTLIBNAME= specifies the name of the format library to save. This option is required. \n o CASLIB= specifies the name of the caslib where the table is saved. \n o TABLE= specifies the name of the table where the format library is saved. \n o POSITION=APPEND | INSERT | REPLACE | NONE\n specifies the position of this format library in the format-library search list.\n o PATH= specifies the name of the file where the format information is saved. \n o PROMOTE promotes the format library to global scope so that it is available to all sessions.\n o REPLACEFMTLIB replaces the format library if it already exists."}},{"Name":"DROPFMTLIB","Type":"S","Help":{"#cdata":"Syntax: DROPFMTLIB FMTLIBNAME=format-library-name \n \nDrops a session-local or a global format library. \n\nFMTLIBNAME=format-library-name\n specifies the name of the format library to drop. This option is required. \n\nFMTSEARCHREMOVE\n removes the format library from the format search order. \n\nTip: If a session-local and a global format library exist, the local format library is dropped first. \nTo drop the global format library in that case, execute the drop command again. "}},{"Name":"FMTSEARCH=","Type":"V","Help":{"#cdata":"Syntax: FMTSEARCH=(name1 ) \n\nModifies the format library search order for the session.\n\n(name1 ) \n specifies a list of one or more format-library names enclosed in parentheses. Each name is separated by a space. \n\nPOSITION=APPEND | INSERT | REPLACE\n specifies the position of the format libraries in the format-library search list. \n\n APPEND appends the format libraries to the end of the format-library search list. \n INSERT inserts the format libraries at the beginning of the format-library search list. \n REPLACE replaces the current format-library search list with the specified format libraries. \n\n Default: APPEND"}},{"Name":"FMTSEARCH CLEAR","Type":"S","Help":{"#cdata":"Clears the format library search list for the session.\n \nExample: Clear the format search list for session Casauto:\n\n cas casauto fmtsearch clear;"}},{"Name":"LISTFMTRANGES","Type":"S","Help":{"#cdata":"Syntax: LISTFMTRANGES FMTNAME=format-name\n\nLists the ranges and labels for a format.\n\n FMTNAME=format-name\n specifies the name of the format to list. This option is required. The format libraries are searched \n in the format-library search order. The ranges are listed for the first instance of format-name that \n is found. \n\n Example: List the ranges in format MYFORMAT:\n \n cas casauto listfmtranges fmtname=myformat;"}},{"Name":"LISTFMTSEARCH","Type":"S","Help":{"#cdata":"Displays the format library search list for the session.\n\nExample: List the format library search order for session Casauto:\n\n cas casauto listfmtsearch;"}},{"Name":"LISTFORMATS","Type":"S","Help":{"#cdata":"Syntax: LISTFORMATS \n\nLists the user-defined format libraries that are known to SAS.\n\n FMTLIBNAME=format-library-name\n specifies the name of the format library. If FMTLIBNAME= is not specified, all of the format libraries \n that are known to SAS are listed. \n\n SCOPE=BOTH | SESSION | GLOBAL\n specifies the scope.\n\n BOTH lists both SESSION and GLOBAL format libraries that are known to SAS. \n SESSION lists the format libraries that are known to SAS. \n GLOBAL lists the format libraries that are known globally to all SAS sessions. \n\n Default: SESSION \n \n MEMBERS\n lists the names of the members in each format library. \n\n Example: List the global and session-local formats and their members for session Casauto:\n \n cas casauto listformats scope=both members;"}},{"Name":"LOADFORMATS","Type":"S","Help":{"#cdata":"Syntax: LOADFORMATS \n\nLoads user-defined formats from a format item store that was created with the FMTC2ITM procedure.\n\n FMTLIBNAME=format-library-name\n specifies the name of the format library that is being added to the session.\n PATH=\"path-to-item-store-file\" \n specifies the name of the file where the item store is saved. \n PROMOTE\n promotes the format library to global scope.\n REPLACE \n if format-library-name already exists in the active session, replaces it with the new format-library-name.\n FMTSEARCH=APPEND | INSERT | REPLACE | NONE\n specifies how the new format library impacts the format library search order. "}},{"Name":"PROMOTEFMTLIB","Type":"S","Help":{"#cdata":"Syntax: PROMOTEFMTLIB FMTLIBNAME=format-library-name \n\nPromotes a session-local format library to a global format library.\n\n FMTLIBNAME=format-library-name\n specifies the name of the format library. This option is required. \n\n REPLACE \n replaces the format library if it is already promoted. \n\nExample: Promote session-local format library MYFMTLIB in session Casauto:\n\n cas casauto promote fmtlibname=myfmtlib;"}},{"Name":"SAVEFMTLIB","Type":"S","Help":{"#cdata":"Syntax: SAVEFMTLIB FMTLIBNAME=format-library-name << > | > \n\nSaves a session format library to a CAS table or to a file. \n\n FMTLIBNAME=format-library-name\n specifies the name of the format library to save. This option is required. \n TABLE=table-name\n specifies the name of the table in which the format library is saved. \n Note: Do not specify this option with PATH=. \n CASLIB=caslib\n specifies the caslib in which the table is stored. \n Note:This option is ignored when PATH= is specified. \n REPLACE\n replaces the table if it already exists. \n Note: This option is ignored when PATH= is specified. \n PATH=path\n specifies the name of the file to which the format library is to be saved.\n PROMOTE\n promotes the format library to global scope so that it is available to all sessions."}},{"Name":"CASSERVERMD=","Type":"V","Help":{"#cdata":"Syntax: CASSERVERMD=server-name | \"server-name\" \n \nSpecifies the name of a server object registered on the SAS Metadata Server that associates \nSAS Cloud Analytic Services connection parameters with a server name.\n\nValid in SAS 9.4M5 and in later releases.\n\nRequirements:\nThe metadata system options must specify the connection parameters for the metadata server \n on which server-name is registered, and the metadata server must be running. \nThe server-name registration on the SAS Metadata Server must define the CAS server port,\n host name, and authentication domain. \n\nInteraction:\nCAS statement options HOST=, PORT=, and USER=, and system options CASHOST=, CASPORT=, \nand CASUSER= are ignored when this option is specified. "}},{"Name":"LISTABOUT","Type":"S","Help":{"#cdata":"Writes information about SAS Cloud Analytic Services to the SAS log."}},{"Name":"LISTSERVERSTARTOPTS|LISTSSO","Type":"S","Help":{"#cdata":"Syntax: LISTSERVERSTARTOPTS | LISTSSO\n \nLists the SAS Cloud Analytic Services server options and their current values. For each option, a note containing information about the option is written to the SAS log. The information includes the option name, option value type, current option value, value range (when applicable), and value source, as shown in the following example.\n\n NOTE: Name = errors\n Type = INT RANGE\n Value = 20\n Minimum = 0\n Maximum = 2147483647\n Source = default\n\nRestriction You must have administration privileges to use this option."}},{"Name":"POSITION=","Type":"V","Values":{"@Value1":"APPEND","@Value2":"INSERT","@Value3":"REPLACE","@Value4":"NONE"},"ToolTips":{"@ToolTip1":"Appends this format library to the end of the format-library search list.","@ToolTip2":"Inserts this format library at the beginning of the format-library search list.","@ToolTip3":"Replaces the current format-library search list with this format library.","@ToolTip4":"Does not add this format library to the format-library search list."},"Help":{"#cdata":"[Sub-option for ADDFMTLIB, FMTSEARCH= options] \n \nSpecifies how the format library search result for the session is presented."}},{"Name":"FMTLIBNAME=","Type":"V","Help":{"#cdata":"[Sub-option for ADDFMTLIB, DROPFMTLIB, LISTFORMATS, PROMOTEFMTLIB, SAVEFMTLIB options]\n \nName of format library to drop, list, promote, or save."}},{"Name":"FMTSEARCHREMOVE","Type":"S","Help":{"#cdata":"[Sub-option for DROPFMTLIB option]\n \nRemoves the format library from the format search."}},{"Name":"SCOPE=","Type":"V","Values":{"@Value1":"SESSION","@Value2":"GLOBAL","@Value3":"BOTH"},"ToolTips":{"@ToolTip1":"Lists the format libraries that are known to SAS.","@ToolTip2":"Lists the format libraries that are known globally to all SAS sessions.","@ToolTip3":"Lists both SESSION and GLOBAL format libraries that are known to SAS."},"Help":{"#cdata":"[Sub-option for LISTFORMATS option]\n \nSpecifies the scope.\n\n BOTH lists both SESSION and GLOBAL format libraries that are known to SAS. \n SESSION lists the format libraries that are known to SAS. \n GLOBAL lists the format libraries that are known globally to all SAS sessions. \n\nDefault: SESSION"}},{"Name":"MEMBERS","Type":"S","Help":{"#cdata":"[Sub-option for LISTFORMATS option]\n \nLists the names of the members in each format library."}},{"Name":"REPLACE","Type":"S","Help":{"#cdata":"[Sub-option for PROMOTEFMTLIB and SAVEFMTLIB options]\n \nIf the format library is already promoted, replace."}},{"Name":"CASLIB=","Type":"V","Help":{"#cdata":"Syntax: CASLIB=caslib\n \n[Sub-option for ADDFMTLIB, SAVEFMTLIB options]\n \nName of the CAS library where a table is saved."}},{"Name":"TABLE=","Type":"V","Help":{"#cdata":"Syntax: TABLE=table-name\n \n[Sub-option for ADDFMTLIB, SAVEFMTLIB options]\n \nSpecifies the name of the table where the format library is saved. \n\nNote: Do not specify this option with PATH=."}},{"Name":"PATH=","Type":"V","Help":{"#cdata":"[Sub-option for ADDFMTLIB option]\n \nName of xml file where format information is saved."}},{"Name":"PROMOTE","Type":"S","Help":{"#cdata":"[Sub-option for ADDFMTLIB and SAVEFMT options] \n \nPromotes the format library to global scope so that it is available to all sessions."}},{"Name":"REPLACEFMTLIB","Type":"S","Help":{"#cdata":"[Sub-option for ADDFMTLIB option] \n \nIf the format library already exists, replace it."}},{"Name":"FMTNAME=","Type":"V","Help":{"#cdata":"[Sub-option for LISTFMTRANGES option]\n \nName of the format."}},{"Name":"_ALL_","Type":"S","Help":{"#cdata":"[Valid only with the LIST, LISTHISTORY, TERMINATE, or CLEAR options]\n \nSpecifies that the LIST, LISTHISTORY, TERMINATE or CLEAR argument applies to all sessions in the SAS client."}}]}} ================================================ FILE: server/data/Statements/CASLIB.json ================================================ {"Keywords":{"Keyword":[{"Name":"DATASOURCE=","Type":"RV","Help":{"#cdata":"Syntax: DATASOURCE= (SRCTYPE=\"type\", , ) \n\nSpecifies data source options to use when connecting to a data source. The SRCTYPE=\"type\" option specifies \nthe data source type. Data sources can be either databases or path-based. The data-source-options syntax \ndepends on the data source. \n\n ENCRYPTIONPASSWORD=\"string\" \n specifies a password for encrypting or decrypting stored data. \n\n Restriction: The ENCRYPTIONPASSWORD= option can be specified only with the DATASOURCE= option. \n\n SRCTYPE= PATH | DNFS | HDFS"},"SubOptionsKeywords":"ENCRYPTIONPASSWORD=|SRCTYPE="},{"Name":"ASSIGN","Type":"S","Help":{"#cdata":"Used with the _ALL_ option to create SAS librefs for existing caslibs so that they are visible in the \nSAS Studio Libraries tree. \n\nRequirement: The ASSIGN option must be used with the _ALL_ option."}},{"Name":"_ALL_","Type":"S","Help":{"#cdata":"[Valid only with the ASSIGN, DROP or LIST options]\n \nSpecifies that the ASSIGN, or LIST argument applies to all currently added caslibs."}},{"Name":"CREATEDIRECTORY|CREATEDIR","Type":"S","Help":{"#cdata":"Creates a subdirectory in the caslib's data source. The path, up to the last directory, must already exist. \n \nRestriction:\nDirectory creation is available only for global caslibs.\n\nExample:\nThe following CASLIB statement creates a new directory named Programs in the /examples/caslibs/ directory:\n\n caslib TestDir path=\"/examples/caslibs/programs\" \n datasource=(srctype=\"path\") createdir global;"}},{"Name":"DESCRIPTION=|DESC=","Type":"V","Help":{"#cdata":"Syntax: DESCRIPTION=\"description\" | DESC=\"description\" \n \nSpecifies a description of the data source."}},{"Name":"GLOBAL","Type":"S","Help":{"#cdata":"Adds the caslib so that it has global scope. A global-scope caslib can have access controls set so \nthat it is accessible from all sessions and can be a way to share data. Other connections to the \nserver that get their own sessions have access to the caslib, subject to access controls. If you \ndo not specify GLOBAL, the caslib is created with session scope. You must also grant access to the \ncaslib in the CAS Server Monitor."}},{"Name":"LIBREF=","Type":"V","Help":{"#cdata":"Creates a libref and associates it with a caslib. The libref can then be used to access data in \nSAS Cloud Analytic Services. \n\nExample:\nThe following CASLIB statement creates the caslib Casdata and binds it to the libref Mycas.\n\n caslib casdata path='/cas/mycasdata/' libref=mycas;"}},{"Name":"LIST","Type":"S","Help":{"#cdata":"Displays caslib names and their specifications. To display all caslibs, specify _ALL_ for the caslib-reference-name. \n \nTip:\nSpecify caslib-reference-name to list the settings for a single caslib. Specify _ALL_ to list all caslibs \nand their caslib settings. The specifications displayed by the LIST _ALL_ option are a subset. For full \nspecification information, use the LIST option with a specific caslib specified."}},{"Name":"NOTACTIVE","Type":"S","Help":{"#cdata":"Specifies that the caslib being added does not become the active caslib for the session. "}},{"Name":"PATH=","Type":"V","Help":{"#cdata":"Syntax: PATH=\"directory-path\"\n \nSpecifies the fully qualified path to a directory to use as a data source. \n\nExample The following CASLIB statement adds a caslib that accesses a path-based directory:\n\n caslib mylib path=\"/local/data\" description=\"Local data\";"}},{"Name":"SESSION|LOCAL","Type":"S","Help":{"#cdata":"Syntax: SESSION | LOCAL\n \nAdds the caslib so that it is session-scope. Other connections to the server that get their own \nsessions do not have access to the caslib. The lifetime of the caslib is the lifetime of the session. \nWhen you add caslibs, SESSION is the default."}},{"Name":"SESSREF=","Type":"V","Help":{"#cdata":"Syntax: SESSREF=session-reference\n \nSpecifies the name of the session to associate the caslib with. By default, the most recently started \nsession is used."}},{"Name":"SUBDIRS","Type":"S","Help":{"#cdata":"Specifies that subdirectories of the specified PATH= directory can be accessed with the caslib. \n\nTip: You do not need to use the SUBDIRS option if the full path to the subdirectory is specified."}}],"#comment":{}}} ================================================ FILE: server/data/Statements/ENDRSUBMIT.json ================================================ {"Keywords":{"Keyword":{"Name":"CANCEL","Type":"S","Help":{"#cdata":"Terminates the block of statements without executing the statements. This option \nis useful in an interactive line mode session if you see an error in a previously \nentered statement, and you want to cancel the step."}}}} ================================================ FILE: server/data/Statements/FILE.json ================================================ {"Keywords":{"Keyword":[{"Name":"LOG","Type":"S","Help":{"#cdata":"Is a reserved fileref that directs the output that is produced by any PUT statements \nto the SAS log."}},{"Name":"DISK","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies that the device is a disk drive."}},{"Name":"DUMMY","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies that the output to the file is discarded. \n\nTip: Specifying DUMMY can be useful for testing."}},{"Name":"GTERM","Type":"S","Help":{"#cdata":"[device-type] \n \nIndicates that the output device type is a graphics device that will receive \ngraphics data."}},{"Name":"PIPE","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies an unnamed pipe. Note: Some operating environments do not support pipes."}},{"Name":"PLOTTER","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies an unbuffered graphics output device."}},{"Name":"PRINTER","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies a printer or printer spool file."}},{"Name":"TAPE","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies a tape drive."}},{"Name":"TEMP","Type":"S","Help":{"#cdata":"[device-type] \n \nCreates a temporary file that exists only as long as the filename is assigned. \n \nRestriction: Do not specify a physical pathname. If you do, SAS returns an error."}},{"Name":"TERMINAL","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies the user's terminal."}},{"Name":"UPRINTER","Type":"S","Help":{"#cdata":"[device-type] \n \nSpecifies a Universal Printing printer definition name."}},{"Name":"COLUMN=|COL=","Type":"V","Help":{"#cdata":"Specifies a variable that SAS automatically sets to the current column location \nof the pointer."}},{"Name":"DELIMITER=|DLM=","Type":"V","Help":{"#cdata":"Specifies an alternate delimiter (other than a blank) to be used for LIST output."}},{"Name":"DLMSTR=","Type":"V","Help":{"#cdata":"Specifies a character string as an alternate delimiter (other than a blank) to be \nused for LIST output"}},{"Name":"DLMSOPT='T'","Type":"V","Help":{"#cdata":"Specifies a parsing option for the DLMSTR= T option that removes trailing blanks of the \nstring delimiter."},"Values":{"@Value1":"'T'"},"ToolTips":{"@ToolTip1":"Removes trailing blanks of the string delimiter."}},{"Name":"DROPOVER","Type":"S","Help":{"#cdata":"Discards data items that exceed the output line length (as specified by the LINESIZE= \nor LRECL= options in the FILE statement)."}},{"Name":"DSD","Type":"S","Help":{"#cdata":"Specifies that data values that contain embedded delimiters, such as tabs or commas, \nbe enclosed in quotation marks."}},{"Name":"ENCODING=","Type":"V","Values":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"ToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"},"Help":{"#cdata":"Specifies the encoding to use when writing to the output file."}},{"Name":"FILENAME=","Type":"V","Help":{"#cdata":"Defines a character variable, whose name you supply, that SAS sets to the value of the \nphysical name of the file currently open for PUT statement output."}},{"Name":"FILEVAR=","Type":"V","Help":{"#cdata":"Defines a variable whose change in value causes the FILE statement to close the current \noutput file and open a new one the next time the FILE statement executes."}},{"Name":"FLOWOVER","Type":"S","Help":{"#cdata":"Causes data that exceeds the current line length to be written on a new line."}},{"Name":"FOOTNOTES|FOOTNOTE","Type":"S","Help":{"#cdata":"Specifies that the currently defined footnotes are printed."}},{"Name":"NOFOOTNOTES|NOFOOTNOTES","Type":"S","Help":{"#cdata":"Specifies that the currently defined footnotes are not printed."}},{"Name":"HEADER=","Type":"V","Help":{"#cdata":"Defines a statement label that identifies a group of SAS statements that you want \nto execute each time SAS begins a new output page"}},{"Name":"LINE=","Type":"V","Help":{"#cdata":"Defines a variable whose value is the current relative line number within the group \nof lines available to the output pointer."}},{"Name":"LINESIZE=|LS=","Type":"V","Help":{"#cdata":"Sets the maximum number of columns per line for reports and the maximum record length \nfor data files."}},{"Name":"LINESLEFT=|LL=","Type":"V","Help":{"#cdata":"Defines a variable whose value is the number of lines left on the current page."}},{"Name":"LRECL=","Type":"V","Help":{"#cdata":"Specifies the logical record length of the output file."}},{"Name":"MOD","Type":"S","Help":{"#cdata":"Writes the output lines after any existing lines in the file."}},{"Name":"N=","Type":"V","Help":{"#cdata":"Specifies the number of lines that you want available to the output pointer in the \ncurrent iteration of the DATA step."},"Values":{"@Value1":"","@Value2":"PAGESIZE|PS"},"ToolTips":{"@ToolTip1":"Specifies the number of lines that are available to the output pointer. Replace n with an integer.","@ToolTip2":"Specifies that the entire page is available to the output pointer."}},{"Name":"ODS=","Type":"S|V","Help":{"#cdata":"[Syntax: ODS < = (ODS-suboptions) >] \n \nSpecifies to use the Output Delivery System to format the output from a DATA step."}},{"Name":"OLD","Type":"S","Help":{"#cdata":"Replaces the previous contents of the file."}},{"Name":"PAD","Type":"S","Help":{"#cdata":"Specifies that records written to an external file are padded with blanks to the \nlength that is specified in the LRECL= option."}},{"Name":"NOPAD","Type":"S","Help":{"#cdata":"Specifies that records written to an external file are not padded with blanks to the \nlength that is specified in the LRECL= option."}},{"Name":"PAGESIZE=|PS=","Type":"V","Help":{"#cdata":"[Syntax: PAGESIZE=value] \n \nSets the number of lines per page for your reports."}},{"Name":"PRINT","Type":"S","Help":{"#cdata":"Either a reserved fileref that directs the output that is produced by any PUT statements \nto the same file as the output that is produced by SAS procedures, or an option that \nspecifies that carriage-control characters are placed in the output lines."}},{"Name":"NOPRINT","Type":"S","Help":{"#cdata":"Specifies that carriage-control characters are placed in the output lines."}},{"Name":"STOPOVER","Type":"S","Help":{"#cdata":"Stops processing the DATA step immediately if a PUT statement attempts to write a \ndata item that exceeds the current line length."}},{"Name":"TITLES|TITLE","Type":"S","Help":{"#cdata":"Specifies that the current title lines are printed on the pages of files."}},{"Name":"NOTITLES|NOTITLE","Type":"S","Help":{"#cdata":"Specifies that the current title lines are not printed on the pages of files."}},{"Name":"_FILE_=","Type":"V","Help":{"#cdata":"[Syntax: _FILE_=variable] \n \nNames a character variable that references the current output buffer of this FILE statement."}},{"Name":"BLKSIZE=|BLK=","Type":"V","Help":{"#cdata":"[Syntax: BLKSIZE=block-size] \n \n[Windows Host Option]\n\nSpecifies the number of bytes that are physically read or written in an I/O operation. \nThe default is 8K. The maximum is 1M (Windows) or 1G-1(UNIX). \n\nIn UNIX, if you specify RECFM=S370VBS, then you should specify BLKSIZE=32760 in order \nto avoid errors with records longer than 255 characters."}},{"Name":"BLOCK","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."}},{"Name":"NOBLOCK","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."}},{"Name":"BYTE","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."}},{"Name":"MESSAGE","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."}},{"Name":"COMMAND","Type":"S","Help":{"#cdata":"[Windows Host Option]\n \nAllows remote commands to be issued to DDE server applications that not use the \nSYSTEM topic name."}},{"Name":"EOFCONNECT","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes and is valid only when you are defining \nthe server. This option indicates that if an end-of-file (EOF) character is \nreceived from a client, the server should try to connect to the next client."}},{"Name":"HOTLINK","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to use the DDE HOTLINK."}},{"Name":"NOTAB","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nInstructs SAS to ignore tab characters between variables."}},{"Name":"IGNOREDOSEOF","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nIs used in the context of I/O operations on variable record format files. When this \noption is specified, any occurrence of ^Z is interpreted as character data and \nnot as an end-of-file marker."}},{"Name":"RECFM=","Type":"V","Values":{"@Value1":"F","@Value2":"P","@Value3":"S","@Value4":"V|D","@Value5":"N","@Value6":"s370V","@Value7":"S370VB","@Value8":"S370VBS","@Value9":"STREAMLF","@Value10":"FB","@Value11":"VB","@Value12":"U"},"ToolTips":{"@ToolTip1":"Fixed-record format","@ToolTip2":"Print format.","@ToolTip3":"Stream-record format.","@ToolTip4":"Variable-record format (the default)","@ToolTip5":"Indicates binary format and causes the file to be treated as a byte stream. If LRECL is not specified, by default SAS reads 256 bytes at a time from the file.","@ToolTip6":"Indicates the variable S370 record format (V).","@ToolTip7":"Indicates the variable block S370 record format (VB).","@ToolTip8":"Indicates the variable block with spanned records S370 record format (VBS).","@ToolTip9":"[For OpenVMS] Specifies StreamLF record format. Records are delimited by LF.","@ToolTip10":"Specifies fixed-length records, blocked.","@ToolTip11":"Specifies variable-length records, blocked.","@ToolTip12":"Specifies undefined-length records, unblocked."},"Help":{"#cdata":"[Windows Host Option] \n \nSpecifies the record format of the external file."}},{"Name":"RETRY=","Type":"V","Help":{"#cdata":"[Syntax: RETRY=seconds] \n \n[Windows Host Option]\n\nIs used only in the context of named pipes. This option specifies how long a named \npipe client should wait for a busy pipe. The minimum (and default) value for seconds \nis 10."}},{"Name":"SERVER","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."}},{"Name":"CLIENT","Type":"S","Help":{"#cdata":"[Windows Host Option] \n \nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."}},{"Name":"TERMSTR=","Type":"V","Values":{"@Value1":"CRLF","@Value2":"LF","@Value3":"NL"},"ToolTips":{"@ToolTip1":"Carriage return line feed. Use TERMSTR=CRLF to write Windows formatted files. CRLF is the default.","@ToolTip2":"Line feed. Use TERMSTR=LF to write UNIX formatted files.","@ToolTip3":"New line. Use TERMSTR=NL to write UNIX formatted files."},"Help":{"#cdata":"[Windows Host Option] \n \nSpecifies the end-of-line character for the file. Use this option to share files \nbetween the UNIX and Windows operating environments."}},{"Name":"ALQ=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks initially allocated to an external file when it is created. \nThe value can range from 0 to 2,147,483,647. If the value is 0 (the default), the minimum \nnumber of blocks required for the given file format is used.\n\nThe ALQ= option (allocation quantity) is used for output and corresponds to the FAB$L_ALQ \nfield in OpenVMS Record Management Services (RMS)."}},{"Name":"CC=","Type":"V","Values":{"@Value1":"FORTRAN","@Value2":"PRINT","@Value3":"CR"},"ToolTips":{"@ToolTip1":"Indicates FORTRAN carriage-control format. This is the default for print files.","@ToolTip2":"Indicates OpenVMS print format.","@ToolTip3":"Indicates OpenVMS carriage-return, carriage-control format. This is the default for nonprinting files."},"Help":{"#cdata":"[OpenVMS Host Option] \n \nSpecifies the carriage-control format of the SAS log and the procedure output file."}},{"Name":"DEQ=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks added when OpenVMS RMS automatically extends an external \nfile during a write operation. The value can range from 0 to 65,535. The default value \nis 0, telling OpenVMS RMS to use the process's default value. A large value results in \nfewer file extensions over the life of the file; a small value results in numerous file \nextensions over the life of the file. A file with numerous file extensions might be \nnoncontiguous, thereby slowing record access.\n\nThe DEQ= option (default file extension quantity) is used for output and corresponds to \nthe FAB$W_DEQ field in OpenVMS RMS."}},{"Name":"FAC=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file access attributes used for external files. Use this option \nto indicate the level of access you want to allow for an external file. You can allow \nREAD, WRITE, UPDATE, and DELETE access (as well as no access). By default with external \nfiles, files opened for input allow read access, files opened for output allow WRITE \naccess, and files opened for update allow READ and WRITE access. The form of the FAC= \noption is \n\n FAC=access-option-list\n \nwhere access-option-list can be one of the following: \n\n DEL specifies DELETE access.\n \n GET specifies READ access.\n \n PUT specifies WRITE access.\n \n UPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want DELETE, READ, and WRITE access: \n\n fac=(del,get,put)\n "}},{"Name":"GSFCC=","Type":"V","Values":{"@Value1":"PRINT","@Value2":"CR","@Value3":"NONE"},"ToolTips":{"@ToolTip1":"Creates a GSF file. It is a VFC format file with carriage control set to null. These files can be used with most utilities with the exception of some file transfer protocols, such as Kermit. This is the default value for this option.","@ToolTip2":"Creates a carriage return carriage control file.","@ToolTip3":"Creates a file with no carriage control. This format is useful if you plan to download the file to a personal computer."},"Help":{"#cdata":"[OpenVMS Host Option] \n \nSpecifies the file format of graphic stream files (GSF files). When specified in \nthe FILENAME statement, it affects only the GSF files that are created using that \nfileref."}},{"Name":"KEY=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies which key SAS uses to read the records in an RMS file with indexed organization. \nThe KEY= option is always used with the KEYVALUE= option. "}},{"Name":"KEYVALUE=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the key value with which to begin reading an indexed file. "}},{"Name":"MBC=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the size of the I/O buffers that OpenVMS RMS allocates for a particular file. \nThe value can range from 0 to 127 and represents the number of blocks used for each buffer. \nBy default, this option is set to 0 and the default values for the process are used.\n\nThe MBC= option (multiblock count) is used for both input and output to control the \nallocation for a particular file. If you want to control the allocation size for all \nthe external files used during the current SAS session, you can use the MBC= option in \nevery FILE, FILENAME, or INFILE statement. You can also use the DCL SET RMS_DEFAULT \ncommand to specify a process default, and let the SAS values default to the process's \ndefault values.\n\nThe MBC= option corresponds to the RAB$B_MBC field in OpenVMS RMS or the CONNECT \nMULTIBLOCK_COUNT attribute when using FDL. This option is not supported for DECnet \noperations."}},{"Name":"MBF=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of I/O buffers you want OpenVMS RMS to allocate for a particular file. \nThe value can range from 0 to 127 and represents the number of buffers used. By default, \nthis option is set to a value of 2. If a value of 0 is specified, the default value for the \nprocess is used.\n\nThe MBF= option (multibuffer count) is used for both input and output to control the number \nof buffers allocated for a particular file. If you want to control the number of buffers \nallocated for all the external files used during the SAS session, you can use the MBF= \noption in every FILE, FILENAME, or INFILE statement. The DCL SET RMS_DEFAULT command can \nbe used to specify a process default. Then, you can let the SAS values default to the \nprocess's default values.\n\nThe MBF= option corresponds to the RAB$B_MBF field in OpenVMS RMS or the CONNECT MULTIBUFFER_COUNT \nattribute when using FDL. This option is not supported for DECnet operations."}},{"Name":"SHR=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file-sharing attributes used for external files. With this option, \nyou can indicate the access level you want to give other users. You can allow READ, WRITE, \nUPDATE, and DELETE access (as well as no access). By default with external files, files \nopened for input allow shared read access, and files opened for output or UPDATE do not \nallow shared access.\n\nHowever, you can allow other users to have READ and WRITE access to a file that you are \nopening for input only. To accomplish this, use the SHR= option. The syntax of the SHR= \noption is \n\n SHR=share-option-list\n\nwhere share-option-list can be one of the following: DEL specifies DELETE access.\n \n GET specifies shared READ access.\n \n NONE specifies no shared access.\n \n PUT specifies shared WRITE access.\n \n UPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want shared DELETE, READ, and WRITE access: \n\n shr=(del,get,put)"}}],"#comment":[{},{}]}} ================================================ FILE: server/data/Statements/FILENAME.json ================================================ {"Keywords":{"Keyword":[{"Name":"CLEAR","Type":"S","Help":{"#cdata":"Disassociates one or more currently assigned filerefs."}},{"Name":"_ALL_","Type":"S","Help":{"#cdata":"Specifies that the CLEAR or LIST argument applies to all currently assigned filerefs."}},{"Name":"LIST","Type":"S","Help":{"#cdata":"Writes the attributes of one or more files to the SAS log, or issues the LIST \ncommand to the FTP server."}},{"Name":"DISK","Type":"S","Help":{"#cdata":"Specifies that the device is a disk drive."}},{"Name":"DUMMY","Type":"S","Help":{"#cdata":"Specifies that the output to the file is discarded."}},{"Name":"GTERM","Type":"S","Help":{"#cdata":"Indicates that the output device type is a graphics device that will receive \ngraphics data."}},{"Name":"PIPE","Type":"S","Help":{"#cdata":"Specifies an unnamed pipe."}},{"Name":"PLOTTER","Type":"S","Help":{"#cdata":"Specifies an unbuffered graphics output device."}},{"Name":"PRINTER","Type":"S","Help":{"#cdata":"Specifies a printer or printer spool file."}},{"Name":"TAPE","Type":"S","Help":{"#cdata":"Specifies a tape drive."}},{"Name":"TEMP","Type":"S","Help":{"#cdata":"Creates a temporary file that exists only as long as the filename is assigned."}},{"Name":"TERMINAL","Type":"S","Help":{"#cdata":"Specifies the user's terminal."}},{"Name":"UPRINTER","Type":"S","Help":{"#cdata":"Specifies a Universal Printing printer definition name."}},{"Name":"COMMPORT","Type":"S","Help":{"#cdata":"[Device Type for Windows] \n \nReads data from and writes data to a communications port."}},{"Name":"DRIVEMAP","Type":"S","Help":{"#cdata":"[Device Type for Windows] \n \nDisplays information about the available hard drives (local and networked)."}},{"Name":"NAMEPIPE","Type":"S","Help":{"#cdata":"[Device Type for Windows] \n \nWrites data to a named pipe."}},{"Name":"NOTESDB","Type":"S","Help":{"#cdata":"[Device Type for Windows] \n \nWrites data to a Lotus Notes database."}},{"Name":"HFS","Type":"S","Help":{"#cdata":"[Device Type for z/OS] \n \nSpecifies a UNIX System Services file."}},{"Name":"MVS","Type":"S","Help":{"#cdata":"[Device Type for z/OS] \n \nSpecifies an MVS data set."}},{"Name":"NOMVSTRANS","Type":"S","Help":{"#cdata":"[Device Type for z/OS] \n \nSuppresses the EBCDIC to ASCII translation that is internal to the Socket access method.\n\nRestriction: The NOMVSTRANS option is supported only for the SBCS (Single-Byte Character Set) \nversion of SAS."}},{"Name":"ENCODING=","Type":"V","Values":{"@Value1":"'warabic'","@Value2":"'wbaltic'","@Value3":"'wlatin2'","@Value4":"'wcyrillic'","@Value5":"'wgreek'","@Value6":"'whebrew'","@Value7":"'wturkish'","@Value8":"'wvietnamese'","@Value9":"'wlatin1'","@Value10":"'utf-8'","@Value11":"'ms-950'","@Value12":"'ms-936'","@Value13":"'ms-932'","@Value14":"'ms-949'"},"ToolTips":{"@ToolTip1":"Arabic","@ToolTip2":"Baltic","@ToolTip3":"Central Europe","@ToolTip4":"Cyrillic","@ToolTip5":"Greek","@ToolTip6":"Hebrew","@ToolTip7":"Turkish","@ToolTip8":"Vietnamese","@ToolTip9":"Western","@ToolTip10":"Unicode encoding","@ToolTip11":"Traditional Chinese","@ToolTip12":"Simplified Chinese","@ToolTip13":"Japanese","@ToolTip14":"Korean"},"Help":{"#cdata":"Specifies the encoding to use when SAS is reading from or writing to an external file."}},{"Name":"RECFM=","Type":"V","Values":{"@Value1":"F","@Value2":"P","@Value3":"S","@Value4":"V|D","@Value5":"N","@Value6":"s370V","@Value7":"S370VB","@Value8":"S370VBS","@Value9":"STREAMLF"},"ToolTips":{"@ToolTip1":"Fixed-record format","@ToolTip2":"Print format. [Not applicable to DATURL and ZIP Access Methods.]","@ToolTip3":"Stream-record format. Data is transferred in image (binary) mode.","@ToolTip4":"Variable-record format (the default). In this format, records have varying lengths, and they are transferred in text (stream) mode.","@ToolTip5":"Indicates binary format and causes the file to be treated as a byte stream. If LRECL is not specified, by default SAS reads 256 bytes at a time from the file. [Not applicable to DATURL and ZIP Access Methods.]","@ToolTip6":"Indicates the variable S370 record format (V). [Not applicable to DATURL and ZIP Access Methods.]","@ToolTip7":"Indicates the variable block S370 record format (VB). [Not applicable to DATURL and ZIP Access Methods.]","@ToolTip8":"Indicates the variable block with spanned records S370 record format (VBS). [Not applicable to DATURL and ZIP Access Methods.]","@ToolTip9":"[For OpenVMS] Specifies StreamLF record format. Records are delimited by LF. [Not applicable to DATURL and ZIP Access Methods.]"},"Help":{"#cdata":"Specifies the record format of the external file. \n \nInteraction:\nIn SAS 9.4, the default value for the global LRECL system option is 32767. If you are \nusing fixed-length records (RECFM=F), the default value for LRECL is 256.\n \nUnder z/OS, the following values can be appended to the RECFM= values: \n\n A specifies that the first byte of each record is an ANSI printer-control character.\n \n M specifies that the file is a machine control character file. SAS does not interpret \n machine-code control characters, nor does it create them in output files. \n \n S specifies that the file contains spanned records (when appended to V), or that the \n file contains standard blocks (when appended to F)."}},{"Name":"CATALOG|LIBRARY","Type":"S","Help":{"#cdata":"[Syntax: FILENAME fileref CATALOG 'catalog' ; ] \n \nSpecifies the access method that enables you to reference a SAS catalog as an external file. \n\n'catalog' \nis a valid two-, three-, or four-part SAS catalog name, where the parts represent \nlibrary.catalog.entry.entrytype.\n\nDefault: The default entry type is CATAMS."}},{"Name":"LRECL=","Type":"V","Help":{"#cdata":"Is the logical record length for the data in bytes. Under Windows, the default is 256. \nThe value of record-length can range from 1 to 1,073,741,823 (1 gigabyte).\n\nAlternatively, you can specify a logical record length value by using the LRECL= system \noption. \n\nInteraction\nIn SAS 9.4, the default value for the global LRECL system option is 32767. If you are using fixed-length \nrecords (RECFM=F), the default value for LRECL is 256."}},{"Name":"DESC=","Type":"V","Help":{"#cdata":"Alias: DESCRIPTION=\n \nSpecifies a description for a file or catalog."}},{"Name":"MOD","Type":"S","Help":{"#cdata":"Places the file in update mode and appends updates to the bottom of the file.\n \nMOD indicates that data written to the file should be appended to the file instead of overwriting \nthe file."}},{"Name":"CLIPBRD","Type":"S","Help":{"#cdata":"[Syntax: FILENAME fileref CLIPBRD ; ] \n \nSpecifies the access method that enables you to read data from or write data to the clipboard on \nthe host machine."}},{"Name":"BUFFER=","Type":"V","Help":{"#cdata":"[For the FILENAME, CLIPBOARD Access Method only] \n \n[Syntax: FILENAME fileref CLIPBRD ;] \n \nCreates and names the paste buffer. You can create any number of paste buffers by naming them with \nthe BUFFER= argument in the STORE command."}},{"Name":"EMAIL","Type":"S","Help":{"#cdata":"Specifies the EMAIL device type, which provides the access method that enables you \nto send electronic mail programmatically from SAS."}},{"Name":"CONTENT_TYPE=|TYPE=","Type":"V","Help":{"#cdata":"[Syntax: CONTENT_TYPE='content/type'] \n \nSpecifies the content type for the message body."}},{"Name":"DELIVERRECEIPT","Type":"S","Help":{"#cdata":"Specifies that a notification be sent when the e-mail message is delivered to the recipient. \n \nNote:If the recipient\u2019s e-mail client does not support or if the recipient does not allow \n\u201cdelivery receipt\u201d requests, the sender will not get a \u201cdelivery receipt\u201d notification when \nthe e-mail is delivered."}},{"Name":"TO=","Type":"V","Help":{"#cdata":"[Syntax: TO='to-address'] \n \nSpecifies the primary recipient(s) of the e-mail message. You must enclose the address in \nquotation marks. \n\nTo specify more than one address, enclose the group of addresses in parentheses, enclose \neach address in quotation marks, and separate each address with a space."}},{"Name":"CC=","Type":"V","Help":{"#cdata":"[Syntax: CC='cc-address' | CC=FORTRAN | PRINT | CR] \n \n(1) Specifies the recipient(s) to receive a copy of the e-mail message. \nYou must enclose an address in quotation marks. \n\nTo specify more than one address, enclose the group of addresses in parentheses, enclose \neach address in quotation marks, and separate each address with a space.\n\n(2) As an OpenVMS Host Option, CR= specifies the carriage-control format of the SAS log \nand the procedure output file. \n\n FORTRAN\n Indicates FORTRAN carriage-control format. This is the default for print files.\n\n PRINT\n Indicates OpenVMS print format.\n\n CR\n Indicates OpenVMS carriage-return, carriage-control format. This is the default "}},{"Name":"BCC=","Type":"V","Help":{"#cdata":"[Syntax: BCC='bcc-address'] \n \nSpecifies the recipient(s) that you want to receive a blind copy of the electronic mail. \nIndividuals that are listed in the bcc field will receive a copy of the e-mail."}},{"Name":"FROM=","Type":"V","Help":{"#cdata":"[Syntax: FROM='from-address'] \n \nSpecifies the e-mail address of the author of the message that is being sent. \nThe default value for FROM= is the e-mail address of the user who is running SAS."}},{"Name":"EXPIRES=","Type":"V","Help":{"#cdata":"[Syntax: EXPIRES='dd mon yyyy hh:mm'] \n \nSpecifies the expiration date for the e-mail message. \n\nThe format dd mon hh:mm parameters are defined as follows: \ndd \n is an integer from 01 to 31 that represents the day of the month. \nmon \n are the first three letters of the month name in English. \nyyyy \n is a four-digit integer that represents the year. \nhh \n is the number of hours that range from 00 through 23. \nmm \n is the number of minutes that range from 00 through 59. \n \nTip:If the date and time have passed the current date and time, an error message \noccurs and no e-mail is sent."}},{"Name":"READRECEIPT","Type":"S","Help":{"#cdata":"Specifies that a notification be sent when the e-mail message is read by the recipient. \n \nNote:If the recipient\u2019s e-mail client does not support or if the recipient does not \nallow return \u201cread receipt\u201d requests, the sender will not get a \u201cread receipt\u201d \nnotification when the recipient reads the e-mail."}},{"Name":"IMPORTANCE=","Type":"V","Values":{"@Value1":"'LOW'","@Value2":"'NORMAL'","@Value3":"'HIGH'"},"ToolTips":{"@ToolTip1":"Low priority message","@ToolTip2":"Normal priority message","@ToolTip3":"High priority message"},"Help":{"#cdata":"Specifies the priority of the e-mail message. You must enclose the value in quotation \nmarks. You can specify the priority in the language that matches your session encoding. \nHowever, SAS will translate the priority into English because the actual message header \nmust contain English in accordance with the RFC-2076 specification (Common Internet \nMessage Headers)."}},{"Name":"REPLYTO=","Type":"V","Help":{"#cdata":"[Syntax: REPLYTO='replyto-address'] \n \nSpecifies the e-mail address(es) for who will receive replies. \nYou must enclose an address in quotation marks. \n\nTo specify more than one address, enclose the group of addresses in parentheses, \nenclose each address in quotation marks, and separate each address with a space."}},{"Name":"SUBJECT=","Type":"V","Help":{"#cdata":"[Syntax: SUBJECT=subject] \n \nSpecifies the subject of the message."}},{"Name":"ATTACH=","Type":"V","Help":{"#cdata":"[Syntax: ATTACH='filename.ext' | ATTACH= ('filename.ext' attachment-options)]\n \nSpecifies the physical name of the file(s) to be attached to the message and any \noptions to modify attachment specifications."}},{"Name":"EXTENSION=|EXT=","Type":"V","Help":{"#cdata":"Specifies a different file extension to be used for the specified attachment."}},{"Name":"NAME=","Type":"V","Help":{"#cdata":"Specifies a different name to be used for the specified attachment.\n \nNAME= can also be an alias for FILENAME=, and specifies the name of a file."}},{"Name":"OUTENCODING=","Type":"V","Help":{"#cdata":"Specifies the resulting text encoding for the attachment to be sent."}},{"Name":"FTP","Type":"S","Help":{"#cdata":"Specifies the access method that enables you to use File Transfer Protocol (FTP) \nto read from or write to a file from any host machine that you can connect to on \na network with an FTP server running."}},{"Name":"SFTP","Type":"S","Help":{"#cdata":"Specifies the access method that enables you to use Secure File Transfer Protocol \n(SFTP) to read from or write to a file from any host computer that you can connect \nto on a network with an OpenSSH SSHD server running."}},{"Name":"BINARY","Type":"S","Help":{"#cdata":"Is fixed-record format. Thus, all records are of size LRECL with no line delimiters. \nData is transferred in image (binary) mode. \n\nAlias: RECFM=F"}},{"Name":"CD=","Type":"V","Help":{"#cdata":"[Syntax: CD='directory'] \n \nIssues a command that changes the working directory for the file transfer to the directory \nthat you specify.\n\nCD= can also be an alias for CONTENTDISP=, CDISP=, which specifies how to deliver the file."}},{"Name":"DEBUG","Type":"S","Help":{"#cdata":"Writes debugging information to the SAS log."}},{"Name":"FILEEXT","Type":"S","Help":{"#cdata":"This option may be used to specify that:\n\n(1) a file extension is automatically appended to the filename member if the extension \ndoes not exist; or\n\n(2) the member type of DATA is automatically appended to the member name on the FILE \nor INFILE statement when you use the DIR option. \n\nInteraction:\nThe autocall macro facility always passes the extension .SAS to the file access method as \nthe extension to use when opening files in the autocall library. The DATA step always passes \nthe extension .DATA. If you define a fileref for an autocall macro library and the files in \nthat library have a file extension of .SAS, use the FILEEXT option. If the files in that \nlibrary do not have an extension, do not use the FILEEXT option. For example, if you define \na fileref for an input file in the DATA step and the file X has an extension of .DATA, you \nwould use the FILEEXT option to read the file X.DATA. If you use the INFILE or FILE statement, \nenclose the member name and extension in quotation marks to preserve the casing.\n\nTip: The FILEEXT option is ignored if you specify a file extension on the FILE or INFILE statement."}},{"Name":"DIR","Type":"S","Help":{"#cdata":"Enables you to access directory files or PDS/PDSE members."}},{"Name":"MGET","Type":"S","Help":{"#cdata":"Transfers multiple files, similar to the FTP/SFTP command MGET."}},{"Name":"MPROMPT","Type":"S","Help":{"#cdata":"Specifies whether to prompt for confirmation that a file is to be read, if \nnecessary, when the user executes the MGET option."}},{"Name":"NEW","Type":"S","Help":{"#cdata":"Specifies that you want FTP/SFTP to create the directory when you use the DIR option.\n \nUnder UNIX, NEW indicates that a new file is to be opened for output. If the file \nalready exists, then it is deleted and re-created. "}},{"Name":"PASSIVE","Type":"S","Help":{"#cdata":"Specifies that an attempt is made for passive mode FTP. \n \nIn passive mode FTP, the client initiates the control and data connections to the server. \nThis action solves the problem of firewalls filtering the incoming data port connection \nto the client from the server. \n\nNote:Not all FTP servers support the passive mode. If an attempt is made by the FILENAME \nstatement FTP access method to issue the PASV command and the command fails or the server \ndoes not accept the command, then active mode FTP is used for the connection."}},{"Name":"OLD","Type":"S","Help":{"#cdata":"[UNIX Host Option]\n \nIf you specify OLD, then the previous contents of the file are replaced. NEW is the default."}},{"Name":"PROMPT","Type":"S","Help":{"#cdata":"Specifies to prompt for the user login password, if necessary.\n \nInteraction: TheUSER= and PASS= options override the PROMPT option if all three options \nare specified. If you specify the PROMPT option and do not specify the USER= or PASS= \noption, you will be prompted for a user ID and password."}},{"Name":"BLOCKSIZE=","Type":"V","Help":{"#cdata":"Specifies the size of the data buffer in bytes."}},{"Name":"HOST=","Type":"V","Help":{"#cdata":"Network name of the remote host with the FTP or OpenSSH SSHD server running."}},{"Name":"HOSTRESPONSELEN=","Type":"V","Help":{"#cdata":"[Syntax: HOSTRESPONSELEN='size'] \n \nwhere size is the length of the FTP server response message.\n\nDefault: 2048 bytes \n\nRange: 2048 to 16384 bytes \n\nRestriction: If you specify a size that is less than 2048 or is greater than 16384, the size will \nbe set to 2048."}},{"Name":"LOWCASE_MEMNAME","Type":"S","Help":{"#cdata":"Enables autocall macro retrieval of lowercase directory or member names from FTP servers or ZIP files. \n \nRestriction:\nSAS autocall macro retrieval always searches for uppercase directory member names. Mixed-case directory \nor member names are not supported."}},{"Name":"OPTIONS=","Type":"V","Help":{"#cdata":"Specifies SFTP configuration options such as port numbers."}},{"Name":"LS","Type":"S","Help":{"#cdata":"Issues the LS command to the FTP/SFTP server. LS returns the contents of the \nworking directory as records with no file attributes."}},{"Name":"LSA","Type":"S","Help":{"#cdata":"Issues the LS command to the SFTP server. LSA returns all the contents of the \nworking directory as records with no file attributes."}},{"Name":"LSFILE=","Type":"V","Help":{"#cdata":"[Syntax: LSFILE='character-string'] \n \nIn combination with the LS option, specifies a character string that enables you \nto request a listing of a subset of files from the working directory. Enclose the \ncharacter string in quotation marks."}},{"Name":"PATH","Type":"S","Help":{"#cdata":"Specifies the location of the SFTP executable if it is not installed in the PATH \nor $PATH search path."}},{"Name":"PASS=|PASSWORD=|PW=|PWD=","Type":"V","Help":{"#cdata":"[Syntax: PASS='password'] \n \nIs the password to use with the user name specified in the USER= option."}},{"Name":"PPASS=","Type":"V","Help":{"#cdata":"[Syntax: PPASS='password'] \n \nwhere password is the password to use with the user name that is specified in the \nPUSER option. The PPASS option is used to access the proxy server.\n\nTip: You can specify the PROMPT option instead of the PPASS option, which tells the \nsystem to prompt you for the password."}},{"Name":"WAIT_MILLISECONDS=","Type":"V","Help":{"#cdata":"[Syntax: WAIT_MILLISECONDS=milliseconds] \n \nSpecifies the FTP or SFTP response time in milliseconds.\n\nDefault: FTP(1,000 milliseconds); SFTP (1,500 milliseconds)\n\nTip: If you receive a timeout message in the log, use the WAIT_MILLISECONDS option \nto increase the response time."}},{"Name":"PORT=","Type":"V","Help":{"#cdata":"Specifies the port that the FTP daemon monitors on the respective host."}},{"Name":"RCMD=","Type":"V","Help":{"#cdata":"[Syntax: RCMD= 'command '] \n \nSpecifies the FTP 'SITE' or 'service' command to send to the FTP server."}},{"Name":"USER=|UID=","Type":"V","Help":{"#cdata":"[Syntax: USER='username'] \n \nThe username used to log in to the server."}},{"Name":"PUSER=","Type":"V","Help":{"#cdata":"[Syntax: PUSER='username'] \n \nwhere username is used to log on to the URL proxy server.\n\nTip: If you specify puser='*' , then the user is prompted for an ID. \n\nInteraction: If you specify the PUSER option, the USER option goes to the Web server \nregardless of whether you specify a proxy server. \n\nInteraction: If PROMPT is specified, but PUSER is not, the user is prompted for an ID \nas well as a password."}},{"Name":"RECONN=","Type":"V","Help":{"#cdata":"Specifies the maximum number of connections that the server will accept."}},{"Name":"TERMSTR=","Type":"V","Values":{"@Value1":"CR","@Value2":"CRLF","@Value3":"LF","@Value4":"NULL","@Value5":"NONE","@Value6":"NL","@Value7":"LFCR","@Value8":"CRNL"},"ToolTips":{"@ToolTip1":"Carriage return (CR).","@ToolTip2":"Carriage return (CR) followed by line feed (LF).","@ToolTip3":"Line feed only (the default).","@ToolTip4":"NULL character (0x00).","@ToolTip5":"Record terminators are not used. This parameter provides the same function as FILEDATA=BINARY.","@ToolTip6":"The newline character (x'15') is used as the record terminator. This parameter provides the same function as FILEDATA=TEXT.","@ToolTip7":"The sequence LF followed by CR is used as the record terminator.","@ToolTip8":"The sequence CR followed by NL is used as the record terminator."},"Help":{"#cdata":"Controls the end of line/record delimiters in PC and UNIX formatted files. This \noption enables the sharing of UNIX and PC formatted files between the two hosts. \n\nSyntax: TERMSTR='eol-termination-character'\n\nwhere the terminating character is the line character for Read operations and is the terminating \ncharacter for a record Write operation.\n\nDefault: CRLF for Windows. LF for all other operating environments.\n\nOperating environment:\nUsing the FILENAME statement requires information that is specific to your operating environment. \nFor more information about how to specify filenames, see the SAS documentation for your operating environment."}},{"Name":"RHELP","Type":"S","Help":{"#cdata":"Issues the HELP command to the FTP server."}},{"Name":"RSTAT","Type":"S","Help":{"#cdata":"Issues the RSTAT command to the FTP server. The results of this command are \nreturned as records."}},{"Name":"SAVEUSER","Type":"S","Help":{"#cdata":"Saves the user ID and password after the user ID and password prompt are successfully \nexecuted.\n\nInteraction: The user ID and password are saved only for the duration of the SAS \nsession or until you change the association between the fileref and the external \nfile, or discontinue it with another FILENAME statement."}},{"Name":"S370V","Type":"S","Help":{"#cdata":"Indicates that the file being read is in IBM 370 variable format."}},{"Name":"S370VS","Type":"S","Help":{"#cdata":"Indicates that the file that is being read is in IBM 370 variable-spanned format."}},{"Name":"SOCKET","Type":"S","Help":{"#cdata":"Specifies the access method that enables you to read from or write to a Transmission \nControl Protocol/Internet Protocol (TCP/IP) socket."}},{"Name":"SERVER","Type":"S","Help":{"#cdata":"Sets the TCP/IP socket to be a listening socket, thereby enabling the system to \nact as a server that is waiting for a connection. \n\nIs used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."}},{"Name":"URL|HTTP","Type":"S","Help":{"#cdata":"[Syntax: FILENAME fileref URL 'external-file' ; ]\n \nSpecifies the access method that enables you to read a file from any host machine that you can \nconnect to on a network with a URL server running. \n\n'external-file' \nspecifies the name of the file that you want to read from on a URL server. The Secure Socket Layer (SSL) \nprotocol, https, can also be used to access the files. The file must be specified in one of these formats: \n\n http://hostname/file\n https://hostname/file\n http://hostname:portno/file\n https://hostname:portno/file \n \nurl-options can be any of the following:\n\n AUTHDOMAIN=\"auth-domain\" -- specifies the name of an authentication domain metadata object in order to \n connect to the proxy or Web server. \n BLOCKSIZE=blocksize -- where blocksize is the size of the URL data buffer in bytes. Default: 8K \n DEBUG -- writes debugging information to the SAS log.\n HEADERS=fileref -- specifies the fileref to which the header information is written when a file is opened \n by using the URL access method. \n LRECL=lrecl -- where lrecl is the logical record length of the data. Default: 256.\n PASS='password' -- where password is the password to use with the user name that is specified in the USER \n option. Used to access the proxy server.\n PROMPT -- specifies to prompt for the user login password if necessary.\n PROXY=url -- specifies the Uniform Resource Locator (URL) for the proxy server in one of these forms: \n http://hostname/ or http://hostname:portno/\n PUSER='username' -- where username is used to log on to the URL proxy server.\n RECFM=recfm -- where recfm is one of three record formats:\n F is fixed-record format. Thus, all records are of size LRECL with no line delimiters. Data is transferred \n in image (binary) mode. \n S is stream-record format. Data is transferred in image (binary) mode.\n V is variable-record format (the default). In this format, records have varying lengths, and they are \n transferred in text (stream) mode.\n TERMSTR='eol-char' -- where eol-char is the line delimiter to use when RECFM=V. There are four valid values:\n CR carriage return (CR). \n CRLF carriage return (CR) followed by line feed (LF). \n LF line feed only (the default). \n NULL NULL character (0x00).\n USER='username' -- where username is used to log on to the URL server."}},{"Name":"PROXY=","Type":"V","Help":{"#cdata":"[Syntax: PROXY=url] \n \nSpecifies the Uniform Resource Locator (URL) for the proxy server in one of these forms: \n\n http://hostname/\n \n http://hostname:portno/"}},{"Name":"SASXBAMW","Type":"S","Help":{"#cdata":"Specifies the access method that enables you to use WebDAV (Web-Based Distributed \nAuthoring and Versioning) to read from or write to a file from any host machine \nthat you can connect to on a network with a WebDAV server running."}},{"Name":"LOCALCACHE=","Type":"V","Help":{"#cdata":"[Syntax: LOCALCACHE=\"directory name\"] \n \nSpecifies a directory where a temporary subdirectory is created to hold local \ncopies of the server files."}},{"Name":"LOCKDURATION=","Type":"V","Help":{"#cdata":"Specifies the number of minutes that the files that are written through the WebDAV \nlibref are locked."}},{"Name":"WEBDAV","Type":"S","Help":{"#cdata":"[FILENAME filref WEBDAV 'external-file' ; ]\n \nEnables you to access remote files by using the WebDAV protocol."}},{"Name":"BATCHFILE=","Type":"V","Help":{"#cdata":"[Syntax: BATCHFILE='path'] \n \nSpecifies the fully qualified pathname and the filename of the batch file that \ncontains the SFTP commands. These commands are submitted when the SFTP access \nmethod is executed. After the batch file processing ends, the SFTP connection \nis closed."}},{"Name":"DDE","Type":"S","Help":{"#cdata":"To use DDE in SAS, issue a FILENAME statement with the following syntax: \n\nFILENAME fileref DDE 'DDE-triplet' ; "}},{"Name":"COMMAND","Type":"S","Help":{"#cdata":"Allows remote commands to be issued to DDE server applications that not use the \nSYSTEM topic name."}},{"Name":"HOTLINK","Type":"S","Help":{"#cdata":"Instructs SAS to use the DDE HOTLINK."}},{"Name":"NOTAB","Type":"S","Help":{"#cdata":"Instructs SAS to ignore tab characters between variables."}},{"Name":"ALTDEST=","Type":"V","Help":{"#cdata":"[Syntax: ALTDEST=filename] \n \nIs for use only with the PRINTER device type. Filename specifies a file destination \nto write to when you direct output to the fileref. Although the output is written to \ndisk and not to the printer, the output is still formatted by using the printer driver \nthat is associated with the printer that you specified with the external-file argument."}},{"Name":"BAUD=","Type":"V","Help":{"#cdata":"Sets the baud rate. The value for baud-rate depends on your communications hardware. \nIt must be an integer. This host option is valid only if you specify the COMMPORT \ndevice-type keyword."}},{"Name":"BITS=","Type":"V","Help":{"#cdata":"Sets the transmission bits. Values are 5 through 8. This host option is valid only \nwhen you specify the COMMPORT device-type keyword.\n\nNote: For the 8250 serial port, invalid combinations are 5 data bits with 2 stop \nbits and 6, 7, or 8 data bits with 1.5 stop bits."}},{"Name":"BLKSIZE=|BLK=","Type":"V","Help":{"#cdata":"[Syntax: BLKSIZE=block-size] \n \nSpecifies the number of bytes that are physically read or written in an I/O operation. \nThe default is 8K. The maximum is 1M (Windows) or 1G-1(UNIX). \n\nIn UNIX, if you specify RECFM=S370VBS, then you should specify BLKSIZE=32760 in order \nto avoid errors with records longer than 255 characters."}},{"Name":"BLOCK","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."}},{"Name":"NOBLOCK","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates whether the client \nis to wait if no data is currently available. BLOCK is the default value."}},{"Name":"BYTE","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."}},{"Name":"MESSAGE","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option indicates the type of pipe. \nBYTE is the default value."}},{"Name":"COMTIMEOUT=","Type":"V","Values":{"@Value1":"EOF","@Value2":"WAIT","@Value3":"ZERO"},"ToolTips":{"@ToolTip1":"Returns an end-of-file (EOF) character when a timeout occurs. This behavior is the default. The EOF character causes the current DATA step to terminate.","@ToolTip2":"Instructs the communications port to wait forever for data. This value overrides the timeout. In this case, no record is returned to the DATA step until data are available. This action can cause your program to go into an infinite loop, so use this value with caution.","@ToolTip3":"Returns a record length of 0 bytes when a timeout occurs. However, the DATA step does not terminate; it simply tries to read data again."},"Help":{"#cdata":"Controls how a communications port timeout is handled. A timeout occurs when no data \nis available at the communications port for a period of time, usually 60 seconds."}},{"Name":"CONSOLE=","Type":"V","Values":{"@Value1":"MAX","@Value2":"MIN","@Value3":"NORMAL"},"ToolTips":{"@ToolTip1":"Opens the DOS window maximized.","@ToolTip2":"Opens the DOS window minimized.","@ToolTip3":"Opens the DOS window using the default for the machine."},"Help":{"#cdata":"Specifies the state of the DOS window when an application is opened using pipes."}},{"Name":"DROPNULL=","Type":"V","Values":{"@Value1":"ON","@Value2":"OFF"},"ToolTips":{"@ToolTip1":"Specifies to discard null bytes when they are received.","@ToolTip2":"Specifies not to discard null bytes when they are received. OFF is the default value."},"Help":{"#cdata":"Is used to discard null bytes when they are received. \n \nThis host option is valid only if you specify the COMMPORT device-type keyword.\nFor example: \n\n filename portin commport 'com1:' dropnull=off;"}},{"Name":"EOFCONNECT","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes and is valid only when you are defining \nthe server. This option indicates that if an end-of-file (EOF) character is \nreceived from a client, the server should try to connect to the next client."}},{"Name":"FLOW=","Type":"V","Values":{"@Value1":"XONXOFF","@Value2":"DTRDSR","@Value3":"RTSCTS"},"ToolTips":{"@ToolTip1":"XONXOFF","@ToolTip2":"DTRDSR","@ToolTip3":"RTSCTS"},"Help":{"#cdata":"Controls the transmission control flow. \n \nThis host option is valid only if you specify the COMMPORT device-type keyword."}},{"Name":"IGNOREDOSEOF","Type":"S","Help":{"#cdata":"Is used in the context of I/O operations on variable record format files. When this \noption is specified, any occurrence of ^Z is interpreted as character data and \nnot as an end-of-file marker."}},{"Name":"PARITY=","Type":"V","Values":{"@Value1":"NONE","@Value2":"ODD","@Value3":"EVEN","@Value4":"MARK","@Value5":"SPACE"},"ToolTips":{"@ToolTip1":"Sets no parity check bit.","@ToolTip2":"Sets odd parity check bit.","@ToolTip3":"Sets mark parity check bit.","@ToolTip4":"Sets space parity check bit."},"Help":{"#cdata":"Sets the parity check bit."}},{"Name":"RETRY=","Type":"V","Help":{"#cdata":"[Syntax: RETRY=seconds] \n \nIs used only in the context of named pipes. This option specifies how long a named \npipe client should wait for a busy pipe. The minimum (and default) value for seconds \nis 10."}},{"Name":"RCONST=","Type":"V","Help":{"#cdata":"[Syntax: RCONST=seconds] \n \nSpecifies the initial read time-out value in 0.001 of a second (1000 = 1 second). \nThe default is 8 seconds. This host-option is valid only if you specify the COMMPORT \ndevice-type keyword."}},{"Name":"RMULTI=","Type":"V","Help":{"#cdata":"[Syntax: RMULTI= seconds] \n \nSpecifies the subsequent read time-out value in 0.001 of a second (1000 = 1 second). \nThis host-option is valid only if you specify the COMMPORT device-type keyword."}},{"Name":"CLIENT","Type":"S","Help":{"#cdata":"Is used only in the context of named pipes. This option specifies the mode of a \nnamed pipe. The default value is SERVER."}},{"Name":"STOP=","Type":"V","Values":{"@Value1":"ONE","@Value2":"TWO","@Value3":"ONEHALF"},"ToolTips":{"@ToolTip1":"Sets 1 stop bit.","@ToolTip2":"Sets 2 stop bits.","@ToolTip3":"Sets 1.5 stop bits."},"Help":{"#cdata":"Sets the stop bit. \n \nThis host option is valid only if you specify the COMMPORT device-type keyword.\n\nNote: For the 8250 serial port, invalid combinations are 5 data bits with 2 stop \nbits and 6, 7, or 8 data bits with 1.5 stop bits."}},{"Name":"WCONST=","Type":"V","Help":{"#cdata":"[Syntax: WCONST=seconds] \n \nSpecifies the initial time-out value in 0.001 of a second (1000 = 1 second). This host \noption is valid only if you specify the COMMPORT device-type keyword."}},{"Name":"WMULTI=","Type":"V","Help":{"#cdata":"[Syntax: WMULTI=seconds] \n \nSpecifies the subsequent time-out value in 0.001 of a second (1000 = 1 second). \nThis host option is valid only if you specify the COMMPORT device-type keyword."}},{"Name":"UNBUF","Type":"S","Help":{"#cdata":"[UNIX Host Option] \n \nTells SAS not to perform buffered writes to the file on any subsequent FILE statement. \nThis option applies especially when you are reading from or writing to a data collection \ndevice. As explained in SAS Language Reference: Dictionary, it also prevents buffered \nreads on INFILE statements."}},{"Name":"ALQ=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks initially allocated to an external file when it is created. \nThe value can range from 0 to 2,147,483,647. If the value is 0 (the default), the minimum \nnumber of blocks required for the given file format is used.\n\nThe ALQ= option (allocation quantity) is used for output and corresponds to the FAB$L_ALQ \nfield in OpenVMS Record Management Services (RMS)."}},{"Name":"DEQ=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of blocks added when OpenVMS RMS automatically extends an external \nfile during a write operation. The value can range from 0 to 65,535. The default value \nis 0, telling OpenVMS RMS to use the process's default value. A large value results in \nfewer file extensions over the life of the file; a small value results in numerous file \nextensions over the life of the file. A file with numerous file extensions might be \nnoncontiguous, thereby slowing record access.\n\nThe DEQ= option (default file extension quantity) is used for output and corresponds to \nthe FAB$W_DEQ field in OpenVMS RMS."}},{"Name":"FAC=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file access attributes used for external files. Use this option \nto indicate the level of access you want to allow for an external file. You can allow \nREAD, WRITE, UPDATE, and DELETE access (as well as no access). By default with external \nfiles, files opened for input allow read access, files opened for output allow WRITE \naccess, and files opened for update allow READ and WRITE access. The form of the FAC= \noption is \n\n FAC=access-option-list\n \nwhere access-option-list can be one of the following: \n\n DEL specifies DELETE access.\n \n GET specifies READ access.\n \n PUT specifies WRITE access.\n \n UPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want DELETE, READ, and WRITE access: \n\n fac=(del,get,put)\n "}},{"Name":"GSFCC=","Type":"V","Values":{"@Value1":"PRINT","@Value2":"CR","@Value3":"NONE"},"ToolTips":{"@ToolTip1":"Creates a GSF file. It is a VFC format file with carriage control set to null. These files can be used with most utilities with the exception of some file transfer protocols, such as Kermit. This is the default value for this option.","@ToolTip2":"Creates a carriage return carriage control file.","@ToolTip3":"Creates a file with no carriage control. This format is useful if you plan to download the file to a personal computer."},"Help":{"#cdata":"[OpenVMS Host Option] \n \nSpecifies the file format of graphic stream files (GSF files). When specified in \nthe FILENAME statement, it affects only the GSF files that are created using that \nfileref."}},{"Name":"KEY=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies which key SAS uses to read the records in an RMS file with indexed organization. \nThe KEY= option is always used with the KEYVALUE= option. "}},{"Name":"KEYVALUE=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the key value with which to begin reading an indexed file. "}},{"Name":"MBC=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the size of the I/O buffers that OpenVMS RMS allocates for a particular file. \nThe value can range from 0 to 127 and represents the number of blocks used for each buffer. \nBy default, this option is set to 0 and the default values for the process are used.\n\nThe MBC= option (multiblock count) is used for both input and output to control the \nallocation for a particular file. If you want to control the allocation size for all \nthe external files used during the current SAS session, you can use the MBC= option in \nevery FILE, FILENAME, or INFILE statement. You can also use the DCL SET RMS_DEFAULT \ncommand to specify a process default, and let the SAS values default to the process's \ndefault values.\n\nThe MBC= option corresponds to the RAB$B_MBC field in OpenVMS RMS or the CONNECT \nMULTIBLOCK_COUNT attribute when using FDL. This option is not supported for DECnet \noperations."}},{"Name":"MBF=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nSpecifies the number of I/O buffers you want OpenVMS RMS to allocate for a particular file. \nThe value can range from 0 to 127 and represents the number of buffers used. By default, \nthis option is set to a value of 2. If a value of 0 is specified, the default value for the \nprocess is used.\n\nThe MBF= option (multibuffer count) is used for both input and output to control the number \nof buffers allocated for a particular file. If you want to control the number of buffers \nallocated for all the external files used during the SAS session, you can use the MBF= \noption in every FILE, FILENAME, or INFILE statement. The DCL SET RMS_DEFAULT command can \nbe used to specify a process default. Then, you can let the SAS values default to the \nprocess's default values.\n\nThe MBF= option corresponds to the RAB$B_MBF field in OpenVMS RMS or the CONNECT MULTIBUFFER_COUNT \nattribute when using FDL. This option is not supported for DECnet operations."}},{"Name":"SHR=","Type":"V","Help":{"#cdata":"[OpenVMS Host Option]\n \nOverrides the default file-sharing attributes used for external files. With this option, \nyou can indicate the access level you want to give other users. You can allow READ, WRITE, \nUPDATE, and DELETE access (as well as no access). By default with external files, files \nopened for input allow shared read access, and files opened for output or UPDATE do not \nallow shared access.\n\nHowever, you can allow other users to have READ and WRITE access to a file that you are \nopening for input only. To accomplish this, use the SHR= option. The syntax of the SHR= \noption is \n\n SHR=share-option-list\n\nwhere share-option-list can be one of the following: DEL specifies DELETE access.\n \n GET specifies shared READ access.\n \n NONE specifies no shared access.\n \n PUT specifies shared WRITE access.\n \n UPD specifies UPDATE access. \n\nYou can combine these values in any order. For example, specifying the following indicates \nthat you want shared DELETE, READ, and WRITE access: \n\n shr=(del,get,put)"}},{"Name":"DISP=","Type":"V","Values":{"@Value1":"NEW","@Value2":"OLD","@Value3":"SHR","@Value4":"MOD","@Value5":"REP"},"ToolTips":{"@ToolTip1":"A new data set is to be created.","@ToolTip2":"The data set exists and is not to be shared.","@ToolTip3":"The data set exists and can be shared.","@ToolTip4":"If the data set exists, adds new records to the end; if the data set does not exist, it creates a new data set. MOD cannot be specified for a partitioned data set.","@ToolTip5":"For non-PDS members, implies DISP=OLD if the data set exists and is cataloged; otherwise, it implies DISP=NEW. For PDS members, it implies DISP=SHR if the PDS is cataloged; otherwise, it implies DISP=NEW."},"Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: DISP=status | (status,,) \n\nSpecifies the status of the physical file at the beginning and ending of a job, \nas well as what to do if the job step terminates abnormally. If you specify only \nstatus, you can omit the parentheses. \n\nstatus \nspecifies the status of the data set at the beginning of a job. Valid values are:\n\n NEW -- creates a new data set. \n OLD -- does not share the existing data set. \n SHR -- shares the existing data set. \n MOD -- if the data set exists, adds new records to the end; if the data set does not exist, \n it creates a new data set. MOD cannot be specified for a partitioned data set. \n REP for non-PDS members, implies DISP=OLD if the data set exists and is cataloged; \n otherwise, it implies DISP=NEW. For PDS members, it implies DISP=SHR if the PDS is \n cataloged; otherwise, it implies DISP=NEW. The default is SHR.\n\nnormal-termination-disp \nspecifies what to do with the data set when the fileref is cleared or when the job step \nthat was using the data set terminates normally. Valid values are:\n\n DELETE -- deletes the data set at the end of the step. \n KEEP -- keeps the data set. \n CATLG -- places the entry in the system catalog or user catalog. \n UNCATLG -- deletes the entry from the system catalog or user catalog.\n \nFor a new data set, the default is CATLG. For an existing data set, the default is KEEP.\n\nabnormal-termination-disp \nspecifies what to do if the job step terminates abnormally. The default is to take the action \nthat is specified or implied by normal-termination-disp. Valid values are the same as the \nnormal-termination-disp values."}},{"Name":"SPACE=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: SPACE=(unit,(primary,secondary,directory), RLSE,type,ROUND) \n\nIs the amount of disk space to be provided for a data set that is being created. \n\nunit \ncan be any of the following: \n\n TRK -- allocates the space in tracks. \n CYL -- allocates the space in cylinders. \n blklen -- allocates space in blocks whose block length is blklen bytes. The system computes \n how many tracks are allocated. \n\nprimary \nspecifies how many tracks, cylinders, or blocks to allocate.\n\nsecondary \nspecifies how many additional tracks, cylinders, or blocks to allocate if more space is \nneeded. The system does not allocate additional space until it is needed.\n\ndirectory \nspecifies how many 256-byte directory blocks are needed for the directory of a partitioned data set.\n\nRLSE \ncauses unused space that was allocated to an output data set to be released when the data set \nis closed. Unused space is released only if the data set is opened for output and if the last \noperation was a write operation.\n\ntype \ncan be any of the following: \n\n CONTIG -- specifies to use contiguous space. \n MXIG -- specifies to use the maximum contiguous space. \n ALX -- specifies to use different areas of contiguous space. \n\n Note: You can also specify MXIG or ALX as a separate, individual keyword in the FILENAME \n statement rather than as a subparameter of the SPACE= option. \n\nROUND \nspecifies that the allocated space must be equal to an integral number of cylinders when the \nspecified unit was a block length. If unit was specified as TRK or CYL, the system ignores ROUND."}},{"Name":"VOLSER=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: VOLSER=value | VOL=value | VOL=(value-1, ..., value-n) \n\nSpecifies the disk or tape volume serial number or numbers. Up to 30 volume serial \nnumbers can be specified.\n\nIf you do not specify VOLSER=, its value is taken from the SAS system option FILEVOL=."}},{"Name":"VOLCOUNT=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: VOLCOUNT=nnn \n\nwhere nnn is the maximum number of volumes that an output data set requires. The volume \ncount is a decimal number from 1 through 255."}},{"Name":"VOLSEQ=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: VOLSEQ=nnn \n\nwhere nnn identifies which volume of an existing multivolume data set is to be used \nto begin processing the data set. The volume sequence number is a decimal number from \n1 to 255."}},{"Name":"UNIT=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: UNIT=value | UNIT=(value,n) \n\nSpecifies one of several devices. The value parameter must be enclosed in quotation marks \nif the unit name contains characters other than alphanumeric characters. The n parameter \nis a number from 1 to 59 that specifies the number of devices to be allocated for the data \nset. If n is the letter \"p\" or \"P\", then all volumes for the data set are mounted in parallel."}},{"Name":"LABEL=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: LABEL=(subparameter-list) \n\nSpecifies the type and contents of the label of either a tape data set or a disk data set, \nas well as other information such as the retention period or expiration date for the data \nset. It is identical to the JCL LABEL= parameter. Here is a simple example: \n\n label=(3,SL,,,EXPDT=2005/123)\n \nThis label specification indicates that the data set sequence number is 3, that it uses \nstandard labels, and that it expires on the 123rd day of 2005."}},{"Name":"LOCKINTERNAL=","Type":"V","Values":{"@Value1":"AUTO","@Value2":"SHARED"},"ToolTips":{"@ToolTip1":"Specifies the SAS system locking that is to be used for the file or files that are identified by a FILENAME statement. AUTO does not allow two applications within the same SAS session to have simultaneous read and write access to a file. If an application has write access to a file, no other applications can have read or write access to it. If an application has read access to a file, no other application can have write access to it. Multiple applications can have simultaneous read access to a file.","@ToolTip2":"Specifies the SAS system locking that is to be used for the file or files that are identified by a FILENAME statement. SHARED does not allow two applications within the same SAS session to have simultaneous write access to a file. SHARED allows one writer and multiple readers to have simultaneous access to a file."},"Help":{"#cdata":"Specifies the SAS system locking that is to be used for the file or files that are \nidentified by a FILENAME statement."}},{"Name":"NOMOUNT","Type":"S","Help":{"#cdata":"[z/OS Host Option]\n \nSpecifies that the mount message is not issued for a volume that is not already \nonline. The default action is to issue the mount message."}},{"Name":"NOPROMPT","Type":"S","Help":{"#cdata":"[z/OS Host Option]\n \nSpecifies that if the file that you reference in the FILENAME statement is unavailable, \na dialog box is not displayed and an error message is written to the SAS log."}},{"Name":"REUSE","Type":"S","Help":{"#cdata":"[z/OS Host Option]\n \nSpecifies that dynamic allocation reuse an existing allocation, if possible, to fulfill \na new allocation request. By default, SAS requests that dynamic allocation create a unique \nallocation for this request."}},{"Name":"WAIT=","Type":"V","Help":{"#cdata":"[z/OS Host Option]\n \nSyntax: WAIT=n \n\nControls how many minutes SAS waits if the file that you reference in the FILENAME \nstatement is unavailable. SAS tries to reacquire the reserved data set every 15 seconds. \nThe value n specifies a length of time in minutes."}},{"Name":"BOM|BOMFILE","Type":"S","Help":{"#cdata":"[UNIX/z/OS Host Option]\n \nIncludes a Byte Order Mark when a UNICODE-encoded file is created."}},{"Name":"NOBOM|NOBOMFILE","Type":"S","Help":{"#cdata":"[UNIX/z/OS Host Option]\n \nSpecifies that a Byte Order Mark is not included when a UNICODE-encoded file is created."}},{"Name":"FILEDATA=","Type":"V","Values":{"@Value1":"BINARY","@Value2":"TEXT"},"ToolTips":{"@ToolTip1":"The FILEDATA= option specifies that the file being processed is expected to contain binary data.","@ToolTip2":"The FILEDATA= option specifies that the file being processed is expected to contain text data."},"Help":{"#cdata":"[UNIX/z/OS Host Option] \n \nThe FILEDATA= option specifies that the file being processed is expected to contain \neither binary or text data."}},{"Name":"OPTCD=","Type":"V","Help":{"#cdata":"[DCB Option under z/OS]\n \nSyntax: OPTCD=value \n\nSpecifies the optional services to be performed by the operating environment. For example, \nspecifying W requests a validity check for write operations on direct-access devices. For \nmore information, see the appropriate IBM MVS JCL manual for your system.\n\nValid values are R, J, T, Z, A, Q, F, H, O, C, E, B, U, and W. You can specify more than \none code by listing them with no blanks or commas between them (as with RECFM). A maximum \nof four characters is allowed."}},{"Name":"DSORG=","Type":"V","Values":{"@Value1":"DA","@Value2":"PO","@Value3":"PS"},"ToolTips":{"@ToolTip1":"Specifies direct access.","@ToolTip2":"Specifies PDS, PDSE.","@ToolTip3":"Specifies sequential."},"Help":{"#cdata":"[DCB Option under z/OS] \n \nThe following values for organization refer to physical files that contain location-dependent \ninformation: DAU, POU, PSU.\n\nYou do not need to include the DSORG= value when you create an external file of type PS or \nPO because the operating environment identifies a partitioned data set by the presence of a \ndirectory allocation in the SPACE= parameter. When you use a FILE statement to write data, \nSAS identifies a PDS or PDSE by the presence of a member name in the FILE statement. If no \nmember name is present, SAS assumes that the data set is sequential."}},{"Name":"DATACLAS=","Type":"V","Help":{"#cdata":"[SMS]\n \nSyntax: DATACLAS=data-class-name \n\nSpecifies the data class for an SMS-managed data set. The name can have up to eight \ncharacters. This option applies only to new data sets; it is ignored for existing data \nsets. The data class is predefined and controls the DCB attributes for a data set.\n\nThe implementation of the DATACLAS= option is compatible with the SMS DATACLAS= JCL parameter."}},{"Name":"DSNTYPE=","Type":"V","Values":{"@Value1":"BASIC","@Value2":"LARGE","@Value3":"EXTREQ","@Value4":"EXTPREF","@Value5":"LIBRARY","@Value6":"PDS","@Value7":"NONE"},"ToolTips":{"@ToolTip1":"Specifies that the system selects the BASIC format if the data set is sequential (DSORG=PS or PSU), or if DSORG is omitted from all sources and the data set is not VSAM. The data set cannot exceed 65535 tracks per volume.","@ToolTip2":"Specifies that the system selects the LARGE format if the data set is sequential (DSORG=PS or PSU), or if DSORG is omitted from all sources and the data set is not VSAM. The data set can exceed 65535 tracks per volume.","@ToolTip3":"Specifies that the data set is in the EXTENDED format if the data set is VSAM, sequential, or if DSORG is omitted from all sources. The assignment fails if the system cannot allocate an extended format data set.","@ToolTip4":"Specifies that you prefer that the data set is in the EXTENDED format if the data set is VSAM, sequential, or if DSORG is omitted from all sources. If extended format is not possible, the system will select the BASIC format.","@ToolTip5":"Specifies that the data set is a PDSE (DSORG=PO).","@ToolTip6":"Specifies that the data set is a PDS (DSORG=PO).","@ToolTip7":"Specifies that the default DSNTYPE of the system should be used when a new sequential file is allocated."},"Help":{"#cdata":"[SMS] \n \nSpecifies the type of name for the data set."}},{"Name":"LIKE=","Type":"V","Help":{"#cdata":"[SMS]\n \nSyntax: LIKE=data-set-name \n\nAllocates an external file that has the same attributes as an existing file."}},{"Name":"MGMTCLAS=","Type":"V","Help":{"#cdata":"[SMS]\n \nSyntax: MGMTCLAS=management-class-name \n\nSpecifies a management class for an SMS data set. The name can have up to eight \ncharacters. This option applies only to new data sets; it is ignored for existing \ndata sets. The management class is predefined and controls how your data set is \nmanaged, such as how often it is backed up and how it is migrated.\n\nThe implementation of the MGMTCLAS= option is compatible with the SMS MGMTCLAS= \nJCL parameter."}},{"Name":"RECORG=","Type":"V","Values":{"@Value1":"KS","@Value2":"ES","@Value3":"RR","@Value4":"LS"},"ToolTips":{"@ToolTip1":"Specifies a VSAM key-sequenced data set.","@ToolTip2":"Specifies a VSAM entry-sequenced data set.","@ToolTip3":"Specifies a VSAM relative-record data set.","@ToolTip4":"Specifies a VSAM linear-space data set."},"Help":{"#cdata":"[SMS] \n \nSpecifies the organization of records in a new VSAM data set. Use this option \nonly if SMS is active."}},{"Name":"STORCLAS=","Type":"V","Help":{"#cdata":"[SMS]\n \nSyntax: STORCLAS=storage-class-name \n\nSpecifies a storage class for an SMS data set. The name can have up to eight characters. \nThis option applies only to new data sets; it is ignored for existing data sets. The \nstorage class is predefined and controls which device your SMS data set is stored on, \nsuch as disk or tape.\n\nThe implementation of the STORCLAS= option is compatible with the SMS STORCLAS= JCL \nparameter."}},{"Name":"SUBSYS=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n \nSpecifies the name of the subsystem (up to four characters)."}},{"Name":"PARM1=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n\nSpecifies a subsystem parameter (up to 67 characters)."}},{"Name":"PARM2=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n\nSpecifies a subsystem parameter (up to 67 characters)."}},{"Name":"PARM3=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n\nSpecifies a subsystem parameter (up to 67 characters)."}},{"Name":"PARM4=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n\nSpecifies a subsystem parameter (up to 67 characters)."}},{"Name":"PARM5=","Type":"V","Help":{"#cdata":"[Subsystem Options]\n\nSpecifies a subsystem parameter (up to 67 characters)."}},{"Name":"ALIGN","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the operator to check the alignment of the printer forms before printing \nthe data set."}},{"Name":"BURST","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the operator that the printed output goes to a burster-trimmer-stacker machine, \nto be burst into separate sheets."}},{"Name":"CHAR1=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a one- to four-character name for character-arrangement table #1 (used \nin conjunction with the 3800 Printing Subsystem)."}},{"Name":"CHAR2=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a one- to four-character name for character-arrangement table #2 (used \nin conjunction with the 3800 Printing Subsystem)."}},{"Name":"CHAR3=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a one- to four-character name for character-arrangement table #3 (used \nin conjunction with the 3800 Printing Subsystem)."}},{"Name":"CHAR4=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a one- to four-character name for character-arrangement table #4 (used \nin conjunction with the 3800 Printing Subsystem)."}},{"Name":"CLOSE","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the operating environment to deallocate the data set when the DCB is closed."}},{"Name":"COPIES=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies how many copies of the SYSOUT data set to print. The default is COPIES=1."}},{"Name":"DEST=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a destination for the SYSOUT data set. If DEST= is not defined, its value \nis taken from the SAS system option FILEDEST=."}},{"Name":"FCB=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the forms control buffer image that JES uses to control the printing \nof the SYSOUT data set."}},{"Name":"FLASH=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies which forms-overlay frame to use when printing on a 3800 Printing Subsystem."}},{"Name":"FLASHC=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the number of copies on which to print the forms overlay frame."}},{"Name":"FOLD","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies that the print chain or print train for the universal character set \nis loaded in fold mode."}},{"Name":"FORMDEF=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nIdentifies a member that contains statements that tell the Print Services Facility \nfrom IBM how to print the SYSOUT data set on a page-mode printer. This option has no \neffect on SAS forms."}},{"Name":"FORMS=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the IBM form number. If FORMS= is not defined, its value is taken from \nthe FILEFORMS= system option. This option has no effect on SAS forms."}},{"Name":"HOLD","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the system to hold the SYSOUT data set when it is deallocated until it \nis released by the system operator."}},{"Name":"ID=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the user ID for the SYSOUT destination."}},{"Name":"MODIFY=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a copy-modification module that tells JES how to print the SYSOUT data \nset on a 3800 Printing Subsystem."}},{"Name":"MODIFYT=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSyntax: MODIFYT=n\n\nSpecifies which of the CHARn tables to use. For example, if n is 1, then the \ncharacter-arrangement table that is identified by the CHAR1= option is used."}},{"Name":"OUTDES=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the output descriptor."}},{"Name":"OUTLIM=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies a limit for the number of logical records in the SYSOUT data set."}},{"Name":"PAGEDEF=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nIdentifies a member that contains statements that tell the Print Services Facility \nhow to format the page on a page-mode printer."}},{"Name":"PGM=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the SYSOUT program name."}},{"Name":"PRMODE=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies which process mode is required for printing the SYSOUT data set."}},{"Name":"SYSOUT=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the output class for the SYSOUT data set. If SYSOUT is not defined, its value \nis taken from the SAS system option FILESYSOUT=."}},{"Name":"UCS=","Type":"V","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nSpecifies the Universal Character Set."}},{"Name":"UCSVER","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the operator to visually verify that the character set image is for the \ncorrect print chain or print train. The character set image is displayed on the \nprinter before the data set is printed."}},{"Name":"VERIFY","Type":"S","Help":{"#cdata":"[SYSOUT Data Set Option]\n\nTells the operator to verify that the image displayed on the printer is for \nthe correct FCB image."}},{"Name":"DATAURL","Type":"S","Help":{"#cdata":"Enables you to read data from user-specified text. \n \nSyntax: FILENAME fileref DATAURL 'data-url-specification' ;\n\nValid in: Anywhere\n\nArguments:\nfileref is a valid fileref.\n\nDATAURL\n specifies the access method that enables you to read data from data-url-specification.\n\n'data-url-specification' specifies the data.\n\n Requirement:\n The data must be in one of the following formats:\n \u2022data:, file-data, where data can consist of characters and URL-encoded characters. Examples are %20 and %00. data must be lowercase.\n \u2022data: ;base64, base64-data, where data consists of base64-encoded data. data must be lowercase.\n \ndata-url-options\n can be any of the following:\n LRECL=record-length\n where lrecl is the logical record length of the data. \n \n RECFM=recfm\n where recfm is one of three record formats:"}},{"Name":"ZIP","Type":"S","Help":{"#cdata":"Enables you to access ZIP files. \n \nSyntax: FILENAME fileref ZIP 'external-file' ;\n\nArguments: \nfileref is a valid fileref.\n\nZIP\n specifies the access method that enables you to use ZIP files.\n\n'external-file'\n specifies the name of the ZIP file that you want to read from or write to.\n \nZIP Options (autocomplete loads them automatically)"}},{"Name":"COMMENT=","Type":"V","Help":{"#cdata":"Writes an informative comment in a ZIP file. \n \nSyntax: COMMENT=\"comment-string\""}},{"Name":"COMPRESSION=","Type":"V","Help":{"#cdata":"Specifies the compression level that is used to write to the ZIP file member. \n\nSyntax: COMPRESSION='compression-level'\n\n\nValid values for the compression level are 0 through 9. A value of 0 stores the file with \nno compression. A value of 9 indicates maximum compression.\n\nDefault: 6\nRestriction: COMPRESSION= is used only when opening a file for writing."}},{"Name":"OPTIONSX=","Type":"V","Help":{"#cdata":"Syntax: OPTIONSX='option-string' \n \nSpecifies SFTP configuration options such as private keys and passphrases. All information in the \noption-string is blotted when written to the SAS log. \n\nRequirements:\nWhen you submit code that contains a FILENAME SFTP statement from SAS Enterprise Guide that runs on \na Windows workspace server, you must specify authentication by using the OPTIONS or OPTIONSX option.\nIf the passphrase in the OPTIONSX string contains one or more spaces, then the passphrase must be \nenclosed in double quotation marks and the OPTIONSX string must be enclosed in single quotation marks.\n\nTip:\nThe passphrase is passed using the -pw parameter."}},{"Name":"ACCEPT=","Type":"V","Help":{"#cdata":"Syntax: ACCEPT='header-type' \n \nSpecifies the Accept: header. The Accept: header can be used to specify certain media types, \nwhich are acceptable for the response. \n\nDefault: */*\n\nRequirement: header-type must be enclosed in either single or double quotation marks."}},{"Name":"CONNECT","Type":"S","Help":{"#cdata":"Creates a connection between the client and the proxy and between the proxy and the server \nwhen accessing a URL through a proxy. \n\nRequirement:\nYou must use the PROXY= option with the CONNECT option. No connection is made if the CONNECT option is used \nwithout the PROXY= option. \n\nInteraction:\nIf you use \"http\" in the external-file argument, a connection is made, but the TLS protocol is not used."}},{"Name":"AUTHDOMAIN=","Type":"V","Help":{"#cdata":"Syntax: AUTHDOMAIN=\"auth-domain\"\n\nSpecifies the name of an authentication domain metadata object in order to connect to the WebDAV server. \nThe authentication domain references credentials (user ID and password) without your explicitly specifying \nthe credentials. \n\nRequirements:\nThe authentication domain and the associated login definition must be stored in a metadata repository, \nand the metadata server must be running in order to resolve the metadata object specification.\nThe auth-domain name is case sensitive, and it must be enclosed in double quotation marks.\n\nInteraction: If you specify AUTHDOMAIN=, you do not need to specify USER= and PASS=."}},{"Name":"DEL_ALL","Type":"S","Help":{"#cdata":"Enables you to delete a directory and all its members.\n\nRequirement: The DIR option is required when you use the DEL_ALL option.\n\nNote:\nThe default behavior of the WebDAV access method is that only empty directories can be deleted. \nUse the DEL_ALL option to delete directories that are not empty."}},{"Name":"MKDIR=","Type":"V","Help":{"#cdata":"Syntax: MKDIR=\"new-directory-name\" \n \nSpecifies a new directory that is created from the parent directory that was specified in the \nexternal-file option. \n\nRequirements:\nYou must use valid directory syntax for the specified host.\nYou must use the DIR option with the MKDIR option.\n\nExample:\nfilename bankname webdav \"http://webserver.com/parentdir/\"\ndir mkdir=\"testdir1\" user=\"myid\" pass=\"xxxx\";"}},{"Name":"FILESRVC","Type":"S","Help":{"#cdata":"Syntax: Form 1:\nUse this form to access SAS Viya files using a file Uniform Resource Identifier (URI).\nFILENAME fileref FILESRVC 'file-uri' ;\n\nForm 2:\nUse this form to access a SAS Viya file using a collection option.\nFILENAME fileref FILESRVC collection-option ;\n\nwhere:\nfile-uri\n is a valid file Uniform Resource Identifier (URI) of the file in the Files service. Here is an example: /files/files/\n \nEnables you to store and retrieve user content using the SAS Viya Files service."}},{"Name":"FOLDERPATH=","Type":"V","Help":{"#cdata":"Syntax: FOLDERPATH='path'\n \nSpecifies a path to a SAS Viya folder for directory access.\n\nThe fileref is used to access files that are members of the folder.\n\nHere is an example:\nfilename jobout filesrvc folderpath='/output/user6/log';\n\nRestrictionThis option cannot be used with the FOLDERURI or PARENTURI options."}},{"Name":"FOLDERURI=","Type":"V","Help":{"#cdata":"Syntax: FOLDERURI='uri'\n \nSpecifies a path to a SAS Viya folder by Uniform Resource Identifier (URI).\n\nThe fileref is used to access files that are members of the folder. Here is an example:\nfilename jobout filesrvc folderuri='/jobExecution/jobs/5a308aa7-1c3a-4465-a14c-fd69a9091926';\n \nRestrictionThis option cannot be used with the FOLDERPATH or PARENTURI options."}},{"Name":"PARENTURI=","Type":"V","Help":{"#cdata":"Syntax: PARENTURI='uri'\n \nSpecifies a SAS Viya object by Uniform Resource Identifier (URI).\n\nThe fileref is used to access files that are attachments to the parent object. Here is an example:\n\nfilename jobout filesrvc parenturi='/jobExecution/jobs/5a308aa7-1c3a-4465-a14c-fd69a9091926';\n\nRestrictionThis option cannot be used with the FOLDERPATH or FOLDERURI options."}},{"Name":"CONTENTTYPE=|CT=|CTYPE=","Type":"V","Help":{"#cdata":"Syntax: CONTENTTYPE='content-type'\n \nSpecifies a default HTTP Content-Type header to be returned with the file when the file\u2019s content \nis fetched from the Files service.\n\nDefaultThe provided file extension is mapped to a default content type. If a mapping is not found \nfor a provided file extension, the default content-type is set to application/octet-stream."}},{"Name":"CONTENTDISP=|CDISP=","Type":"V","Help":{"#cdata":"Syntax: CONTENTDISP='string'\n \nSpecifies how to deliver the file."}},{"Name":"DEBUG=","Type":"V","Values":{"@Value1":"ERROR","@Value2":" HTTP"},"ToolTips":{"@ToolTip1":"Indicates to write debugging information when HTTP calls fail.","@ToolTip2":"Indicates to write debugging information for all HTTP calls."},"Help":{"#cdata":"Syntax: DEBUG=ERROR | HTTP\n \nWrites debugging information to the SAS log."}},{"Name":"DESCRIPTION=","Type":"V","Help":{"#cdata":"Syntax: DESCRIPTION='string'\n \nSpecifies a description for the file."}},{"Name":"DOCUMENTTYPE=|DT=","Type":"V","Help":{"#cdata":"Syntax: DOCUMENTTYPE='document-type'\n \nSets the document type attribute of the file."}},{"Name":"FILENAME=|NAME=","Type":"V","Help":{"#cdata":"Syntax: FILENAME='name'\n \nSpecifies the name of a file."}}],"#comment":[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]}} ================================================ FILE: server/data/Statements/FOOTNOTE.json ================================================ {"Keywords":{"Keyword":[{"Name":"ANGLE=|A=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: ANGLE=degrees | A=degrees] \n \nSpecifies the angle of the baseline of the entire text string with respect to the \nhorizontal. A positive degrees value angles the baseline counterclockwise; a negative \nvalue angles it clockwise. By default, ANGLE=0 (horizontal)."}},{"Name":"BOLD","Type":"S","Help":{"#cdata":"[For template-based procedures only] \n \nSpecifies that the font weight is bold for the text string."}},{"Name":"BCOLOR=|BC=","Type":"C","Help":{"#cdata":"[Syntax: BCOLOR=background-color] \n \nSpecifies the background color of a box produced by the BOX= option. If you omit \nBOX=, BCOLOR= is ignored. By default, the background color of the box is the same \nas the background color for the entire graph. The color of the frame of the box is \ndetermined by the color specification used in BOX=."}},{"Name":"BLANK=YES|BL=YES","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: BLANK=YES] \n \nProtects the box and its contents from being overwritten by any subsequent graphics \nelements by blanking out the area where the box is displayed. The BLANK= option enables \nyou to overlay graphics elements with boxed text. It is ignored if you omit the BOX= \noption. Because titles and footnotes are written from the highest numbered to the \nlowest numbered, the BLANK= option only blanks out titles and footnotes of a lower \nnumber."}},{"Name":"BOX=|BO=","Type":"V","Values":{"@Value1":"1","@Value2":"2","@Value3":"3","@Value4":"4"},"ToolTips":{"@ToolTip1":"A value of 1 produces the thinnest box lines.","@ToolTip2":"A value of 2 produces the next thinnest box lines.","@ToolTip3":"A value of 3 produces the next thickest box lines.","@ToolTip4":"A value of 4 produces the thickest box lines."},"Help":{"#cdata":"Draws a box around one line of text."}},{"Name":"BSPACE=|BS=","Type":"V","Help":{"#cdata":"[Syntax: BSPACE=box-space] \n \nSpecifies the amount of space between the boxed text and the box. The space above \nthe text is measured from the font maximum, and the space below the text is measured \nfrom the font minimum. By default, BSPACE=1. If the BOX= option is not used, the BSPACE= \noption is ignored."}},{"Name":"COLOR=|C=","Type":"C","Help":{"#cdata":"[Syntax: COLOR=color] \n \nSpecifies the color for the following text, box, or line. The COLOR= option affects \nall text, lines, and boxes that follow it and stays in effect until another COLOR= \nspecification is encountered."}},{"Name":"DRAW=|D=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: DRAW=(x,y...,x-n,y-n)] \n \nDraws lines anywhere on the graphics output area using x and y as absolute or relative \ncoordinates."}},{"Name":"FONT=|F=","Type":"V","Help":{"#cdata":"[Syntax: FONT=font] \n \nSpecifies the font for the subsequent text."}},{"Name":"HEIGHT=|H=","Type":"V","Help":{"#cdata":"[Syntax: HEIGHT=text-height] \n \nSpecifies the height of text characters in number of units. By default, HEIGHT=1. Height \nis measured from the font minimum to the capline. Ascenders can extend above the capline,\ndepending on the font."}},{"Name":"ITALIC","Type":"S","Help":{"#cdata":"[For template-based procedures only] \n \nSpecifies that the font style is italic for the text string."}},{"Name":"JUSTIFY=|J=","Type":"V","Values":{"@Value1":"LEFT","@Value2":"CENTER","@Value3":"RIGHT"},"ToolTips":{"@ToolTip1":"Justify to the left.","@ToolTip2":"Justify to the center.","@ToolTip3":"Justify to the right."},"Help":{"#cdata":"Specifies the alignment of the text string. The default is CENTER."}},{"Name":"LANGLE=|LA=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: LANGLE=degrees] \n \nSpecifies the angle of the baseline of the entire text string(s) with respect to the horizontal. \nA positive value for degrees moves the baseline counterclockwise; a negative value moves it clockwise. \nBy default, LANGLE=0 (horizontal)."}},{"Name":"LINK=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: LINK= \"URL\"] \n \nSpecifies a uniform resource locator (URL) that a title or footnote links to. The \ntext-string that you use to specify the URL can contain occurrences of the variables \n#BYVAL, #BYVAR, and #BYLINE."}},{"Name":"LSPACE=|LS=","Type":"V","Help":{"#cdata":"[Syntax: LSPACE=line-space ] \n \nSpecifies the amount of spacing above lines of note and title text and\nthe amount of spacing below lines of footnote text."}},{"Name":"MOVE=|M=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: MOVE=(x,y) ] \n \nPositions subsequent text or lines anywhere on the graphics output area using x and y as \nabsolute or relative coordinates."}},{"Name":"ROTATE=|R=","Type":"V","Help":{"#cdata":"[For device-based procedures only][Syntax: ROTATE=degrees] \n \nSpecifies the angle at which each character of text is rotated with respect to the \nbaseline of the text string. The angle is measured from the current text baseline \nangle, which is specified by the ANGLE= or LANGLE= options. By default, the baseline \nis horizontal. A positive value for degrees rotates the character counterclockwise; \na negative value rotates it clockwise. By default, ROTATE=0 (parallel to the baseline)."}},{"Name":"UNDERLIN=|U=","Type":"V","Values":{"@Value1":"0","@Value2":"1","@Value3":"2","@Value4":"3"},"ToolTips":{"@ToolTip1":"UNDERLIN=0 halts underlining for subsequent text.","@ToolTip2":"Undelines with the thinnest line.","@ToolTip3":"Undelines with the next thickest line.","@ToolTip4":"Undelines with the thickest line."},"Help":{"#cdata":"Underlines subsequent text."}},{"Name":"WRAP","Type":"S","Help":{"#cdata":"[For device-based procedures only] \n \nWraps the text to a second line if the text does not fit on one line. If the WRAP \noption is omitted, the text font-size is reduced until the text fits on one line. \nWrapping occurs at the last blank before the text meets the end of the window. If \nthere are no blanks in the text string, then there is no wrapping."}}]}} ================================================ FILE: server/data/Statements/FORMAT.json ================================================ {"Keywords":{"Keyword":{"Name":"DEFAULT=","Type":"V","Help":{"#cdata":"Syntax: DEFAULT=default-format] \n \nSpecifies a temporary default format for displaying the values of variables that are \nnot listed in the FORMAT statement. These default formats apply only to the current DATA \nstep; they are not permanently associated with variables in the output data set.\n\nA DEFAULT= format specification applies to\n\n o variables that are not named in a FORMAT or ATTRIB statement \n o variables that are not permanently associated with a format within a SAS data set \n o variables that are not written with the explicit use of a format. \n\nDefault: If you omit DEFAULT=, SAS uses BESTw. as the default numeric format and $w. \nas the default character format. \n\nRestriction: Use this option only in a DATA step. \n\nTip: A DEFAULT= specification can occur anywhere in a FORMAT statement. It can specify \neither a numeric default, a character default, or both."}}}} ================================================ FILE: server/data/Statements/GOPTIONS.json ================================================ {"Keywords":{"Keyword":[{"Name":"ACCESSIBLE","Type":"S","Help":{"#cdata":"Enables you to comply with section 508 of the Rehabilitation Acts and meet usability \nrequirements for disabled users. Specifying the ACCESSIBLE option, when used with the \nODS HTML statement, generates descriptive text and data for your graphs. SAS/GRAPH \nwrites accessibility information to the graph's output HTML file, and creates a left-\njustified footnote that provides a link to the information."}},{"Name":"NOACCESSIBLE","Type":"S","Help":{"#cdata":"Toggles off the ACCESSIBLE option."}},{"Name":"ADMGDF","Type":"S","Help":{"#cdata":"Instructs the GDDM device driver to write out an ADMGDF file."}},{"Name":"NOADMGDF","Type":"S","Help":{"#cdata":"Instructs the GDDM device driver to write out a GDF file."}},{"Name":"ASPECT=","Type":"V","Help":{"#cdata":"Syntax: ASPECT=scaling-factor\n\nwhere scaling-factor is a nonnegative integer or real number that determines the \nratio of width to height for graphics elements. If you specify ASPECT=1, each \ngraphics element has equal horizontal and vertical scaling factors; ASPECT=2 \nscales the graphics element twice as wide as its height; and so on. If ASPECT= \nis not specified or is set to 0 or null, SAS/GRAPH uses the aspect ratio of the \nhardware device."}},{"Name":"AUTOCOPY","Type":"S","Help":{"#cdata":"Prints a copy of the graph automatically. Same as AUTOCOPY=Y."}},{"Name":"NOAUTOCOPY","Type":"S","Help":{"#cdata":"Suppresses printing a copy of the graph. Same as AUTOCOPY=N."}},{"Name":"AUTOFEED","Type":"S","Help":{"#cdata":"Causes the device to feed new paper automatically for the next graph. Same as AUTOFEED=Y."}},{"Name":"NOAUTOFEED","Type":"S","Help":{"#cdata":"Suppresses the automatic paper feed. Same as AUTOFEED=N."}},{"Name":"CTEXT=","Type":"C","Help":{"#cdata":"Selects the default color for all text and the border."}},{"Name":"XPIXELS=","Type":"V","Help":{"#cdata":"Specifies the width of the addressable display area in pixels and in conjunction \nwith XMAX determines the horizontal resolution for the device.\n \nSyntax: XPIXELS=width-in-pixels where:\n\nwidth-in-pixels is a positive integer up to eight digits long (0...99999999)."}},{"Name":"YPIXELS=","Type":"V","Help":{"#cdata":"Specifies the height of the addressable display area in pixels and in conjunction \nwith YMAX determines the horizontal resolution for the device.\n \nSyntax: YPIXELS=height-in-pixels where:\n\nheight-in-pixels \nis a positive integer up to eight digits long (0...99999999)."}},{"Name":"ALTDESC","Type":"S","Help":{"#cdata":"Specifies to write the DESCRIPTION= statement text to the ALT= text in an HTML file."}},{"Name":"NOALTDESC","Type":"S","Help":{"#cdata":"Specifies not to write the DESCRIPTION= statement text to the ALT= text in an HTML file."}},{"Name":"AUTOSIZE=","Type":"V","Values":{"@Value1":"ON","@Value2":"OFF","@Value3":"DEFAULT"},"ToolTips":{"@ToolTip1":"Changes the cell size in order to preserve the number of rows and columns.","@ToolTip2":"Preserves the device's original cell size and temporarily changes the number of rows and columns.","@ToolTip3":"Uses the default setting (ON or OFF) that is controlled by DEVOPTS bit 50 (see DEVOPTS)."},"Help":{"#cdata":"Controls whether to change the size of the character cells in order to preserve the number of rows \nand columns specified in the device entry."}},{"Name":"BINDING=","Type":"V","Values":{"@Value1":"DEFAULTEDGE","@Value2":"LONGEDGE","@Value3":"SHORTEDGE"},"ToolTips":{"@ToolTip1":"Refers to the harware's factory-default setting","@ToolTip2":"Refers to the paper's long edge.","@ToolTip3":"Refers to the paper's short edge."},"Help":{"#cdata":"Specifies which edge of the document is the binding edge."}},{"Name":"BORDER","Type":"S","Help":{"#cdata":"Specifies to draw a border around the graphics output area."}},{"Name":"NOBORDER","Type":"S","Help":{"#cdata":"Specifies not to draw a border around the graphics output area."}},{"Name":"CBACK=","Type":"C","Help":{"#cdata":"Specifies the background color of the graphics output."}},{"Name":"CBY=","Type":"C","Help":{"#cdata":"Selects the color of the By lines that appear in the graphics output."}},{"Name":"CELL|CELLS","Type":"S","Help":{"#cdata":"Causes the device to use cell alignment."}},{"Name":"NOCELL|NOCELLS","Type":"S","Help":{"#cdata":"Suppresses cell alignment, causing the procedure to use the entire procedure output \narea and place axis and tick mark labels without regard to cell alignment."}},{"Name":"CHARACTERS","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to use the device-resident font when you do not specify a font in a \nSAS program."}},{"Name":"NOCHARACTERS","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to draw the characters using the SIMULATE font and suppresses \nthe use of all device--resident fonts, regardless of values you specify in \nother SAS statements."}},{"Name":"CHARREC=","Type":"V","Help":{"#cdata":"Specifies a device-resident font by associating a CHARTYPE number with a device-resident \nfont. Also defines a default size to use with that font."}},{"Name":"CHARTYPE=","Type":"V","Help":{"#cdata":"Syntax: CHARTYPE=hardware-font-chartype \n\nhardware-font-chartype \nis a nonnegative integer from 0 to 999. hardware-font-chartype refers to the actual \nnumber for the device-resident font you want to use as listed in the Chartype window \nof the device entry for the selected device driver. By default, CHARTYPE is 0, which \nis the default device-resident font for the device.\n \nSelects the number of the default hardware character set."}},{"Name":"CIRCLEARC","Type":"S","Help":{"#cdata":"Specifies that SAS/GRAPH use the device's hardware circle-drawing capability, \nif available."}},{"Name":"NOCIRCLEARC","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to use software move and draw commands to draw circles and arcs."}},{"Name":"CMAP=","Type":"V","Help":{"#cdata":"Syntax: CMAP=('from-color : to-color' <...,'from-color-n : to-color-n'>)\n \nSpecifies a color map for the device."}},{"Name":"COLLATE","Type":"S","Help":{"#cdata":"Specifies to collate the output, if collation is supported by the device."}},{"Name":"NOCOLLATE","Type":"S","Help":{"#cdata":"Specifies not to collate the output."}},{"Name":"COLORS=|COLOURS=","Type":"V","Help":{"#cdata":"[Syntax: COLORS=<(colors-list | NONE)>] \n \nSpecifies the foreground colors used to produce your graphics output if you do \nnot specify colors explicitly in program statements."}},{"Name":"COLORTYPE=","Type":"V","Values":{"@Value1":"NAME","@Value2":"RGB","@Value3":"HLS","@Value4":"GRAY","@Value5":"CMY","@Value6":"CMYK","@Value7":"HSV"},"ToolTips":{"@ToolTip1":"SAS predefined color names.","@ToolTip2":"Red-green-blue (RGB) color specifications.","@ToolTip3":"Hue-lightness-saturation (HLS) color specifications.","@ToolTip4":"Gray-scale level.","@ToolTip5":"Cyan-magenta-yellow color specifications.","@ToolTip6":"Cyan-magenta-yellow-black color specifications.","@ToolTip7":"Hue-saturation-value color specifications."},"Help":{"#cdata":"Specifies a color type."}},{"Name":"COLS=","Type":"V","Help":{"#cdata":"Sets the number of columns that the device-resident font uses."}},{"Name":"CPATTERN=","Type":"C","Help":{"#cdata":"Selects the default color for PATTERN definitions when a color has not been specified."}},{"Name":"CSYMBOL=","Type":"C","Help":{"#cdata":"Specifies the default color for SYMBOL definitions when a color has not been specified."}},{"Name":"CTITLE=","Type":"V","Help":{"#cdata":"Selects the default color for all titles, footnotes, and notes, and the border."}},{"Name":"DASH","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to use the built-in hardware dashed-line drawing capability of the device when \ngenerating graphics output."}},{"Name":"NODASH","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to draw the dashed lines."}},{"Name":"DASHLINE=","Type":"V","Help":{"#cdata":"[Syntax: DASHLINE='dashed-line-hex-string'X] \n \nSpecifies which dashed lines should be generated by hardware means if possible."}},{"Name":"DASHSCALE=","Type":"V","Help":{"#cdata":"Scales the lengths of the dashes in a dashed line. Value can be any number greater \nthan 0. For example, GOPTIONS DASHSCALE=.5 reduces any existing dash length by \none-half."}},{"Name":"DELAY=","Type":"V","Help":{"#cdata":"Specifies the length of time between graphs in units of 0.01 seconds. For example, \nto specify a delay of .03 seconds, specify DELAY=3."}},{"Name":"DESCRIPTION=|DES=","Type":"V","Help":{"#cdata":"[Syntax: DESCRIPTION='text-string' s] \n \nProvides a description of the device entry."}},{"Name":"DEVADDR=","Type":"V","Help":{"#cdata":"[Syntax: DEVADDR=device-address] \n \nSpecifies the location of the device to which the output of device drivers is sent."}},{"Name":"DEVICE=|DEV=","Type":"V","Help":{"#cdata":"Specifies the device driver to which SAS/GRAPH sends the procedure output."}},{"Name":"DEVMAP=","Type":"V","Help":{"#cdata":"[Syntax: DEVMAP=device-map-name | NONE] \n \nSpecifies the device map to be used when device-resident fonts are used."}},{"Name":"DEVOPTS=","Type":"V","Help":{"#cdata":"[Syntax: DEVOPTS='hardware-capabilities-hex-string'X] \n \nSpecifies the hardware capabilities of the device."}},{"Name":"DEVTYPE=","Type":"V","Values":{"@Value1":"GTERM","@Value2":"G3270"},"ToolTips":{"@ToolTip1":"Indicates that the output device is a graphics device that will be receiving graphics data; most device drivers use this value.","@ToolTip2":"Indicates that the output device is an IBM 3270 graphics data stream."},"Help":{"#cdata":"Specifies the type of the output device."}},{"Name":"DISPLAY","Type":"S","Help":{"#cdata":"Specifies that output is displayed on the graphics device but does not affect whether a graph is \nplaced in a catalog."}},{"Name":"NODISPLAY","Type":"S","Help":{"#cdata":"Specifies that output is not displayed on the graphics device but does not affect \nwhether a graph is placed in a catalog."}},{"Name":"DISPOSAL=","Type":"V","Values":{"@Value1":"NONE","@Value2":"BACKGROUND","@Value3":"PREVIOUS","@Value4":"UNSPECIFIED"},"ToolTips":{"@ToolTip1":"Causes the graphic to be left in place after displaying. This is the default.","@ToolTip2":"Causes the background color to be returned and the graph erased after displaying.","@ToolTip3":"Causes the graphic area to be restored with what was displayed in the area previously.","@ToolTip4":"Indicates that no action is necessary."},"Help":{"#cdata":"Specifies what happens to the graphic after it is displayed."}},{"Name":"DRVINIT=","Type":"V","Help":{"#cdata":"Syntax: DRVINIT1='system-command(s)' | DRVINIT2='system-command(s)]\n \nwhere:\n\nsystem-command(s) specifies a character string that is a valid system command and \ncan be in upper- or lowercase letters."}},{"Name":"DRVTERM=","Type":"V","Help":{"#cdata":"Syntax: DRVTERM1='system-command(s)' | DRVTERM2='system-command(s)]\n \nwhere:\n\nsystem-command(s) specifies a character string that is a valid system command and can \nbe in upper- or lowercase letters."}},{"Name":"DRVQRY","Type":"S","Help":{"#cdata":"Specifies that the device can be queried for information about the current device \nconfiguration."}},{"Name":"NODRVQRY","Type":"S","Help":{"#cdata":"Specifies that the device cannot be queried for information about the current device \nconfiguration."}},{"Name":"DUPLEX","Type":"S","Help":{"#cdata":"Specifies to use duplex printing if available on the device."}},{"Name":"ERASE","Type":"S","Help":{"#cdata":"Causes the graph to be erased when you press RETURN after the graph has been displayed."}},{"Name":"NOERASE","Type":"S","Help":{"#cdata":"Causes the graph to remain on the display when you press RETURN after the graph \nhas been displayed."}},{"Name":"EXTENSION=|EXT=","Type":"V","Help":{"#cdata":"Specifies a string up to eight characters long that is a file extension, such as \nGIF or CGM, that you want to append to an external file."}},{"Name":"FASTTEXT","Type":"S","Help":{"#cdata":"Specifies to use integer-based font processing for faster font rendering."}},{"Name":"NOFASTTEXT","Type":"S","Help":{"#cdata":"Specifies not to use integer-based font processing for faster font rendering."}},{"Name":"FBY=","Type":"V","Help":{"#cdata":"Specifies the font for all By lines on the graphics output."}},{"Name":"FCACHE=","Type":"V","Help":{"#cdata":"[Syntax: FCACHE=number-fonts-open] \n \nSpecifies the number of system fonts to keep open. Default: FCACHE=3"}},{"Name":"FILECLOSE=","Type":"V","Values":{"@Value1":"DRIVERTERM","@Value2":"GRAPHEND"},"ToolTips":{"@ToolTip1":"Closes the GSF and makes it available to the device after all graphs have been produced and the procedure or driver terminates.","@ToolTip2":"Closes the GSF after each separate graph is produced and releases it to the device before sending another."},"Help":{"#cdata":"Controls when the graphics stream file (GSF) is closed when you are using the device \ndriver to send graphics output to a hard copy device."}},{"Name":"FILEONLY","Type":"S","Help":{"#cdata":"Specifies that a file rather than a storage location is the default destination for \ngraphics output."}},{"Name":"NOFILEONLY","Type":"S","Help":{"#cdata":"Specifies that a storage location is the default destination for graphics output, \nunless a file of the same name exists."}},{"Name":"FILL","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to use the built-in hardware rectangle-filling capability of \nthe device."}},{"Name":"NOFILL","Type":"S","Help":{"#cdata":"Causes SAS/GRAPH to use software fills to fill rectangles."}},{"Name":"FILLINC=","Type":"V","Help":{"#cdata":"Specifies the number of pixels to move before drawing the next line in a software \nfill of a solid area. \n\nRange: 0-9999.\n\nIf FILLINC is set to 0 or 1, adjacent lines are used (solid fill with no gaps). \nIf FILLINC is set to 2, a pixel-width line is skipped before drawing the next \nline of a fill."}},{"Name":"FONTRES=","Type":"V","Values":{"@Value1":"NORMAL","@Value2":"PRESENTATION"},"ToolTips":{"@ToolTip1":"Renders fonts in memory using integer rendering routines, which improves character drawing speed for most host systems.","@ToolTip2":"Disables the storage or use of rendered versions of Bitstream fonts, but produces the fonts at their highest resolution."},"Help":{"#cdata":"Controls the resolution of Bitstream fonts."}},{"Name":"FORMAT=","Type":"V","Values":{"@Value1":"CHARACTER","@Value2":"BINARY"},"ToolTips":{"@ToolTip1":"Character file format.","@ToolTip2":"Binary file format."},"Help":{"#cdata":"Sets the file format of the metacode file produced by the SAS-supplied part of the Metagraphics device driver."}},{"Name":"FTEXT=","Type":"V","Help":{"#cdata":"Sets the default font for all text."}},{"Name":"FTITLE=","Type":"V","Help":{"#cdata":"Specifies the default font for the first TITLE line."}},{"Name":"FTRACK=","Type":"V","Values":{"@Value1":"LOOSE","@Value2":"NONE","@Value3":"NORMAL","@Value4":"TIGHT","@Value5":"TOUCH","@Value6":"V5"},"ToolTips":{"@ToolTip1":"Leaves the most visible space between characters and produces a longer string.","@ToolTip2":"Spacing depends on the size of the font. NONE might produce a shorter or longer string than LOOSE for the same font at different point sizes, because some sizes add space between the characters while others remove it.","@ToolTip3":"Is the recommended setting.","@ToolTip4":"Reduces the space between characters.","@ToolTip5":"Leaves the least visible space between characters.","@ToolTip6":"Places a fixed amount of space between the characters and does not adjust for the shape of the character; that is, it does not support kerning."},"Help":{"#cdata":"Controls the amount of space between letters in the SAS-supplied Bitstream fonts \n(Brush, Century, Swiss, and Zapf)."}},{"Name":"GACCESS=","Type":"V","Values":{"@Value1":"SASGASTD","@Value2":"SASGAEDT","@Value3":"SASGAFIX","@Value4":"SASGALOG","@Value5":"GSASFILE"},"ToolTips":{"@ToolTip1":"Specifies that a continuous stream of data is written.","@ToolTip2":"Specifies that the file be host-specific edit format.","@ToolTip3":"Specifies that fixed-length records be written.","@ToolTip4":"Specifies that records are to be written to the SAS log.","@ToolTip5":"Specifies that the records are to be written to the destination whose fileref is GSASFILE."},"Help":{"#cdata":"[Syntax: GACCESS=output-format | 'output-format destination'] \n \nSpecifies the format or the destination or both of graphics data written to a device \nor graphics stream file (GSF)."}},{"Name":"GCLASS=","Type":"V","Help":{"#cdata":"[Syntax: GCLASS=SYSOUT-class] \n \nSpecifies the output class for IBM printers."}},{"Name":"GCOPIES=","Type":"V","Help":{"#cdata":"[Syntax: GCOPIES=(<,max-copies>)] \n \nSets the current and maximum number of copies to print."}},{"Name":"GDDMCOPY=","Type":"V","Values":{"@Value1":"FSCOPY","@Value2":"GSCOPY"},"ToolTips":{"@ToolTip1":"Used when sending output to an IEEE attached plotter.","@ToolTip2":"Used when creating an ADMPRINT file for output on 3287-type printers."},"Help":{"#cdata":"Instructs the driver to issue either an FSCOPY or GSCOPY call to GDDM when AUTOCOPY \nis in effect."}},{"Name":"GDDMNICKNAME=|GDDMN=","Type":"V","Help":{"#cdata":"Selects a GDDM nickname for the device to which output is sent."}},{"Name":"GDDMTOKEN=|GDDMT=","Type":"V","Help":{"#cdata":"Specifies a GDDM token for the device to which output is sent."}},{"Name":"GDEST=","Type":"V","Help":{"#cdata":"Specifies the JES SYSOUT destination for IBM printers."}},{"Name":"GEND=","Type":"V","Help":{"#cdata":"[Syntax: GEND='string' <...'string-n'>] \n \nAppends an ASCII string to every graphics data record that is sent to a device \nor file."}},{"Name":"GEPILOG=","Type":"V","Help":{"#cdata":"[Syntax: GEPILOG='string' <...'string-n'>] \n \nSends a string to a device or file after all graphics commands are sent.\n \n'string' can be either of the following: \n\n 'hex-string'X\n \n 'character-string'"}},{"Name":"GPROLOG=","Type":"V","Help":{"#cdata":"[Syntax: GPROLOG='string' <...'string-n'>] \n \nSends a string to device or file before graphics commands are sent.\n \n'string' can be either of the following: \n\n 'hex-string'X\n \n 'character-string'"}},{"Name":"GSTART=","Type":"V","Help":{"#cdata":"[Syntax: GSTART='string <...'string-n'>] \n \nPrefixes every record of graphics data sent to a device or file with a string of characters.\n \n'string' can be either of the following: \n\n 'hex-string'X\n \n 'character-string'"}},{"Name":"GFORMS=","Type":"V","Help":{"#cdata":"[Syntax: GFORMS='forms-code'] \n \nSpecifies the JES form name for IBM printers."}},{"Name":"GOUTMODE=","Type":"V","Values":{"@Value1":"APPEND","@Value2":"REPLACE"},"ToolTips":{"@ToolTip1":"Adds each new graph to the end of the current catalog.","@ToolTip2":"Replaces the contents of the catalog with the graph or graphs produced by a single procedure."},"Help":{"#cdata":"Appends to or replaces the graphics output catalog."}},{"Name":"GPROTOCOL=","Type":"V","Values":{"@Value1":"SASGPADE","@Value2":"SASGPAGL","@Value3":"SASGPASC","@Value4":"SASGPCAB","@Value5":"SASGPCHK","@Value6":"SASGPDAT","@Value7":"SASGPDCA","@Value8":"SASGPHEX","@Value9":"SASGPHYD","@Value10":"SASGPIDA","@Value11":"SASGPIDX","@Value12":"SASGPIMP","@Value13":"SASGPIOC","@Value14":"SASGPISI","@Value15":"SASGPI24","@Value16":"SASGPLCL","@Value17":"SASGPNET","@Value18":"SASGPMIC","@Value19":"SASGPRTM","@Value20":"SASGPSCS","@Value21":"SASGPSTD","@Value22":"SASGPSTE","@Value23":"SASGPTCX","@Value24":"SASGPVAT","@Value25":"SASGP497","@Value26":"SASGP71"},"ToolTips":{"@ToolTip1":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip2":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip3":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip4":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip5":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip6":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip7":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip8":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip9":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip10":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip11":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip12":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip13":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip14":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip15":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip16":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip17":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip18":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip19":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip20":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip21":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip22":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip23":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip24":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip25":"Protocol module name. Valid only for IBM mainframe systems.","@ToolTip26":"Protocol module name. Valid only for IBM mainframe systems."},"Help":{"#cdata":"Specifies the protocol module to use when routing output directly to a printer or \ncreating a graphics stream file (GSF) to send to a device attached to your host \nby a protocol converter."}},{"Name":"GRAPHRC","Type":"S","Help":{"#cdata":"Allows a return code at procedure termination. If the return code is not 0, the entire \njob might terminate."}},{"Name":"NOGRAPHRC","Type":"S","Help":{"#cdata":"Always returns a step code of 0, even if the SAS/GRAPH program produced errors."}},{"Name":"GSFLEN","Type":"S","Help":{"#cdata":"[Syntax: GSFLEN=record-length] \n \nControls the length of records written to the graphics stream file (GSF).\n \nrecord-length: must be a nonnegative integer up to five digits long (0...99999)."}},{"Name":"GSFMODE=","Type":"V","Values":{"@Value1":"APPEND","@Value2":"PORT","@Value3":"REPLACE"},"ToolTips":{"@ToolTip1":"Adds the records to the end of a GSF designated by the GACCESS= or GSFNAME= graphics option or device parameter.","@ToolTip2":"Sends the records to a device or communications port.","@ToolTip3":"Replaces the existing contents of a GSF designated by the GACCESS= or GSFNAME= graphics option or device parameter."},"Help":{"#cdata":"Specifies the disposition of records written to a graphics stream file (GSF) or to \na device or communications port by the device driver."}},{"Name":"GSFNAME=","Type":"V","Help":{"#cdata":"Specifies the fileref of the file or aggregate file location to which graphics stream \nfile records are written."}},{"Name":"GSFPROMPT","Type":"S","Help":{"#cdata":"Specifies to write prompt messages to the graphics stream file (GSF)."}},{"Name":"NOGSFPROMPT","Type":"S","Help":{"#cdata":"Specifies not to write prompt messages to the graphics stream file (GSF)."}},{"Name":"GSIZE=","Type":"S","Help":{"#cdata":"Sets the number of lines of display used for graphics for devices whose displays can \nbe divided into graphics and text areas."}},{"Name":"GUNIT=","Type":"V","Help":{"#cdata":"Specifies the default unit of measure to use with height specifications."}},{"Name":"GWAIT=","Type":"V","Help":{"#cdata":"Specifies the time (in seconds) between each graph displayed in a series. By default, \nGWAIT=0, which means that you must press the RETURN key between each display in a \nseries of graphs."}},{"Name":"HANDSHAKE=","Type":"V","Values":{"@Value1":"HARDWARE","@Value2":"NONE","@Value3":"SOFTWARE","@Value4":"XONXOFF"},"ToolTips":{"@ToolTip1":"Specifies that SAS/GRAPH instruct the device to use the hardware CTS and RTS signals.","@ToolTip2":"Specifies that SAS/GRAPH send data without providing flow control. Specify NONE only if the hardware or interface program you are using provides its own flow control.","@ToolTip3":"Specifies that SAS/GRAPH use programmed flow control with plotters in eavesdrop mode.","@ToolTip4":"Specifies that SAS/GRAPH instruct the device to use ASCII characters DC1 and DC3. (This is not appropriate for some devices.)"},"Help":{"#cdata":"Specifies the type of flow control used to regulate the flow of data to a hard copy device."}},{"Name":"GWRITER=","Type":"V","Help":{"#cdata":"[Syntax: GWRITER='writer-name'] \n \nSpecifies the name of the external writer used with IBM printers."}},{"Name":"HBY=","Type":"V","Help":{"#cdata":"[Syntax: HBY=By line-height ] \n \nSpecifies the height of By lines generated when you use BY-group processing."}},{"Name":"HEADER=","Type":"V","Help":{"#cdata":"[Syntax: HEADER='command'] \n \nSpecifies the command that executes a user-supplied program to create HEADER \nrecords for the driver."}},{"Name":"HEADERFILE=","Type":"V","Help":{"#cdata":"[Syntax: HEADERFILE=fileref] \n \nSpecifies the fileref for the file from which the Metagraphics driver reads \nHEADER records."}},{"Name":"HORIGIN=","Type":"V","Help":{"#cdata":"[Syntax: HORIGIN=horizontal-offset ]\n \nSets the horizontal offset from the lower-left corner of the display area to the \nlower-left corner of the graph."}},{"Name":"HOSTSPEC=","Type":"S","Help":{"#cdata":"[Syntax: HOSTSPEC='text-string'] \n \nStores FILENAME statement options in the device entry."}},{"Name":"HPOS=","Type":"V","Help":{"#cdata":"[Syntax: HPOS=columns] \n \nSpecifies the number of columns in the graphics output area."}},{"Name":"HSIZE=","Type":"V","Help":{"#cdata":"[Syntax: HSIZE=horizontal-size ]\n \nSets the horizontal size of the graphics output area."}},{"Name":"HTEXT=","Type":"V","Help":{"#cdata":"[Syntax: HTEXT=text-height ] \n \nSpecifies the default height of the text in the graphics output."}},{"Name":"HTITLE=","Type":"V","Help":{"#cdata":"[Syntax: HTITLE=title-height ] \n \nSelects the default height used for the first TITLE line."}},{"Name":"IBACK=","Type":"V","Help":{"#cdata":"[Syntax: IBACK=fileref | 'external-file' | 'URL'| \" \"]\n \nSpecifies an image file to display in a graph's background area."}},{"Name":"ID=","Type":"V","Help":{"#cdata":"[Syntax: ID='description'] \n \nSpecifies the description string used by the Metagraphics driver."}},{"Name":"IMAGEPRINT","Type":"S","Help":{"#cdata":"Specifies that any images are to be included in graphics output. This is the default."}},{"Name":"NOIMAGEPRINT","Type":"S","Help":{"#cdata":"Specifies that images are to be withheld from graphics output."}},{"Name":"IMAGESTYLE=","Type":"V","Values":{"@Value1":"TILE","@Value2":"FIT"},"ToolTips":{"@ToolTip1":"Tile the image within the specified area. This copies the images as many times as needed to fit the area.","@ToolTip2":"Fit the image within the background area. This stretches the image, if necessary."},"Help":{"#cdata":"Specifies the way to display the image file that is specified on the IBACK= option."}},{"Name":"INTERACTIVE=","Type":"V","Values":{"@Value1":"USER","@Value2":"PROC","@Value3":"GRAPH"},"ToolTips":{"@ToolTip1":"Specifies that the user-written part of the driver be executed outside of SAS/GRAPH.","@ToolTip2":"Specifies that the user-written part of the Metagraphics driver be invoked after the procedure is complete.","@ToolTip3":"Specifies that the user-written part be invoked for each graph."},"Help":{"#cdata":"Sets level of interactivity for Metagraphics driver."}},{"Name":"INTERLACED","Type":"S","Help":{"#cdata":"Specifies that images are to be displayed as they are received in the browser."}},{"Name":"NONINTERLACED","Type":"S","Help":{"#cdata":"Specifies that images are not to be displayed as they are received in the browser."}},{"Name":"INTERPOL=|I=","Type":"V","Values":{"@Value1":"BOX","@Value2":"HILO","@Value3":"JOIN","@Value4":"L","@Value5":"MEMPTY","@Value6":"MSOLID","@Value7":"M","@Value8":"NEEDLE","@Value9":"NONE","@Value10":"R","@Value11":"SM","@Value12":"SPLINE","@Value13":"STD","@Value14":"STEP"},"ToolTips":{"@ToolTip1":"Produces box and whisker plots.","@ToolTip2":"Specifies that a solid vertical line connect the minimum and maximum Y values for each X value. Syntax: INTERPOL=HILO