#BEGINBUCKET BBSDSALLOC  {JOBNAME}
#/   {LANG}  lower case 2 byte language code from artifact instance XML.
#/   {LANG2BCODE}  upper case 2 byte language code from artifact instance XML.
#/   {MVS2BDSCODE} upper case 2 byte language code, key entry for dataset attributes in MVSDSDataTable.xml
#/   [DSLANGCODE]  upper case 2 byte language code variable which must be set within instance code to resolve 
#/                 
#/ We don't use an encoding value in the INSTANCEUNIQUEKEY because the actual LOQUAL used in the DD statement
#/ incorporates [ORDERENCODING] (from MVSDSDataTable.xml) which will always be the same, because otherwise,
#/ if you have a NE and a W3 artifact, for example, you will end up trying to allocate the same dataset twice
#/ for W3, if that is the encoding on the order.  In other words, the thing we use to determine if we have a unique
#/ artifact needs to match what we use to construct the dataset name in the JCL
#/
#/ ------------------------------------------------------------------
#BEGINDEFS
#/ ------------------------------------------------------------------
#/EXCEPTIONFORMISSINGSYMBOL
#SYMBOLCALLS ENTRY;SYSOUT;CUSTPRODQUAL;TMPUNI;WORKSPC
#/ ------------------------------------------------------------------
#BEGINSTATICINSTANCES
#/ ------------------------------------------------------------------
#IF [INSTALLENCODEDONLY] #THEN DOESNOTQUALIFY
#IFEQ [HOST] z64 #THEN USEZB
#STATICINSTANCE MVS2BDSCODE=LB;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [LB:LOQUAL]
#THEN SKIPZB
#USEZB
#STATICINSTANCE MVS2BDSCODE=ZB;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [ZB:LOQUAL]
#SKIPZB
#STATICINSTANCE MVS2BDSCODE=LE;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [LE:LOQUAL]
#STATICINSTANCE MVS2BDSCODE=BZ;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [BZ:LOQUAL]
#IFEQ [HOST] z64 #THEN USEZX
#STATICINSTANCE MVS2BDSCODE=XL;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [XL:LOQUAL]
#THEN SKIPZX
#USEZX
#STATICINSTANCE MVS2BDSCODE=ZX;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [ZX:LOQUAL]
#SKIPZX
#STATICINSTANCE MVS2BDSCODE=XN;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [XN:LOQUAL]
#STATICINSTANCE MVS2BDSCODE=XX;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [XX:LOQUAL]
#IFEQ [HOST] z64 #THEN USEZE
#STATICINSTANCE MVS2BDSCODE=LD;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [LD:LOQUAL]
#THEN SKIPZE
#USEZE
#STATICINSTANCE MVS2BDSCODE=ZE;LANG2BDSCODE=EN;ENCODE=NE;
#INSTANCEUNIQUEKEY [ZE:LOQUAL]
#SKIPZE
#DOESNOTQUALIFY
#STATICINSTANCE MVS2BDSCODE=TT;LANG2BDSCODE=EN;ENCODE=[ORDERENCODING];
#INSTANCEUNIQUEKEY [TT:LOQUAL]
#STATICINSTANCE MVS2BDSCODE=SH;LANG2BDSCODE=EN;ENCODE=[ORDERENCODING];
#INSTANCEUNIQUEKEY [SH:LOQUAL]
#STATICINSTANCE MVS2BDSCODE=AU;LANG2BDSCODE=EN;ENCODE=[ORDERENCODING];
#INSTANCEUNIQUEKEY [AU:LOQUAL]
#STATICINSTANCE MVS2BDSCODE=SP;LANG2BDSCODE=;ENCODE=[ORDERENCODING];
#INSTANCEUNIQUEKEY [SP:LOQUAL]
#/ -------------------------------------------------
#BEGININSTANCEQUALIFIERS
#/ -------------------------------------------------
#IFEQ {ENCODE} [ORDERENCODING] #THEN PASSESENCODE
#IF [INSTALLENCODEDONLY] #THEN DOESNOTQUALIFY
#IFNOTEQ {ENCODE} NE #THEN DOESNOTQUALIFY
#PASSESENCODE

#TABLEFIX {MVS2BDSCODE}
#IFEQ [NOAL] DoNotAllocate #THEN NEXT
#SET [TARGET2BDSCODE] {MVS2BDSCODE}   
#SET [DSLANGCODE] EN         #/ Set language symbol to EN for empty/blank language argument.
#IFNOT {LANG2BCODE} #THEN NOLANG     #/ Is language symbol non-blank?
#SET [DSLANGCODE] {LANG2BCODE}     #/ If so set general use language symbol to instance argument value. 
#NOLANG
#INSTANCEUNIQUEKEY [LOQUAL] #NOTUNIQUE NEXT
#CREATEINSTANCEFROMENTRY
#NEXT
#FORALL <MEMBER>
#IFNOT {COPY2BDSCODE} #THEN NEXT
#TABLEFIX {COPY2BDSCODE}
#SET [TARGET2BDSCODE] {COPY2BDSCODE}
#IFEQ [NOAL] DoNotAllocate #THEN NEXT
#INSTANCEUNIQUEKEY [LOQUAL] #NOTUNIQUE NEXT
#CREATEINSTANCEFROMENTRY
#NEXT
#ENDFORALL
#DOESNOTQUALIFY
#ENDINSTANCEQUALIFIERS
#/ --------------------------------------------------------------------
#BEGINPREFIX
#/ --------------------------------------------------------------------
//NEWALLOC EXEC PGM=IEFBR14
#BEGININSTANCE               #/ All instance code must resolve to valid SAS source code.
#/ -------------------------------------------------------------------
#SET [DSLANGCODE] EN         #/ Set language symbol to EN for empty/blank language argument.
#IFNOT {LANG2BCODE} #THEN NEXT     #/ Is language symbol non-blank?
#SET [DSLANGCODE] {LANG2BCODE}     #/ If so set general use language symbol to instance argument value. 
#NEXT
#TABLEFIX {MVS2BDSCODE} #/ Fix ds table row to OTP2 from the instance.
//DDOT[DSLANGCODE]{MVS2BDSCODE} DD DSN=[CUSTPRODQUAL].[LOQUAL],
//      DISP=(NEW,CATLG,DELETE),
//      SPACE=[SPACEPARMS],
#IFEQ [RECFM] U #THEN RECFMU
//      DCB=(DSORG=[DSORG],RECFM=[RECFM],LRECL=[LRECL],BLKSIZE=[BLKSIZE]),
#THEN TXEN
#RECFMU
//      DCB=(DSORG=[DSORG],RECFM=[RECFM],BLKSIZE=[BLKSIZE]),
#TXEN
#IFNOTEQ [DATASETTYPE] PDSE #THEN NOTPDSE
//      DSNTYPE=LIBRARY,
#THEN CHECKSMS
#NOTPDSE
#IFNOTEQ [DATASETTYPE] PDS #THEN NOTPDS
//      DSNTYPE=PDS,
#THEN CHECKSMS
#NOTPDS
#IFNOTEQ [DATASETTYPE] SASDATALIB #THEN CHECKSMS
//      DSNTYPE=LARGE,
#CHECKSMS
#IFEQ [DATASETTYPE] PDSE #THEN PDSE
#IFEQ [SMS-ALLOC] true #THEN SMSA
#THEN UNITVOL
#PDSE
#IFEQ [SMS-ALLOC-PDSE] true #THEN SMSAPDSE
#/ no-op required here, otherwise get a parsing error
#UNITVOL
//      UNIT=[DISKUNIT],VOL=SER=[BYDSVOLSER]
#THEN DONE
#SMSA
//      STORCLAS=[SMS-STORCLAS],MGMTCLAS=[SMS-MGMTCLAS],
//      DATACLAS=[SMS-DATACLAS],
#THEN ADDUNIT
#SMSAPDSE
//      STORCLAS=[SMS-PDSE-STORCLAS],MGMTCLAS=[SMS-PDSE-MGMTCLAS],
//      DATACLAS=[SMS-PDSE-DATACLAS],
#ADDUNIT
//      UNIT=[DISKUNIT]
#DONE
#/ ----------------------------------------------------------------------
#BEGINSUFFIX 
#/ -------------------------------------------------------------------
//*
#/ ----------------------------------------------------------------------
#ENDBUCKET 