diff --git a/README.md b/README.md index 11864a44a84acb26bd93ee2c969dfe16f33184b6..1791039d93c47442a87fe0ae5308f9d10af64eef 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ # GTF -## Install dev version (linux) +## Install dev version To install the dev version of this project run the following steps: - Install the app via the VAI setup on var/www/[app name] -- Clone this repo on var/wwww/[app name]\_dev -- Run install.sh and give the var/www/[app name] path when asked to build your tree structure -- Now you have the correct versioned tree structure, rename var/www/[app name] as var/www/[app name]\_vai and var/www/[app name]\_dev as var/www/[app name] -- Run `git pull` and `git push` to update/post the project and his dependencies +- Rename var/www/[app name] by var/www/[app name]\_vai +- Clone this repo on var/wwww/[app name] +- Run install.sh (linux) or install.bat (windows) and give the var/www/[app name]\_vai path when asked +- Now you have the correct versioned tree structure, and your app should run +- Linux : run `git pull` and `git push` to update/post the project and his dependencies +- Windows : run update.bat to update the app diff --git a/conf/properties.json b/conf/properties.json new file mode 100644 index 0000000000000000000000000000000000000000..3b281952fae5eedd9653077bb6cd5e63db9f299b --- /dev/null +++ b/conf/properties.json @@ -0,0 +1,10 @@ +{ + "services_alias": "rest[ENV]", + "web_server_name": "https://[hostname]:[PORT]/", + "version": "[VERSION]", + "build": "[BUILD]", + "status": "unstable", + "month_year": "[MONTH_YEAR]", + "application": "gtf", + "environment": "[ENV]" +} diff --git a/push_subtrees.sh b/push_subtrees.sh old mode 100644 new mode 100755 diff --git a/src/vitis/.gitignore b/src/vitis/.gitignore index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fb23a1f31378cce575900e083e4179591effa425 100644 --- a/src/vitis/.gitignore +++ b/src/vitis/.gitignore @@ -0,0 +1,6 @@ +vas/rest/class/* +vas/rest/class/!*/ +vas/rest/class/!*.* +vas/sql/* +vas/sql/!*/ +vas/sql/!*.* diff --git a/src/vitis/vas/rest/ws/vitis/Properties.class.inc b/src/vitis/vas/rest/ws/vitis/Properties.class.inc index 0e5faa3b59c434e84d4d45447b10139446866eaf..de3df97056d73d1b2e7eb75f9fb1eaf60478447e 100755 --- a/src/vitis/vas/rest/ws/vitis/Properties.class.inc +++ b/src/vitis/vas/rest/ws/vitis/Properties.class.inc @@ -91,6 +91,7 @@ class Properties extends Vitis { } else { $this->aFields = $this->aProperties; } + require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/version.inc"; require_once dirname($_SERVER['SCRIPT_FILENAME']) . "/conf/version.inc"; if (VM_STATUS != "STABLE") { diff --git a/utils/copy_hooks.bat b/utils/copy_hooks.bat new file mode 100644 index 0000000000000000000000000000000000000000..a24ac68b0f099047b546b33d77a4fab3d99c0247 --- /dev/null +++ b/utils/copy_hooks.bat @@ -0,0 +1,3 @@ + + +robocopy "githooks" "../.git/hooks" /E /NFL /NDL /NJH /NJS /nc /ns /np diff --git a/utils/get_deps.sh b/utils/get_deps.sh index 92b0273980ef5ae8db6eea7268fd3a5c406243b9..0a26177f9d9a4d746b39799eff421477c4d6ebd8 100755 --- a/utils/get_deps.sh +++ b/utils/get_deps.sh @@ -1,24 +1,23 @@ #!/bin/bash # # Récupère l'ensemble des dépendances depuis conf/_install/dependency.xml -# Nécessite xmllint : sudo apt install libxml2-utils # # # # - if [ "../conf/_install/dependency.xml" ]; then - let depsCount=$(xmllint --xpath 'count(//dependenciesCollection/dependency/name)' ../conf/_install/dependency.xml) declare -A aDeps vitisVersion=master + depsCount=0 + dependencies=($(cat "../conf/_install/dependency.xml" | tr -d '\040\011\012\015' | grep -oP '<dependency>([\s\S]*?)<\/dependency>')) - for (( i=1; i <= $depsCount; i++ )); do + for i in ${!dependencies[*]}; do - sName="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/name)' ../conf/_install/dependency.xml)" - sVersion="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/version)' ../conf/_install/dependency.xml)" - sNature="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/nature)' ../conf/_install/dependency.xml)" + sName=$(grep -oP '(?<=name>)[^<]+' <<< ${dependencies[$i]}) + sVersion=$(grep -oP '(?<=version>)[^<]+' <<< ${dependencies[$i]}) + sNature=$(grep -oP '(?<=nature>)[^<]+' <<< ${dependencies[$i]}) if [ $sName == "vitis" ]; then vitisVersion=$sVersion @@ -27,22 +26,22 @@ if [ "../conf/_install/dependency.xml" ]; then aDeps[$i, name]=$sName aDeps[$i, version]=$sVersion aDeps[$i, nature]=$sNature + let depsCount++ fi done echo "[INFO] dependencies:" echo "vitis : $vitisVersion" - for (( i=1; i <= $depsCount; i++ )); do - - echo "name: ${aDeps[$i, name]}" - echo "version: ${aDeps[$i, version]}" - + for i in ${!dependencies[*]}; do + echo "(${aDeps[$i, nature]}) ${aDeps[$i, name]} : ${aDeps[$i, version]}" done + echo "depsCount : ${depsCount}" export vitisVersion export depsCount export aDeps + else echo "[ERROR] ../conf/_install/dependency.xml not found" fi diff --git a/utils/init_symlinks.sh b/utils/init_symlinks.sh index c98ed30e162c2d81c8b90e5b6755bb5602941b5e..f073ab46f032a47293d4090920fd5d34000d5ae1 100755 --- a/utils/init_symlinks.sh +++ b/utils/init_symlinks.sh @@ -19,23 +19,69 @@ read APP_EXISTING_PATH cd .. +# Supprime les anciens symlinks +if [ -d "client" ]; then + rm -Rf client +fi +if [ -d "vas" ]; then + rm -Rf vas +fi +find src/vitis/client -type l -delete +find src/vitis/vas/sql -type l -delete +find src/vitis/vas/rest -type l -delete + # Vitis echo "---- Link vitis ----" if ! [ -e "$(pwd)/client" ]; then - echo "---- Link vitis 2 ----" - ln -rsf src/vitis/client client + + mkdir client + mkdir client/javascript + mkdir client/modules + ln -rsf src/vitis/client/css client/css + ln -rsf src/vitis/client/forms client/forms + ln -rsf src/vitis/client/images client/images + ln -rsf src/vitis/client/javascript/app client/javascript/app + ln -rsf src/vitis/client/javascript/externs client/javascript/externs + ln -rsf src/vitis/client/javascript/require client/javascript/require + ln -rsf src/vitis/client/lang client/lang + ln -rsf src/vitis/client/less client/less + ln -rsf src/vitis/client/modules/vitis client/modules/vitis + ln -rsf src/vitis/client/templates client/templates + ln -rsf src/vitis/client/.htaccess client/.htaccess + ln -rsf src/vitis/client/index.html client/index.html fi if ! [ -e "$(pwd)/vas" ]; then - ln -rsf src/vitis/vas vas + + mkdir vas + mkdir vas/rest + mkdir vas/rest/ws + ln -rsf src/vitis/vas/doc vas/doc + ln -rsf src/vitis/vas/rest/class vas/rest/class + ln -rsf src/vitis/vas/rest/inc vas/rest/inc + ln -rsf src/vitis/vas/rest/ws/vitis vas/rest/ws/vitis + ln -rsf src/vitis/vas/rest/index.phtml vas/rest/index.phtml + ln -rsf src/vitis/vas/rest/index.vhtml vas/rest/index.vhtml + ln -rsf src/vitis/vas/sql vas/sql + ln -rsf src/vitis/vas/util vas/util fi # Conf echo "---- Link conf ----" if ! [ -e "src/vitis/client/conf" ]; then - ln -rsf conf src/vitis/client/conf + # ln -rsf conf client/conf + + mkdir client/conf + for elem in $( ls "conf"); do + if [[ $elem != 'properties.json' ]]; then + if [[ -d "conf/${elem}" || -f "conf/${elem}" ]]; then + echo "---- Link conf/$elem" + ln -rsf conf/$elem client/conf/$elem + fi + fi + done fi if ! [ -e "conf/closure" ]; then - ln -rsf src/closure/conf conf/closure + ln -rsf src/closure/conf client/conf/closure fi # Modules @@ -47,22 +93,17 @@ if [[ $depsCount > 0 ]]; then echo "---- Link module_${module} ----" if [ -d "$(pwd)/src/module_${module}/module" ]; then if ! [ -e "src/vitis/client/modules/${module}" ]; then - ln -rsf src/module_${module}/module src/vitis/client/modules/${module} + ln -rsf src/module_${module}/module client/modules/${module} fi fi if [ -d "$(pwd)/src/module_${module}/web_service/ws" ]; then if ! [ -e "src/vitis/vas/rest/ws/${module}" ]; then - ln -rsf src/module_${module}/web_service/ws src/vitis/vas/rest/ws/${module} - fi - fi - if [ -d "$(pwd)/src/module_${module}/web_service/conf" ]; then - if ! [ -e "src/vitis/vas/rest/conf/${module}" ]; then - ln -rsf src/module_${module}/web_service/conf src/vitis/vas/rest/conf/${module} + ln -rsf src/module_${module}/web_service/ws vas/rest/ws/${module} fi fi if [ -d "$(pwd)/src/module_${module}/web_service/sql" ]; then if ! [ -e "src/vitis/vas/sql/${module}" ]; then - ln -rsf src/module_${module}/web_service/sql src/vitis/vas/sql/${module} + ln -rsf src/module_${module}/web_service/sql vas/sql/${module} fi fi if [ -d "$(pwd)/src/module_${module}/web_service/class" ]; then @@ -70,7 +111,7 @@ if [[ $depsCount > 0 ]]; then if [ -d "$(pwd)/src/module_${module}/web_service/class/${class_dir}" ]; then echo "---- Link module_${module}/${class_dir} ----" if ! [ -e "src/vitis/vas/rest/class/${class_dir}" ]; then - ln -rsf src/module_${module}/web_service/class/${class_dir} src/vitis/vas/rest/class/${class_dir} + ln -rsf src/module_${module}/web_service/class/${class_dir} vas/rest/class/${class_dir} fi fi done @@ -84,6 +125,7 @@ if [[ $depsCount > 0 ]]; then echo "---- Link exixting app ${APP_EXISTING_PATH} ----" declare -a existing_folders_path=("vas/server" + "vas/rest/conf" "vas/log" "vas/public" "vas/shared" @@ -99,11 +141,6 @@ if [[ $depsCount > 0 ]]; then done declare -a existing_files_path=("client/conf/properties.json" - "vas/rest/conf/properties.inc" - "vas/rest/conf/properties_domain.inc" - "vas/rest/conf/properties_post.inc" - "vas/rest/conf/properties_server.inc" - "vas/rest/conf/version.inc" "vas/rest/.htaccess") for file_path in "${existing_files_path[@]}"; do if [ -f "${APP_EXISTING_PATH}/$file_path" ]; then @@ -114,15 +151,8 @@ if [[ $depsCount > 0 ]]; then for properties_dir in $( ls "${APP_EXISTING_PATH}/vas/rest/conf"); do if [ -d "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}" ]; then - if [ -d "$(pwd)/vas/rest/conf/${properties_dir}" ]; then - for properties_file in $( ls "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}"); do - # if [ ${properties_file:0:10}=="properties" || ${properties_file}=="version.inc" ]; then - if [[ $properties_file == "properties"* ]] || [[ $properties_file == "version.inc" ]]; then - echo "copy vas/rest/conf/${properties_dir}/${properties_file}" - cp -f "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/${properties_file}" "$(pwd)/vas/rest/conf/${properties_dir}/${properties_file}" - fi - done - fi + echo "copy ${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/ > $(pwd)/vas/rest/conf/" + cp -Rf "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/" "$(pwd)/vas/rest/conf/" fi done fi diff --git a/utils/init_tree.bat b/utils/init_tree.bat new file mode 100644 index 0000000000000000000000000000000000000000..d8e6956ca21d8e9e7a4d4d46c77657f1153fb8b9 --- /dev/null +++ b/utils/init_tree.bat @@ -0,0 +1,99 @@ +@echo off +title Install Vitis App +setlocal EnableDelayedExpansion + +cd .. + +set /p existing_path="Existing app path: " + +REM Client Dir +echo Create client directory +if exist "client" ( + rmdir /S /Q "client" +) +echo copy client +robocopy "src/vitis/client" "client" /E /NFL /NDL /NJH /NJS /nc /ns /np +echo copy client/conf +robocopy "conf" "client/conf" /E /NFL /NDL /NJH /NJS /nc /ns /np +echo copy client/conf/closure +robocopy "src/closure/conf" "client/conf/closure" /E /NFL /NDL /NJH /NJS /nc /ns /np + +echo Copy client modules +for /d %%g in ("src/module_*") do ( + set x=%%g + echo !x:~7! + if exist "src/%%g/module" ( + echo copy client/modules/!x:~7! + robocopy "src/%%g/module" "client/modules/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) +) + +REM VAS dir +echo Create vas directory +echo Create client directory +if exist "vas" ( + rmdir /S /Q "vas" +) +echo copy vas +robocopy "src/vitis/vas" "vas" /E /NFL /NDL /NJH /NJS /nc /ns /np + +echo Copy vas web_services +for /d %%g in ("src/module_*") do ( + set x=%%g + echo !x:~7! + if exist "src/%%g/web_service/conf" ( + echo copy vas/rest/conf/!x:~7! + robocopy "src/%%g/web_service/conf" "vas/rest/conf/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/sql" ( + echo copy vas/sql/!x:~7! + robocopy "src/%%g/web_service/sql" "vas/sql/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/ws" ( + echo copy vas/rest/ws/!x:~7! + robocopy "src/%%g/web_service/ws" "vas/rest/ws/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/class" ( + echo copy vas/rest/class + robocopy "src/%%g/web_service/class" "vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/ws_data" ( + echo copy vas/ws_data + robocopy "src/%%g/web_service/ws_data" "vas/ws_data" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/public" ( + echo copy vas/public + robocopy "src/%%g/web_service/public" "vas/public" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "src/%%g/web_service/upload" ( + echo copy vas/upload + robocopy "src/%%g/web_service/upload" "vas/upload" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) +) + +REM Copy from existing path +if exist %existing_path% ( + echo copy properties from %existing_path% + + for %%G in (vas\server,vas\rest\conf,vas\log,vas\public,vas\shared,vas\tmp,vas\upload,vas\ws_data) do ( + echo %%G + if exist %existing_path%\%%G ( + echo copy %%G + robocopy "%existing_path%\%%G" "%%G" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + ) + + if exist %existing_path%\client\conf\properties.json ( + echo copy properties.json + robocopy "%existing_path%\client\conf" "client\conf" "properties.json" /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist %existing_path%\vas\rest\.htaccess ( + echo copy .htaccess + robocopy "%existing_path%\vas\rest" "vas\rest" ".htaccess" /NFL /NDL /NJH /NJS /nc /ns /np + ) + + if exist "%existing_path%\vas\rest\conf" ( + echo copy vas\rest\conf + robocopy "%existing_path%\vas\rest\conf" "vas\rest\conf" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) +) diff --git a/utils/pull_subtrees.sh b/utils/pull_subtrees.sh index c2793f2ee9ad6e0f53da243fb1b6d26dd9baa20b..5cac1ba0c4a626761809103e822793ec694068a4 100755 --- a/utils/pull_subtrees.sh +++ b/utils/pull_subtrees.sh @@ -17,17 +17,7 @@ cd .. # Vitis echo "---- Pull vitis ----" -git subtree pull --prefix src/vitis --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master - -# fichiers à ignorer -git update-index --assume-unchanged conf/properties.json -git update-index --assume-unchanged conf/package.json -git update-index --assume-unchanged src/vitis/vas/rest/.htaccess -git update-index --assume-unchanged src/vitis/vas/rest/conf/properties.inc -git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_domain.inc -git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_post.inc -git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_server.inc -git update-index --assume-unchanged src/vitis/vas/rest/conf/version.inc +git subtree pull --prefix src/vitis --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion # Modules if [[ $depsCount > 0 ]]; then @@ -36,11 +26,7 @@ if [[ $depsCount > 0 ]]; then echo "---- Pull ${aDeps[$i, name]} ----" # Ajoute le dépôt - git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master - # fichiers à ignorer - git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties.inc - git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties_server.inc - git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/version.inc + git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]} fi done fi diff --git a/utils/push_subtrees.sh b/utils/push_subtrees.sh index b4949ea2dca1465c2cc0282d59442c158d7138e1..18a9d3bdac1f0d8d3f6af3e16af06d7337ddf9f6 100755 --- a/utils/push_subtrees.sh +++ b/utils/push_subtrees.sh @@ -17,7 +17,11 @@ cd .. # Vitis echo "---- Push vitis ----" -git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master +{ # 'try' block + git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion +} || { # 'catch' block + echo "could not push vitis" +} # Modules if [[ $depsCount > 0 ]]; then @@ -28,7 +32,7 @@ if [[ $depsCount > 0 ]]; then # Push le dépôt { # 'try' block - git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master + git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]} } || { # 'catch' block echo "could not push ${aDeps[$i, name]}" } diff --git a/utils/update_tree.bat b/utils/update_tree.bat new file mode 100644 index 0000000000000000000000000000000000000000..3c3c5dc356d7cc5922c046ea95f6787f80faa363 --- /dev/null +++ b/utils/update_tree.bat @@ -0,0 +1,80 @@ +@echo off +title Update Vitis tree +echo Update Vitis tree +setlocal EnableDelayedExpansion + +cd utils + +REM Pull repo +"C:\Program Files\Git\bin\sh.exe" --login -i -c "git pull" + +REM Pull subtrees +"C:\Program Files\Git\bin\sh.exe" --login -i -c "./pull_subtrees.sh" + +REM Save important files +if exist "../vas/rest/sql" ( + robocopy "../vas/rest/sql" "../vas/rest/sql_bak" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +if exist "../vas/rest/conf" ( + robocopy "../vas/rest/conf" "../vas/rest/conf_bak" /E /NFL /NDL /NJH /NJS /nc /ns /np +) + +REM Replace Vitis files +for /d %%g in ("../src/vitis/client/*") do ( + set x=%%g + echo copy client/!x! + rmdir /S /Q "../client/!x!" + robocopy "../src/vitis/client/!x!" "../client/!x!" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +for /d %%g in ("../src/vitis/vas/sql") do ( + echo copy vas/sql + rmdir /S /Q "../vas/sql" + robocopy "../src/vitis/vas/sql" "../vas/sql" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +for /d %%g in ("../src/vitis/vas/rest/class") do ( + echo copy vas/rest/class + rmdir /S /Q "../vas/rest/class" + robocopy "../src/vitis/vas/rest/class" "../vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +for /d %%g in ("../src/vitis/vas/rest/conf") do ( + echo copy vas/rest/conf + robocopy "../src/vitis/vas/rest/conf" "../vas/rest/conf_veremes" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +for /d %%g in ("../src/vitis/vas/rest/inc") do ( + echo copy vas/rest/inc + rmdir /S /Q "../vas/rest/inc" + robocopy "../src/vitis/vas/rest/inc" "../vas/rest/inc" /E /NFL /NDL /NJH /NJS /nc /ns /np +) +for /d %%g in ("../src/vitis/vas/rest/ws") do ( + echo copy vas/rest/ws + rmdir /S /Q "../vas/rest/ws" + robocopy "../src/vitis/vas/rest/ws" "../vas/rest/ws" /E /NFL /NDL /NJH /NJS /nc /ns /np +) + +REM Replace modules files +for /d %%g in ("../src/module_*") do ( + set x=%%g + if exist "../src/%%g/module" ( + echo copy client/modules/!x:~7! + robocopy "../src/%%g/module" "../client/modules/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "../src/%%g/web_service/conf" ( + echo copy vas/rest/conf_veremes/!x:~7! + robocopy "../src/%%g/web_service/conf" "../vas/rest/conf_veremes/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "../src/%%g/web_service/sql" ( + echo copy vas/sql/!x:~7! + robocopy "../src/%%g/web_service/sql" "../vas/sql/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "../src/%%g/web_service/ws" ( + echo copy vas/rest/ws/!x:~7! + robocopy "../src/%%g/web_service/ws" "../vas/rest/ws/!x:~7!" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) + if exist "../src/%%g/web_service/class" ( + echo copy vas/rest/class + robocopy "../src/%%g/web_service/class" "../vas/rest/class" /E /NFL /NDL /NJH /NJS /nc /ns /np + ) +) + + +cd ..