From 7048adb3b6c5c52b7f8af3519c7153879f90a64d Mon Sep 17 00:00:00 2001 From: "Bart Jablonski (yabwon)" Date: Wed, 20 Apr 2022 22:35:09 +0200 Subject: [PATCH] **SAS Packages Framework**, version 20220420 **SAS Packages Framework**, version 20220420 - Changes in the `%GeneratePackage()` macro: - check for driving files existence added, - local `createPackageContentStatus` macro variable added, - if `createPackageContentStatus` is not zero an _ERROR _is printed and tests are not executed, - The `kscanx()` function and `kcountw()` function used in macros of the Framework, - Doc. updated. - Packages regenerated with new version of the SAS Packages Framework: - BasePlus - SQLinDS - macroArray - DFA - dynMacroArray - GSM --- LICENSE | 2 +- README.md | 14 +-- SPF/SPFinit.md | 22 ++-- SPF/SPFinit.sas | 189 +++++++++++++++++++------------ SPF/license.sas | 2 +- packages/README.md | 12 +- packages/SHA256_for_packages.txt | 8 ++ packages/baseplus.md | 4 +- packages/baseplus.zip | Bin 76900 -> 76898 bytes packages/dfa.md | 4 +- packages/dfa.zip | Bin 47031 -> 47031 bytes packages/dynmacroarray.zip | Bin 13362 -> 13357 bytes packages/gsm.md | 4 +- packages/gsm.zip | Bin 16658 -> 16654 bytes packages/macroarray.md | 4 +- packages/macroarray.zip | Bin 50316 -> 50308 bytes packages/sqlinds.md | 4 +- packages/sqlinds.zip | Bin 13131 -> 13119 bytes 18 files changed, 160 insertions(+), 109 deletions(-) diff --git a/LICENSE b/LICENSE index ac88a7e..f119d51 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 - 2021 Bartosz Jablonski +Copyright (c) 2019 - 2022 Bartosz Jablonski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d2a7d54..59357b9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. **The latest version** of SPF is **`20220113`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. **The latest version** of SPF is **`20220420`**. To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -106,7 +106,7 @@ Currently the following packages are available (see the `./packages` directory): set %SQL(select * from sashelp.class order by age); run; ``` -SHA256 digest for SQLinDS: DCAB62267B52822F416BA7E6713A696D843E8092A4E3A37DF06CBE1E1D5DAD11 +SHA256 digest for SQLinDS: 701B69BE71B99792803BCE7718ED486259310FFB92E6D77ED1BC029D9CC67B60 [Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") @@ -118,7 +118,7 @@ SHA256 digest for MacroCore: A23C29529F3CE7D0C8BEE9545C5D22D5B5594907547374A5135 - **DFA** (Dynamic Function Arrays)\[0.5\], contains set of macros and FCMP functions which implement: a dynamically allocated array, a stack, a fifo queue, an ordered stack, and a priority queue, run `%helpPackage(DFA,createDFArray)` to find examples. -SHA256 digest for DFA: 5F89AC6AE628EB27D87FF6A9D72A515FFA3FF6694D04DE0D9811BFFB81444ABB +SHA256 digest for DFA: 6B3FB0B06B47A7EF1BB004B483B0F39B8F553F7F16D02A7E24CDE388BBA704EA [Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") @@ -141,7 +141,7 @@ SHA256 digest for DFA: 5F89AC6AE628EB27D87FF6A9D72A515FFA3FF6694D04DE0D9811BFFB8 which = 1:H:2 ); ``` -SHA256 digest for macroArray: DAEB87654D99965BF2B7A6AB14626B3E617D0ABF526E77725DF89A1AB4C812C2 +SHA256 digest for macroArray: DF63B0E027827A82038F1C8422787A0BC569BA93104BA1778DB6DD088A5D255C [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") @@ -164,7 +164,7 @@ format x bool.; %zipLibrary(sashelp,libOut=work) ``` -SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B3228987B6F74857 +SHA256 digest for BasePlus: 12A9A2155D9C6F969DF0A66E3A18D0938B8194FA3AA9D70EDDE1CB71DEF9691E [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") @@ -173,12 +173,12 @@ SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B322 The dataset with functions can be shared between different operating systems and allows to generate macros on site without showing their code. -SHA256 digest for GSM: BE9508C8E37706B2EB2FBCA68B64F7DCF63C65E8E24775C92E28FE34E547893D +SHA256 digest for GSM: E6E2A6214EE7DC6E06AA76916A68B216DD7665184E63CF2C01F487A038E71B09 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) -SHA256 digest for dynMacroArray: 766DF3F330B87E99FAC32A00A569D9A45DA1157F591DE34DD0892CD864779409 +SHA256 digest for dynMacroArray: 7DA9BFDED37C18C4FB5BD7579A81A4B2578EEEF1546D1A3AB5C80DE07C88A615 ### ====== diff --git a/SPF/SPFinit.md b/SPF/SPFinit.md index bc5d72e..20a7ae3 100644 --- a/SPF/SPFinit.md +++ b/SPF/SPFinit.md @@ -21,7 +21,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20220113`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20220420`**. **To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -39,7 +39,7 @@ After assigning the directory do not change them when using the SPF since it may ## This is short help information for the `installPackage` macro -------------------------------------------------------------------------------------------- - Macro to install SAS packages, version `20220113` + Macro to install SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -108,7 +108,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `helpPackage` macro ------------------------------------------------------------------------------- - Macro to get help about SAS packages, version `20220113` + Macro to get help about SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -178,7 +178,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `loadPackage` macro ------------------------------------------------------------------------------- - Macro to *load* SAS packages, version `20220113` + Macro to *load* SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -251,7 +251,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `loadPackageS` macro ------------------------------------------------------------------------------- - Macro wrapper for the loadPackage macro, version `20220113` + Macro wrapper for the loadPackage macro, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -300,7 +300,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `unloadPackage` macro ------------------------------------------------------------------------------- - Macro to unload SAS packages, version `20220113` + Macro to unload SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -365,7 +365,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `listPackages` macro ----------------------------------------------------------------------------------------- - Macro to list available SAS packages, version `20220113` + Macro to list available SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -406,7 +406,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `verifyPackage` macro ------------------------------------------------------------------------------- - Macro to verify SAS package with it hash digest, version `20220113` + Macro to verify SAS package with it hash digest, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -460,7 +460,7 @@ filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages; ## This is short help information for the `previewPackage` macro ------------------------------------------------------------------------------- - Macro to get previwe of a SAS packages, version `20220113` + Macro to get previwe of a SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -527,7 +527,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `generatePackage` macro ------------------------------------------------------------------------------- - Macro to generate SAS packages, version `20220113` + Macro to generate SAS packages, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -703,7 +703,7 @@ All files have to have `.sas` extension. Other files are ignored. ## This is short help information for the `extendPackagesFileref` macro ----------------------------------------------------------------------------------------- - Macro to list directories pointed by 'packages' fileref, version `20220113` + Macro to list directories pointed by 'packages' fileref, version `20220420` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/SPFinit.sas b/SPF/SPFinit.sas index b6bf1ee..bab9f4c 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -12,7 +12,7 @@ /* */ /* Here is the official version: */ /* - Copyright (c) 2019 - 2021 Bartosz Jablonski (yabwon@gmail.com) + Copyright (c) 2019 - 2022 Bartosz Jablonski (yabwon@gmail.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20220113. + Version 20220420. See examples below. A SAS package is a zip file containing a group of files @@ -81,7 +81,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20220113. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20220420. Run %loadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -96,7 +96,7 @@ des = 'Macro to load SAS package, version 20220113. Run %loadPackage() for help %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20220113` #; + %put # Macro to *load* SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -191,8 +191,8 @@ des = 'Macro to load SAS package, version 20220113. Run %loadPackage() for help length packages $ 32767 p $ 4096; packages = resolve(symget("path")); if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */ - do i = 1 to countw(packages, "()", "QS"); - p = dequote(scan(packages, i, "()", "QS")); + do i = 1 to kcountw(packages, "()", "QS"); + p = dequote(kscanx(packages, i, "()", "QS")); exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip.")); if exists then leave; end; @@ -271,7 +271,7 @@ des = 'Macro to load SAS package, version 20220113. Run %loadPackage() for help */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20220113. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20220420. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -286,7 +286,7 @@ des = 'Macro to unload SAS package, version 20220113. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20220113` #; + %put # Macro to unload SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -372,8 +372,8 @@ des = 'Macro to unload SAS package, version 20220113. Run %unloadPackage() for h length packages $ 32767 p $ 4096; packages = resolve(symget("path")); if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */ - do i = 1 to countw(packages, "()", "QS"); - p = dequote(scan(packages, i, "()", "QS")); + do i = 1 to kcountw(packages, "()", "QS"); + p = dequote(kscanx(packages, i, "()", "QS")); exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip.")); if exists then leave; end; @@ -430,7 +430,7 @@ des = 'Macro to unload SAS package, version 20220113. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20220113. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20220420. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -445,7 +445,7 @@ des = 'Macro to get help about SAS package, version 20220113. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20220113` #; + %put # Macro to get help about SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -536,8 +536,8 @@ des = 'Macro to get help about SAS package, version 20220113. Run %helpPackage() length packages $ 32767 p $ 4096; packages = resolve(symget("path")); if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */ - do i = 1 to countw(packages, "()", "QS"); - p = dequote(scan(packages, i, "()", "QS")); + do i = 1 to kcountw(packages, "()", "QS"); + p = dequote(kscanx(packages, i, "()", "QS")); exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip.")); if exists then leave; end; @@ -575,7 +575,7 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20220113 */ +/* Macros to install SAS packages, version 20220420 */ /* A SAS package is a zip file containing a group of files with SAS code (macros, functions, data steps generating data, etc.) wrapped up together and %INCLUDEed by @@ -594,7 +594,7 @@ TODO: /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20220113. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20220420. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -609,7 +609,7 @@ des = 'Macro to install SAS package, version 20220113. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20220113` #; + %put # Macro to install SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -702,7 +702,7 @@ des = 'Macro to install SAS package, version 20220113. Run %%installPackage() fo /* in case the 'packages' fileref is multi-directory the first directory will be selected as a destination */ data _null_; /* get the firstPackagesPath */ - call symputX("firstPackagesPath", dequote(scan(pathname("packages"), 1, "()", "QS")) ,"L"); + call symputX("firstPackagesPath", dequote(kscanx(pathname("packages"), 1, "()", "QS")) ,"L"); run; %if %superq(sourcePath)= %then @@ -923,7 +923,7 @@ des = 'Macro to install SAS package, version 20220113. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20220113 + Version 20220420 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -943,7 +943,7 @@ des = 'Macro to install SAS package, version 20220113. Run %%installPackage() fo %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220113.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220420.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -958,7 +958,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE %put ### This is short help information for the `listPackages` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list available SAS packages, version `20220113` #; + %put # Macro to list available SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1023,8 +1023,8 @@ data _null_; if char(baseAll,1) ^= "(" then baseAll = quote(strip(baseAll)); /* for paths with spaces */ - do k = 1 to countw(baseAll, "()", "QS"); drop k; - base = dequote(scan(baseAll, k, "()", "QS")); + do k = 1 to kcountw(baseAll, "()", "QS"); drop k; + base = dequote(kscanx(baseAll, k, "()", "QS")); length folder $ 64 file $ 1024 folderRef fileRef $ 8; @@ -1051,7 +1051,7 @@ data _null_; fileId = dopen(fileRef); EOF = 0; - if fileId = 0 and lowcase(scan(folder, -1, ".")) = 'zip' then + if fileId = 0 and lowcase(kscanx(folder, -1, ".")) = 'zip' then do; file = catx('/',base, folder); @@ -1075,9 +1075,9 @@ data _null_; do until(EOF); input; - if strip(upcase(scan(_INFILE_,1,":"))) in ("PACKAGE" "TITLE" "VERSION" "AUTHOR" "MAINTAINER" "LICENSE") then + if strip(upcase(kscanx(_INFILE_,1,":"))) in ("PACKAGE" "TITLE" "VERSION" "AUTHOR" "MAINTAINER" "LICENSE") then do; - _INFILE_ = scan(_INFILE_,1,":") !! ":" !! scan(_INFILE_,2,":"); + _INFILE_ = kscanx(_INFILE_,1,":") !! ":" !! kscanx(_INFILE_,2,":"); putlog " * " _INFILE_; end; if strip(upcase(strip(_INFILE_))) =: "DESCRIPTION START:" then leave; @@ -1108,7 +1108,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20220113 + Version 20220420 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1141,7 +1141,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; if set to DEF then the !SASROOT/sasv9.cfg is used */ )/secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20220113. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20220420. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1156,7 +1156,7 @@ des = 'Macro to generate SAS packages, version 20220113. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20220113` #; + %put # Macro to generate SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1237,16 +1237,16 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 1024; infile &_DESCR_.; input; - select( strip(upcase(scan(_INFILE_, 1, ":"))) ); - when("PACKAGE") call symputX("packageName", scan(_INFILE_, 2, ":"),"L"); - when("VERSION") call symputX("packageVersion", scan(_INFILE_, 2, ":"),"L"); - when("AUTHOR") call symputX("packageAuthor", scan(_INFILE_, 2, ":"),"L"); - when("MAINTAINER") call symputX("packageMaintainer", scan(_INFILE_, 2, ":"),"L"); - when("TITLE") call symputX("packageTitle", scan(_INFILE_, 2, ":"),"L"); - when("ENCODING") call symputX("packageEncoding", scan(_INFILE_, 2, ":"),"L"); - when("LICENSE") call symputX("packageLicense", scan(_INFILE_, 2, ":"),"L"); - when("REQUIRED") call symputX("packageRequired", scan(_INFILE_, 2, ":"),"L"); - when("REQPACKAGES") call symputX("packageReqPackages", scan(_INFILE_, 2, ":"),"L"); + select( strip(upcase(kscanx(_INFILE_, 1, ":"))) ); + when("PACKAGE") call symputX("packageName", kscanx(_INFILE_, 2, ":"),"L"); + when("VERSION") call symputX("packageVersion", kscanx(_INFILE_, 2, ":"),"L"); + when("AUTHOR") call symputX("packageAuthor", kscanx(_INFILE_, 2, ":"),"L"); + when("MAINTAINER") call symputX("packageMaintainer", kscanx(_INFILE_, 2, ":"),"L"); + when("TITLE") call symputX("packageTitle", kscanx(_INFILE_, 2, ":"),"L"); + when("ENCODING") call symputX("packageEncoding", kscanx(_INFILE_, 2, ":"),"L"); + when("LICENSE") call symputX("packageLicense", kscanx(_INFILE_, 2, ":"),"L"); + when("REQUIRED") call symputX("packageRequired", kscanx(_INFILE_, 2, ":"),"L"); + when("REQPACKAGES") call symputX("packageReqPackages", kscanx(_INFILE_, 2, ":"),"L"); /* stop at the beginning of description */ when("DESCRIPTION START") stop; @@ -1513,8 +1513,8 @@ data &filesWithCodes.; put; _abort_ + 1; end; - order = scan(folder, 1, "_"); - type = scan(folder,-1, "_"); + order = kscanx(folder, 1, "_"); + type = kscanx(folder,-1, "_"); fileRef = "_%sysfunc(datetime(), hex6.)1"; rc = filename(fileRef, catx("/", base, folder)); @@ -1842,9 +1842,9 @@ data _null_; put ' LP.defineData("vers"); '; put ' LP.defineDone(); '; put ' do _N_ = 1 to countw(SYSloadedPackages); '; - put ' req = scan(SYSloadedPackages, _N_, " "); '; - put ' name = lowcase(strip(scan(req, 1, "("))); '; - put ' vers = input(compress(scan(req,-1, "("), ".", "KD"),best32.); '; + put ' req = kscanx(SYSloadedPackages, _N_, " "); '; + put ' name = lowcase(strip(kscanx(req, 1, "("))); '; + put ' vers = input(compress(kscanx(req,-1, "("), ".", "KD"),best32.); '; put ' _RC_ = LP.add(); '; put ' end; '; /* check if elements of the framework are available */ @@ -1853,8 +1853,8 @@ data _null_; put ' do req = ' / packageReqPackages / ' ; '; /* put ' req = compress(req, "(.)", "KDF"); ';*/ - put ' name = lowcase(strip(scan(req, 1, "("))); '; - put ' verR = input(compress(scan(req,-1, "("), ".", "KD"),best32.); vers = .; '; + put ' name = lowcase(strip(kscanx(req, 1, "("))); '; + put ' verR = input(compress(kscanx(req,-1, "("), ".", "KD"),best32.); vers = .; '; put ' LP_find = LP.find(); '; put ' if (LP_find ne 0) or (LP_find = 0 and . < vers < verR) then '; put ' do; '; @@ -1884,17 +1884,17 @@ data _null_; put ' LP.defineData("vers"); '; put ' LP.defineDone(); '; put ' do _N_ = 1 to countw(SYSloadedPackages); '; - put ' req = scan(SYSloadedPackages, _N_, " "); '; - put ' name = lowcase(strip(scan(req, 1, "("))); '; - put ' vers = input(compress(scan(req,-1, "("), ".", "KD"), best32.); '; + put ' req = kscanx(SYSloadedPackages, _N_, " "); '; + put ' name = lowcase(strip(kscanx(req, 1, "("))); '; + put ' vers = input(compress(kscanx(req,-1, "("), ".", "KD"), best32.); '; put ' _RC_ = LP.add(); '; put ' end; '; put ' missingPackagr = 0; '; put ' do req = ' / packageReqPackages / ' ; '; /* put ' req = compress(req, "(.)", "KDF"); ';*/ - put ' name = lowcase(strip(scan(req, 1, "("))); '; - put ' verR = input(compress(scan(req,-1, "("), ".", "KD"),best32.); vers = .; '; + put ' name = lowcase(strip(kscanx(req, 1, "("))); '; + put ' verR = input(compress(kscanx(req,-1, "("), ".", "KD"),best32.); vers = .; '; put ' LP_find = LP.find(); '; put ' if (LP_find ne 0) or (LP_find = 0 and . < vers < verR) then '; put ' do; '; @@ -1910,8 +1910,8 @@ data _null_; put ' put "ERROR: No package loaded!"; '; put ' call symputX("packageRequiredErrors", 1, "L"); '; put ' do req = ' / packageReqPackages / ' ; '; - put ' name = lowcase(strip(scan(req, 1, "("))); '; - put ' vers = input(compress(scan(req,-1, "("), ".", "KD"), best32.); '; + put ' name = lowcase(strip(kscanx(req, 1, "("))); '; + put ' vers = input(compress(kscanx(req,-1, "("), ".", "KD"), best32.); '; put ' put "ERROR: SAS package " req "is missing! Download/install it and" ; '; put ' put ''ERROR- use %loadPackage('' name ", requiredVersion = " vers ") to load it." ; '; put ' end ; '; @@ -2055,7 +2055,7 @@ data _null_; put ' end ; '; put " else "; put ' do; '; - put " stringPCKG = scan(substr(SYSloadedPackages, indexPCKG+1), 1, '#'); "; + put " stringPCKG = kscanx(substr(SYSloadedPackages, indexPCKG+1), 1, '#'); "; put ' SYSloadedPackages = compbl(tranwrd(SYSloadedPackages, strip(stringPCKG), "#")); '; put " SYSloadedPackages = catx('#', SYSloadedPackages, '&packageName.(&packageVersion.)'); "; put ' SYSloadedPackages = compbl(translate(SYSloadedPackages, " ", "#")); '; @@ -2334,7 +2334,7 @@ data _null_; put ' length req name $ 64; '; put ' put "NOTE-" / "NOTE: To unload additional required SAS packages execute: " / "NOTE-"; '; put ' do req = ' / packageReqPackages / ' ; '; - put ' name = strip(scan(req, 1, "(")); '; + put ' name = strip(kscanx(req, 1, "(")); '; put ' put '' %unloadPackage( '' name ")" ; '; put ' end ; '; put ' put "NOTE-" / "NOTE-"; stop; '; @@ -2555,7 +2555,7 @@ data _null_; put ' end ; '; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20220113 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20220420 *"; put "***";'; put 'run; ' /; @@ -2670,11 +2670,14 @@ options notes source; %put NOTE-# Creating package content. #; %put NOTE-######################################################; options nonotes nosource; +%local createPackageContentStatus; +%let createPackageContentStatus = 0; + data _null_; /* break if no data */ if NOBS = 0 then stop; - set &filesWithCodes. nobs = NOBS; + set &filesWithCodes. nobs = NOBS end = EOF; if (upcase(type) not in: ('TEST')); /* test files are not to be copied */ call execute(cat ('filename _SPFIN_ "', catx('/', base, folder, file), '";')); @@ -2692,7 +2695,10 @@ data _null_; call execute(' end ;'); call execute(' if ex then put "File " pathname "copied into the package with return code: " rc;'); - call execute(' else put "ERROR: File " pathname "NOT copied into the package!" ;'); + call execute(' else do;'); + call execute(' put "ERROR: File " pathname "NOT copied into the package!" ;'); + call execute(' call symputX("createPackageContentStatus",1,"L");'); + call execute(' end;'); call execute('run;'); /* test file content for help tags */ @@ -2708,6 +2714,7 @@ data _null_; call execute(' do; '); call execute(' put "ERROR: Unmatched or nested HELP tags in ' !! catx('/', folder, file) !! '! Line: " _N_; '); call execute(' put "ERROR- Aborting! "; '); + call execute(' call symputX("createPackageContentStatus",1,"L"); '); call execute(' abort; '); call execute(' end; '); call execute(' if (EOF and test=.) then put "WARNING: No HELP tags in the file ' !! catx('/', folder, file) !! '." ; '); @@ -2715,7 +2722,37 @@ data _null_; call execute('filename _SPFIN_ clear;'); call execute('filename _SPFOUT_ clear;'); + + if EOF then + do drivFile = + "packagemetadata", + "iceloadpackage ", + "description ", + "lazydata ", + "license ", + "preview ", + "unload ", + "load ", + "help " + ; + /* test if "driving" files exist */ + call execute(cats("filename _SPFOUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='", drivFile, ".sas';") ); + call execute('data _null_;'); + call execute(' pathname = pathname("_SPFIN_");'); + call execute(' ex = fexist("_SPFOUT_");'); + + call execute(' if not ex then do;'); + call execute(' put "ERROR: File ' !! strip(drivFile) !! '.sas DOES NOT EXIST in the package!" ;'); + call execute(' call symputX("createPackageContentStatus",1,"L"); '); + call execute(' end;'); + + call execute('run;'); + call execute('filename _SPFOUT_ clear;'); + + stop; + end; run; + options notes source; %put NOTE-######################################################; options ¬esSourceOptions.; @@ -2749,7 +2786,13 @@ filename &zipReferrence. clear; %end; /*+++++++++++++++++++++++*/ - +/* verify if there were errors while package content creation */ +%if %bquote(&createPackageContentStatus.) ne 0 %then + %do; + %put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **; + %put ERROR- ** NO TESTING WILL BE EXECUTED. **; + %GOTO NOTESTING; + %end; /* tests of package are executed by default */ %if %bquote(&testPackage.) ne Y %then @@ -2761,7 +2804,7 @@ filename &zipReferrence. clear; /* in case the packages macrovariable is multi-directory the first directory will be selected */ data _null_; - call symputX("packages", dequote(scan(resolve(symget("packages")), 1, "()", "QS")) ,"L"); + call symputX("packages", dequote(kscanx(resolve(symget("packages")), 1, "()", "QS")) ,"L"); run; /* check if systask is available */ @@ -2974,7 +3017,7 @@ data _null_; put '%previewPackage'"(&packageName.,*,"; put " path=&filesLocation.)" /; - /*check if package elements realy exists*/ + /*check if package elements realy exist*/ EOF = 0; do until(EOF); set &filesWithCodes. end = EOF; @@ -3332,7 +3375,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20220113. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20220420. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -3348,7 +3391,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20220113` #; + %put # Macro wrapper for the loadPackage macro, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -3434,7 +3477,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20220113. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20220420. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -3449,7 +3492,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220113. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20220113` #; + %put # Macro to verify SAS package with it hash digest, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -3525,8 +3568,8 @@ des = 'Macro to verify SAS package with the hash digest, version 20220113. Run % length packages $ 32767 p $ 4096; packages = resolve(symget("path")); if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */ - do i = 1 to countw(packages, "()", "QS"); - p = dequote(scan(packages, i, "()", "QS")); + do i = 1 to kcountw(packages, "()", "QS"); + p = dequote(kscanx(packages, i, "()", "QS")); exists + fileexist(catx("/", p, "%lowcase(&packageName.).zip")); if exists then leave; end; @@ -3619,7 +3662,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20220113. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20220113. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20220420. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -3634,7 +3677,7 @@ des = 'Macro to preview content of a SAS package, version 20220113. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get previwe of a SAS packages, version `20220113` #; + %put # Macro to get previwe of a SAS packages, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -3720,8 +3763,8 @@ des = 'Macro to preview content of a SAS package, version 20220113. Run %preview length packages $ 32767 p $ 4096; packages = resolve(symget("path")); if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */ - do i = 1 to countw(packages, "()", "QS"); - p = dequote(scan(packages, i, "()", "QS")); + do i = 1 to kcountw(packages, "()", "QS"); + p = dequote(kscanx(packages, i, "()", "QS")); exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip.")); if exists then leave; end; @@ -3761,7 +3804,7 @@ des = 'Macro to preview content of a SAS package, version 20220113. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20220113. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20220420. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -3777,7 +3820,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20220113 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20220113` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20220420` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/license.sas b/SPF/license.sas index 82335c8..8c0a3ea 100644 --- a/SPF/license.sas +++ b/SPF/license.sas @@ -1,4 +1,4 @@ -Copyright (c) 2019 - 2021 Bartosz Jablonski +Copyright (c) 2019 - 2022 Bartosz Jablonski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/README.md b/packages/README.md index a4a5192..f66ea8e 100644 --- a/packages/README.md +++ b/packages/README.md @@ -18,7 +18,7 @@ data class; WH = weight + height; run; ``` -SHA256 digest for SQLinDS: DCAB62267B52822F416BA7E6713A696D843E8092A4E3A37DF06CBE1E1D5DAD11 +SHA256 digest for SQLinDS: 701B69BE71B99792803BCE7718ED486259310FFB92E6D77ED1BC029D9CC67B60 [Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") @@ -59,7 +59,7 @@ data _null_; end; run; ``` -SHA256 digest for DFA: 5F89AC6AE628EB27D87FF6A9D72A515FFA3FF6694D04DE0D9811BFFB81444ABB +SHA256 digest for DFA: 6B3FB0B06B47A7EF1BB004B483B0F39B8F553F7F16D02A7E24CDE388BBA704EA [Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") @@ -84,7 +84,7 @@ SHA256 digest for DFA: 5F89AC6AE628EB27D87FF6A9D72A515FFA3FF6694D04DE0D9811BFFB8 which = 1:H:2 ); ``` -SHA256 digest for macroArray: DAEB87654D99965BF2B7A6AB14626B3E617D0ABF526E77725DF89A1AB4C812C2 +SHA256 digest for macroArray: DF63B0E027827A82038F1C8422787A0BC569BA93104BA1778DB6DD088A5D255C [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") @@ -108,7 +108,7 @@ format x bool.; %zipLibrary(sashelp,libOut=work) ``` -SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B3228987B6F74857 +SHA256 digest for BasePlus: 12A9A2155D9C6F969DF0A66E3A18D0938B8194FA3AA9D70EDDE1CB71DEF9691E [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") @@ -119,7 +119,7 @@ SHA256 digest for BasePlus: A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B322 The dataset with functions can be shared between different operating systems and allows to generate macros on site without showing their code. -SHA256 digest for GSM: BE9508C8E37706B2EB2FBCA68B64F7DCF63C65E8E24775C92E28FE34E547893D +SHA256 digest for GSM: E6E2A6214EE7DC6E06AA76916A68B216DD7665184E63CF2C01F487A038E71B09 [Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") @@ -127,6 +127,6 @@ SHA256 digest for GSM: BE9508C8E37706B2EB2FBCA68B64F7DCF63C65E8E24775C92E28FE34E - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) -SHA256 digest for dynMacroArray: 766DF3F330B87E99FAC32A00A569D9A45DA1157F591DE34DD0892CD864779409 +SHA256 digest for dynMacroArray: 7DA9BFDED37C18C4FB5BD7579A81A4B2578EEEF1546D1A3AB5C80DE07C88A615 --- diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 880f41d..ad126d9 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,11 @@ +/* 20220420 */ +BasePlus: 12A9A2155D9C6F969DF0A66E3A18D0938B8194FA3AA9D70EDDE1CB71DEF9691E +DFA: 6B3FB0B06B47A7EF1BB004B483B0F39B8F553F7F16D02A7E24CDE388BBA704EA +dynMacroArray: 7DA9BFDED37C18C4FB5BD7579A81A4B2578EEEF1546D1A3AB5C80DE07C88A615 +GSM: E6E2A6214EE7DC6E06AA76916A68B216DD7665184E63CF2C01F487A038E71B09 +macroArray: DF63B0E027827A82038F1C8422787A0BC569BA93104BA1778DB6DD088A5D255C +SQLinDS: 701B69BE71B99792803BCE7718ED486259310FFB92E6D77ED1BC029D9CC67B60 + /* 20220406 */ GSM: BE9508C8E37706B2EB2FBCA68B64F7DCF63C65E8E24775C92E28FE34E547893D diff --git a/packages/baseplus.md b/packages/baseplus.md index 9176e94..6095908 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -250,10 +250,10 @@ Package contains: -*SAS package generated by generatePackage, version 20220113* +*SAS package generated by generatePackage, version 20220420* The SHA256 hash digest for package BasePlus: -`A60A300E083628C65DD6899E7EF95588916F8F66B6A25B32B3228987B6F74857` +`12A9A2155D9C6F969DF0A66E3A18D0938B8194FA3AA9D70EDDE1CB71DEF9691E` --- # Content description ############################################################################################ diff --git a/packages/baseplus.zip b/packages/baseplus.zip index c21e07876b3d147a51ce1d527a998ac905f32782..f8b73854bd89f8fb6ac6e2139f3c1d518367bc8d 100644 GIT binary patch delta 8411 zcmZu$1ymJXyFSCAySuw2q(hMIPU!~ekd7nWNC<~UL8Ke$4gu*B5JXZWln^9DxQD~H z{{QpdJBzh==H1Wp?DyS!_MDm7TZ@Pri-=g7DquuH5D0_{60Ut&hoyrIhW&4_Ms7iX z18Oua01iCS{~(~jnskL~%`ke?{IG-|+UU-{?P?K?{I8dsy`(~;^(*xF7dO}J#I5b# zqiro5CiGfZV`6pL(8S>*Sxt)APx#gi2{y^_$Zt#Z@5FjmsEl-G;n}Kz^}(dI6=B$HOO4Ykohe_|Muk?gmeQp zIy#z%wCr_W2+38RgrB20E$P)9CD72T@Af84dLRXx*d2QqX#r1~Kb|P>%8^y0@y0kE*k~YDbK9q2>^C z7FCY3yYmTsl3JWQr?@;4!6%5w#j|4e&7&)`gR(^{( z@rh?p8xI;~Q2nuIh{?EX6yy~|3r^B3FE zNuM7e^BgE?7bO`~6eU?UD)g%08(nU#{QjV`y;IhUqrTa8vR3W#?BPz-p{jt{1mIOmHK;d2m(ky#NXO_*k=k#4r{8(~hG zX3ETJxHo;s#+jgZ?7AVWXv5vv8-K4Ekeg+ZQ;jkPEx#dje$xgw?kKZtlmyp^9`%XD(Cu?KTe z3~AdCP{^=pGmpzLKTv)fyEQOjw~b%O6RPeLs{R_G+n(g2Q!{jF#vM&7;xPt6@aU5@ zXDU8yoe0fP(;=IPX^1ltK{T7LLsRXLWvXbF9 z+q+0*kwYC_7}7|Nkv6rbaY_Pq2@dMLgZaVe22vdH>0|>b6RQRGTkbQi}DlVl{h>@5wf1NT|6nO~`GsR-&Dk^WZa)b|g(D zcm4A6GXX$L#|p`q)Ot2(O=lOkDDY3K5vlhu@~a6mDciJ= z(}o+|l_4H#h0M(+I@Pc1K5{vWt)+$oJ`$Kb-UpfwmyWFm3aX`i42QS{*{c|+i$XG&Aqv$4GETY;pAyG7pN_;9ggszMpT|vqlj7pyqSat`;hb}rA z-pz!f>9EKd+y1&3`6#XQvk&iJ@k(u^z1-3yL1jLIW|oE&`tiY)IQ>2i#K{$np)7H} z*8xKKk@3^Ec|&;7()w$pkNz!mI*zLW&Goldox2tE5cZ_ESSS=&@aOhs4Ryx&mCf6WB~?CFD=cnTT*tfBl-QZ6X%oKhU3)!Z()H{T}MzV|sp zU!}O+Z5SxAL{hEY&32T$p|<|{X)5`2hW}XP!hZszsW-ZKCk+<`@v})syKokE^zb=p z!85VX*rIXxNp=g(vyxM9IP(j0GR6J2ND5U33=o6+5>_tIWbk}`98>KUq2Tkqh;ra3 zr8*Ctp`&B?wmk0wNi1F1e{J0BE>Tc;c}Xc3hFm0vFUld+9f6F(d=R+8fN4rc`Krfy z4C64Fg!r*V_N($)NLunhCc!yjFE4femmnIPp-r6&Oofsmmb053H1p|2i?3|5gkB%= zrzHK>XOlk%4lk|^a+8O2VASs5P?BeQUkDvUQr?WL6Q-53LhAXtAKixJ$g@xgZtqc;zDSW)EO1X&FnM z1V!!nyvdd_oVs1U#BtXXkj^H5ZXTQUa^y&+0 zgu{6ugw;sl<*qq_k4~G;<{3pXPpK z4;dxPy{L8PAr*@jreRsP%wRIXf?cF$iMLHS#V1vPfis9=HLL1*5M=c9zdZ~RU8 z@DiN{aEl?0DBz{y=ohjADO;L68FRi$m>&m(zQ`gL%cutNwm>`x$V%KJ-yd37sIw!Y zU_B38Tl23(-C`8ZELBw-sK-f>id=j2;ci`~7m4rS`%pXMa`3PF@DF_$Ik#=vgZGT(1J}T{Ti|wQQ{` zUSFHDpQ)kQA^)E(xh>$gO6(XTF#aiVku<&pCA%d>!#}RZ;dv3g&`D3~I{xiM3C2MQ zzb#Vj%R%{6Mnp)k8{Vd0TIx%p$J)dcO6()7+gA4Mj!hgH1xtS{xSvv5U|-;5IC8P3 z*TqLcio2DzNdhIeKNslUme@U)5m(|SpL&!|5y%~^Y%PK#i*co*#sJD+oc(cxkr(;W z=TTk5)BacIv3iQaNtUnExyqV~E22KksMqSqi;1i}4JR=!s0U}|*4y++$g1a!lxe>6 ziPI_I^v_at^b}ym zl94ZDtP?>LSNjUpS6et!lB*b_{^{;XGt~@7a=vuH_hd%e1;tcRPQ)g8?s z&OhrB(n`5aC(g@w1nkkeEFS5mA$+%Uc%G)8x%h zNz)}aX2{pZhu93Zb7=YqZU5RO_?-FR<+-ZLhrP$2@cbFo`(j^r`UpFI-4dxV22KGnrXaaYA*IUQw0ru-T{^Po> zLo?!RL!1iFuCc3fbcfz-ZmuQAw3EIt25s8^)t7E z+B3`7-r&agW>oN#*4u6~$@$e9ReR{=GEoJTd)Pf%+1_w+&*$d9&j{#uZ^yd(eCYM@ zY4r@8kT(3A3Cvr|Auny(wD?eF7X%^S?AfW=mDyC)w5-4`-uJ}4Rdtl3jdZg#5CiUz zl)5?sR5b#ngP)a+93!9JeXUjqa#C9Rx;Zk`;8BB;KU%2OFzwtURU2pF87y=|l2AWS z7sPA^@*%$q)IKBg`V;8>hcHH!VXFN%$+41y+yEIu z2y$n9j$8Pu1$RFU`-75;dU{7? zn$ICjb}x7H_m@{cDA_w3tMxI(at_5+azPplQN|F()|y-eFAR9j4DyB46n@v^T%oUs z)UrMc7c}Pfh;XqEb=q*Nzmby}`u5D768R>cc%ViKc}>&sGG$*XFz8R&&kbzlhX;9* zLy>ve!*pZsCp^7We&T-Vg0(BONu9_3y${?_a^T`TVr27(S_w*-Tr#!RnSN2v?*oi@tS00m7 zZ`(g{{2)7apS5Xm{k0BqEl6p^?@9br=fd8^8D+ioXXi_ZFi`YGU`?hQ<^4>(Ox$yv za0yau4}Ac_v&foelHb|fIY72R*WP4m-DWpbIxbZ?=(LjA|S`mdX5YLxA+V7k??@2zF`N44d zi_ga^PaGnhOuH7LgL&LOwq#x#D&nS`RjkAXTG{(2?Vi0XrYFI5Z`4*Ox1ZLnK~{?V zW~Lb@zB-8|R%Z8X?xDMIT-# zpwD}3OC)`>Xi{h2<4i-&6Cd8E!U;&Ocki=fFuD9KoE;0EpLiXCPSa>@??Fh{7sG8p zGnBUM!JN4$V#A6-pxa_bOn*R0K7hzAT33Q7M%m~qVR9%AO+`EH-gkremMCQ=xG;J` z-+UGcL-HR0tCx&%jz@Xsxf4{Q_PV3-^I-ZJvQ}3PgF6wD(;fdP zW%Sh7i0J5XG|Ce{O)PuST-)_Z@|)6rnuenx?G|bg4D?R4r>9Zc>_k`S*n0A{?CFKn zo?yQz`6EqhRGcS+IAvcU(aQ54xEv`Si87m>Z2B0(NM=q_*i~j9(h_Hp)S7@N_4C@P z&PQB|^;n9jRT-%c?}rx)X9z_;XMe@&EYb0oSGX=KixW>G(KO>RhQwUy@0Q43D~(8| zgZ+-UxBP)YxlUap8_<^M8q-VYgJRGE^k%4=b<9cn)H$0nLhA}Lrs~ArMMA45Xk7lP zQWveM!9gr^+55<2i$-U_yBFUeU&dx9%Q>;!r^F_MR)yIZU+_sVbzbL){SIouv{Z`G z6q%e(l-69qhy#h{C;y2(SLQOzR`HGOCFQtxY(a^A8f@3f=vhCKIn)WqGp>zscHb%* z(0vXVK4d#-mkz0cM4#%ssY#ySRGnqm8=){5*Eg!RQPN@d{H;-L$MImn{@9yXvcFJ% z?vN?Rup8=J{-Hg4;qoJSGnAenz?9c&)(x>ml1PbY;FsDHcE#3VmSem2C3XkhO){IR z85)~P?aa)Sz`$uCyNcS@jBFEh7Ohk#D7$B3I=UeKqZ!pph(5n|SDA#sO;Vk}zh@WBQ|a<^VMysm2?JPy z`uoU$oF43zK&|?=W4lIOr&h6HWX=!+`xZ>VZl#isTF6tv@nyHqv?U6>T0Y}+{QE5S z9iu|@A_02RCtBoJp?mP*d_@o8iD( z5O)+&oAWc4WCg1l`WZnpdsEW9>9^JT5;#j?U%K^fWXT|}`i+g2e>@l{&`&`QdHuLs z^(deSudO}}BB|4DvXKA7ac)jPj^yZbuUBxNm${=12AW2n+iGDc<@HC8@z)UaTL}Y| z2{)$?V(z@HV`n8N1SPNHC3a*Svaa{$w{0+m%-P)>A63cK>FkiNHfdaU zeNUf^CNmY`kavxEq0rxwVBT3WIiwnLBLpdWZymc;1=-CRo36^q(XPXaB$6W+8fD^q z>l-#?xbcbfm;rgi&%LXdg+Vd6U=ROrwTY5{qqFwCA{9GVjC}o1Q<=^sxx zoC)M;j!zy+m<{c?SlWs&cpVB4FyO@or-|U$Bfe8xd)s= z1@~Y=OdP(|QG_LZAHbEz$ANR1^d#>$LF|o@?}58z6biiQ(jkKs4pKu8@0%iG7%||H zinM-oIPl2NxR0QhSKsfUv{w$?gRq*n_kg3m>>eyM7T*I%bMigFZ;QMK*&R#wz^D7$ zJ+SPf0K>b03<}(X=3!zmSOiw+)F{tA08hpM@JP~B#62LI`G>V;LH}0Vy^-eEe;gNfV42U5w7zFZmb#}9~`TunAuTd}^BR&NP zgz=Yf8%j@ctD(1S|RJ%X!^U7xcfgEg|-TxnNs0$51fnfarI!yx*LtoJV zcr@P0~=oAgW3Ll`~cTy^$dnp$!fJb{LRT6t;af$>2y}|$A z(r&SPsyB=ZH;APLD8M&TpfoCJYL5RsSpIY}$K$Z>?c_lq*yzBI`*Hy25iP(3&(kjB zo6|2?XP2X4b6s~!$o35s#n3V znO0>7fk^%mRC>?`&KZgxE?O(NN_uWy+ zp|?!`q_Iakcd-qlw!x@$e^K2B@2P6c01EaF zzQ9P;FcSS=e!b8sW`Gw?n(AjRe+0V?*uaRCf00h1v@8I}-7N>I&H^h9G6kh$0mz^c zEU?ve=kKICwLbxq-Q5fRUR}u0Mi$uWx|4o^Nx?Mppfrhj@(2H39Cr>pk~~hgFb4_P zW&F2;@ggWKV38bZ#tLA!Gg%CcWd&H_ofo&g$Zv+t*AQ&UQ2mv6HFSy<;Dn2A zVIpwj7AVc)D;ZRf4YpqIQc`AvMWw#pMgLx}cPX*!;xebgQp$xD_4le8hSsscR@I%u zGRy&Z13hQ^Cz;aNIHnp{4WD2N`oEH~gG#XfGt#8MUdjm=1WLvQfnaw|_;J4!oXM}an{1@rnCG-V5Km@&F2Wa3)P;$V^sJjNGOBme*a1E3MiQ-upgLx%r{S)$b= zApk9=HV^?^v2Kts;axh1$Muie6TERnA=M=Dj$hP+YlO3BY8pPa%9l)VQth}n3uOuj zt)Lukdv%*v3WTDWRpToZV^yuE3$1^N>YHtnOE(WNiB9o>f)4rX|iqK{9WsE4SsX8y#cB2eu5irkHY zOG|mPJ*0qF^kJZk7r*5(UeXrb0xe`&?Dn9$uu`=lc5ZsU3{T*o5nS?qWQ%h;>a7l* zkwMDbL5+UTE7{M#zP`RHpfftXoG6!9UpA&#I}o)I@ThuB7XOJicG(v@5p&Irm~H^A z+knw!mp~*@g+}(_0e^k(DvtfooJ?uiAucCbt-mH)TG0~M?+pSZWE>$8J&Xnj7pvTQ z(9(24)$G;67yB&t=8Ut;ZX{rFnGFy9qIS@TRh*@F>1|0zLpqp0DLZB^jtESlhNP}a zBp=qXQ!e|tI3ucFM0C4$^xT;`s-kC|q>fvur)ePC=N0J4v{Rr$tLL#zPbXDRXQUV_ zmWO@%Ow|EZPdDH4bUj8-y9g&FWn|KaOi5Y1&b{gJS^QD|Y?}l(9l_#{#+l!FFP4Ic z1|!s1oS=#`s%|yq50v=8>ABBK+!6&E6pLm=e1nduNK?%;qr>P3s_JSvQ4E$QuC-Ea z6xb5$j6rrU*NkZ`T#b94(<@IchpD>r3N$p$6BAFhuSQn_8E4bTyPo($$R&(&Jo<(D zXCG!2m$D88GD*)&Hn1y>HB65ZWf*4~E(}>aIBm}FvZNWuedX~BE$gp<_La}M_S?)U zxXx4qEjQnDtIuZDfh&E*#5p2S>)cV&%}&HcZ<2wvT&Rk3AUSMW%9aZJM7qn`88!VA zu>jsb{>?jQ;=3ObTKB1@E zWOyTLnS@&eRw(chsY^w%^5z=LEZZ|kr+)6)+hZgz$c5No`+-GXl153w0PFX@eWPMvfc2lbf}_@gsp_#Ncx2p-h?hsLMUTQQHsuL2LXUlHoefi-Q>(!*0cX#X{^AFL&n5$XbvpFgBSM z1@=AUnse1&maDbv=a6#xg?IAP^)WnMat*PTT4j6qm`mrujEz^Vk&yCY#^5E*MkG;v zzBEH!@icY-#{+tUlW>OP<}(cWmx?ep3{;Fh-CrJ>&6#aZ&fdS5Zo;Bo3V*QVD(K(T z2PC1q$S*cBBPM`+J~n(oK9$8gHvBXwhk6>otydW$@L&*KItfoed@8FXL_5qLu(d_1 z^I%iy(KdeD8AbOBf!my5aG&H{u`Tf|c~UF*2E|GB%Ex71dN~ghjGPxG)En0yOmZq0z(0jM59;fwAfk4o(Jl24le+LtQmAVfPzbVDQ+J&K+&zy~7CS>Ec$)E&5+?J{?k9 z|1H-9HxeF*iE0NwN$5WM6+YkcM;`IBCG=VhJ(`@Kpz@#jR`Z6`Y6u*-a(a#5-KEL9qdoTD|=`KV?cG9_;8(xJz{_A;FVLE|9ul&*F`$ zG+Hahm*|@Dc`f~*QYbIcHWFu&ZPa1;MRAH|Z&Owq8!@4gbTN8~U9~z-GMx65j z@_1snT;^}or*y6k&L}=ig@)!q%i7j|u0Q0PMx#s4)RY4exSt%H^mvUg5nRx&ASOde zyM1)$(D#x&EwPK(oisrr=33GH-Fd`E{FFGZM;7euLp;q40q#oA*G386qvfthYl$;k zp#-$lmqQ3oe5KrZD2CR+!jC@WJ{d8uc_R0MWdl0$vo$y%#xFP^5vRc9gK}s-+ETOUrL)iJY57X^a1i7w@5GXPCS|U8@ySuC zm@*jkrX}kJMPHXGuLvlnI*_-TNiP0+nQUcJ%aV^C^d)5l*fH=}FPbLunU};eQFTY> z*)D|fM=kms%_{U4xj+oi9Ol)`n5fNP zY;O2$%pge&D8F4~t4TY^`3bW&nz|hM9N<)$5~X9SGQ5kSJC6rC{C#u1&CK-51(Wd-zA#wmI>jDWa`TMwhgbejYa zL_PiqXHf#BH%JP`aKe=Ou9~Y*b7);zw6#1r=Mexq23}@Q zgp9_Uw;YWbOTV2YS~b*oYz?b_5sAL*l!#;^Yl*krR0=Uqxy19<2~o24uAv?(cGe4p z&HujQyl%#6aSDFHr?e`4_OTc#tvCk~hZTBD6U`F#64~H0mG-s~U|R)cn~b5fKXfYO z*NMhBzUkw=%9g}lHKLKy`SABu-hLn7QC}n$o=2dGak?_$b5rsjIQciWzE%P20aOj` znU&>!Po0qoM2m7L8v>cFtK#zFqn`457UbA`d43T$Uw0bc4O|O^yee9I^OW)n#Ma<4 zQs;H`nf$_y>iaZp8!r)n-1$O5_(8lJgMQbmB7N6 zpsYT`+I6#$-s7+F-Wea=a^FVx2*R(ML;?2ERD6M*4_=?!WmOYiPj+VAbnP2EvUwFz zDMv^~vZR59esq=ZF8hGTBy*PGE7B%M-W1+NiOlWOUbEd;iy$0QSFiL+-bgP$#d_aE zo1A>|-3;z1luUUGKRzM7@MP1PSy-@ca%E=@BNgtEg1ztnxvqy7mzN2586>rtFm+rX z7rC}R{*96+2^bGQdbBsbOysS;y7v>_2lNs}8q)9Rws`^~pLPlHzOWYNwYH`lmm&2P z!%Z-kT@LZ>neprzt1C86jmvnbyD|4folpIHq6BU!@o)p_0bN)kcB~rM1Y5bdcxnE-S5bvV_3w$x|Mh}V2JyrW<_wQHe zgX|Gj3?6~yE4boM$C65|tVzo#@t(Axud%yIkzIJdkq)MM=0qp? zM;Fqh1#8@G_@!aRM9Y@lyE)(7rIi>=!qYM^8oo9p>XMQpF|tl*PS-|*n*PTW0aGy#*9CJe_l*D_ur0nm<|?yL?u))aYO3K zZijIG$ga$g^sYWvGfit9%*ex?x2a=EWfk&j5$GmsE2{$a*D#FJwJ15&THEiSEC;+} z9y$VTf|Ms8P7WNonDg;B-gsXh*ni(=4}C-ER9={g z5X)gb>?Uv&{ll^`L>YfX6Qmu3(hJ!#QbLzm`x*HB_~cSrsj8(VW^X;PsfjxKOTPpO z5@^P@5hwj2qmb}hIUKdx{Vv*q4XPRJn&0dvZ_rm!IS5ihpX~2tiM7VjSb7Eitit=# z2s-n-xos7v1kvK+`T1P*TT8NOfAB=(k7s8+ro6G%3?LezqkUPiv&l#FOp+U7KfEt) zHQLwF^23y%19E;sBLDSUshbz%VmC7;+Q)LZN8oUi*)-T*Z3DDBN@}h6^3l(f-~kbh>;vv8aT<#1Vpd*mz&vuZ+yc(1 z*kStv6CU$m2TQzH%T7&~3XD@5?&cu0YvN%St+zM~(2v#xe$p>v9Hl)>=VfKlzGB-{ zR)UEeQp86LZ5%CVLG>dFBcBU6^8+{Qu~l8FDUCw$?1>yKYTj-945oY;2#G2go$qm) zsymw!wG^f@!^H`79uFZbcctlC6`NqRRSUd+`DF0#Z38Bi( z+S8{}9n$t`B$I=@pw=BB5f$CeB8DDgqg$J&?#Yt>cWkxvQXO0s? zN7tU96(1UU9(d{2W=V@!8ZyVNCbE<}*shuO+aPhZdGQQ?Q8|hh~=IiVXMMpKV{s};XS4E7yKMx(mWm44`^KR z8}E(QYxJ+;iuAi_ap15P93l4zql=ZGpj;;F??HN^vuwm~EE=vFY6?}M5?QK{ zsr>$%p?tR+-ZL?KddLpFLe<`z4p%R5({B(G`qG?jzextY>sL<0-fyRk&VA1{>OD3) zVHS^<-6aZ`BP8Zrw~w&7X;dM7!lZH#zF)5~$ ziWze&!=`i+MqokKYKzkS+JPAU@h6TS8*)IcP-_|uYUn~&W+TNW2B<=B>B7X!uVTNUPP=Q%r=;d%YWM57ao73RgS1f^LaMVrA zkVWC%$5Vjh_eY`ciuN%o(f}N7o)&H}2C_CXjs(;Fn_zS{)M3{kmVkoBg_1kq@7rK#R8u=q0c`DrmuV^`#G|eFF7NYF>Xa2$YRXH(ucO6 z&O8fXo_Wdf&L%2~hf_Unyv)vY+)teFg?npOT6OQTH=Z>r>;%2SDe<*NXIB2T+rvQA zKhH8rWzwfq^L@}{N|E)Dd`6#Q{YF}XoMX3_b}J0C_CaJR@`eX$SXcb;;;msU*kdY5 z=4_FkMD<|w3Py-R_Ex%ruBqJWYAWb`v1j4qWO`LrBccb|0hAfAq4iY^vk}=$qY+9U zaA@3=S?>mkmblN*mLqEsPL-t2pgl|150W57!aNdLmXIf2;iNs0HmcWUVaHGN*y2p3 zR?kQ-OdyOcQ}SpWg0a0@E(M!}7i+q@u%u)z!?DD7)3*u5Gb;TjhDaGKy_LO$hF`6S zVZMC@oL@_PG91c^zmlYmY)1e;+_tw(2D9k`UZv*f#JUnXEuVP8bVt~G#)pl%wqBGz zO-Uj2^Bd)}DXDBoPJ4#MrXBx^oYVDv64oSEq=b zPTS?iZc)0u>B4c6fpL3Akx99$Kk}CCma54ZjJAr&L9+^HqgcCDda0)1#i^cCB)T1W zO$>;u6xHP^){OIWTNm+(3Y)iQQC%UNkGjUd`d$@(3QQdI&goR2LhRk4?_B7SPLOl46)=Xpo*R_+ z1HBlpgEOq7X1ixgv2%r$v~k+MA@n7{x)!TE$KJZF{fdj5=JwFvJHH(By@NL- zyZnl4zc7u8t9xSKZec7*74pls=Ah_T*>Emj-KIl>2gESRl8bI4dhhuA2#XEyYKjEn z^|4NEir0~BV*K+Ld?$rQ^X`jP@~mNQOCEfUok3Kz}_m-mSPP#nKY^D>sxLDkYq>5yL#8(vT3o6w)I;wC`yK)^0J0?dOtL>viR-Jzq z0Ckcath8N(X5wgXUFnejIjvp#n0?w##pHq6LQfSrQD?V&+a>3HurVn>i={`?myVo@o@s@rA13+&$nF&AJBz5|W6sj$CZH z`vyEkB76jwN%ztHDTuW(+C6Zz2t`M9o!KT+AZx-8NMeKb(GcKGI5Rc^6eVSFH!L1V~0NNJk62ktE!_rR>38W~|2 z&?RyYKKGK{gQ0%@djK2`2O>C8Bfv` z7&UBacIkecFAK=`$+fLU+_GnHJ)gCOCzwX_$pxSgmazqxd=z!G7);xfOKprZte~(W*I{=V~0sx@m0RWVLImkeV=z#19 zhl@K0I?+1^(gaOWRQ!K)fy&Us32hPx0#t0091nxb7=u32k8jvLQs9ccL9ADkG4K?rwbwJdt^t z51$urVgLX>HUCc(0@Y*$a^9^ss6QiI8>j;lkO|>vybH1pgm05Ac+#YQIhI2!n1IX-cd^oA zrde3RNuS}QyXALx-6!Z#0Z53gAcbNw191?3eQA%>tl`uz|KUdq6=nu9BO)|rh6nKt z>ctFXMBJyt?~z>Vpge7~#k&Bk^!LFMa92&Z>)*vfO=kJ0Ry-_lllM(f0ahSI zLQ4|{^d$=r2Vw7X*JIa$=z*5A07>cZJfmfiJ`KP<1L2cEk4WiXN$IrTQEC5cBwO^~ z&ws&Hjc^siUn*B9KP!+QVO=hGyW9;YdHe^dxcAPQDq*1)ll%WK^t*rp&_@{-;i_`D zit#V&j(&s+y2%P8Lrlm>2Wznu5dLt3)8V@qaotbI=@1}+aF_-v#r99~YHaY;5Hxbv zN+IC*--`Q6ZDe~0Zglr3`FopUj6r4Dfn?A=HXtFQlJjsgB!-FmRswb)A!5$?AMwBX z12>R{?}5J!OrSFC@O=)?4*H56E-jqBmuCJ;n%@|cSqGog9{7IydmC3mhuDGK2^2w3Ccv~+lee{axl z&ojyNKO zQCXW??uky~o3)#B@d9r7D(==^UvTLdD3(Q1@N@{jKXR%|X`bU_Q~>1@)5-y4QO{@j0jh_gZ>p3`l_Yf(pvez)I` z``{Av$&#k)MApX?O3?n!=k(W-`EBXp*Z0n`{N{5j*HwpoKibXQGI^NsKWijgw3OzS zQxfxhgpsIBQ6j#YE6zTU`Q06nravadbqgc zA>R6X7`Wz5;h+z0$ZfA`F!ciEHk(M!_g7(T8Z`k>eTh^pM(_JbxuR zMy=5oDiVwGjr~z$I&=uZu)=k=LF$|n0hCDl9A}<&#g-HOpSa#FxkK@lxSK-}KGFCz z7(j2oK2{6mB4rLvVk1yqK#RxK2xciIo@)_T*!caAUwt3>BlF$Rpa8Zdq@4e zNvU9mx#TK~seIbLu~3oC!I3W3&wG-SC%o2nKCr`_iTrXZ0jMr0u{dB7plHBdo5wmz3@WYkHy#9^&VyYD$v%-&r& z*~@u4(0YK53#{R964_c#MdJbbM3>1X;%L}x>fj-E(4;Gi>VK83hg|^!ho)svnbEIObITicU^eTaS+E#mwV0t&v+i#?CH?S%U0vV zGxZR;uz~0yLO)*1L)2yzZdbn*r_@H8HcpWPeVcjuFb z2?=LoPsF}??~E>?z+HX}J3c$T+TOKEE|pwW_kLQE5`f9G+mFh>{JQFt@mWw}=yVB4 zY5grtlyTAFV`ImXu&7U0TN+z&S5}K*`=%kwPR&S~quvp@9EHQnVRwxQ`(zUXweNfR zQ`+-1*^P}2t<4+(P^A|>RIk#`?V>iMckoe@^M6gYfBvX6v}K6Ph5r{vs5oXuAMseh+RRK@uOw@1ys(=(8~eP)^wyg%oQAPCNo{LAO;opyPXFP71KJC;qK_b)q9J-m5u?4>vrb3aR_h7N=cKTq47-2~Ird56n2rFKQF; z`Nb;w)XV+Fm`~raiFunMW;47`w}vUAliHrQ|MsKJHtCXGQTbZB2u0>pBeAkfo=gh% z1$^aD8DpT(Y^OWrNySKNdP}vWWXp=#^>eT+q+iJ#ilLRjyvdS9q>+&yuE@UTcXfi#32 zWj(eV`fTlHHmxd13segC$ZPxJR`zQNADVg>xx*4*9K99g_;U_n&fmTedxUc>mhvM{4}z28e>WP;d6P6iLz zIU2I+<%AXVa--%y_p!pR#?0+Nx7FHNv+%8rr%=l8n!pa%Mc&NA8;#$&HHmF5ggzNR zTb^$x8+JyrHKC|c-{Mom*tp0$Gy|^r(;*OP^urBj`vXs)933Bqt0IOmE1H)a8A&2r znF^TljW?bS{zD$=rktiD&?^Ru3h9~OZX?vb+#b;%QGIKxaPbivjLYVv~v90UKD6dKf=4q> zTsAVmrp}!n54MTqs!6YhghgR-un8F6g~p4q;`?JS;+o`#!GjHA=9i6CMxXeC|B z)X@La{VWP2k0m0%#FS1~J6&yW9V#!+!sG-7iq2%A2CwwTvpXkS&cCS7A%2@Rg!-Bj zyeBCJRL1xtGy$78>Z*l7fh+`W5>;|^bQlLu4zbi-FyY{cLV_o~$am+>llHtZj4J+)7L@YOti-wNOvttnCPHhPEyY;~UY8 ziwOE%xs{O4!~7g?D-o0KFa(SdFyOAjNXUQA==6~IB%Rz(CZC*O$QE;q9f0?G-8~cS zjL9b228k7tOHP(1_{^}*p&_%FCm>@6m-9h~#bdi@LIg3QHnN9lt+QTwvCe(RQev8% zBlmVugz+*utjiw(90+64=k+0nQM+C_%8(nNZFP|GQT@dAvwgoi*&|6@ ztoCPClR4h|Xa#t3TtH*nRK9ibl1?q8%G^NnJ;cY=v za%26KU!17F#=?vPd{&!flgRBM5HmzSJNWvj4W-||zl11LImL4ivMzZ~6=AV*#YEKi zRFULNoP&eDdGSqzo~`&x7`4t%aFbMlx!Eyrk zyl|^-8O2V>K#10|a{6f$6tnpsfLqF_B7I@>1hXy`V!j#a` zv)FK9f2D(|sB@y*>l8}b*#d5sUG0*K5m0Kb0ta?yZf?c2j4TWVJMufis$H!#V>^GP z)Av!^ve2x^#PC7NCKOdPtj5#y zKD;?-JhGxzg?3pIE5lo2{tXtyhtYiv{KjX%n^6weyIF|9%g( zGtkZDr<3yNKrmcTXHYKlaJzF-LHx%uj{eXgqgHQPLk#tp&AAh}+sV2k%j_klISz@4 zs$H(XN3FquWMYOG@9~gmP}2o`>2S|_MT~J@k82u__KGy*_@HygbH|$A_b8)YQpFa~ zV(TxGjYCk*`}Bw&S0=(IM@0Q8js@vU=A-lLTn3|Z6wIvtH9Qt`vagytjX$K#DAd#k zqyc(?CdZhe!263;knw}`he~z^Myf;ErMlKg2r!AX3ERv4EUM`yc4_zQ2=Xv??nzXKRu@JB?dl zOp1uQNkY-TLH~Ifp2W<+1oNmbFQFs_g;O<@CB%9l@wf3ZIpU;y^*Xz0Aw`^mMgWt( zwG6DfJXdYg!F=kp^pY_QHbq<3WHE!AL!~OCufi?3i0_R0qb6`E}dO{iC z>FiTir1*|8Her5L>Xj54d{KL)84)5Nf(XoO^DZR(Oi7ZZTFAtb|9Y-fYX(*~_aJNg z@Iw&ZaJV>eSU)8L3t#V#%uN1#iFQMp@M%L%O<7)7$4}+@2F-HtK8{HIz`T|$W~U^x zZ+4$aNT2H%!jwSKRZ&#LK0Y%jKV~c+d9thUqhWWOC6!z)fQ*aO>+`<7QI#ujkOpaF z?!!U`=o8QSMF2cO4+xn&jIC@XJNdf-*}&)u@9)Nt9B)upeYM6oUj4 z{0j*KxtQgs)oY61l_@C#(p{3$&5LQZeMITae@BH}VkwxZ-~29aq&AXSN#v+nb*}XL zGzl5_4KAN(dj33#m`O(P@5R0Hq`rWb-HV|Na-END(YJQlpjy;|CZdbnIz!*B(X`2x zjvb-O!Hmr?^Kj_U1(-<+WpalF2W5=nh-1FStDx6H=x#9mvPjF@x0lt3eX>-$VI2G6 z#4p{^b~@H&v{;v`I|H#Yga@uZZ~}7-w;zQQ;K3Gf5;dl2H73&0l)r$0ta2dibRjE1 z()XCak}XR6!KX9A7`F164$4cEyXAqLpgL%Gs!Mb7vqC3Z!{}5{mnn>`ClT;sMTyIQ zKw~@8Uv#n#i!4;^qyEfyicPoO(@B{k<=}5o?z73b9%S@uDBV>1-W$+{@P8VbqYyXZml_Mp)jk_U}l^i^}l=#W+O|T5=^1`J< zonF&S`YX#cLi+9{wHE9x7q~K?51wExvdXC6M(P-|>*69O4B9Su3sGkOrMA;lFA6e7 zz9V;vG@kxk!M)^%)6&1Y8XK1kMi%yOvVp|!91PJy1bdGgzaa)Z~G-+j&*T-H~VdxgU;l17;!u(Jib&6M6#or7{n-v4Z7zfR9<2Ga3{6DiSH6NW?UorV=m@CmwG^o2rR@ac_C2Vx?C_uH2V^fsY zzrHEupRVnR_*0X*%&1!0w6^Z5R8HQ)(;VHLH5#jG)S)OKLL-^Eo9^rA&uuawvN^bK zAr&C@zD2tC=B(RGt0j7AJBmE495=dxfs@&U%x1d#edwPRjNuYwamxSS9c(H1(Ko08 z02#+5Cn@SAk{Y~fQ&u3&TQIdNbK$<-Bec`4 zd55cbAI0Oh3cXt3F#)a?{=aeGy_)|~Wc*LhE34*xOe|MJ9+9KwAG+2kJnH6}H;;&0 l`ww+%|M@xps}E|G9(~cee;8J$_^8MJ7oQ>jq#{|_}yJK|qFX0R?H09#TL;1r&yE{vh4RP(z1wcXx-R#Ly`v4U)op zKitn+?|MG{u4|vY&N}OSID4O6e}qB&q7fsvCxQhbXH zb#w>jHcWfnTKG4Z&u1@3z~VxEEy2d`rZt5yJkuRV9gRQyikP*RSWjU>yQ~ejKB&2& zJ2rys-Fn`7!oUG&wnrWZ<^}l=FN1BY=gS^Y{H!FBi7^aJk}cgBBbt8(TWtcv#Q3Z9jqqYm)%%4pyeDy34|q10$K!`jVZdk+Fx;u% zV&1?k`96>SkLaq-?Xk_-pYI+H4#wi*4=@*FafDABRTzV%nDFRYm&Mo9_ElZSRgDa( zrp)Lco%|PoI~Y->Te&lk^vnk^Z))qHtCD;par=?&d~N*Wr(7SmPXwWqi}Edd1I4IB zmcDVmstvu1uO@Xe!r5>S|0JgwkIdXJXYCsreLhbR(AB60o2U z4aJfp+PTfzzSyrA4FsDa(y_f>O4GLQ&cAU8_9A{K_glz3&c2jjn(xyrkjyJXU{*11 zqUM9g^g|;W#vqfVTH|Y5jlWakd(%VN;xy22B$vOOy##}m_Jg%WeVNoGp9HXZb!MHL zEa}NbgS$5(zg?rfJ|E6eAh#lEe=u}Kr8aBf_MHE;*mbr(6$=LuC zhqW-t^LgP*Wy5S9G&wHd4%<;$ou%z0i~^mPYE?G#8y6nx^P6CDK@WX?K93&rM6#BS z1VLWS>ngNw`UEi%ZhGe3C?yP)&n#83_CT06QJjHmVg>Sae>LD+-6pExxLCfbv;0hv zsJ`}p=z}zYE7Z4=>7^9r6PDz|{8WBfgTdnyk0?#i#XL)*mVqT0OVtU3rAlv`bW_bEl7t%CO2i$kVPINI{J~U4 z&{h(+&5lj4%rHQWLGG-$&kEN3^MFC8#}`|K21)$cqr$_Nt%k9Pt6Xl$p7*>^l#~su zy`4!*M`y#Sol!cI`dqN9gHLqAT_h%?(!o-Ms~cIU5#xx9H9u8on#@-Cp5DTlJ-o`j zDP4kUr7x7)-RvUy42Y}edkaT#+G14kO?B{VY}lrEcn#<$HQA>Q3B)f%zU?KJ_b%yX zB9bcqwQ$f=IO0Rdd2uj(u*FOB0a;B_Q2+^ zfEv_r4=`Emxrc=2H!BFclQs?I=;R$c-C0nfYa9Q%5z~7rdk&f*INbPqGC(uzjeX}c zdyU76eF~7RTGP(j?-~4-C-`_8@IF+0b)5Y8_qsvR((a;j(@|cHzHe>hl>xk*YdS_J zVM7*t?H#>E3g?PWL1GWRTMhH!*YVU6M7^TI%HG9CAbW3&Ge`Bl;0?`!dK1O=a^RU9v(R z{Tj5ANXtpGe$`}6mx$zZBcuLF;%30fE;(airL0Lp0v$~*2MXn&>4+plw5l4z^ws@1 zfp0in7i69v%1FSi{*{`xO0zSGA80HsN0g})3(NE;1@?7|Yul&|29fax>4jwrLLpCW z{TtT2)`K2U?7M~8M(t^v*zL%2l7yUH>q~m&TAx_OA&oLWq>xc=fZ&NQD-F@6u-cx4 zqLQ!3kj1JhM%afbs-(|xg<7Gng!PmL0Bc{tcWh{|rxTPs91cB%M)odYh6c{$YQjovhS@#g#aJ)3{^)i3?cFNfdAAN!O!=IzzG!q`SjTicyKnPeu-=(@e!SROqn%?s z(v^{6cUWEyxxd|WF{+fSAQ#vQE*)1u^1XoMv4q1v%5sfC$3-N0wq!?5`i_XI02a@5 z{rj!@@U;8Ni~@B;Y-7+^?#NP;m!zMFXvx|M4IA#rFQSa*Jh}Hw{Buqkv{|6?BDTww zI;C_~u3{6_g-n%LN;6f*OCI-k^d1|gW#u2kMT3O8g7(h!ET}(I)DB+%tj=|(luTZ3 zFD`X+%8tqVrDZa&G017_+aIze2uP-SiQNiNMaE9E-Epaz*G`UQvPfKefB-ETh^Bp5 zu>NvN&U(!mAKUkoFRF=i&8+g#;H%R&@pEuj&IYeyj5L>r>wT6x6w<&HWk=dLC-SYt z1bE@ibHQnszI;ge5u_|U!(cpQS#HcyaDmaC-WKWXX0T1+4~k**ObYG)F5%#!yC2yAL#p!RFHzuKC^o~_F zhOOhdzlSwQKlqRk{rw=%v}e+#{m)3x zh6dzK)TDku1~;X4$ocCP4Uk)P7sStKa&GB14WIh=5cyL&wld}~qfnss;VVz;O5mR_ z_}NPb_sg4>hK=uZr~|#md4WS6^2O{f9lLp znNn-Xyo~(hvEy^zF1bIv*GR10BKhL#eTk3Z` zwO&VzT;U01rw)+jm@~WgW9dA%o%C1JOjbng?sOlU*kl&y{QdshYjRpyQWehG_$_t4 zZ%>J(bAgIUUo*_f5=FmhZ9O8+6{V+^j^(8vX zmTjaWt@V8Z{NxBX>zKtZ5O)7_=hbu|ZOq5k&=Ly#g?my#0K0V&65n>F6FRwxTILX@ z4$V5Wi<+gt^rq(A>AJ~-`T?*8Q0(Hn5HFrry2jx&gUz+0liot18LOTv& zre{_&LcloUP6>)A?p2wFLccGAj;Y#iz1nC9<#KjmeBQzcBKeEUG4jR_i=Y{hBpC#8 zMJx%w^_5)@CjJ$)C{?x7Eu(Okc~muCRBS>j6?-KQq%eJ$E~1WEXg;%ZwL1EVL4&C+ zO;1DBSEL5Rk~d@eX^J4$uF@k!P~qSYUc=dY%b)i)$1$>6<<)Dk|Me+OWXDZ_CFU83 z$Ddy|LYs4Y(V7E~Ows^(t!n9>Nvz}c8ASZZ8I!O=OPAu0kp*dv(9_5^`Ytrj;*?RB z=J+NclAPuBDyVhovJ;64yeMWUjFf2Vxc=uW@(xnL9jUZOx z1~n;sAAcW(sYc9zq!boNL3>#Mo1hmAX_^Af4pGs2L!r|3)-&c8&oi8yx`QK9pz@wX zcA~oZsC{^TZBspN>2H1*%Q8Rd1dhVjNH$Vi7wKvPcC>ner{S_~U>=rlhzU%nDR=;5 zbaQTJ&z*s1Hiw}|>B%zFGQHI`$q?1m{KX!SCZ!e~+9kJ@pJ*=?by}wRD2J~ckva-> z`36BIuj$sp75zS??+Ah zzBTyEf{W#>_JZ*5mo5fw17zlDhWVLA1yDdILaU$f zc_@j4_5S2q9F?SpmX9OHpU)8;3TZtM(w|=JC5B*?PHjZ;$;IiEnR|1`Ra%hslYHkU zjezF3rj~oRa9(fqmKodJ32n?RBBzJ1EdF{KUvFUj!byYs^O2(}X9UinAB&ACQ_NSd z8Hon46iCj++1c${mXuO---`okV4XIRb_r&4FQ2$$8PlRN{uE!FU6B699R>WCXS{zg zi6=|^l}OweT<(EsI=2w0H#T2!z(l3stt{uT6vy_Zr1U@VJO$XO3G${!P$U2@R7H zH@xvJd>v zd#D|Yo>V6c&weHZunTpgvf}>ew1v6+vvkp57%@-m9+>vqJ}{AsS!>4qH(@(R-o zhooNdbC$PDt-*n0EJ6%&G9v0H{=F1@!Qf(qjo zBgRyH;zL#Ge|mjRzKTox6#5k_}f_gD2LSyIHDM2E7}y#w!Ijd)u6@&T=@ zr$_$W1EU!~bwSpQzcRn6z#XQ^hn!YW|N%Q{1POU6PEW9i`ImY(vc>sXat7p z#S;FJdM+$)O$2loY`^~n70XmBV(@$x_y*jB)1FTtreGab5mn23y z=&#;!7HQ%T^vk#@`KmIUa`7`4IVCd?3N+++WD>~3)h=gUiD&E0!I8m$1g31j{vC=g z1>`Sk&8>dL_jfK`mN_k%_2fUllq`4hRnmJZP4G!n5_mV2x04NrguCmuHNq| zbE7Wy?jo}pEdxd5Y^5H~??9l|!j8seEK6GhR9U~XD59_@B3Pw60FV=y!|A?ynEmh@Z5=9{Km#$pah*1vy!t1KVngPqkX3_|73 zb>43Nb|$4RiN9j{rhsRrr>z|~zOco(Qdb~e#LrMsGvkdy>!(jspY?bBPkJO^_cw_`DE;{cBAPlfU5c0S| zPqJs1$oV7)fyNsm4&MH+d< zk|=T9Odco}on#+y6*fbuhX*h^17UuMF&uHsS9le4TBXoU#yRuEN!$IPOd75ho55z9 z!Od%)mB}L7t#qAIXc)g?C*le0!@?R&GueNQkP39)K+2p|B%1l17d=7X3x-O_XCfY} z5foO{r>MF=IOh`tfA^4le`5dE;IvEuz|^j+)Zwg)+sIuM2~=J%tEpkY0>lLqFu>=GOVL4ikn(S9j*g~f({X9amP$lw0i$ls!-$7KB6_(!0LW+#T2rN4} z*b2yy{ND9dNV&++|HgzT56FhX%;euIF^&Dx&sF#`EmKczZH8EX9#zbVN>Hyz8+WyL z{M=+)&ALj~T=e94 z%}b7eUo+vhnMY17q%G|$HkQ2^L}`4AuhXkeU3DxJ$GU7*DG_2G2+_ySC%+ns0Bgiw z>Qjczm`v+%9&%bApOT$r&7o4;6~@#4WzqeThULSWC>8D5K7sQNxhkcy(_Xg!sz1$e zj}M0D<^rRQhC!aP)%YH(UhKWz?CVU7vcbE7k1@*w^Nq+M&gku8Q;pr)>CfKJmKJll zQ=!|+DM}F6vT;U=GGS9ZycY+C= zZ78Gxj+3lo#_QdH7vU@~6NJ$&*%RE(y2diL!hgRGW${+nmYil8om2{ui^Z=87pnG( zLs=v3I4b+JXQ}DhrVM<71u752qQ_WT-(J-n^PPG~iVNA}G7T4|&efF`SA1MV#z@{=Pw5`vtW2RO)|=gB6Gu zeG`m=B5enUNrB-cHF(vgtY}n^GgeEfV8Tanq|!qCD9VhcNFGJNmu(XCpnoQ_wm$g8 zkHRZb4ee2kMl1a*p2iZPKSo}}WB)6Jl3K_fBNs(m|3;R|P96ul@QF&X|7;8=suFsn ze3j%QL#ibHf6V)%3i4H{Y^e^Zx+yYZ?v! diff --git a/packages/dynmacroarray.zip b/packages/dynmacroarray.zip index 4e71ed83460715ff60ab7c73b5f50ac6b37af4a4..915b54f81efae8800b8343a2763c852646055667 100644 GIT binary patch delta 5033 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 diff --git a/packages/gsm.md b/packages/gsm.md index ee5e01d..772d0bb 100644 --- a/packages/gsm.md +++ b/packages/gsm.md @@ -91,10 +91,10 @@ Package contains: Required SAS Components: `Base SAS Software` -* SAS package generated by generatePackage, version 20220113 * +* SAS package generated by generatePackage, version 20220420 * The SHA256 hash digest for package GSM: -`BE9508C8E37706B2EB2FBCA68B64F7DCF63C65E8E24775C92E28FE34E547893D` +`E6E2A6214EE7DC6E06AA76916A68B216DD7665184E63CF2C01F487A038E71B09` ## >>> `%GSM()` macro: <<< ####################### diff --git a/packages/gsm.zip b/packages/gsm.zip index 4c4e2eadd03e5ebdd423630336440cf3d6ba518e..b9560c6dfe1889ed3ba7eb3f784be6a9732a3e0b 100644 GIT binary patch delta 5341 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 OT&VOvr~U^NnEkc@ delta 5355 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 LCq{7RKkxhxl_;aM delta 6318 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 WCMF0(^{*H>l1PvXi<0lp;eP;|l7XE7