From b192fb3f17063ed33036f458c26664e275311ae0 Mon Sep 17 00:00:00 2001 From: jpmvaz Date: Sun, 13 Sep 2026 20:10:17 +0100 Subject: [PATCH] v_2.3 --- Infosec/.dockerignore => .dockerignore | 0 Infosec/.env.example => .env.example | 0 Infosec/.gitignore => .gitignore | 0 Alert Hub System/.dockerignore | 19 - Alert Hub System/.env.example | 79 -- Alert Hub System/.gitignore | 11 - Alert Hub System/Dockerfile | 45 - .../OLD_VERSIONS/v1.0/alerthub.zip | Bin 48307 -> 0 bytes .../OLD_VERSIONS/v1.2/alerthub.zip | Bin 55955 -> 0 bytes .../OLD_VERSIONS/v1.3/alerthub.zip | Bin 56865 -> 0 bytes .../OLD_VERSIONS/v1.4/alerthub.zip | Bin 57926 -> 0 bytes .../OLD_VERSIONS/v1.5/alerthub.zip | Bin 58308 -> 0 bytes Alert Hub System/README.md | 144 -- Alert Hub System/app/__init__.py | 278 ---- Alert Hub System/app/auth_utils.py | 37 - Alert Hub System/app/config.py | 81 -- Alert Hub System/app/forms.py | 139 -- Alert Hub System/app/mailer.py | 161 --- Alert Hub System/app/models.py | 192 --- Alert Hub System/app/routes_auth.py | 308 ---- Alert Hub System/app/routes_backoffice.py | 426 ------ Alert Hub System/app/routes_main.py | 137 -- Alert Hub System/app/scheduler.py | 79 -- Alert Hub System/app/static/css/app.css | 869 ------------ Alert Hub System/app/static/favicon.svg | 1 - Alert Hub System/app/static/js/app.js | 73 - Alert Hub System/app/templates/account.html | 81 -- .../app/templates/alert_form.html | 48 - .../app/templates/alerts_list.html | 64 - .../app/templates/backoffice/audit_log.html | 51 - .../app/templates/backoffice/dashboard.html | 77 - .../app/templates/backoffice/mail_config.html | 90 -- .../app/templates/backoffice/mail_log.html | 73 - .../app/templates/backoffice/settings.html | 45 - .../app/templates/backoffice/user_form.html | 41 - .../app/templates/backoffice/users_list.html | 65 - Alert Hub System/app/templates/base.html | 136 -- Alert Hub System/app/templates/error.html | 12 - Alert Hub System/app/templates/index.html | 60 - Alert Hub System/app/templates/login.html | 23 - Alert Hub System/app/templates/mfa.html | 19 - Alert Hub System/app/templates/mfa_setup.html | 34 - Alert Hub System/app/templates/setup.html | 35 - Alert Hub System/docker-compose.yml | 34 - Alert Hub System/entrypoint.sh | 26 - Alert Hub System/requirements.txt | 14 - Alert Hub System/wsgi.py | 13 - Alert Hub System/wsgi_backoffice.py | 9 - Alert Hub System/wsgi_frontoffice.py | 9 - Approval Workflow/.env.example | 18 - Approval Workflow/Dockerfile | 9 - .../OLD_VERSIONS/v1.0/approvalflow.zip | Bin 23404 -> 0 bytes .../approvalflow/approvalflow/.env.example | 21 - .../v1.0/approvalflow/approvalflow/Dockerfile | 9 - .../v1.0/approvalflow/approvalflow/README.md | 79 -- .../v1.0/approvalflow/approvalflow/app.py | 284 ---- .../v1.0/approvalflow/approvalflow/db.py | 157 --- .../approvalflow/docker-compose.yml | 9 - .../v1.0/approvalflow/approvalflow/mailer.py | 54 - .../approvalflow/approvalflow/pipeline.py | 76 - .../v1.0/approvalflow/approvalflow/poller.py | 146 -- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 53 - .../approvalflow/templates/base.html | 35 - .../approvalflow/templates/decision.html | 42 - .../approvalflow/templates/index.html | 46 - .../approvalflow/templates/login.html | 15 - .../templates/request_detail.html | 40 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 61 - .../OLD_VERSIONS/v2.0/approvalflow.zip | Bin 25118 -> 0 bytes .../approvalflow/approvalflow/.env.example | 21 - .../v2.0/approvalflow/approvalflow/Dockerfile | 9 - .../v2.0/approvalflow/approvalflow/README.md | 84 -- .../v2.0/approvalflow/approvalflow/app.py | 298 ---- .../v2.0/approvalflow/approvalflow/db.py | 176 --- .../approvalflow/docker-compose.yml | 9 - .../v2.0/approvalflow/approvalflow/mailer.py | 54 - .../approvalflow/approvalflow/pipeline.py | 153 -- .../v2.0/approvalflow/approvalflow/poller.py | 132 -- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 52 - .../approvalflow/templates/base.html | 35 - .../approvalflow/templates/decision.html | 55 - .../approvalflow/templates/index.html | 46 - .../approvalflow/templates/login.html | 15 - .../templates/request_detail.html | 59 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 55 - .../OLD_VERSIONS/v3.0/approvalflow.zip | Bin 22775 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../v3.0/approvalflow/approvalflow/Dockerfile | 9 - .../v3.0/approvalflow/approvalflow/README.md | 86 -- .../v3.0/approvalflow/approvalflow/app.py | 296 ---- .../v3.0/approvalflow/approvalflow/db.py | 176 --- .../approvalflow/docker-compose.yml | 9 - .../v3.0/approvalflow/approvalflow/mailer.py | 53 - .../approvalflow/approvalflow/pipeline.py | 153 -- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 35 - .../approvalflow/templates/decision.html | 55 - .../approvalflow/templates/index.html | 46 - .../approvalflow/templates/login.html | 15 - .../templates/request_detail.html | 59 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 54 - .../OLD_VERSIONS/v4.0 w/approvalflow.zip | Bin 25121 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 90 -- .../v4.0 w/approvalflow/approvalflow/app.py | 311 ----- .../v4.0 w/approvalflow/approvalflow/db.py | 189 --- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 109 -- .../approvalflow/approvalflow/pipeline.py | 158 --- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 36 - .../approvalflow/templates/decision.html | 55 - .../approvalflow/templates/index.html | 46 - .../approvalflow/templates/login.html | 15 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 59 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 54 - .../OLD_VERSIONS/v5.0 w/approvalflow.zip | Bin 26299 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 90 -- .../v5.0 w/approvalflow/approvalflow/app.py | 322 ----- .../v5.0 w/approvalflow/approvalflow/db.py | 204 --- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 109 -- .../approvalflow/approvalflow/pipeline.py | 189 --- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 36 - .../approvalflow/templates/decision.html | 60 - .../approvalflow/templates/index.html | 48 - .../approvalflow/templates/login.html | 15 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 69 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 54 - .../OLD_VERSIONS/v6.0 w/approvalflow.zip | Bin 26994 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 90 -- .../v6.0 w/approvalflow/approvalflow/app.py | 377 ----- .../v6.0 w/approvalflow/approvalflow/db.py | 207 --- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 109 -- .../approvalflow/approvalflow/pipeline.py | 196 --- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 136 -- .../approvalflow/templates/admin.html | 49 - .../approvalflow/templates/base.html | 36 - .../approvalflow/templates/decision.html | 60 - .../approvalflow/templates/index.html | 48 - .../approvalflow/templates/login.html | 15 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 73 - .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 54 - .../OLD_VERSIONS/v7.0 w/approvalflow.zip | Bin 28521 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 91 -- .../v7.0 w/approvalflow/approvalflow/app.py | 411 ------ .../v7.0 w/approvalflow/approvalflow/db.py | 218 --- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 115 -- .../approvalflow/approvalflow/pipeline.py | 216 --- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 143 -- .../approvalflow/templates/admin.html | 49 - .../approvalflow/templates/base.html | 37 - .../approvalflow/templates/decision.html | 63 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 15 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 78 -- .../approvalflow/templates/users.html | 66 - .../approvalflow/templates/workflow_edit.html | 54 - .../OLD_VERSIONS/v8.0 w/approvalflow.zip | Bin 34984 -> 0 bytes .../approvalflow/approvalflow/.env.example | 13 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 94 -- .../v8.0 w/approvalflow/approvalflow/app.py | 539 ------- .../v8.0 w/approvalflow/approvalflow/db.py | 227 --- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 145 -- .../approvalflow/approvalflow/pipeline.py | 236 ---- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 195 --- .../approvalflow/templates/account.html | 47 - .../approvalflow/templates/admin.html | 49 - .../approvalflow/templates/base.html | 52 - .../approvalflow/templates/decision.html | 63 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 26 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 78 -- .../approvalflow/templates/users.html | 74 - .../approvalflow/templates/workflow_edit.html | 90 -- .../v8.0 w/approvalflow/approvalflow/totp.py | 40 - .../OLD_VERSIONS/v9.0 final/approvalflow.zip | Bin 36071 -> 0 bytes .../approvalflow/approvalflow/.env.example | 18 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 97 -- .../approvalflow/approvalflow/app.py | 566 -------- .../approvalflow/approvalflow/db.py | 234 ---- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 145 -- .../approvalflow/approvalflow/pipeline.py | 236 ---- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 195 --- .../approvalflow/templates/account.html | 96 -- .../approvalflow/templates/admin.html | 49 - .../approvalflow/templates/base.html | 52 - .../approvalflow/templates/decision.html | 63 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 26 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 78 -- .../approvalflow/templates/users.html | 76 - .../approvalflow/templates/workflow_edit.html | 90 -- .../approvalflow/approvalflow/totp.py | 40 - .../OLD_VERSIONS/v9.1 patch/approvalflow.zip | Bin 37734 -> 0 bytes .../approvalflow/approvalflow/.env.example | 18 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 116 -- .../approvalflow/approvalflow/app.py | 579 -------- .../approvalflow/approvalflow/db.py | 249 ---- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 145 -- .../approvalflow/approvalflow/pipeline.py | 291 ---- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 195 --- .../approvalflow/templates/account.html | 96 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 52 - .../approvalflow/templates/decision.html | 65 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 26 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 80 -- .../approvalflow/templates/users.html | 76 - .../approvalflow/templates/workflow_edit.html | 99 -- .../approvalflow/approvalflow/totp.py | 40 - .../OLD_VERSIONS/v9.2 patch/approvalflow.zip | Bin 37742 -> 0 bytes .../approvalflow/approvalflow/.env.example | 18 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 116 -- .../approvalflow/approvalflow/app.py | 579 -------- .../approvalflow/approvalflow/db.py | 249 ---- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 145 -- .../approvalflow/approvalflow/pipeline.py | 291 ---- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 195 --- .../approvalflow/templates/account.html | 96 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 52 - .../approvalflow/templates/decision.html | 65 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 26 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 80 -- .../approvalflow/templates/users.html | 76 - .../approvalflow/templates/workflow_edit.html | 99 -- .../approvalflow/approvalflow/totp.py | 40 - .../OLD_VERSIONS/v9.3 patch/approvalflow.zip | Bin 37771 -> 0 bytes .../approvalflow/approvalflow/.env.example | 18 - .../approvalflow/approvalflow/Dockerfile | 9 - .../approvalflow/approvalflow/README.md | 116 -- .../approvalflow/approvalflow/app.py | 579 -------- .../approvalflow/approvalflow/db.py | 249 ---- .../approvalflow/docker-compose.yml | 9 - .../approvalflow/approvalflow/mailer.py | 145 -- .../approvalflow/approvalflow/pipeline.py | 292 ---- .../approvalflow/requirements.txt | 3 - .../approvalflow/static/style.css | 195 --- .../approvalflow/templates/account.html | 96 -- .../approvalflow/templates/admin.html | 50 - .../approvalflow/templates/base.html | 52 - .../approvalflow/templates/decision.html | 65 - .../approvalflow/templates/index.html | 50 - .../approvalflow/templates/login.html | 26 - .../approvalflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 80 -- .../approvalflow/templates/users.html | 76 - .../approvalflow/templates/workflow_edit.html | 99 -- .../approvalflow/approvalflow/totp.py | 40 - Approval Workflow/README.md | 116 -- Approval Workflow/app.py | 579 -------- Approval Workflow/db.py | 249 ---- Approval Workflow/docker-compose.yml | 9 - Approval Workflow/mailer.py | 145 -- Approval Workflow/pipeline.py | 292 ---- Approval Workflow/requirements.txt | 3 - Approval Workflow/static/style.css | 195 --- Approval Workflow/templates/account.html | 96 -- Approval Workflow/templates/admin.html | 50 - Approval Workflow/templates/base.html | 52 - Approval Workflow/templates/decision.html | 65 - Approval Workflow/templates/index.html | 50 - Approval Workflow/templates/login.html | 26 - Approval Workflow/templates/mail_status.html | 44 - .../templates/request_detail.html | 80 -- Approval Workflow/templates/users.html | 76 - .../templates/workflow_edit.html | 99 -- Approval Workflow/totp.py | 40 - Barcode/.dockerignore | 38 - Barcode/.env.example | 5 - Barcode/Dockerfile | 42 - Barcode/LICENSE | 29 - Barcode/OLD_VERSIONS/Barcode.zip | Bin 291050 -> 0 bytes Barcode/OLD_VERSIONS/BarcodeStudio v1.0.zip | Bin 308072 -> 0 bytes Barcode/README.md | 385 ----- Barcode/docker-compose.yml | 66 - Barcode/nginx/nginx.conf | 128 -- Barcode/web/index.html | 794 ----------- Barcode/web/vendor/JsBarcode.all.min.js | 2 - Barcode/web/vendor/bwip-js-min.js | 70 - Infosec/Dockerfile => Dockerfile | 0 Forensic-Mail-Indexer/.dockerignore | 7 - Forensic-Mail-Indexer/Dockerfile | 41 - .../OLD_VERSIONS/v1.0/pst-indexer.zip | Bin 27473 -> 0 bytes .../OLD_VERSIONS/v1.2/pst-indexer.zip | Bin 51421 -> 0 bytes .../OLD_VERSIONS/v1.3/pst-indexer.zip | Bin 55233 -> 0 bytes .../OLD_VERSIONS/v1.4/v1.4.zip | Bin 63171 -> 0 bytes .../OLD_VERSIONS/v2.0/pst-indexer.zip | Bin 71234 -> 0 bytes .../v2.0/pst-indexer/.dockerignore | 7 - .../OLD_VERSIONS/v2.0/pst-indexer/Dockerfile | 41 - .../OLD_VERSIONS/v2.0/pst-indexer/README.md | 1098 --------------- .../v2.0/pst-indexer/admin_frontend/admin.css | 940 ------------- .../v2.0/pst-indexer/admin_frontend/admin.js | 866 ------------ .../pst-indexer/admin_frontend/index.html | 318 ----- .../v2.0/pst-indexer/backend/admin_app.py | 587 -------- .../v2.0/pst-indexer/backend/app.py | 835 ----------- .../v2.0/pst-indexer/backend/auth.py | 513 ------- .../v2.0/pst-indexer/backend/requirements.txt | 10 - .../v2.0/pst-indexer/docker-compose.yml | 20 - .../v2.0/pst-indexer/entrypoint.sh | 31 - .../v2.0/pst-indexer/frontend/app.js | 869 ------------ .../v2.0/pst-indexer/frontend/index.html | 256 ---- .../v2.0/pst-indexer/frontend/styles.css | 1136 --------------- Forensic-Mail-Indexer/OLD_VERSIONS/v2.1 | 1 - .../OLD_VERSIONS/v2.2/pst-indexer.zip | Bin 74484 -> 0 bytes Forensic-Mail-Indexer/README.md | 1172 ---------------- .../admin_frontend/admin.css | 980 ------------- Forensic-Mail-Indexer/admin_frontend/admin.js | 867 ------------ .../admin_frontend/index.html | 321 ----- Forensic-Mail-Indexer/backend/admin_app.py | 597 -------- Forensic-Mail-Indexer/backend/app.py | 1234 ----------------- Forensic-Mail-Indexer/backend/auth.py | 520 ------- .../backend/requirements.txt | 10 - Forensic-Mail-Indexer/docker-compose.yml | 19 - Forensic-Mail-Indexer/entrypoint.sh | 25 - Forensic-Mail-Indexer/frontend/app.js | 877 ------------ Forensic-Mail-Indexer/frontend/index.html | 259 ---- Forensic-Mail-Indexer/frontend/styles.css | 1182 ---------------- .../v1.0/martinhal-datahub.zip | Bin 58595 -> 0 bytes .../v1.1/martinhal-datahub.zip | Bin 62863 -> 0 bytes .../v1.2/martinhal-datahub.zip | Bin 70596 -> 0 bytes .../martinhal-isdss-v1.3-patch0.1.zip | Bin 78003 -> 0 bytes .../martinhal-isdss-v1.3-patch0.2.zip | Bin 86346 -> 0 bytes .../martinhal-isdss-v1.3-patch0.3.zip | Bin 88620 -> 0 bytes .../martinhal-isdss-v1.3-patch0.4.zip | Bin 90641 -> 0 bytes .../v1.3/martinhal-isdss-v1.3.zip | Bin 75517 -> 0 bytes .../martinhal-isdss-v1.4-patch0.1.zip | Bin 98473 -> 0 bytes .../martinhal-isdss-v1.4-patch0.2.zip | Bin 104280 -> 0 bytes .../martinhal-isdss-v1.4-patch0.3.zip | Bin 110819 -> 0 bytes .../martinhal-isdss-v1.5-patch0.1.zip | Bin 206381 -> 0 bytes .../martinhal-isdss-v1.5-patch0.2.zip | Bin 207435 -> 0 bytes .../v1.5/ISDSS Logo.png | Bin 916691 -> 0 bytes .../v1.5/martinhal-isdss-v1.5.zip | Bin 197910 -> 0 bytes Jellyfin | 1 - {Infosec/MEDIA => MEDIA}/InfosecLogo.png | Bin .../v1.0/birthday-app.zip | Bin 18747 -> 0 bytes .../v1.1/birthday-app.zip | Bin 19913 -> 0 bytes .../v1.1/birthday-app/Dockerfile | 9 - .../v1.1/birthday-app/README.md | 90 -- .../v1.1/birthday-app/app.py | 647 --------- .../v1.1/birthday-app/docker-compose.yml | 30 - .../v1.1/birthday-app/requirements.txt | 5 - .../v1.1/birthday-app/static/style.css | 230 --- .../v1.1/birthday-app/templates/admin.html | 148 -- .../v1.1/birthday-app/templates/base.html | 40 - .../birthday-app/templates/dashboard.html | 118 -- .../v1.1/birthday-app/templates/login.html | 17 - .../birthday-app/templates/mfa_setup.html | 22 - .../birthday-app/templates/mfa_verify.html | 14 - .../v1.2/birthday-app.zip | Bin 21329 -> 0 bytes .../v1.2/birthday-app/Dockerfile | 9 - .../v1.2/birthday-app/README.md | 91 -- .../v1.2/birthday-app/app.py | 724 ---------- .../v1.2/birthday-app/docker-compose.yml | 30 - .../v1.2/birthday-app/requirements.txt | 5 - .../v1.2/birthday-app/static/style.css | 258 ---- .../v1.2/birthday-app/templates/admin.html | 165 --- .../v1.2/birthday-app/templates/base.html | 40 - .../birthday-app/templates/dashboard.html | 147 -- .../v1.2/birthday-app/templates/login.html | 17 - .../birthday-app/templates/mfa_setup.html | 22 - .../birthday-app/templates/mfa_verify.html | 14 - .../v1.2/Martinhal_Contact_Site.zip | Bin 17479 -> 0 bytes .../Martinhal_Contact_Site_v1.3_update.zip | Bin 17893 -> 0 bytes .../Martinhal_Contact_Site_v1.4_update.zip | Bin 18744 -> 0 bytes .../Martinhal_Contact_Site_v1.5_update.zip | Bin 19416 -> 0 bytes .../Martinhal_Contact_Site.7z | Bin 76725 -> 0 bytes Martinhal_Futebol | 1 - Martinhal_Mobile_Contracts | 1 - .../infosec-v1_1.zip | Bin .../infosec-v1_2.zip | Bin .../infosec-v2_0.zip | Bin .../infosec-v2_1.zip | Bin .../infosec-v2_2.zip | Bin .../infosec-v2_3.zip | Bin Presentation system/v1.1/files.zip | Bin 423867 -> 0 bytes Presentation system/v1.2/qr-presentation.zip | Bin 441964 -> 0 bytes Presentation system/v1.3/MPS_logo.png | Bin 2041917 -> 0 bytes Presentation system/v1.3/README.md | 185 --- Presentation system/v1.3/qr-presentation.zip | Bin 588762 -> 0 bytes Presentation system/v1.4/qr-presentation.zip | Bin 589140 -> 0 bytes Presentation system/v1.5/qr-presentation.zip | Bin 591705 -> 0 bytes Presentation system/v1.6/qr-presentation.zip | Bin 591491 -> 0 bytes Presentation system/v1.7/qr-presentation.zip | Bin 591766 -> 0 bytes Infosec/README.md => README.md | 0 Self-Hosted Stream Webcam/files.zip | Bin 52220 -> 0 bytes Infosec/UPGRADE.md => UPGRADE.md | 0 WikiJS/wikiJS.zip | Bin 4544 -> 0 bytes {Infosec/avatars => avatars}/.gitkeep | 0 {Infosec/brand => brand}/.gitkeep | 0 {Infosec/data => data}/.gitkeep | 0 Infosec/db.js => db.js | 0 .../docker-compose.yml => docker-compose.yml | 0 ...cker-entrypoint.sh => docker-entrypoint.sh | 0 Infosec/init-db.js => init-db.js | 0 {Infosec/lib => lib}/audit.js | 0 {Infosec/lib => lib}/dates.js | 0 {Infosec/lib => lib}/mailer.js | 0 {Infosec/lib => lib}/settings.js | 0 {Infosec/lib => lib}/templates.js | 0 {Infosec/lib => lib}/validate.js | 0 {Infosec/middleware => middleware}/auth.js | 0 .../package-lock.json => package-lock.json | 0 Infosec/package.json => package.json | 0 {Infosec/public => public}/account.html | 0 .../public => public}/assets/infosec-logo.png | Bin {Infosec/public => public}/calendar-view.html | 0 {Infosec/public => public}/css/style.css | 0 .../public => public}/data-management.html | 0 {Infosec/public => public}/js/app.js | 0 {Infosec/public => public}/legislation.html | 0 {Infosec/public => public}/login.html | 0 {Infosec/public => public}/logs.html | 0 {Infosec/public => public}/setup.html | 0 {Infosec/public => public}/storage.html | 0 .../public => public}/version-control.html | 0 {Infosec/public => public}/view-data.html | 0 {Infosec/routes => routes}/auth.js | 0 {Infosec/routes => routes}/data.js | 0 {Infosec/routes => routes}/datacreate.js | 0 {Infosec/routes => routes}/legislation.js | 0 {Infosec/routes => routes}/logs.js | 0 {Infosec/routes => routes}/mail.js | 0 {Infosec/routes => routes}/manage.js | 0 {Infosec/routes => routes}/settings.js | 0 {Infosec/routes => routes}/setup.js | 0 {Infosec/routes => routes}/storage.js | 0 {Infosec/routes => routes}/users.js | 0 {Infosec/routes => routes}/versions.js | 0 Infosec/server.js => server.js | 0 {Infosec/uploads => uploads}/.gitkeep | 0 482 files changed, 48205 deletions(-) rename Infosec/.dockerignore => .dockerignore (100%) rename Infosec/.env.example => .env.example (100%) rename Infosec/.gitignore => .gitignore (100%) delete mode 100644 Alert Hub System/.dockerignore delete mode 100644 Alert Hub System/.env.example delete mode 100644 Alert Hub System/.gitignore delete mode 100644 Alert Hub System/Dockerfile delete mode 100644 Alert Hub System/OLD_VERSIONS/v1.0/alerthub.zip delete mode 100644 Alert Hub System/OLD_VERSIONS/v1.2/alerthub.zip delete mode 100644 Alert Hub System/OLD_VERSIONS/v1.3/alerthub.zip delete mode 100644 Alert Hub System/OLD_VERSIONS/v1.4/alerthub.zip delete mode 100644 Alert Hub System/OLD_VERSIONS/v1.5/alerthub.zip delete mode 100644 Alert Hub System/README.md delete mode 100644 Alert Hub System/app/__init__.py delete mode 100644 Alert Hub System/app/auth_utils.py delete mode 100644 Alert Hub System/app/config.py delete mode 100644 Alert Hub System/app/forms.py delete mode 100644 Alert Hub System/app/mailer.py delete mode 100644 Alert Hub System/app/models.py delete mode 100644 Alert Hub System/app/routes_auth.py delete mode 100644 Alert Hub System/app/routes_backoffice.py delete mode 100644 Alert Hub System/app/routes_main.py delete mode 100644 Alert Hub System/app/scheduler.py delete mode 100644 Alert Hub System/app/static/css/app.css delete mode 100644 Alert Hub System/app/static/favicon.svg delete mode 100644 Alert Hub System/app/static/js/app.js delete mode 100644 Alert Hub System/app/templates/account.html delete mode 100644 Alert Hub System/app/templates/alert_form.html delete mode 100644 Alert Hub System/app/templates/alerts_list.html delete mode 100644 Alert Hub System/app/templates/backoffice/audit_log.html delete mode 100644 Alert Hub System/app/templates/backoffice/dashboard.html delete mode 100644 Alert Hub System/app/templates/backoffice/mail_config.html delete mode 100644 Alert Hub System/app/templates/backoffice/mail_log.html delete mode 100644 Alert Hub System/app/templates/backoffice/settings.html delete mode 100644 Alert Hub System/app/templates/backoffice/user_form.html delete mode 100644 Alert Hub System/app/templates/backoffice/users_list.html delete mode 100644 Alert Hub System/app/templates/base.html delete mode 100644 Alert Hub System/app/templates/error.html delete mode 100644 Alert Hub System/app/templates/index.html delete mode 100644 Alert Hub System/app/templates/login.html delete mode 100644 Alert Hub System/app/templates/mfa.html delete mode 100644 Alert Hub System/app/templates/mfa_setup.html delete mode 100644 Alert Hub System/app/templates/setup.html delete mode 100644 Alert Hub System/docker-compose.yml delete mode 100644 Alert Hub System/entrypoint.sh delete mode 100644 Alert Hub System/requirements.txt delete mode 100644 Alert Hub System/wsgi.py delete mode 100644 Alert Hub System/wsgi_backoffice.py delete mode 100644 Alert Hub System/wsgi_frontoffice.py delete mode 100644 Approval Workflow/.env.example delete mode 100644 Approval Workflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/poller.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/poller.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/account.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/totp.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/account.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/totp.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/account.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/totp.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/account.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/totp.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow.zip delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/.env.example delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/Dockerfile delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/README.md delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/app.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/db.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/docker-compose.yml delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/mailer.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/pipeline.py delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/requirements.txt delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/static/style.css delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/account.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/admin.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/base.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/decision.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/index.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/login.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/mail_status.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/request_detail.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/users.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/totp.py delete mode 100644 Approval Workflow/README.md delete mode 100644 Approval Workflow/app.py delete mode 100644 Approval Workflow/db.py delete mode 100644 Approval Workflow/docker-compose.yml delete mode 100644 Approval Workflow/mailer.py delete mode 100644 Approval Workflow/pipeline.py delete mode 100644 Approval Workflow/requirements.txt delete mode 100644 Approval Workflow/static/style.css delete mode 100644 Approval Workflow/templates/account.html delete mode 100644 Approval Workflow/templates/admin.html delete mode 100644 Approval Workflow/templates/base.html delete mode 100644 Approval Workflow/templates/decision.html delete mode 100644 Approval Workflow/templates/index.html delete mode 100644 Approval Workflow/templates/login.html delete mode 100644 Approval Workflow/templates/mail_status.html delete mode 100644 Approval Workflow/templates/request_detail.html delete mode 100644 Approval Workflow/templates/users.html delete mode 100644 Approval Workflow/templates/workflow_edit.html delete mode 100644 Approval Workflow/totp.py delete mode 100644 Barcode/.dockerignore delete mode 100644 Barcode/.env.example delete mode 100644 Barcode/Dockerfile delete mode 100644 Barcode/LICENSE delete mode 100644 Barcode/OLD_VERSIONS/Barcode.zip delete mode 100644 Barcode/OLD_VERSIONS/BarcodeStudio v1.0.zip delete mode 100644 Barcode/README.md delete mode 100644 Barcode/docker-compose.yml delete mode 100644 Barcode/nginx/nginx.conf delete mode 100644 Barcode/web/index.html delete mode 100644 Barcode/web/vendor/JsBarcode.all.min.js delete mode 100644 Barcode/web/vendor/bwip-js-min.js rename Infosec/Dockerfile => Dockerfile (100%) delete mode 100644 Forensic-Mail-Indexer/.dockerignore delete mode 100644 Forensic-Mail-Indexer/Dockerfile delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v1.0/pst-indexer.zip delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v1.2/pst-indexer.zip delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v1.3/pst-indexer.zip delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v1.4/v1.4.zip delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer.zip delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/.dockerignore delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/Dockerfile delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/README.md delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/admin_frontend/admin.css delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/admin_frontend/admin.js delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/admin_frontend/index.html delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/admin_app.py delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/app.py delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/auth.py delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/requirements.txt delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/docker-compose.yml delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/entrypoint.sh delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/app.js delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/index.html delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/styles.css delete mode 160000 Forensic-Mail-Indexer/OLD_VERSIONS/v2.1 delete mode 100644 Forensic-Mail-Indexer/OLD_VERSIONS/v2.2/pst-indexer.zip delete mode 100644 Forensic-Mail-Indexer/README.md delete mode 100644 Forensic-Mail-Indexer/admin_frontend/admin.css delete mode 100644 Forensic-Mail-Indexer/admin_frontend/admin.js delete mode 100644 Forensic-Mail-Indexer/admin_frontend/index.html delete mode 100644 Forensic-Mail-Indexer/backend/admin_app.py delete mode 100644 Forensic-Mail-Indexer/backend/app.py delete mode 100644 Forensic-Mail-Indexer/backend/auth.py delete mode 100644 Forensic-Mail-Indexer/backend/requirements.txt delete mode 100644 Forensic-Mail-Indexer/docker-compose.yml delete mode 100644 Forensic-Mail-Indexer/entrypoint.sh delete mode 100644 Forensic-Mail-Indexer/frontend/app.js delete mode 100644 Forensic-Mail-Indexer/frontend/index.html delete mode 100644 Forensic-Mail-Indexer/frontend/styles.css delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.0/martinhal-datahub.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.1/martinhal-datahub.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.2/martinhal-datahub.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.1/martinhal-isdss-v1.3-patch0.1.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.2/martinhal-isdss-v1.3-patch0.2.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.3/martinhal-isdss-v1.3-patch0.3.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.4/martinhal-isdss-v1.3-patch0.4.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.3/martinhal-isdss-v1.3.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.1/martinhal-isdss-v1.4-patch0.1.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.2/martinhal-isdss-v1.4-patch0.2.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.3/martinhal-isdss-v1.4-patch0.3.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.5 Patch 0.1/martinhal-isdss-v1.5-patch0.1.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.5 Patch 0.2/martinhal-isdss-v1.5-patch0.2.zip delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.5/ISDSS Logo.png delete mode 100644 ISDSS - Internal Survailance Data Storage System/v1.5/martinhal-isdss-v1.5.zip delete mode 160000 Jellyfin rename {Infosec/MEDIA => MEDIA}/InfosecLogo.png (100%) delete mode 100644 Martinhal Birthday Mailing App/v1.0/birthday-app.zip delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app.zip delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/Dockerfile delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/README.md delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/app.py delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/docker-compose.yml delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/requirements.txt delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/static/style.css delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/admin.html delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/base.html delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/dashboard.html delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/login.html delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/mfa_setup.html delete mode 100644 Martinhal Birthday Mailing App/v1.1/birthday-app/templates/mfa_verify.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app.zip delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/Dockerfile delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/README.md delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/app.py delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/docker-compose.yml delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/requirements.txt delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/static/style.css delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/admin.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/base.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/dashboard.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/login.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/mfa_setup.html delete mode 100644 Martinhal Birthday Mailing App/v1.2/birthday-app/templates/mfa_verify.html delete mode 100644 Martinhal Contacts/v1.2/Martinhal_Contact_Site.zip delete mode 100644 Martinhal Contacts/v1.3/Martinhal_Contact_Site_v1.3_update.zip delete mode 100644 Martinhal Contacts/v1.4/Martinhal_Contact_Site_v1.4_update.zip delete mode 100644 Martinhal Contacts/v1.5/Martinhal_Contact_Site_v1.5_update.zip delete mode 100644 Martinhal_Contact_Site/Martinhal_Contact_Site.7z delete mode 160000 Martinhal_Futebol delete mode 160000 Martinhal_Mobile_Contracts rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v1_1.zip (100%) rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v1_2.zip (100%) rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v2_0.zip (100%) rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v2_1.zip (100%) rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v2_2.zip (100%) rename {Infosec/OLD_VERSIONS => OLD_VERSIONS}/infosec-v2_3.zip (100%) delete mode 100644 Presentation system/v1.1/files.zip delete mode 100644 Presentation system/v1.2/qr-presentation.zip delete mode 100644 Presentation system/v1.3/MPS_logo.png delete mode 100644 Presentation system/v1.3/README.md delete mode 100644 Presentation system/v1.3/qr-presentation.zip delete mode 100644 Presentation system/v1.4/qr-presentation.zip delete mode 100644 Presentation system/v1.5/qr-presentation.zip delete mode 100644 Presentation system/v1.6/qr-presentation.zip delete mode 100644 Presentation system/v1.7/qr-presentation.zip rename Infosec/README.md => README.md (100%) delete mode 100644 Self-Hosted Stream Webcam/files.zip rename Infosec/UPGRADE.md => UPGRADE.md (100%) delete mode 100644 WikiJS/wikiJS.zip rename {Infosec/avatars => avatars}/.gitkeep (100%) rename {Infosec/brand => brand}/.gitkeep (100%) rename {Infosec/data => data}/.gitkeep (100%) rename Infosec/db.js => db.js (100%) rename Infosec/docker-compose.yml => docker-compose.yml (100%) rename Infosec/docker-entrypoint.sh => docker-entrypoint.sh (100%) rename Infosec/init-db.js => init-db.js (100%) rename {Infosec/lib => lib}/audit.js (100%) rename {Infosec/lib => lib}/dates.js (100%) rename {Infosec/lib => lib}/mailer.js (100%) rename {Infosec/lib => lib}/settings.js (100%) rename {Infosec/lib => lib}/templates.js (100%) rename {Infosec/lib => lib}/validate.js (100%) rename {Infosec/middleware => middleware}/auth.js (100%) rename Infosec/package-lock.json => package-lock.json (100%) rename Infosec/package.json => package.json (100%) rename {Infosec/public => public}/account.html (100%) rename {Infosec/public => public}/assets/infosec-logo.png (100%) rename {Infosec/public => public}/calendar-view.html (100%) rename {Infosec/public => public}/css/style.css (100%) rename {Infosec/public => public}/data-management.html (100%) rename {Infosec/public => public}/js/app.js (100%) rename {Infosec/public => public}/legislation.html (100%) rename {Infosec/public => public}/login.html (100%) rename {Infosec/public => public}/logs.html (100%) rename {Infosec/public => public}/setup.html (100%) rename {Infosec/public => public}/storage.html (100%) rename {Infosec/public => public}/version-control.html (100%) rename {Infosec/public => public}/view-data.html (100%) rename {Infosec/routes => routes}/auth.js (100%) rename {Infosec/routes => routes}/data.js (100%) rename {Infosec/routes => routes}/datacreate.js (100%) rename {Infosec/routes => routes}/legislation.js (100%) rename {Infosec/routes => routes}/logs.js (100%) rename {Infosec/routes => routes}/mail.js (100%) rename {Infosec/routes => routes}/manage.js (100%) rename {Infosec/routes => routes}/settings.js (100%) rename {Infosec/routes => routes}/setup.js (100%) rename {Infosec/routes => routes}/storage.js (100%) rename {Infosec/routes => routes}/users.js (100%) rename {Infosec/routes => routes}/versions.js (100%) rename Infosec/server.js => server.js (100%) rename {Infosec/uploads => uploads}/.gitkeep (100%) diff --git a/Infosec/.dockerignore b/.dockerignore similarity index 100% rename from Infosec/.dockerignore rename to .dockerignore diff --git a/Infosec/.env.example b/.env.example similarity index 100% rename from Infosec/.env.example rename to .env.example diff --git a/Infosec/.gitignore b/.gitignore similarity index 100% rename from Infosec/.gitignore rename to .gitignore diff --git a/Alert Hub System/.dockerignore b/Alert Hub System/.dockerignore deleted file mode 100644 index 378ea1e..0000000 --- a/Alert Hub System/.dockerignore +++ /dev/null @@ -1,19 +0,0 @@ -.git -.gitignore -.env -*.md -__pycache__/ -*.pyc -*.pyo -*.pyd -.venv/ -venv/ -.env.local -data/ -*.db -*.sqlite* -.DS_Store -.idea/ -.vscode/ -node_modules/ -tests/ diff --git a/Alert Hub System/.env.example b/Alert Hub System/.env.example deleted file mode 100644 index 699da0c..0000000 --- a/Alert Hub System/.env.example +++ /dev/null @@ -1,79 +0,0 @@ -# ============================================================================= -# AlertHub Configuration -# All configuration is done here. NEVER commit your real .env to source control. -# ============================================================================= - -# ---- Flask Core ---- -# Generate a strong key: python -c "import secrets; print(secrets.token_hex(32))" -SECRET_KEY=change-me-to-a-long-random-string-please-generate-with-secrets-module -FLASK_ENV=production - -# ---- Ports ---- -# AlertHub now runs as a SINGLE service on one port. The admin backoffice is -# served on the same port under the /backoffice path (admins only). -FRONTOFFICE_PORT=8080 - -# BACKOFFICE_PORT is no longer used (the backoffice shares the main port under -# /backoffice). It is kept here only so old .env files remain valid; you can -# safely delete it. -# BACKOFFICE_PORT=9001 - -# ---- Gunicorn (optional) ---- -# Keep GUNICORN_WORKERS at 1 so the reminder scheduler runs exactly once. -# Increase GUNICORN_THREADS for more concurrency instead. -GUNICORN_WORKERS=1 -GUNICORN_THREADS=4 - -# ---- Database ---- -DATABASE_PATH=/data/alerthub.db - -# ---- Initial Administrator ---- -# There is NO seeded admin any more. On first launch, open the app and you'll be -# taken to a one-time "Create administrator" screen to set the username & -# password yourself. (The variables below are legacy/no-ops, kept for reference.) -# INITIAL_ADMIN_USERNAME=admin -# INITIAL_ADMIN_EMAIL=admin@example.com -# INITIAL_ADMIN_PASSWORD= - -# ---- Session / Security ---- -# Set SESSION_COOKIE_SECURE=true if you serve via HTTPS (recommended in production) -SESSION_COOKIE_SECURE=false -SESSION_LIFETIME_HOURS=8 -PASSWORD_MIN_LENGTH=10 - -# ---- MFA ---- -# MFA is optional and self-service: any user can enable it from Account → MFA. -MFA_ISSUER_NAME=AlertHub - -# ---- Scheduler ---- -# How often (in minutes) the scheduler checks alerts and dispatches reminder emails -SCHEDULER_INTERVAL_MINUTES=60 - -# ---- Default Reminder Lead Times (in days) ---- -# Comma-separated list. Configurable per-alert later, but these are defaults. -DEFAULT_REMINDER_DAYS=30,14,7,1 - -# ---- SMTP / Outgoing mail (Purelymail defaults) ---- -# Note: these values seed the DB on first run only. After that, edit them in -# the backoffice at /mail-config. -# Purelymail SMTP: smtp.purelymail.com : 465 (SSL/TLS) -# If your client only supports STARTTLS, use port 587 with SMTP_ENCRYPTION=starttls -SMTP_HOST=smtp.purelymail.com -SMTP_PORT=465 -SMTP_USERNAME=you@yourdomain.com -SMTP_PASSWORD= -SMTP_ENCRYPTION=ssl -# Allowed: none | starttls | ssl -SMTP_FROM_ADDRESS=you@yourdomain.com -SMTP_FROM_NAME=AlertHub Notifications - -# ---- IMAP / Sent-folder copy (Purelymail defaults) ---- -# When a mail is sent from the platform, a copy is appended to the mailbox's -# Sent folder over IMAP so it shows up in your normal mail client. -# Purelymail IMAP: imap.purelymail.com : 993 (SSL/TLS) -# Leave IMAP_USERNAME / IMAP_PASSWORD blank to reuse the SMTP credentials. -IMAP_HOST=imap.purelymail.com -IMAP_PORT=993 -IMAP_USERNAME= -IMAP_PASSWORD= -IMAP_SENT_FOLDER=Sent diff --git a/Alert Hub System/.gitignore b/Alert Hub System/.gitignore deleted file mode 100644 index 9bc2f00..0000000 --- a/Alert Hub System/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.env -*.pyc -__pycache__/ -.venv/ -venv/ -data/ -*.db -*.sqlite* -.DS_Store -.idea/ -.vscode/ diff --git a/Alert Hub System/Dockerfile b/Alert Hub System/Dockerfile deleted file mode 100644 index dedbe96..0000000 --- a/Alert Hub System/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -# syntax=docker/dockerfile:1.7 -# ---- Build / runtime image ------------------------------------------------- -# python:3.13-slim-trixie is the current stable Debian-based slim variant. -FROM python:3.13-slim-trixie - -ENV PYTHONDONTWRITEBYTECODE=1 \ - PYTHONUNBUFFERED=1 \ - PIP_NO_CACHE_DIR=1 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 - -# Install only what we strictly need (curl for healthchecks). -# Use --no-install-recommends, then immediately purge apt lists to keep -# the image small. -RUN apt-get update \ - && apt-get install -y --no-install-recommends curl \ - && rm -rf /var/lib/apt/lists/* - -# Create an unprivileged user -RUN groupadd --system --gid 10001 alerthub \ - && useradd --system --uid 10001 --gid alerthub --home-dir /app --shell /usr/sbin/nologin alerthub - -WORKDIR /app - -# Install Python dependencies first (better layer cache) -COPY --chown=alerthub:alerthub requirements.txt ./ -RUN pip install --upgrade pip \ - && pip install --no-cache-dir -r requirements.txt - -# Copy application sources -COPY --chown=alerthub:alerthub app/ ./app/ -COPY --chown=alerthub:alerthub wsgi.py wsgi_frontoffice.py wsgi_backoffice.py entrypoint.sh ./ - -RUN chmod +x entrypoint.sh \ - && mkdir -p /data \ - && chown -R alerthub:alerthub /app /data - -USER alerthub - -EXPOSE 8080 - -# Start the unified app (frontoffice + /backoffice) on a single port. -ENTRYPOINT ["./entrypoint.sh"] - -HEALTHCHECK --interval=30s --timeout=4s --start-period=10s --retries=3 \ - CMD curl -fsS http://127.0.0.1:${FRONTOFFICE_PORT:-8080}/login >/dev/null || exit 1 diff --git a/Alert Hub System/OLD_VERSIONS/v1.0/alerthub.zip b/Alert Hub System/OLD_VERSIONS/v1.0/alerthub.zip deleted file mode 100644 index a8503c03ee89e31fcc32b08f8615a99f228c15b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48307 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 diff --git a/Alert Hub System/OLD_VERSIONS/v1.3/alerthub.zip b/Alert Hub System/OLD_VERSIONS/v1.3/alerthub.zip deleted file mode 100644 index 2fef4575f8e704b6a2414b114f9926abf00d8016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56865 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

g7}>+tl!~X-`wYlO?7NQOp|IX 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 W?V1>I^FaT-8~j0olDCb}xBmeLQy;UCG<4D#^1F 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

amXd*-^R#Sze(hr`gLKLdr@;lkHl5BAZX~(B7 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 z

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�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 diff --git a/Alert Hub System/README.md b/Alert Hub System/README.md deleted file mode 100644 index a779da7..0000000 --- a/Alert Hub System/README.md +++ /dev/null @@ -1,144 +0,0 @@ -# AlertHub - -**Version 1.5 — Martinhal IT (Joao Vaz)** - -A Dockerized alert/reminder web application with email notifications, MFA-capable authentication, and role-based access control. Designed for tracking expiration dates (licenses, renewals, certificates, contracts) with live countdown timers and configurable email reminders. - -## Features - -- **First-run admin setup** — On the very first launch (no accounts yet) you're taken to a "Create administrator" screen to set the admin username & password yourself. No seeded/default admin credentials. -- **Single-port architecture** — Everything runs on one port (`:8080`). The frontoffice (alerts + management) is at the root; the admin backoffice (users, mail, settings, audit log, mail log) is served on the **same port** under `/backoffice` and is restricted to admins. -- **Backoffice shortcut** — Admins get a **Backoffice** link in the top bar (and a **Frontoffice** link back) that switches between the two areas. Only visible to admins. -- **Authentication** — Password (bcrypt, 12 rounds) with optional TOTP MFA. **Any user** can self-enable MFA from *Account → MFA*; it is never mandatory. -- **User avatars** — Any user can upload a profile picture (PNG/JPG/GIF/WebP). Images are auto-squared and resized to 256×256 and stored in the database (survives upgrades). Shown in the top bar. -- **RBAC** — Two roles: `user` (view-only) and `admin` (full access) -- **Live countdown timers** — Per-alert ticking timers (days/hours/minutes/seconds) with state-based color coding (warning, critical, expired) -- **Email reminders** — Configurable SMTP + IMAP editable from the backoffice. Per-alert override of reminder lead times. -- **Mail log** — Every message the platform sends is recorded in the backoffice **Mail Log** (recipients, subject, delivery status, whether the Sent-folder copy was saved, and who triggered it). -- **Sent-folder copy (IMAP)** — After each successful send, a copy of the message is appended to the mailbox's **Sent** folder over IMAP, so it appears in your normal mail client. -- **Log export & email** — Both the Audit log and Mail log can be exported to CSV or emailed (as a CSV attachment) to any destination address. -- **Account security** — Lockout after 5 failed attempts (15-minute window), audit log of sensitive actions, security headers (CSP, X-Frame-Options, HSTS-ready) -- **IT-terminal aesthetic** — JetBrains Mono + IBM Plex Sans, signal-green accents, light + dark mode (auto-detect + manual toggle) -- **Consistent footer** — `© 2026 Martinhal IT - Joao Vaz - Version 1.5` on every page except the login screen. -- **Hardened container** — Non-root user, all capabilities dropped, `no-new-privileges`, healthcheck - -## Stack - -Python 3.13 · Flask 3.1 · SQLAlchemy 2 · Flask-Login · Flask-WTF · APScheduler · pyotp · bcrypt · gunicorn · SQLite - -## Quick start - -```bash -# 1. Get the code, then: -cp .env.example .env - -# 2. Edit .env — at minimum, change: -# - SECRET_KEY (use: python -c "import secrets; print(secrets.token_hex(32))") -# - SMTP_* / IMAP_* (your Purelymail credentials) - -# 3. Build and start: -docker compose up -d --build - -# 4. Open: -# App: http://localhost:8080 -# Backoffice: http://localhost:8080/backoffice (admins only) - -# 5. First visit → you'll be sent to the "Create administrator" screen. -# Set the admin username, email, and password there. -``` - -### First-run checklist - -1. Open the app — you'll land on **Create administrator**. Set the admin username, email and password. -2. Sign in with the credentials you just created. -3. (Optional) Go to **Account** → **Set up MFA** (scan the QR code with Google Authenticator, Authy, 1Password, etc.). Any user can do this. -4. (Optional) **Account** → **Profile avatar** → upload a picture. -5. Open the backoffice → **Mail** → confirm the Purelymail SMTP/IMAP settings, fill in the mailbox username/password, and send a test email. Check the **Mail Log** to confirm it sent and that a copy was saved to the mailbox's Sent folder. -6. Backoffice → **Settings** → set the default reminder lead times (e.g. `30,14,7,1` days before expiry). -7. Frontoffice → **Manage Alerts** → add your first alert. - -## Configuration - -All configuration lives in `.env`. The `docker-compose.yml` only references the file via `env_file` — no secrets are baked into the image or compose file. - -| Variable | Purpose | -|---|---| -| `SECRET_KEY` | Flask session signing key (required, generate a new one) | -| `FRONTOFFICE_PORT` | The single host port (default 8080). `BACKOFFICE_PORT` is no longer used. | -| `GUNICORN_WORKERS` / `GUNICORN_THREADS` | Web server sizing. Keep workers at 1 so the reminder scheduler runs once (default 1 worker / 4 threads). | -| `DATABASE_PATH` | SQLite path inside the container (default `/data/alerthub.db`) | -| `SESSION_LIFETIME_HOURS` | Login session length | -| `MAX_LOGIN_ATTEMPTS` / `LOCKOUT_MINUTES` | Brute-force protection | -| `SCHEDULER_INTERVAL_MINUTES` | How often the reminder job runs (default 60) | -| `SMTP_HOST` / `SMTP_PORT` / `SMTP_USERNAME` / `SMTP_PASSWORD` / `SMTP_ENCRYPTION` / `SMTP_FROM_ADDRESS` / `SMTP_FROM_NAME` | Initial outgoing-mail config (Purelymail defaults; seeded into DB on first run; admins edit live values via backoffice afterwards) | -| `IMAP_HOST` / `IMAP_PORT` / `IMAP_USERNAME` / `IMAP_PASSWORD` / `IMAP_SENT_FOLDER` | IMAP settings for saving a copy of sent mail to the Sent folder (Purelymail defaults). Leave user/pass blank to reuse the SMTP credentials. | -| `DEFAULT_REMINDER_DAYS` | Default reminder thresholds, comma-separated (e.g. `30,14,7,1`) | - -> **Admin account:** There is no seeded admin. The first launch presents a one-time **Create administrator** screen. The old `INITIAL_ADMIN_*` variables are no longer used. - -> **Note:** `SMTP_*` / `IMAP_*` values seed the database on first launch. After that, the backoffice **Mail** page is the source of truth — edits there persist independently of `.env`. - -### Purelymail mail settings - -Defaults ship pre-configured for Purelymail: - -- **Outgoing (SMTP):** `smtp.purelymail.com`, port **465**, SSL/TLS. (If your client only supports STARTTLS, use port **587** with `SMTP_ENCRYPTION=starttls`.) -- **Incoming (IMAP):** `imap.purelymail.com`, port **993**, SSL/TLS — used to append sent messages to the **Sent** folder. - -Just fill in your mailbox username and password (in `.env` or the backoffice **Mail** page). - -## Upgrading in place (no data loss) - -This build is designed to be **unzipped over the previous version**. On startup the app runs additive migrations: it creates any new tables (e.g. the mail log) and adds any new columns (avatars) to the existing SQLite database in the `/data` volume, without touching your existing users, alerts, settings, or audit history. - -```bash -# from the folder containing your existing docker-compose.yml / .env / app: -unzip -o alerthub.zip # overwrite code in place (keeps .env and the /data volume) -docker compose up -d --build # rebuild & restart; migrations run automatically -``` - -Your customised SMTP settings are preserved on upgrade; the new IMAP keys are seeded with the Purelymail defaults (adjust them in the backoffice **Mail** page). - -## Architecture - -``` -┌──────────── Docker container ────────────┐ -│ │ -│ entrypoint.sh │ -│ └── gunicorn wsgi:application :8080 │ -│ ├── frontoffice (/) │ -│ ├── backoffice (/backoffice) │ -│ └── scheduler (APScheduler) │ -│ │ -│ /data/alerthub.db (named volume) │ -└──────────────────────────────────────────┘ -``` - -Both processes share the same SQLite database (mounted as a Docker named volume). The reminder scheduler runs only inside the frontoffice process to avoid duplicate emails. - -## Security notes - -- Passwords stored as bcrypt hashes (cost 12). -- TOTP secrets stored encrypted at rest is NOT implemented — the secret is stored as-is. If your threat model requires it, mount the DB on an encrypted volume. -- CSP is strict (no inline scripts except the early theme bootstrap which is `nonce`-able if you tighten further). -- Container runs as uid `10001`, drops all Linux capabilities, and uses `no-new-privileges`. -- Brute-force lockout is per-username, not per-IP. - -## Operational tips - -- **Trigger a reminder check manually:** Backoffice → Settings → "Run check now". -- **Reset a user's MFA:** Backoffice → Users → row menu → Reset MFA. -- **Unlock a locked-out user:** Backoffice → Users → row menu → Unlock. -- **Inspect activity:** Backoffice → Audit log (paginated). -- **Reset reminder history for an alert** (e.g. after extending the date): Manage Alerts → row → Reset reminders. - -## Uninstall / data reset - -```bash -docker compose down # stop containers, keep data -docker compose down -v # also remove the alerthub_data volume (deletes DB) -``` - -## License - -Provided as-is for internal use. No warranty. diff --git a/Alert Hub System/app/__init__.py b/Alert Hub System/app/__init__.py deleted file mode 100644 index 46a18fb..0000000 --- a/Alert Hub System/app/__init__.py +++ /dev/null @@ -1,278 +0,0 @@ -"""Application factory. - -Builds a single unified Flask app served on ONE port: - - frontoffice at the root: / (View) and /alerts (Add/Edit/Remove) - - backoffice under /backoffice: users, mail config, settings, audit log, - mail log — all restricted to admins. - -Everything shares the same database, models, and login system. The ``variant`` -argument is retained for backwards compatibility with existing WSGI entry -points but no longer changes what is registered — both areas are always -available on the same app. -""" -import os -import logging -from flask import Flask, redirect, url_for, render_template, request, session -from flask_login import LoginManager -from flask_wtf.csrf import CSRFProtect -from sqlalchemy import inspect, text -from sqlalchemy.exc import IntegrityError, OperationalError - -from .config import Config -from .models import db, User, AppSetting -from .scheduler import init_scheduler - -APP_VERSION = "1.5" - -login_manager = LoginManager() -csrf = CSRFProtect() - - -def _setup_logging(): - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", - ) - - -def _run_migrations(app: Flask): - """Lightweight, additive schema migrations so an existing DB can be - upgraded in place (unzip-over-the-top) without any data loss. - - Only ADDs missing tables/columns — never drops or alters existing data. - Every step is idempotent and tolerant of a concurrent process having - already applied it (both gunicorn apps boot against the same file). - """ - with app.app_context(): - # 1. Create any brand-new tables (e.g. mail_log) and missing tables. - try: - db.create_all() - except OperationalError as e: - # Another booting process created a table at the same moment. - app.logger.info("create_all raced (ignored): %s", e) - db.session.rollback() - - # 2. Add any missing columns on the users table. - inspector = inspect(db.engine) - existing_cols = {c["name"] for c in inspector.get_columns("users")} - add_column = { - "avatar_data": "ALTER TABLE users ADD COLUMN avatar_data BLOB", - "avatar_mime": "ALTER TABLE users ADD COLUMN avatar_mime VARCHAR(64)", - } - for col, ddl in add_column.items(): - if col in existing_cols: - continue - try: - with db.engine.begin() as conn: - conn.execute(text(ddl)) - app.logger.info("Migration: added users.%s", col) - except OperationalError as e: - # "duplicate column name" — another process won the race. Fine. - app.logger.info("Add column %s raced (ignored): %s", col, e) - - -def _seed_settings(app: Flask): - """Seed default settings (mail config, IMAP, reminders) when rows are - missing. Never overwrites values an admin has already set — so upgrades - keep existing configuration. New keys (e.g. IMAP) are seeded on upgrade. - - Uses an INSERT that tolerates a concurrent process seeding the same key. - """ - with app.app_context(): - defaults = { - # ---- SMTP (outgoing) — Purelymail defaults ---- - "smtp_host": app.config.get("SMTP_HOST", "smtp.purelymail.com"), - "smtp_port": str(app.config.get("SMTP_PORT", 465)), - "smtp_username": app.config.get("SMTP_USERNAME", ""), - "smtp_password": app.config.get("SMTP_PASSWORD", ""), - "smtp_encryption": app.config.get("SMTP_ENCRYPTION", "ssl"), - "smtp_from_address": app.config.get("SMTP_FROM_ADDRESS", ""), - "smtp_from_name": app.config.get("SMTP_FROM_NAME", "AlertHub"), - # ---- IMAP (Sent-folder copy) — Purelymail defaults ---- - "imap_enabled": "true", - "imap_host": app.config.get("IMAP_HOST", "imap.purelymail.com"), - "imap_port": str(app.config.get("IMAP_PORT", 993)), - "imap_username": app.config.get("IMAP_USERNAME", ""), - "imap_password": app.config.get("IMAP_PASSWORD", ""), - "imap_sent_folder": app.config.get("IMAP_SENT_FOLDER", "Sent"), - # ---- Reminders ---- - "default_reminder_days": app.config.get("DEFAULT_REMINDER_DAYS", "30,14,7,1"), - } - for k, v in defaults.items(): - if AppSetting.get(k) is not None: - continue - try: - row = AppSetting(key=k, value=v) - db.session.add(row) - db.session.commit() - except IntegrityError: - # A concurrent boot inserted this key first — that's fine. - db.session.rollback() - - -def _initialise_database(app: Flask): - """Run migrations + seeding exactly once at a time across processes. - - The container starts several worker processes that all import the app and - hit the shared SQLite file simultaneously. A cross-process file lock - serialises initialisation so concurrent DDL/seeding can't collide. - """ - import fcntl # POSIX-only; the container is Linux. - - db_dir = os.path.dirname(app.config["DATABASE_PATH"]) or "." - os.makedirs(db_dir, exist_ok=True) - lock_path = os.path.join(db_dir, ".alerthub-init.lock") - - try: - lock_file = open(lock_path, "w") - except OSError: - # If we somehow can't open the lock file, fall back to unlocked init; - # the per-step tolerance above still guards against most races. - _run_migrations(app) - _seed_settings(app) - return - - with lock_file: - try: - fcntl.flock(lock_file, fcntl.LOCK_EX) - except OSError: - pass # advisory lock unavailable — proceed; steps are tolerant. - try: - _run_migrations(app) - _seed_settings(app) - finally: - try: - fcntl.flock(lock_file, fcntl.LOCK_UN) - except OSError: - pass - - -def create_app(variant: str = "frontoffice") -> Flask: - """Build the unified Flask app (frontoffice + /backoffice on one port). - - ``variant`` is accepted for backwards compatibility with the existing WSGI - entry points but no longer restricts which blueprints are registered. - """ - if variant not in ("frontoffice", "backoffice"): - variant = "frontoffice" - - _setup_logging() - - app = Flask( - __name__, - template_folder="templates", - static_folder="static", - ) - app.config.from_object(Config) - app.config["APP_VARIANT"] = variant - - # Make sure data dir exists - os.makedirs(os.path.dirname(app.config["DATABASE_PATH"]), exist_ok=True) - - db.init_app(app) - csrf.init_app(app) - login_manager.init_app(app) - login_manager.login_view = "auth.login" - login_manager.login_message = "Please sign in to continue." - login_manager.login_message_category = "info" - - @login_manager.user_loader - def load_user(user_id): - try: - return db.session.get(User, int(user_id)) - except (TypeError, ValueError): - return None - - # ---- Blueprints ---- - # Unified app: the frontoffice lives at the root and the backoffice is - # mounted under /backoffice, so both are served on the SAME port. Access to - # backoffice views is still restricted to admins by @admin_required. - from .routes_auth import auth_bp - from .routes_main import main_bp - from .routes_backoffice import backoffice_bp - - app.register_blueprint(auth_bp) - app.register_blueprint(main_bp) - app.register_blueprint(backoffice_bp, url_prefix="/backoffice") - - # ---- Error handlers ---- - @app.errorhandler(403) - def forbidden(_): - return render_template("error.html", code=403, message="You don't have permission to view this page."), 403 - - @app.errorhandler(404) - def not_found(_): - return render_template("error.html", code=404, message="Page not found."), 404 - - @app.errorhandler(500) - def server_error(_): - return render_template("error.html", code=500, message="Internal server error."), 500 - - # ---- Security headers ---- - @app.after_request - def add_security_headers(response): - response.headers.setdefault("X-Content-Type-Options", "nosniff") - response.headers.setdefault("X-Frame-Options", "DENY") - response.headers.setdefault("Referrer-Policy", "strict-origin-when-cross-origin") - response.headers.setdefault("Permissions-Policy", "geolocation=(), microphone=(), camera=()") - # Reasonable CSP for our self-hosted assets + the QR data URI - response.headers.setdefault( - "Content-Security-Policy", - "default-src 'self'; img-src 'self' data:; " - "style-src 'self' 'unsafe-inline'; script-src 'self'; " - "font-src 'self' data:; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" - ) - return response - - # ---- Template context: brand + which area we're in ---- - @app.context_processor - def inject_globals(): - # The backoffice is now mounted under /backoffice on the same origin, - # so cross-links are simple same-site URLs and "is_backoffice" is - # determined by which blueprint served the current request. - is_bo = (request.blueprint == "backoffice") if request else False - try: - backoffice_url = url_for("backoffice.dashboard") - frontoffice_url = url_for("main.index") - except Exception: - backoffice_url = "/backoffice/" - frontoffice_url = "/" - return { - "app_variant": "backoffice" if is_bo else "frontoffice", - "brand_name": "AlertHub", - "is_backoffice": is_bo, - "app_version": APP_VERSION, - "footer_text": "© 2026 Martinhal IT - Joao Vaz - Version " + APP_VERSION, - "backoffice_url": backoffice_url, - "frontoffice_url": frontoffice_url, - } - - # ---- Initialise DB (additive migrations) + seed default settings. - # Serialised across the container's worker processes via a file lock. ---- - _initialise_database(app) - - # ---- First-run guard: if there are no users yet, force the operator - # through the "create administrator" setup screen before anything else. ---- - app._alerthub_has_users = False - - @app.before_request - def _require_initial_setup(): - if app._alerthub_has_users: - return None - # Allow static assets and the setup endpoint itself through. - if request.endpoint in ("static", "auth.setup"): - return None - try: - if User.query.count() > 0: - app._alerthub_has_users = True - return None - except Exception: - return None - return redirect(url_for("auth.setup")) - - # ---- Scheduler. init_scheduler() is idempotent (guarded by a module-level - # singleton), and the container runs a single Gunicorn worker, so exactly - # one reminder scheduler runs regardless of how many times this is called. ---- - init_scheduler(app) - - return app diff --git a/Alert Hub System/app/auth_utils.py b/Alert Hub System/app/auth_utils.py deleted file mode 100644 index ecdf567..0000000 --- a/Alert Hub System/app/auth_utils.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Auth helpers and decorators.""" -from functools import wraps -from flask import abort, redirect, url_for, session, flash, request -from flask_login import current_user - - -def admin_required(view): - @wraps(view) - def wrapped(*args, **kwargs): - if not current_user.is_authenticated: - return redirect(url_for("auth.login", next=request.full_path)) - if not current_user.is_admin: - abort(403) - if session.get("mfa_pending"): - return redirect(url_for("auth.mfa_challenge")) - return view(*args, **kwargs) - return wrapped - - -def login_required_full(view): - """Like flask_login.login_required, but also blocks users with pending MFA.""" - @wraps(view) - def wrapped(*args, **kwargs): - if not current_user.is_authenticated: - return redirect(url_for("auth.login", next=request.full_path)) - if session.get("mfa_pending"): - return redirect(url_for("auth.mfa_challenge")) - return view(*args, **kwargs) - return wrapped - - -def get_remote_ip() -> str: - """Best-effort IP detection for audit logs.""" - fwd = request.headers.get("X-Forwarded-For", "") - if fwd: - return fwd.split(",")[0].strip() - return request.remote_addr or "" diff --git a/Alert Hub System/app/config.py b/Alert Hub System/app/config.py deleted file mode 100644 index ffa9a56..0000000 --- a/Alert Hub System/app/config.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Configuration loaded from environment variables.""" -import os -from datetime import timedelta - - -def _bool(val: str, default: bool = False) -> bool: - if val is None: - return default - return val.strip().lower() in ("1", "true", "yes", "on") - - -class Config: - SECRET_KEY = os.environ.get("SECRET_KEY", "dev-only-replace-me") - FLASK_ENV = os.environ.get("FLASK_ENV", "production") - - DATABASE_PATH = os.environ.get("DATABASE_PATH", "/data/alerthub.db") - SQLALCHEMY_DATABASE_URI = f"sqlite:///{DATABASE_PATH}" - SQLALCHEMY_TRACK_MODIFICATIONS = False - SQLALCHEMY_ENGINE_OPTIONS = { - "pool_pre_ping": True, - # Wait (instead of erroring) when another process holds the SQLite - # write lock — both gunicorn apps share one database file. - "connect_args": {"timeout": 30}, - } - - # Bootstrap admin (only used on first DB init) - INITIAL_ADMIN_USERNAME = os.environ.get("INITIAL_ADMIN_USERNAME", "admin") - INITIAL_ADMIN_EMAIL = os.environ.get("INITIAL_ADMIN_EMAIL", "admin@example.com") - INITIAL_ADMIN_PASSWORD = os.environ.get("INITIAL_ADMIN_PASSWORD", "ChangeMeOnFirstLogin!") - - # Session security - SESSION_COOKIE_SECURE = _bool(os.environ.get("SESSION_COOKIE_SECURE"), False) - SESSION_COOKIE_HTTPONLY = True - SESSION_COOKIE_SAMESITE = "Lax" - PERMANENT_SESSION_LIFETIME = timedelta( - hours=int(os.environ.get("SESSION_LIFETIME_HOURS", "8")) - ) - - PASSWORD_MIN_LENGTH = int(os.environ.get("PASSWORD_MIN_LENGTH", "10")) - - # MFA - MFA_ISSUER_NAME = os.environ.get("MFA_ISSUER_NAME", "AlertHub") - - # Scheduler - SCHEDULER_INTERVAL_MINUTES = int(os.environ.get("SCHEDULER_INTERVAL_MINUTES", "60")) - - # Default reminder lead times in days - DEFAULT_REMINDER_DAYS = os.environ.get("DEFAULT_REMINDER_DAYS", "30,14,7,1") - - # SMTP defaults (seed only — admins edit live values via backoffice) - # Purelymail outgoing: smtp.purelymail.com : 465 (SSL/TLS) - SMTP_HOST = os.environ.get("SMTP_HOST", "smtp.purelymail.com") - SMTP_PORT = int(os.environ.get("SMTP_PORT", "465")) - SMTP_USERNAME = os.environ.get("SMTP_USERNAME", "") - SMTP_PASSWORD = os.environ.get("SMTP_PASSWORD", "") - SMTP_ENCRYPTION = os.environ.get("SMTP_ENCRYPTION", "ssl") - SMTP_FROM_ADDRESS = os.environ.get("SMTP_FROM_ADDRESS", "") - SMTP_FROM_NAME = os.environ.get("SMTP_FROM_NAME", "AlertHub") - - # IMAP defaults (seed only) — used to save a copy of sent mail to the - # mailbox's Sent folder. Purelymail incoming: imap.purelymail.com : 993 (SSL/TLS) - IMAP_HOST = os.environ.get("IMAP_HOST", "imap.purelymail.com") - IMAP_PORT = int(os.environ.get("IMAP_PORT", "993")) - IMAP_USERNAME = os.environ.get("IMAP_USERNAME", "") - IMAP_PASSWORD = os.environ.get("IMAP_PASSWORD", "") - IMAP_SENT_FOLDER = os.environ.get("IMAP_SENT_FOLDER", "Sent") - - # Ports (used by run scripts only) - FRONTOFFICE_PORT = int(os.environ.get("FRONTOFFICE_PORT", "8080")) - BACKOFFICE_PORT = int(os.environ.get("BACKOFFICE_PORT", "9001")) - - # Optional explicit public URLs for the cross-console links in the top bar. - # If empty, the app derives them from the request host + the ports above - # (e.g. http://:9001/). Set these when behind a reverse proxy - # or when the consoles are reached at custom hostnames/paths. - BACKOFFICE_PUBLIC_URL = os.environ.get("BACKOFFICE_PUBLIC_URL", "") - FRONTOFFICE_PUBLIC_URL = os.environ.get("FRONTOFFICE_PUBLIC_URL", "") - - # Resource limits - MAX_CONTENT_LENGTH = 2 * 1024 * 1024 # 2MB upload cap - WTF_CSRF_TIME_LIMIT = 3600 diff --git a/Alert Hub System/app/forms.py b/Alert Hub System/app/forms.py deleted file mode 100644 index 0947d0e..0000000 --- a/Alert Hub System/app/forms.py +++ /dev/null @@ -1,139 +0,0 @@ -"""WTForms — all forms get CSRF protection automatically via Flask-WTF.""" -from flask_wtf import FlaskForm -from flask_wtf.file import FileField, FileAllowed, FileRequired -from wtforms import StringField, PasswordField, BooleanField, IntegerField, SelectField, DateField, TextAreaField, SubmitField -from wtforms.validators import DataRequired, Email, Length, EqualTo, Optional, NumberRange, Regexp - - -class LoginForm(FlaskForm): - username = StringField("Username", validators=[DataRequired(), Length(min=2, max=64)]) - password = PasswordField("Password", validators=[DataRequired(), Length(min=1, max=200)]) - submit = SubmitField("Sign in") - - -class SetupAdminForm(FlaskForm): - """First-run form: create the very first administrator account.""" - username = StringField("Admin username", validators=[ - DataRequired(), - Length(min=2, max=64), - Regexp(r"^[A-Za-z0-9_.\-]+$", message="Letters, digits, underscore, dot, dash only."), - ]) - email = StringField("Admin email", validators=[DataRequired(), Email(), Length(max=255)]) - password = PasswordField("Password", validators=[ - DataRequired(), - Length(min=10, max=200, message="Min 10 characters"), - ]) - confirm = PasswordField("Confirm password", validators=[ - DataRequired(), - EqualTo("password", message="Passwords must match."), - ]) - submit = SubmitField("Create administrator") - - -class AvatarForm(FlaskForm): - avatar = FileField("Avatar image", validators=[ - FileRequired(message="Choose an image file."), - FileAllowed(["png", "jpg", "jpeg", "gif", "webp"], "Images only (png, jpg, gif, webp)."), - ]) - submit = SubmitField("Upload avatar") - - -class MfaForm(FlaskForm): - code = StringField("Authentication code", validators=[ - DataRequired(), - Length(min=6, max=6, message="Must be 6 digits"), - Regexp(r"^\d{6}$", message="Digits only"), - ]) - submit = SubmitField("Verify") - - -class MfaSetupForm(FlaskForm): - code = StringField("Verification code", validators=[ - DataRequired(), - Length(min=6, max=6), - Regexp(r"^\d{6}$"), - ]) - submit = SubmitField("Enable MFA") - - -class ChangePasswordForm(FlaskForm): - current_password = PasswordField("Current password", validators=[DataRequired()]) - new_password = PasswordField("New password", validators=[ - DataRequired(), - Length(min=10, max=200, message="Min 10 characters"), - ]) - confirm = PasswordField("Confirm new password", validators=[ - DataRequired(), - EqualTo("new_password", message="Passwords must match."), - ]) - submit = SubmitField("Change password") - - -class AlertForm(FlaskForm): - title = StringField("Title", validators=[DataRequired(), Length(max=200)]) - category = StringField("Category", validators=[Optional(), Length(max=64)]) - description = TextAreaField("Description", validators=[Optional(), Length(max=5000)]) - expiration_date = DateField("Expiration date", validators=[DataRequired()], format="%Y-%m-%d") - reminder_days = StringField( - "Reminder days (comma-separated, days before expiration)", - validators=[DataRequired(), Regexp(r"^[\d,\s]+$", message="Numbers separated by commas only")], - default="30,14,7,1", - ) - is_active = BooleanField("Active", default=True) - submit = SubmitField("Save") - - -class UserForm(FlaskForm): - username = StringField("Username", validators=[ - DataRequired(), - Length(min=2, max=64), - Regexp(r"^[A-Za-z0-9_.\-]+$", message="Letters, digits, underscore, dot, dash only."), - ]) - email = StringField("Email", validators=[DataRequired(), Email(), Length(max=255)]) - role = SelectField("Role", choices=[("user", "User (view only)"), ("admin", "Administrator")]) - is_active = BooleanField("Active", default=True) - password = PasswordField("Password (leave blank to keep current)", validators=[Optional(), Length(min=10, max=200)]) - submit = SubmitField("Save") - - -class MailConfigForm(FlaskForm): - smtp_host = StringField("SMTP Host", validators=[DataRequired(), Length(max=255)]) - smtp_port = IntegerField("Port", validators=[DataRequired(), NumberRange(min=1, max=65535)]) - smtp_username = StringField("Username", validators=[Optional(), Length(max=255)]) - smtp_password = PasswordField("Password (leave blank to keep current)", validators=[Optional(), Length(max=255)]) - smtp_encryption = SelectField("Encryption", choices=[ - ("none", "None (plain — not recommended)"), - ("starttls", "STARTTLS (port 587)"), - ("ssl", "SSL/TLS (port 465)"), - ]) - smtp_from_address = StringField("From address", validators=[DataRequired(), Email(), Length(max=255)]) - smtp_from_name = StringField("From name", validators=[Optional(), Length(max=255)]) - - # ---- IMAP: used to save a copy of every sent message to the Sent folder ---- - imap_enabled = BooleanField("Save a copy of sent mail to the mailbox (IMAP)", default=True) - imap_host = StringField("IMAP Host", validators=[Optional(), Length(max=255)]) - imap_port = IntegerField("IMAP Port", validators=[Optional(), NumberRange(min=1, max=65535)]) - imap_username = StringField("IMAP Username (blank = use SMTP username)", validators=[Optional(), Length(max=255)]) - imap_password = PasswordField("IMAP Password (blank = keep current / use SMTP password)", validators=[Optional(), Length(max=255)]) - imap_sent_folder = StringField("Sent folder name", validators=[Optional(), Length(max=128)]) - - submit = SubmitField("Save mail configuration") - - -class TestMailForm(FlaskForm): - test_recipient = StringField("Send test email to", validators=[DataRequired(), Email()]) - submit = SubmitField("Send test email") - - -class LogEmailForm(FlaskForm): - """Email an exported log (CSV attachment) to a destination address.""" - log_recipient = StringField("Email log to", validators=[DataRequired(), Email()]) - submit = SubmitField("Email log") - - -class GlobalSettingsForm(FlaskForm): - default_reminder_days = StringField( - "Default reminder days (comma-separated)", - validators=[DataRequired(), Regexp(r"^[\d,\s]+$")], - ) - submit = SubmitField("Save settings") diff --git a/Alert Hub System/app/mailer.py b/Alert Hub System/app/mailer.py deleted file mode 100644 index d1edfa5..0000000 --- a/Alert Hub System/app/mailer.py +++ /dev/null @@ -1,161 +0,0 @@ -"""SMTP mailer that pulls live config from the AppSetting store. - -Every send is recorded in the MailLog (visible in the backoffice "Mail Log"), -and — when IMAP is configured — a copy of the outgoing message is appended to -the external mailbox's Sent folder so it shows up in normal mail clients. -""" -import smtplib -import imaplib -import ssl -import time -import logging -from email.message import EmailMessage -from email.utils import formataddr, formatdate -from flask_login import current_user -from .models import AppSetting, MailLog - -logger = logging.getLogger(__name__) - - -def get_mail_config() -> dict: - """Read SMTP + IMAP settings from the database.""" - return { - # ---- SMTP (outgoing) ---- - "host": AppSetting.get("smtp_host", "") or "", - "port": int(AppSetting.get("smtp_port", "465") or "465"), - "username": AppSetting.get("smtp_username", "") or "", - "password": AppSetting.get("smtp_password", "") or "", - "encryption": (AppSetting.get("smtp_encryption", "ssl") or "ssl").lower(), - "from_address": AppSetting.get("smtp_from_address", "") or "", - "from_name": AppSetting.get("smtp_from_name", "AlertHub") or "AlertHub", - # ---- IMAP (for saving a copy in the Sent folder) ---- - "imap_enabled": (AppSetting.get("imap_enabled", "true") or "true").lower() in ("1", "true", "yes", "on"), - "imap_host": AppSetting.get("imap_host", "") or "", - "imap_port": int(AppSetting.get("imap_port", "993") or "993"), - "imap_username": AppSetting.get("imap_username", "") or "", - "imap_password": AppSetting.get("imap_password", "") or "", - "imap_sent_folder": AppSetting.get("imap_sent_folder", "Sent") or "Sent", - } - - -def _build_message(cfg, to_addresses, subject, body_text, body_html=None, attachments=None) -> EmailMessage: - msg = EmailMessage() - msg["Subject"] = subject - msg["From"] = formataddr((cfg["from_name"], cfg["from_address"])) - msg["To"] = ", ".join(to_addresses) - msg["Date"] = formatdate(localtime=True) - msg.set_content(body_text) - if body_html: - msg.add_alternative(body_html, subtype="html") - for att in (attachments or []): - # att = (filename, mime_maintype, mime_subtype, bytes) - fname, maintype, subtype, data = att - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=fname) - return msg - - -def _append_to_sent(cfg, msg) -> tuple[bool, str]: - """Append a copy of the message to the mailbox's Sent folder over IMAP.""" - if not cfg.get("imap_enabled"): - return False, "disabled" - imap_host = cfg["imap_host"] or "" - imap_user = cfg["imap_username"] or cfg["username"] - imap_pass = cfg["imap_password"] or cfg["password"] - if not imap_host or not imap_user or not imap_pass: - return False, "IMAP not fully configured" - folder = cfg.get("imap_sent_folder") or "Sent" - try: - context = ssl.create_default_context() - with imaplib.IMAP4_SSL(imap_host, cfg.get("imap_port", 993), ssl_context=context, timeout=20) as imap: - imap.login(imap_user, imap_pass) - raw = msg.as_bytes() - # \Seen so it doesn't show as unread in the Sent folder - typ, _ = imap.append(folder, "(\\Seen)", imaplib.Time2Internaldate(time.time()), raw) - if typ != "OK": - return False, f"IMAP append returned {typ}" - return True, "saved" - except (imaplib.IMAP4.error, ssl.SSLError, OSError) as e: - logger.exception("IMAP append to Sent failed") - return False, f"IMAP error: {e}" - - -def _smtp_send(cfg, msg) -> tuple[bool, str]: - encryption = cfg["encryption"] - try: - if encryption == "ssl": - context = ssl.create_default_context() - with smtplib.SMTP_SSL(cfg["host"], cfg["port"], context=context, timeout=20) as server: - if cfg["username"]: - server.login(cfg["username"], cfg["password"]) - server.send_message(msg) - else: - with smtplib.SMTP(cfg["host"], cfg["port"], timeout=20) as server: - server.ehlo() - if encryption == "starttls": - context = ssl.create_default_context() - server.starttls(context=context) - server.ehlo() - if cfg["username"]: - server.login(cfg["username"], cfg["password"]) - server.send_message(msg) - return True, "ok" - except smtplib.SMTPAuthenticationError as e: - logger.exception("SMTP auth failed") - err = e.smtp_error.decode("utf-8", errors="ignore") if isinstance(e.smtp_error, bytes) else e.smtp_error - return False, f"Authentication failed: {e.smtp_code} {err}" - except (smtplib.SMTPException, ssl.SSLError, OSError) as e: - logger.exception("SMTP error") - return False, f"SMTP error: {e}" - - -def send_mail(to_addresses, subject: str, body_text: str, body_html: str | None = None, - attachments=None, kind: str = "general", triggered_by: str | None = None) -> tuple[bool, str]: - """Send an email. Returns (success, message). Never raises. - - Side effects: - - Appends a copy to the external mailbox Sent folder (IMAP) on success. - - Records the send (and Sent-copy result) in the MailLog. - """ - cfg = get_mail_config() - - # Resolve who triggered this (username) for the log. - if triggered_by is None: - try: - triggered_by = current_user.username if current_user.is_authenticated else "system" - except Exception: - triggered_by = "system" - - if not cfg["host"] or not cfg["from_address"]: - info = "SMTP not configured (host or from-address missing)." - MailLog.record(kind, to_addresses, subject, "failed", info, "n/a", triggered_by) - return False, info - - if isinstance(to_addresses, str): - to_addresses = [to_addresses] - to_addresses = [a for a in to_addresses if a] - if not to_addresses: - info = "No recipients." - MailLog.record(kind, "", subject, "failed", info, "n/a", triggered_by) - return False, info - - msg = _build_message(cfg, to_addresses, subject, body_text, body_html, attachments) - - ok, info = _smtp_send(cfg, msg) - - sent_copy = "n/a" - if ok: - copied, copy_info = _append_to_sent(cfg, msg) - if copy_info == "disabled": - sent_copy = "disabled" - elif copied: - sent_copy = "saved" - else: - sent_copy = "failed" - info = f"{info}; Sent-copy: {copy_info}" - - MailLog.record(kind, to_addresses, subject, - "sent" if ok else "failed", info, sent_copy, triggered_by) - - if ok: - return True, f"Sent to {len(to_addresses)} recipient(s)." - return False, info diff --git a/Alert Hub System/app/models.py b/Alert Hub System/app/models.py deleted file mode 100644 index b125171..0000000 --- a/Alert Hub System/app/models.py +++ /dev/null @@ -1,192 +0,0 @@ -"""SQLAlchemy models.""" -from datetime import datetime, timezone -from flask_sqlalchemy import SQLAlchemy -from flask_login import UserMixin -import bcrypt -import json - -db = SQLAlchemy() - - -def utcnow(): - return datetime.now(timezone.utc) - - -class User(UserMixin, db.Model): - __tablename__ = "users" - - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(64), unique=True, nullable=False, index=True) - email = db.Column(db.String(255), unique=True, nullable=False) - password_hash = db.Column(db.String(255), nullable=False) - role = db.Column(db.String(16), nullable=False, default="user") # 'user' | 'admin' - is_active = db.Column(db.Boolean, default=True, nullable=False) - - mfa_secret = db.Column(db.String(64), nullable=True) - mfa_enabled = db.Column(db.Boolean, default=False, nullable=False) - - # Optional user avatar (stored as normalised PNG bytes in the DB so it - # survives an "unzip over the top" upgrade without any external files). - avatar_data = db.Column(db.LargeBinary, nullable=True) - avatar_mime = db.Column(db.String(64), nullable=True) - - created_at = db.Column(db.DateTime, default=utcnow, nullable=False) - last_login_at = db.Column(db.DateTime, nullable=True) - failed_login_count = db.Column(db.Integer, default=0, nullable=False) - locked_until = db.Column(db.DateTime, nullable=True) - - # ---- password helpers ---- - def set_password(self, password: str) -> None: - self.password_hash = bcrypt.hashpw( - password.encode("utf-8"), bcrypt.gensalt(rounds=12) - ).decode("utf-8") - - def check_password(self, password: str) -> bool: - try: - return bcrypt.checkpw( - password.encode("utf-8"), self.password_hash.encode("utf-8") - ) - except (ValueError, TypeError): - return False - - @property - def is_admin(self) -> bool: - return self.role == "admin" - - @property - def is_locked(self) -> bool: - return self.locked_until is not None and self.locked_until > utcnow() - - @property - def has_avatar(self) -> bool: - return self.avatar_data is not None and len(self.avatar_data) > 0 - - @property - def initials(self) -> str: - return (self.username or "?")[:2].upper() - - -class Alert(db.Model): - __tablename__ = "alerts" - - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(200), nullable=False) - description = db.Column(db.Text, nullable=True) - category = db.Column(db.String(64), nullable=True) # e.g. 'License', 'Renewal' - expiration_date = db.Column(db.Date, nullable=False) - # JSON-encoded list of integer days, e.g. "[30, 14, 7, 1]" - reminder_days_json = db.Column(db.String(255), nullable=False, default="[30,14,7,1]") - # JSON-encoded list of days for which the reminder has already been sent (avoid dupes) - reminders_sent_json = db.Column(db.String(255), nullable=False, default="[]") - is_active = db.Column(db.Boolean, default=True, nullable=False) - created_by = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True) - created_at = db.Column(db.DateTime, default=utcnow, nullable=False) - updated_at = db.Column(db.DateTime, default=utcnow, onupdate=utcnow, nullable=False) - - creator = db.relationship("User", foreign_keys=[created_by]) - - @property - def reminder_days(self) -> list: - try: - return sorted(set(int(x) for x in json.loads(self.reminder_days_json)), reverse=True) - except (ValueError, TypeError): - return [] - - @reminder_days.setter - def reminder_days(self, value) -> None: - self.reminder_days_json = json.dumps(sorted(set(int(x) for x in value), reverse=True)) - - @property - def reminders_sent(self) -> list: - try: - return list(json.loads(self.reminders_sent_json)) - except (ValueError, TypeError): - return [] - - @reminders_sent.setter - def reminders_sent(self, value) -> None: - self.reminders_sent_json = json.dumps(list(value)) - - -class AppSetting(db.Model): - """Generic key/value settings store (mail config + misc).""" - __tablename__ = "app_settings" - - key = db.Column(db.String(64), primary_key=True) - value = db.Column(db.Text, nullable=True) - updated_at = db.Column(db.DateTime, default=utcnow, onupdate=utcnow, nullable=False) - - @classmethod - def get(cls, key: str, default=None): - row = db.session.get(cls, key) - return row.value if row is not None else default - - @classmethod - def set(cls, key: str, value: str) -> None: - row = db.session.get(cls, key) - if row is None: - row = cls(key=key, value=value) - db.session.add(row) - else: - row.value = value - db.session.commit() - - @classmethod - def get_all(cls) -> dict: - return {row.key: row.value for row in cls.query.all()} - - -class AuditLog(db.Model): - __tablename__ = "audit_log" - - id = db.Column(db.Integer, primary_key=True) - timestamp = db.Column(db.DateTime, default=utcnow, nullable=False, index=True) - user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True) - username = db.Column(db.String(64), nullable=True) # denormalised for survival after delete - action = db.Column(db.String(64), nullable=False) - details = db.Column(db.Text, nullable=True) - ip_address = db.Column(db.String(45), nullable=True) - - @staticmethod - def record(action: str, user=None, details: str = "", ip: str = ""): - entry = AuditLog( - action=action, - user_id=getattr(user, "id", None), - username=getattr(user, "username", None), - details=details[:1000] if details else None, - ip_address=ip, - ) - db.session.add(entry) - db.session.commit() - - -class MailLog(db.Model): - """Record of every outbound email dispatched by the platform.""" - __tablename__ = "mail_log" - - id = db.Column(db.Integer, primary_key=True) - timestamp = db.Column(db.DateTime, default=utcnow, nullable=False, index=True) - kind = db.Column(db.String(32), nullable=False, default="general") # reminder | test | log-export | general - recipients = db.Column(db.Text, nullable=True) - subject = db.Column(db.String(500), nullable=True) - status = db.Column(db.String(16), nullable=False, default="unknown") # sent | failed - info = db.Column(db.Text, nullable=True) - sent_copy = db.Column(db.String(24), nullable=False, default="n/a") # saved | failed | disabled | n/a - triggered_by = db.Column(db.String(64), nullable=True) # username or "system" - - @staticmethod - def record(kind, recipients, subject, status, info="", sent_copy="n/a", triggered_by="system"): - if isinstance(recipients, (list, tuple)): - recipients = ", ".join(str(r) for r in recipients) - entry = MailLog( - kind=(kind or "general")[:32], - recipients=(recipients or "")[:2000], - subject=(subject or "")[:500], - status=(status or "unknown")[:16], - info=(info or "")[:2000], - sent_copy=(sent_copy or "n/a")[:24], - triggered_by=(triggered_by or "system")[:64], - ) - db.session.add(entry) - db.session.commit() - return entry diff --git a/Alert Hub System/app/routes_auth.py b/Alert Hub System/app/routes_auth.py deleted file mode 100644 index 5a094c0..0000000 --- a/Alert Hub System/app/routes_auth.py +++ /dev/null @@ -1,308 +0,0 @@ -"""Authentication routes: first-run setup, login, MFA, logout, password, avatar.""" -import io -import base64 -from datetime import timedelta -import pyotp -import qrcode -from PIL import Image, ImageOps -from flask import ( - Blueprint, render_template, redirect, url_for, flash, request, session, - current_app, abort, Response, -) -from flask_login import login_user, logout_user, login_required, current_user - -from .models import db, User, AuditLog, utcnow -from .forms import LoginForm, MfaForm, MfaSetupForm, ChangePasswordForm, SetupAdminForm, AvatarForm -from .auth_utils import get_remote_ip, login_required_full - -auth_bp = Blueprint("auth", __name__) - - -AVATAR_SIZE = 256 - - -def _normalise_avatar(file_storage) -> bytes: - """Open an uploaded image, square-crop + resize, return PNG bytes. - - Raises ValueError if the file is not a usable image. - """ - try: - img = Image.open(file_storage.stream) - img = ImageOps.exif_transpose(img) - img = img.convert("RGBA") if img.mode in ("RGBA", "LA", "P") else img.convert("RGB") - # Center-crop to a square, then resize. - img = ImageOps.fit(img, (AVATAR_SIZE, AVATAR_SIZE), method=Image.LANCZOS) - if img.mode == "RGBA": - background = Image.new("RGBA", img.size, (255, 255, 255, 0)) - img = Image.alpha_composite(background, img) - buf = io.BytesIO() - img.save(buf, format="PNG", optimize=True) - return buf.getvalue() - except Exception as exc: # noqa: BLE001 - surface a clean error to the user - raise ValueError(f"Could not process image: {exc}") - - -# --------------------------------------------------------------------------- # -# First-run setup — create the initial administrator -# --------------------------------------------------------------------------- # -@auth_bp.route("/setup", methods=["GET", "POST"]) -def setup(): - # Only available while there are zero users. Once an admin exists, hide it. - if User.query.count() > 0: - return redirect(url_for("auth.login")) - - form = SetupAdminForm() - if form.validate_on_submit(): - admin = User( - username=form.username.data.strip(), - email=form.email.data.strip().lower(), - role="admin", - is_active=True, - ) - admin.set_password(form.password.data) - db.session.add(admin) - db.session.commit() - current_app._alerthub_has_users = True - AuditLog.record("setup.admin_created", user=admin, details=f"username={admin.username}", ip=get_remote_ip()) - flash("Administrator account created. Please sign in.", "success") - return redirect(url_for("auth.login")) - - return render_template("setup.html", form=form) - - -# --------------------------------------------------------------------------- # -# Login -# --------------------------------------------------------------------------- # -@auth_bp.route("/login", methods=["GET", "POST"]) -def login(): - if current_user.is_authenticated and not session.get("mfa_pending"): - return redirect(url_for("main.index")) - - form = LoginForm() - if form.validate_on_submit(): - user = User.query.filter_by(username=form.username.data.strip()).first() - ip = get_remote_ip() - - if user is None or not user.check_password(form.password.data): - # Increment failed login if user exists - if user is not None: - user.failed_login_count = (user.failed_login_count or 0) + 1 - if user.failed_login_count >= 5: - user.locked_until = utcnow() + timedelta(minutes=15) - user.failed_login_count = 0 - AuditLog.record("login.lockout", user=user, details=f"5 failed attempts", ip=ip) - db.session.commit() - AuditLog.record("login.fail", details=f"username={form.username.data}", ip=ip) - flash("Invalid credentials.", "error") - return render_template("login.html", form=form), 401 - - if not user.is_active: - flash("Account is disabled.", "error") - AuditLog.record("login.disabled", user=user, ip=ip) - return render_template("login.html", form=form), 403 - - if user.is_locked: - flash("Account is temporarily locked due to failed login attempts. Try again later.", "error") - AuditLog.record("login.locked", user=user, ip=ip) - return render_template("login.html", form=form), 423 - - # Password OK — reset counters - user.failed_login_count = 0 - user.locked_until = None - - if user.mfa_enabled: - # Stage 1 success — but require MFA before granting full session - session["mfa_pending"] = True - session["pending_user_id"] = user.id - db.session.commit() - AuditLog.record("login.password_ok", user=user, ip=ip) - return redirect(url_for("auth.mfa_challenge")) - - # No MFA — full login - login_user(user, remember=False) - session.permanent = True - session.pop("mfa_pending", None) - session.pop("pending_user_id", None) - user.last_login_at = utcnow() - db.session.commit() - AuditLog.record("login.success", user=user, ip=ip) - - next_url = request.args.get("next") or url_for("main.index") - return redirect(next_url) - - return render_template("login.html", form=form) - - -# --------------------------------------------------------------------------- # -# MFA challenge (after password OK) -# --------------------------------------------------------------------------- # -@auth_bp.route("/mfa", methods=["GET", "POST"]) -def mfa_challenge(): - if not session.get("mfa_pending"): - return redirect(url_for("auth.login")) - - user_id = session.get("pending_user_id") - user = db.session.get(User, user_id) if user_id else None - if user is None or not user.mfa_enabled or not user.mfa_secret: - session.pop("mfa_pending", None) - session.pop("pending_user_id", None) - return redirect(url_for("auth.login")) - - form = MfaForm() - if form.validate_on_submit(): - totp = pyotp.TOTP(user.mfa_secret) - if totp.verify(form.code.data, valid_window=1): - login_user(user, remember=False) - session.permanent = True - session.pop("mfa_pending", None) - session.pop("pending_user_id", None) - user.last_login_at = utcnow() - db.session.commit() - AuditLog.record("login.mfa_ok", user=user, ip=get_remote_ip()) - return redirect(url_for("main.index")) - flash("Invalid authentication code.", "error") - AuditLog.record("login.mfa_fail", user=user, ip=get_remote_ip()) - - return render_template("mfa.html", form=form) - - -# --------------------------------------------------------------------------- # -# Logout -# --------------------------------------------------------------------------- # -@auth_bp.route("/logout", methods=["POST"]) -@login_required -def logout(): - AuditLog.record("logout", user=current_user, ip=get_remote_ip()) - logout_user() - session.clear() - flash("Signed out.", "success") - return redirect(url_for("auth.login")) - - -# --------------------------------------------------------------------------- # -# Account: change password / set up MFA -# --------------------------------------------------------------------------- # -@auth_bp.route("/account", methods=["GET"]) -@login_required_full -def account(): - return render_template( - "account.html", - password_form=ChangePasswordForm(), - mfa_setup_form=MfaSetupForm(), - avatar_form=AvatarForm(), - ) - - -# --------------------------------------------------------------------------- # -# Avatar: upload / remove / serve -# --------------------------------------------------------------------------- # -@auth_bp.route("/account/avatar", methods=["POST"]) -@login_required_full -def avatar_upload(): - form = AvatarForm() - if form.validate_on_submit(): - try: - png_bytes = _normalise_avatar(form.avatar.data) - except ValueError as e: - flash(str(e), "error") - return redirect(url_for("auth.account")) - current_user.avatar_data = png_bytes - current_user.avatar_mime = "image/png" - db.session.commit() - AuditLog.record("avatar.update", user=current_user, ip=get_remote_ip()) - flash("Avatar updated.", "success") - else: - for errs in form.errors.values(): - for e in errs: - flash(e, "error") - return redirect(url_for("auth.account")) - - -@auth_bp.route("/account/avatar/remove", methods=["POST"]) -@login_required_full -def avatar_remove(): - current_user.avatar_data = None - current_user.avatar_mime = None - db.session.commit() - AuditLog.record("avatar.remove", user=current_user, ip=get_remote_ip()) - flash("Avatar removed.", "info") - return redirect(url_for("auth.account")) - - -@auth_bp.route("/avatar/", methods=["GET"]) -@login_required_full -def avatar(user_id: int): - user = db.session.get(User, user_id) - if user is None or not user.has_avatar: - abort(404) - resp = Response(user.avatar_data, mimetype=user.avatar_mime or "image/png") - resp.headers["Cache-Control"] = "private, max-age=60" - return resp - - -@auth_bp.route("/account/password", methods=["POST"]) -@login_required_full -def change_password(): - form = ChangePasswordForm() - if form.validate_on_submit(): - if not current_user.check_password(form.current_password.data): - flash("Current password is incorrect.", "error") - else: - current_user.set_password(form.new_password.data) - db.session.commit() - AuditLog.record("password.change", user=current_user, ip=get_remote_ip()) - flash("Password updated.", "success") - return redirect(url_for("auth.account")) - return render_template( - "account.html", - password_form=form, - mfa_setup_form=MfaSetupForm(), - ) - - -@auth_bp.route("/account/mfa/setup", methods=["GET", "POST"]) -@login_required_full -def mfa_setup(): - """Generate a new TOTP secret + QR code; user confirms with a 6-digit code.""" - if current_user.mfa_enabled: - flash("MFA is already enabled.", "info") - return redirect(url_for("auth.account")) - - # Keep candidate secret in session until verified - if "mfa_setup_secret" not in session: - session["mfa_setup_secret"] = pyotp.random_base32() - - secret = session["mfa_setup_secret"] - issuer = current_app.config.get("MFA_ISSUER_NAME", "AlertHub") - uri = pyotp.TOTP(secret).provisioning_uri(name=current_user.email, issuer_name=issuer) - - # Generate QR code as base64 PNG - img = qrcode.make(uri) - buf = io.BytesIO() - img.save(buf, format="PNG") - qr_b64 = base64.b64encode(buf.getvalue()).decode("ascii") - - form = MfaSetupForm() - if form.validate_on_submit(): - if pyotp.TOTP(secret).verify(form.code.data, valid_window=1): - current_user.mfa_secret = secret - current_user.mfa_enabled = True - db.session.commit() - session.pop("mfa_setup_secret", None) - AuditLog.record("mfa.enabled", user=current_user, ip=get_remote_ip()) - flash("MFA enabled successfully. You will be prompted for a code on next sign-in.", "success") - return redirect(url_for("auth.account")) - flash("Verification code did not match. Try again.", "error") - - return render_template("mfa_setup.html", form=form, qr_b64=qr_b64, secret=secret) - - -@auth_bp.route("/account/mfa/disable", methods=["POST"]) -@login_required_full -def mfa_disable(): - current_user.mfa_enabled = False - current_user.mfa_secret = None - db.session.commit() - AuditLog.record("mfa.disabled", user=current_user, ip=get_remote_ip()) - flash("MFA disabled.", "info") - return redirect(url_for("auth.account")) diff --git a/Alert Hub System/app/routes_backoffice.py b/Alert Hub System/app/routes_backoffice.py deleted file mode 100644 index baea9a8..0000000 --- a/Alert Hub System/app/routes_backoffice.py +++ /dev/null @@ -1,426 +0,0 @@ -"""Backoffice routes — admins only. -Sections: - 3. Manage Users & Permissions - - Mail / SMTP configuration - - Global settings (default reminder days, scheduler, run-now) - - Audit log viewer -""" -import csv -import io -from datetime import date, datetime -from flask import Blueprint, render_template, redirect, url_for, flash, request, abort, current_app, Response -from flask_login import current_user - -from .models import db, User, Alert, AppSetting, AuditLog, MailLog -from .forms import UserForm, MailConfigForm, TestMailForm, GlobalSettingsForm, LogEmailForm -from .auth_utils import admin_required, get_remote_ip -from .mailer import send_mail, get_mail_config -from .scheduler import trigger_now - -backoffice_bp = Blueprint("backoffice", __name__) - - -def _csv_response(filename: str, header: list, rows) -> Response: - buf = io.StringIO() - writer = csv.writer(buf) - writer.writerow(header) - for r in rows: - writer.writerow(r) - data = buf.getvalue() - return Response( - data, - mimetype="text/csv", - headers={"Content-Disposition": f'attachment; filename="{filename}"'}, - ) - - -def _audit_rows(): - for e in AuditLog.query.order_by(AuditLog.timestamp.desc()).all(): - yield [ - e.timestamp.strftime("%Y-%m-%d %H:%M:%S") if e.timestamp else "", - e.username or "", - e.action or "", - e.details or "", - e.ip_address or "", - ] - - -def _maillog_rows(): - for m in MailLog.query.order_by(MailLog.timestamp.desc()).all(): - yield [ - m.timestamp.strftime("%Y-%m-%d %H:%M:%S") if m.timestamp else "", - m.kind or "", - m.recipients or "", - m.subject or "", - m.status or "", - m.sent_copy or "", - m.triggered_by or "", - m.info or "", - ] - - -AUDIT_CSV_HEADER = ["timestamp_utc", "user", "action", "details", "ip"] -MAILLOG_CSV_HEADER = ["timestamp_utc", "kind", "recipients", "subject", "status", "sent_copy", "triggered_by", "info"] - - -def _build_csv_string(header, rows) -> str: - buf = io.StringIO() - writer = csv.writer(buf) - writer.writerow(header) - for r in rows: - writer.writerow(r) - return buf.getvalue() - - -# --------------------------------------------------------------------------- # -# Backoffice home — admin dashboard -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/") -@admin_required -def dashboard(): - user_count = User.query.count() - admin_count = User.query.filter_by(role="admin").count() - active_alerts = Alert.query.filter_by(is_active=True).count() - today = date.today() - expiring_soon = Alert.query.filter( - Alert.is_active.is_(True), - Alert.expiration_date >= today, - ).order_by(Alert.expiration_date.asc()).limit(5).all() - recent_audit = AuditLog.query.order_by(AuditLog.timestamp.desc()).limit(10).all() - return render_template( - "backoffice/dashboard.html", - user_count=user_count, - admin_count=admin_count, - active_alerts=active_alerts, - expiring_soon=expiring_soon, - recent_audit=recent_audit, - today=today, - ) - - -# --------------------------------------------------------------------------- # -# User management -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/users") -@admin_required -def users_list(): - users = User.query.order_by(User.username.asc()).all() - return render_template("backoffice/users_list.html", users=users) - - -@backoffice_bp.route("/users/new", methods=["GET", "POST"]) -@admin_required -def user_new(): - form = UserForm() - if form.validate_on_submit(): - if not form.password.data: - flash("Password is required for a new user.", "error") - elif User.query.filter((User.username == form.username.data) | (User.email == form.email.data)).first(): - flash("Username or email already exists.", "error") - elif len(form.password.data) < current_app.config["PASSWORD_MIN_LENGTH"]: - flash(f"Password must be at least {current_app.config['PASSWORD_MIN_LENGTH']} characters.", "error") - else: - user = User( - username=form.username.data.strip(), - email=form.email.data.strip().lower(), - role=form.role.data, - is_active=form.is_active.data, - ) - user.set_password(form.password.data) - db.session.add(user) - db.session.commit() - AuditLog.record("user.create", user=current_user, details=f"new={user.username} role={user.role}", ip=get_remote_ip()) - flash(f"User '{user.username}' created.", "success") - return redirect(url_for("backoffice.users_list")) - return render_template("backoffice/user_form.html", form=form, user=None) - - -@backoffice_bp.route("/users//edit", methods=["GET", "POST"]) -@admin_required -def user_edit(user_id: int): - user = db.session.get(User, user_id) - if user is None: - abort(404) - form = UserForm(obj=user) - if form.validate_on_submit(): - # Username / email uniqueness check (excluding self) - clash = User.query.filter( - User.id != user.id, - (User.username == form.username.data) | (User.email == form.email.data.lower()) - ).first() - if clash: - flash("Another user already has that username or email.", "error") - else: - # Prevent self-demotion of last admin / self-deactivation lock-out - if user.id == current_user.id: - if form.role.data != "admin": - flash("You cannot demote yourself.", "error") - return render_template("backoffice/user_form.html", form=form, user=user) - if not form.is_active.data: - flash("You cannot deactivate your own account.", "error") - return render_template("backoffice/user_form.html", form=form, user=user) - - # Prevent removing the last active admin - if user.role == "admin" and form.role.data != "admin": - other_admins = User.query.filter(User.id != user.id, User.role == "admin", User.is_active.is_(True)).count() - if other_admins == 0: - flash("Cannot demote the last administrator.", "error") - return render_template("backoffice/user_form.html", form=form, user=user) - - user.username = form.username.data.strip() - user.email = form.email.data.strip().lower() - user.role = form.role.data - user.is_active = form.is_active.data - if form.password.data: - if len(form.password.data) < current_app.config["PASSWORD_MIN_LENGTH"]: - flash(f"Password must be at least {current_app.config['PASSWORD_MIN_LENGTH']} characters.", "error") - return render_template("backoffice/user_form.html", form=form, user=user) - user.set_password(form.password.data) - db.session.commit() - AuditLog.record("user.update", user=current_user, details=f"id={user.id} username={user.username}", ip=get_remote_ip()) - flash("User updated.", "success") - return redirect(url_for("backoffice.users_list")) - return render_template("backoffice/user_form.html", form=form, user=user) - - -@backoffice_bp.route("/users//delete", methods=["POST"]) -@admin_required -def user_delete(user_id: int): - user = db.session.get(User, user_id) - if user is None: - abort(404) - if user.id == current_user.id: - flash("You cannot delete your own account.", "error") - return redirect(url_for("backoffice.users_list")) - if user.role == "admin": - other_admins = User.query.filter(User.id != user.id, User.role == "admin", User.is_active.is_(True)).count() - if other_admins == 0: - flash("Cannot delete the last administrator.", "error") - return redirect(url_for("backoffice.users_list")) - username = user.username - db.session.delete(user) - db.session.commit() - AuditLog.record("user.delete", user=current_user, details=f"deleted={username}", ip=get_remote_ip()) - flash(f"User '{username}' deleted.", "success") - return redirect(url_for("backoffice.users_list")) - - -@backoffice_bp.route("/users//reset-mfa", methods=["POST"]) -@admin_required -def user_reset_mfa(user_id: int): - user = db.session.get(User, user_id) - if user is None: - abort(404) - user.mfa_enabled = False - user.mfa_secret = None - db.session.commit() - AuditLog.record("user.mfa_reset", user=current_user, details=f"target={user.username}", ip=get_remote_ip()) - flash(f"MFA reset for '{user.username}'. They can re-enrol on next login.", "info") - return redirect(url_for("backoffice.users_list")) - - -@backoffice_bp.route("/users//unlock", methods=["POST"]) -@admin_required -def user_unlock(user_id: int): - user = db.session.get(User, user_id) - if user is None: - abort(404) - user.locked_until = None - user.failed_login_count = 0 - db.session.commit() - AuditLog.record("user.unlock", user=current_user, details=f"target={user.username}", ip=get_remote_ip()) - flash(f"Unlocked '{user.username}'.", "success") - return redirect(url_for("backoffice.users_list")) - - -# --------------------------------------------------------------------------- # -# Mail configuration -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/mail-config", methods=["GET", "POST"]) -@admin_required -def mail_config(): - form = MailConfigForm() - test_form = TestMailForm() - - if request.method == "GET": - cfg = get_mail_config() - form.smtp_host.data = cfg["host"] - form.smtp_port.data = cfg["port"] - form.smtp_username.data = cfg["username"] - form.smtp_encryption.data = cfg["encryption"] - form.smtp_from_address.data = cfg["from_address"] - form.smtp_from_name.data = cfg["from_name"] - form.imap_enabled.data = cfg["imap_enabled"] - form.imap_host.data = cfg["imap_host"] - form.imap_port.data = cfg["imap_port"] - form.imap_username.data = cfg["imap_username"] - form.imap_sent_folder.data = cfg["imap_sent_folder"] - - if form.submit.data and form.validate_on_submit(): - AppSetting.set("smtp_host", form.smtp_host.data.strip()) - AppSetting.set("smtp_port", str(form.smtp_port.data)) - AppSetting.set("smtp_username", form.smtp_username.data.strip()) - if form.smtp_password.data: - AppSetting.set("smtp_password", form.smtp_password.data) - AppSetting.set("smtp_encryption", form.smtp_encryption.data) - AppSetting.set("smtp_from_address", form.smtp_from_address.data.strip().lower()) - AppSetting.set("smtp_from_name", (form.smtp_from_name.data or "").strip() or "AlertHub") - # ---- IMAP (Sent-folder copy) ---- - AppSetting.set("imap_enabled", "true" if form.imap_enabled.data else "false") - AppSetting.set("imap_host", (form.imap_host.data or "").strip()) - AppSetting.set("imap_port", str(form.imap_port.data or 993)) - AppSetting.set("imap_username", (form.imap_username.data or "").strip()) - if form.imap_password.data: - AppSetting.set("imap_password", form.imap_password.data) - AppSetting.set("imap_sent_folder", (form.imap_sent_folder.data or "").strip() or "Sent") - AuditLog.record("mailconfig.update", user=current_user, ip=get_remote_ip()) - flash("Mail configuration saved.", "success") - return redirect(url_for("backoffice.mail_config")) - - return render_template("backoffice/mail_config.html", form=form, test_form=test_form) - - -@backoffice_bp.route("/mail-config/test", methods=["POST"]) -@admin_required -def mail_test(): - test_form = TestMailForm() - if test_form.validate_on_submit(): - ok, info = send_mail( - test_form.test_recipient.data.strip(), - "[AlertHub] Test email", - "This is a test email from AlertHub. If you received this, SMTP is configured correctly.", - "

This is a test email from AlertHub. If you received this, SMTP is configured correctly.

", - kind="test", - triggered_by=current_user.username, - ) - AuditLog.record("mailconfig.test", user=current_user, details=f"to={test_form.test_recipient.data} ok={ok}", ip=get_remote_ip()) - flash(("Test email sent. " if ok else "Test failed: ") + info, "success" if ok else "error") - else: - flash("Provide a valid recipient email address.", "error") - return redirect(url_for("backoffice.mail_config")) - - -# --------------------------------------------------------------------------- # -# Global settings + scheduler trigger -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/settings", methods=["GET", "POST"]) -@admin_required -def settings(): - form = GlobalSettingsForm() - if request.method == "GET": - form.default_reminder_days.data = AppSetting.get("default_reminder_days", "30,14,7,1") - if form.validate_on_submit(): - cleaned = ",".join( - str(x) for x in sorted({int(p.strip()) for p in form.default_reminder_days.data.split(",") if p.strip().isdigit()}, reverse=True) - ) - if not cleaned: - flash("Please enter at least one valid day value.", "error") - else: - AppSetting.set("default_reminder_days", cleaned) - AuditLog.record("settings.update", user=current_user, details=f"default_reminder_days={cleaned}", ip=get_remote_ip()) - flash("Settings saved.", "success") - return redirect(url_for("backoffice.settings")) - scheduler_interval = current_app.config.get("SCHEDULER_INTERVAL_MINUTES", 60) - return render_template("backoffice/settings.html", form=form, scheduler_interval=scheduler_interval) - - -@backoffice_bp.route("/settings/run-check", methods=["POST"]) -@admin_required -def run_check_now(): - """Manually run the reminder scan once.""" - try: - trigger_now(current_app._get_current_object()) - AuditLog.record("scheduler.manual_run", user=current_user, ip=get_remote_ip()) - flash("Reminder check executed.", "success") - except Exception as e: - current_app.logger.exception("Manual scheduler run failed") - flash(f"Reminder check failed: {e}", "error") - return redirect(url_for("backoffice.settings")) - - -# --------------------------------------------------------------------------- # -# Audit log viewer -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/audit-log") -@admin_required -def audit_log(): - page = max(1, int(request.args.get("page", 1))) - per_page = 50 - pagination = AuditLog.query.order_by(AuditLog.timestamp.desc()).paginate(page=page, per_page=per_page, error_out=False) - return render_template("backoffice/audit_log.html", pagination=pagination, log_email_form=LogEmailForm()) - - -@backoffice_bp.route("/audit-log/export") -@admin_required -def audit_log_export(): - stamp = datetime.utcnow().strftime("%Y%m%d-%H%M%S") - AuditLog.record("auditlog.export", user=current_user, ip=get_remote_ip()) - return _csv_response(f"alerthub-audit-log-{stamp}.csv", AUDIT_CSV_HEADER, _audit_rows()) - - -@backoffice_bp.route("/audit-log/email", methods=["POST"]) -@admin_required -def audit_log_email(): - form = LogEmailForm() - if not form.validate_on_submit(): - flash("Provide a valid destination email address.", "error") - return redirect(url_for("backoffice.audit_log")) - recipient = form.log_recipient.data.strip() - stamp = datetime.utcnow().strftime("%Y%m%d-%H%M%S") - csv_str = _build_csv_string(AUDIT_CSV_HEADER, _audit_rows()) - ok, info = send_mail( - recipient, - f"[AlertHub] Audit log export ({stamp} UTC)", - "Attached is the AlertHub audit log export requested from the backoffice.", - "

Attached is the AlertHub audit log export requested from the backoffice.

", - attachments=[(f"alerthub-audit-log-{stamp}.csv", "text", "csv", csv_str.encode("utf-8"))], - kind="log-export", - triggered_by=current_user.username, - ) - AuditLog.record("auditlog.email", user=current_user, details=f"to={recipient} ok={ok}", ip=get_remote_ip()) - flash(("Audit log emailed. " if ok else "Failed to email log: ") + info, "success" if ok else "error") - return redirect(url_for("backoffice.audit_log")) - - -# --------------------------------------------------------------------------- # -# Mail log viewer (every message the platform sends) -# --------------------------------------------------------------------------- # -@backoffice_bp.route("/mail-log") -@admin_required -def mail_log(): - page = max(1, int(request.args.get("page", 1))) - per_page = 50 - pagination = MailLog.query.order_by(MailLog.timestamp.desc()).paginate(page=page, per_page=per_page, error_out=False) - return render_template("backoffice/mail_log.html", pagination=pagination, log_email_form=LogEmailForm()) - - -@backoffice_bp.route("/mail-log/export") -@admin_required -def mail_log_export(): - stamp = datetime.utcnow().strftime("%Y%m%d-%H%M%S") - AuditLog.record("maillog.export", user=current_user, ip=get_remote_ip()) - return _csv_response(f"alerthub-mail-log-{stamp}.csv", MAILLOG_CSV_HEADER, _maillog_rows()) - - -@backoffice_bp.route("/mail-log/email", methods=["POST"]) -@admin_required -def mail_log_email(): - form = LogEmailForm() - if not form.validate_on_submit(): - flash("Provide a valid destination email address.", "error") - return redirect(url_for("backoffice.mail_log")) - recipient = form.log_recipient.data.strip() - stamp = datetime.utcnow().strftime("%Y%m%d-%H%M%S") - csv_str = _build_csv_string(MAILLOG_CSV_HEADER, _maillog_rows()) - ok, info = send_mail( - recipient, - f"[AlertHub] Mail log export ({stamp} UTC)", - "Attached is the AlertHub mail log export requested from the backoffice.", - "

Attached is the AlertHub mail log export requested from the backoffice.

", - attachments=[(f"alerthub-mail-log-{stamp}.csv", "text", "csv", csv_str.encode("utf-8"))], - kind="log-export", - triggered_by=current_user.username, - ) - AuditLog.record("maillog.email", user=current_user, details=f"to={recipient} ok={ok}", ip=get_remote_ip()) - flash(("Mail log emailed. " if ok else "Failed to email log: ") + info, "success" if ok else "error") - return redirect(url_for("backoffice.mail_log")) diff --git a/Alert Hub System/app/routes_main.py b/Alert Hub System/app/routes_main.py deleted file mode 100644 index 4b5ebd1..0000000 --- a/Alert Hub System/app/routes_main.py +++ /dev/null @@ -1,137 +0,0 @@ -"""Frontoffice routes — visible to all authenticated users. - -Sections: - 1. View Data (everyone) - 2. Add/Remove/Edit (admins only) -""" -import json -from datetime import date -from flask import Blueprint, render_template, redirect, url_for, flash, request, abort -from flask_login import current_user - -from .models import db, Alert, AppSetting, AuditLog -from .forms import AlertForm -from .auth_utils import admin_required, login_required_full, get_remote_ip - -main_bp = Blueprint("main", __name__) - - -def _parse_days(text: str) -> list[int]: - return sorted({int(x.strip()) for x in text.split(",") if x.strip().isdigit() and int(x.strip()) >= 0}, reverse=True) - - -# --------------------------------------------------------------------------- # -# Section 1 — View Data -# --------------------------------------------------------------------------- # -@main_bp.route("/") -@login_required_full -def index(): - today = date.today() - alerts = Alert.query.filter_by(is_active=True).order_by(Alert.expiration_date.asc()).all() - payload = [] - for a in alerts: - days_left = (a.expiration_date - today).days - payload.append({ - "id": a.id, - "title": a.title, - "category": a.category, - "description": a.description, - "expiration_date": a.expiration_date.isoformat(), - "days_left": days_left, - "reminder_days": a.reminder_days, - }) - return render_template("index.html", alerts=payload, today_iso=today.isoformat()) - - -# --------------------------------------------------------------------------- # -# Section 2 — Add / Remove / Edit -# --------------------------------------------------------------------------- # -@main_bp.route("/alerts") -@login_required_full -def alerts_list(): - alerts = Alert.query.order_by(Alert.expiration_date.asc()).all() - return render_template("alerts_list.html", alerts=alerts) - - -@main_bp.route("/alerts/new", methods=["GET", "POST"]) -@admin_required -def alert_new(): - default_reminder_days = AppSetting.get("default_reminder_days", "30,14,7,1") - form = AlertForm(reminder_days=default_reminder_days) - if form.validate_on_submit(): - days = _parse_days(form.reminder_days.data) - if not days: - flash("Reminder days must contain at least one valid number.", "error") - else: - alert = Alert( - title=form.title.data.strip(), - category=(form.category.data or "").strip() or None, - description=(form.description.data or "").strip() or None, - expiration_date=form.expiration_date.data, - is_active=form.is_active.data, - created_by=current_user.id, - ) - alert.reminder_days = days - db.session.add(alert) - db.session.commit() - AuditLog.record("alert.create", user=current_user, details=f"id={alert.id} title={alert.title}", ip=get_remote_ip()) - flash("Alert created.", "success") - return redirect(url_for("main.alerts_list")) - return render_template("alert_form.html", form=form, alert=None) - - -@main_bp.route("/alerts//edit", methods=["GET", "POST"]) -@admin_required -def alert_edit(alert_id: int): - alert = db.session.get(Alert, alert_id) - if alert is None: - abort(404) - form = AlertForm(obj=alert) - if request.method == "GET": - form.reminder_days.data = ",".join(str(d) for d in alert.reminder_days) - if form.validate_on_submit(): - days = _parse_days(form.reminder_days.data) - if not days: - flash("Reminder days must contain at least one valid number.", "error") - else: - alert.title = form.title.data.strip() - alert.category = (form.category.data or "").strip() or None - alert.description = (form.description.data or "").strip() or None - alert.expiration_date = form.expiration_date.data - alert.is_active = form.is_active.data - # If reminder_days changed OR expiration_date changed, reset sent log - if days != alert.reminder_days: - alert.reminders_sent = [] - alert.reminder_days = days - db.session.commit() - AuditLog.record("alert.update", user=current_user, details=f"id={alert.id}", ip=get_remote_ip()) - flash("Alert updated.", "success") - return redirect(url_for("main.alerts_list")) - return render_template("alert_form.html", form=form, alert=alert) - - -@main_bp.route("/alerts//delete", methods=["POST"]) -@admin_required -def alert_delete(alert_id: int): - alert = db.session.get(Alert, alert_id) - if alert is None: - abort(404) - title = alert.title - db.session.delete(alert) - db.session.commit() - AuditLog.record("alert.delete", user=current_user, details=f"id={alert_id} title={title}", ip=get_remote_ip()) - flash(f"Alert '{title}' deleted.", "success") - return redirect(url_for("main.alerts_list")) - - -@main_bp.route("/alerts//reset-reminders", methods=["POST"]) -@admin_required -def alert_reset_reminders(alert_id: int): - alert = db.session.get(Alert, alert_id) - if alert is None: - abort(404) - alert.reminders_sent = [] - db.session.commit() - AuditLog.record("alert.reset_reminders", user=current_user, details=f"id={alert_id}", ip=get_remote_ip()) - flash("Reminder send-history cleared. Pending reminders will be re-sent on next scheduler run.", "info") - return redirect(url_for("main.alerts_list")) diff --git a/Alert Hub System/app/scheduler.py b/Alert Hub System/app/scheduler.py deleted file mode 100644 index 4668a6b..0000000 --- a/Alert Hub System/app/scheduler.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Background scheduler that scans alerts and dispatches reminder emails.""" -import logging -from datetime import date, timezone -from apscheduler.schedulers.background import BackgroundScheduler -from .models import Alert, User, db -from .mailer import send_mail - -logger = logging.getLogger(__name__) -_scheduler: BackgroundScheduler | None = None - - -def _check_and_send(app): - """Iterate active alerts; for each reminder threshold reached, email all users.""" - with app.app_context(): - today = date.today() - active_alerts = Alert.query.filter_by(is_active=True).all() - recipients = [u.email for u in User.query.filter_by(is_active=True).all() if u.email] - if not recipients: - logger.info("Scheduler tick: no recipients.") - return - - for alert in active_alerts: - days_left = (alert.expiration_date - today).days - already_sent = set(alert.reminders_sent) - newly_sent = [] - for threshold in alert.reminder_days: - if days_left <= threshold and threshold not in already_sent: - subject = f"[AlertHub] Reminder: {alert.title} expires in {days_left} day(s)" - body_text = ( - f"Alert: {alert.title}\n" - f"Category: {alert.category or '—'}\n" - f"Expiration date: {alert.expiration_date.isoformat()}\n" - f"Days remaining: {days_left}\n\n" - f"{alert.description or ''}\n" - ) - body_html = f""" -
-

⏰ AlertHub Reminder

-

{alert.title}

-

Category: {alert.category or '—'}
- Expiration date: {alert.expiration_date.isoformat()}
- Days remaining: {days_left}

-

{alert.description or ''}

-
- """ - ok, info = send_mail(recipients, subject, body_text, body_html, - kind="reminder", triggered_by="system") - logger.info("Alert %s threshold %d: send=%s (%s)", alert.id, threshold, ok, info) - if ok: - newly_sent.append(threshold) - if newly_sent: - alert.reminders_sent = list(already_sent.union(newly_sent)) - db.session.commit() - - -def init_scheduler(app): - """Start the scheduler if not already running. Called once at app startup.""" - global _scheduler - if _scheduler is not None and _scheduler.running: - return _scheduler - interval = max(1, int(app.config.get("SCHEDULER_INTERVAL_MINUTES", 60))) - _scheduler = BackgroundScheduler(timezone="UTC") - _scheduler.add_job( - _check_and_send, - "interval", - minutes=interval, - args=[app], - id="alert_reminder_job", - replace_existing=True, - next_run_time=None, # don't run immediately on boot - ) - _scheduler.start() - logger.info("Scheduler started; reminder check every %d minute(s).", interval) - return _scheduler - - -def trigger_now(app): - """Manual trigger (for the 'Run check now' button).""" - _check_and_send(app) diff --git a/Alert Hub System/app/static/css/app.css b/Alert Hub System/app/static/css/app.css deleted file mode 100644 index 5b061a8..0000000 --- a/Alert Hub System/app/static/css/app.css +++ /dev/null @@ -1,869 +0,0 @@ -/* ====================================================================== - AlertHub — IT operations console aesthetic - Typography: JetBrains Mono (display/mono), Space Grotesk avoided in favour - of system stack with mono accents to keep the terminal vibe. - ====================================================================== */ - -@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap'); - -:root { - --font-mono: 'JetBrains Mono', 'SF Mono', Menlo, Consolas, monospace; - --font-sans: 'IBM Plex Sans', -apple-system, system-ui, sans-serif; - - --radius-sm: 4px; - --radius-md: 8px; - --radius-lg: 14px; - - --tx-h: 1.15; - --tx-b: 1.55; -} - -/* ---------- Dark theme (default) ---------- */ -[data-theme="dark"] { - --bg-base: #0a0e14; - --bg-elev-1: #0f141b; - --bg-elev-2: #141a23; - --bg-elev-3: #1a212c; - --grid-line: rgba(0, 212, 170, 0.04); - --border: #1f2733; - --border-strong: #2a3442; - - --text-primary: #d8e2ec; - --text-secondary: #8b96a5; - --text-dim: #5a6371; - - --accent: #00d4aa; /* signal green */ - --accent-soft: rgba(0, 212, 170, 0.12); - --accent-hot: #00ffcc; - --magenta: #ff3e8b; /* alert magenta */ - --amber: #ffb454; - --danger: #ff5c5c; - --info: #4ad8ff; - - --shadow-1: 0 1px 0 rgba(255,255,255,0.03), 0 8px 24px rgba(0,0,0,0.5); - --glow-accent: 0 0 0 1px rgba(0,212,170,0.3), 0 0 20px rgba(0,212,170,0.15); -} - -/* ---------- Light theme ---------- */ -[data-theme="light"] { - --bg-base: #f4f6f9; - --bg-elev-1: #ffffff; - --bg-elev-2: #f9fbfd; - --bg-elev-3: #f0f3f7; - --grid-line: rgba(0, 130, 100, 0.05); - --border: #e2e8ef; - --border-strong: #c8d2dd; - - --text-primary: #0e1620; - --text-secondary: #4a5566; - --text-dim: #8693a3; - - --accent: #008f74; - --accent-soft: rgba(0, 143, 116, 0.08); - --accent-hot: #00b388; - --magenta: #d92671; - --amber: #d97a13; - --danger: #d93939; - --info: #1f9ec5; - - --shadow-1: 0 1px 2px rgba(15, 30, 45, 0.06), 0 8px 20px rgba(15, 30, 45, 0.05); - --glow-accent: 0 0 0 1px rgba(0, 143, 116, 0.25); -} - -* { box-sizing: border-box; } - -html, body { - margin: 0; - padding: 0; - background: var(--bg-base); - color: var(--text-primary); - font-family: var(--font-sans); - font-size: 15px; - line-height: var(--tx-b); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - min-height: 100vh; -} - -body { - position: relative; - overflow-x: hidden; -} - -/* Decorative grid background */ -.grid-bg { - position: fixed; - inset: 0; - pointer-events: none; - z-index: 0; - background-image: - linear-gradient(var(--grid-line) 1px, transparent 1px), - linear-gradient(90deg, var(--grid-line) 1px, transparent 1px); - background-size: 32px 32px; - mask-image: radial-gradient(ellipse at top, black 30%, transparent 75%); - -webkit-mask-image: radial-gradient(ellipse at top, black 30%, transparent 75%); -} - -a { color: var(--accent); text-decoration: none; } -a:hover { color: var(--accent-hot); text-decoration: underline; text-underline-offset: 3px; } - -h1, h2, h3, h4 { - font-family: var(--font-sans); - font-weight: 700; - letter-spacing: -0.01em; - line-height: var(--tx-h); - margin: 0 0 .6em; -} -h1 { font-size: 1.85rem; } -h2 { font-size: 1.35rem; } -h3 { font-size: 1.1rem; } - -code, .mono { font-family: var(--font-mono); font-size: .92em; } - -/* ---------- Top bar ---------- */ -.topbar { - position: sticky; - top: 0; - z-index: 50; - backdrop-filter: blur(10px) saturate(140%); - -webkit-backdrop-filter: blur(10px) saturate(140%); - background: color-mix(in srgb, var(--bg-elev-1) 82%, transparent); - border-bottom: 1px solid var(--border); -} -.topbar-inner { - max-width: 1320px; - margin: 0 auto; - padding: 12px 24px; - display: grid; - grid-template-columns: auto 1fr auto; - align-items: center; - gap: 24px; -} -.brand { - display: inline-flex; - align-items: center; - gap: 10px; - color: var(--text-primary); - font-family: var(--font-mono); - font-weight: 700; - letter-spacing: -0.01em; -} -.brand:hover { text-decoration: none; } -.brand-mark { - color: var(--accent); - font-size: 1.1em; - letter-spacing: -2px; - filter: drop-shadow(0 0 6px var(--accent)); -} -.brand-name { font-size: 1.05rem; } -.brand-tag { - font-family: var(--font-mono); - font-size: .65rem; - font-weight: 500; - letter-spacing: 0.15em; - padding: 2px 7px; - border-radius: 4px; - background: var(--accent-soft); - color: var(--accent); - margin-left: 6px; -} -body.is-backoffice .brand-tag { - background: color-mix(in srgb, var(--magenta) 14%, transparent); - color: var(--magenta); -} - -.topbar-nav { - display: flex; - gap: 4px; - justify-self: center; -} -.navlink { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 8px 14px; - font-family: var(--font-mono); - font-size: .85rem; - font-weight: 500; - color: var(--text-secondary); - border-radius: var(--radius-sm); - transition: all .15s ease; -} -.navlink:hover { color: var(--text-primary); background: var(--bg-elev-2); text-decoration: none; } -.navlink.active { color: var(--accent); background: var(--accent-soft); } -.navlink.active .dot { background: var(--accent); box-shadow: 0 0 8px var(--accent); } -.dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--text-dim); -} -.dot-admin { background: var(--magenta); box-shadow: 0 0 8px var(--magenta); } -.navlink-cross { border: 1px solid var(--border); } -.navlink-cross:hover { border-color: var(--border-strong); color: var(--magenta); } -.navlink-cross.active { color: var(--magenta); background: color-mix(in srgb, var(--magenta) 12%, transparent); } -.navlink-cross.active .dot-admin { background: var(--magenta); } - -.topbar-right { display: inline-flex; gap: 10px; align-items: center; justify-self: end; } -.icon-btn { - background: transparent; - border: 1px solid var(--border); - color: var(--text-secondary); - width: 36px; height: 36px; - border-radius: var(--radius-sm); - display: inline-flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all .15s ease; -} -.icon-btn:hover { color: var(--text-primary); border-color: var(--border-strong); background: var(--bg-elev-2); } -.icon-sun { display: none; } -.icon-moon { display: block; } -[data-theme="light"] .icon-sun { display: block; } -[data-theme="light"] .icon-moon { display: none; } - -.user-chip { - display: inline-flex; - align-items: center; - gap: 10px; - padding: 4px 12px 4px 4px; - border: 1px solid var(--border); - border-radius: 999px; - color: var(--text-primary); - background: var(--bg-elev-2); -} -.user-chip:hover { border-color: var(--border-strong); text-decoration: none; } -.user-avatar { - width: 28px; height: 28px; - border-radius: 50%; - background: linear-gradient(135deg, var(--accent), var(--info)); - color: #061218; - font-family: var(--font-mono); - font-size: .72rem; - font-weight: 700; - display: inline-flex; - align-items: center; - justify-content: center; -} -.user-avatar-img { - object-fit: cover; - padding: 0; - border: 1px solid var(--border-strong); - background: var(--bg-elev-3); -} -.user-meta { display: flex; flex-direction: column; line-height: 1.1; } -.user-name { font-size: .85rem; } -.user-role { - font-family: var(--font-mono); - font-size: .6rem; - font-weight: 600; - letter-spacing: 0.1em; - text-transform: uppercase; -} -.user-role.role-admin { color: var(--magenta); } -.user-role.role-user { color: var(--text-dim); } - -.inline-form { display: inline; } - -/* ---------- Container ---------- */ -.container { - max-width: 1320px; - margin: 0 auto; - padding: 32px 24px 64px; - position: relative; - z-index: 1; -} - -/* ---------- Buttons ---------- */ -.btn { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 9px 16px; - border-radius: var(--radius-sm); - font-family: var(--font-mono); - font-size: .85rem; - font-weight: 500; - border: 1px solid transparent; - cursor: pointer; - transition: all .15s ease; - white-space: nowrap; - text-decoration: none; -} -.btn:hover { text-decoration: none; } -.btn-primary { - background: var(--accent); - color: #02181a; - border-color: var(--accent); -} -.btn-primary:hover { background: var(--accent-hot); box-shadow: var(--glow-accent); color: #02181a; } -.btn-ghost { - background: transparent; - color: var(--text-primary); - border-color: var(--border); -} -.btn-ghost:hover { border-color: var(--border-strong); background: var(--bg-elev-2); } -.btn-danger { - background: transparent; - color: var(--danger); - border-color: color-mix(in srgb, var(--danger) 35%, transparent); -} -.btn-danger:hover { background: color-mix(in srgb, var(--danger) 12%, transparent); border-color: var(--danger); } -.btn-sm { padding: 5px 10px; font-size: .78rem; } -.btn-block { display: flex; width: 100%; justify-content: center; } -.btn-row { display: flex; gap: 8px; flex-wrap: wrap; } - -/* ---------- Cards / Panels ---------- */ -.panel { - background: var(--bg-elev-1); - border: 1px solid var(--border); - border-radius: var(--radius-md); - box-shadow: var(--shadow-1); -} -.panel-header { - padding: 16px 20px; - border-bottom: 1px solid var(--border); - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; -} -.panel-header h2, .panel-header h3 { margin: 0; } -.panel-body { padding: 20px; } - -.section-head { - display: flex; - align-items: flex-end; - justify-content: space-between; - gap: 16px; - margin: 0 0 24px; - padding-bottom: 16px; - border-bottom: 1px dashed var(--border); -} -.section-head .lead { color: var(--text-secondary); margin: 6px 0 0; font-size: .95rem; } -.section-tag { - font-family: var(--font-mono); - font-size: .65rem; - letter-spacing: 0.15em; - color: var(--accent); - text-transform: uppercase; - margin-bottom: 6px; - display: block; -} - -/* ---------- Forms ---------- */ -.form { display: grid; gap: 16px; } -.form label { - display: block; - font-family: var(--font-mono); - font-size: .78rem; - font-weight: 500; - letter-spacing: 0.06em; - text-transform: uppercase; - color: var(--text-secondary); - margin-bottom: 6px; -} -.form input[type=text], -.form input[type=email], -.form input[type=password], -.form input[type=number], -.form input[type=date], -.form select, -.form textarea { - width: 100%; - padding: 10px 12px; - background: var(--bg-elev-2); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - color: var(--text-primary); - font-family: var(--font-sans); - font-size: .95rem; - transition: all .15s ease; -} -.form textarea { font-family: var(--font-sans); resize: vertical; min-height: 90px; } -.form input:focus, .form select:focus, .form textarea:focus { - outline: none; - border-color: var(--accent); - box-shadow: 0 0 0 3px var(--accent-soft); - background: var(--bg-elev-1); -} -.form .check-row { - display: inline-flex; - align-items: center; - gap: 10px; -} -.form .check-row label { - margin: 0; - text-transform: none; - letter-spacing: 0; - font-family: var(--font-sans); - font-size: .95rem; - font-weight: 500; - color: var(--text-primary); -} -.help { color: var(--text-dim); font-size: .82rem; margin-top: 4px; } -.form-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } -@media (max-width: 720px) { .form-grid-2 { grid-template-columns: 1fr; } } - -.error { color: var(--danger); font-size: .82rem; margin-top: 4px; } - -/* ---------- Flash messages ---------- */ -.flash-stack { display: grid; gap: 10px; margin-bottom: 24px; } -.flash { - padding: 12px 16px; - border-radius: var(--radius-sm); - border: 1px solid; - display: flex; - align-items: center; - gap: 12px; - background: var(--bg-elev-1); - font-size: .92rem; -} -.flash-icon { - width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; -} -.flash-success { border-color: color-mix(in srgb, var(--accent) 40%, transparent); } -.flash-success .flash-icon { background: var(--accent); box-shadow: 0 0 8px var(--accent); } -.flash-error { border-color: color-mix(in srgb, var(--danger) 40%, transparent); } -.flash-error .flash-icon { background: var(--danger); box-shadow: 0 0 8px var(--danger); } -.flash-info { border-color: color-mix(in srgb, var(--info) 40%, transparent); } -.flash-info .flash-icon { background: var(--info); } - -/* ---------- Auth pages ---------- */ -.auth-shell { - min-height: calc(100vh - 200px); - display: flex; - align-items: center; - justify-content: center; - padding: 40px 16px; -} -.auth-card { - width: 100%; - max-width: 420px; - background: var(--bg-elev-1); - border: 1px solid var(--border); - border-radius: var(--radius-lg); - padding: 32px; - box-shadow: var(--shadow-1); - position: relative; -} -.auth-card::before { - content: ''; - position: absolute; - inset: -1px; - border-radius: inherit; - padding: 1px; - background: linear-gradient(135deg, var(--accent), transparent 40%, var(--magenta)); - -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - -webkit-mask-composite: xor; - mask-composite: exclude; - opacity: .5; - pointer-events: none; -} -.auth-prompt { - font-family: var(--font-mono); - font-size: .8rem; - color: var(--accent); - margin-bottom: 6px; - letter-spacing: 0.06em; -} -.auth-prompt::before { content: '> '; opacity: .7; } -.auth-card h1 { margin-bottom: 6px; font-size: 1.5rem; } -.auth-sub { color: var(--text-secondary); font-size: .9rem; margin-bottom: 24px; } - -/* ---------- ALERT cards (the heart of the View page) ---------- */ -.alerts-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); - gap: 18px; -} -.alert-card { - background: var(--bg-elev-1); - border: 1px solid var(--border); - border-radius: var(--radius-md); - padding: 20px; - position: relative; - overflow: hidden; - transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease; -} -.alert-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-1); border-color: var(--border-strong); } -.alert-card::before { - content: ''; - position: absolute; - top: 0; left: 0; right: 0; - height: 2px; - background: var(--accent); - opacity: .8; -} -.alert-card.is-warning::before { background: var(--amber); } -.alert-card.is-critical::before { background: var(--danger); } -.alert-card.is-expired::before { background: var(--text-dim); } - -.alert-head { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 12px; - margin-bottom: 12px; -} -.alert-title { margin: 0; font-size: 1.1rem; font-weight: 700; line-height: 1.3; } -.alert-cat { - display: inline-block; - font-family: var(--font-mono); - font-size: .65rem; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: 3px 8px; - border-radius: 3px; - background: var(--bg-elev-3); - color: var(--text-secondary); -} -.alert-desc { - color: var(--text-secondary); - font-size: .9rem; - margin: 0 0 16px; - line-height: 1.5; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} -.alert-message { - font-family: var(--font-mono); - font-size: .85rem; - color: var(--text-secondary); - margin-bottom: 16px; - padding: 10px 12px; - background: var(--bg-elev-2); - border-left: 2px solid var(--accent); - border-radius: 0 var(--radius-sm) var(--radius-sm) 0; -} -.alert-card.is-warning .alert-message { border-left-color: var(--amber); } -.alert-card.is-critical .alert-message { border-left-color: var(--danger); } -.alert-card.is-expired .alert-message { border-left-color: var(--text-dim); } - -/* The countdown timer */ -.countdown { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 6px; -} -.countdown-segment { - background: var(--bg-elev-2); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - padding: 10px 4px 8px; - text-align: center; - position: relative; -} -.countdown-value { - font-family: var(--font-mono); - font-size: 1.5rem; - font-weight: 700; - color: var(--accent); - line-height: 1; - display: block; - letter-spacing: -0.02em; - font-variant-numeric: tabular-nums; -} -.alert-card.is-warning .countdown-value { color: var(--amber); } -.alert-card.is-critical .countdown-value { - color: var(--danger); - animation: pulse-num 1.4s ease-in-out infinite; -} -.alert-card.is-expired .countdown-value { color: var(--text-dim); } -.countdown-label { - font-family: var(--font-mono); - font-size: .55rem; - font-weight: 500; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--text-dim); - display: block; - margin-top: 4px; -} -@keyframes pulse-num { - 0%, 100% { opacity: 1; } - 50% { opacity: .55; } -} - -.alert-meta { - margin-top: 14px; - display: flex; - justify-content: space-between; - align-items: center; - font-family: var(--font-mono); - font-size: .72rem; - color: var(--text-dim); - text-transform: uppercase; - letter-spacing: 0.08em; -} -.alert-status-dot { - display: inline-block; - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--accent); - margin-right: 6px; - box-shadow: 0 0 6px var(--accent); -} -.alert-card.is-warning .alert-status-dot { background: var(--amber); box-shadow: 0 0 6px var(--amber); } -.alert-card.is-critical .alert-status-dot { - background: var(--danger); - box-shadow: 0 0 8px var(--danger); - animation: blink 1s ease-in-out infinite; -} -.alert-card.is-expired .alert-status-dot { background: var(--text-dim); box-shadow: none; } -@keyframes blink { 50% { opacity: .25; } } - -/* Empty state */ -.empty { - text-align: center; - padding: 60px 20px; - color: var(--text-secondary); - border: 1px dashed var(--border); - border-radius: var(--radius-md); -} -.empty .empty-icon { font-size: 2rem; opacity: .5; margin-bottom: 12px; } - -/* ---------- Tables ---------- */ -.table { - width: 100%; - border-collapse: separate; - border-spacing: 0; - background: var(--bg-elev-1); - border: 1px solid var(--border); - border-radius: var(--radius-md); - overflow: hidden; -} -.table th, .table td { - padding: 12px 16px; - text-align: left; - border-bottom: 1px solid var(--border); - vertical-align: middle; -} -.table thead th { - background: var(--bg-elev-2); - font-family: var(--font-mono); - font-size: .72rem; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.1em; - color: var(--text-secondary); -} -.table tbody tr:hover { background: var(--bg-elev-2); } -.table tbody tr:last-child td { border-bottom: none; } -.table .actions { text-align: right; white-space: nowrap; } - -.role-badge { - display: inline-block; - font-family: var(--font-mono); - font-size: .68rem; - letter-spacing: 0.1em; - text-transform: uppercase; - padding: 3px 8px; - border-radius: 3px; -} -.role-badge.role-admin { background: color-mix(in srgb, var(--magenta) 14%, transparent); color: var(--magenta); } -.role-badge.role-user { background: var(--bg-elev-3); color: var(--text-secondary); } - -.status-badge { - display: inline-flex; - align-items: center; - gap: 6px; - font-family: var(--font-mono); - font-size: .7rem; - letter-spacing: 0.08em; - text-transform: uppercase; -} -.status-badge .led { width: 6px; height: 6px; border-radius: 50%; } -.status-active .led { background: var(--accent); box-shadow: 0 0 6px var(--accent); } -.status-inactive .led { background: var(--text-dim); } - -/* ---------- Stat cards ---------- */ -.stat-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 16px; - margin-bottom: 28px; -} -.stat { - background: var(--bg-elev-1); - border: 1px solid var(--border); - border-radius: var(--radius-md); - padding: 18px; - position: relative; -} -.stat-label { - font-family: var(--font-mono); - font-size: .68rem; - text-transform: uppercase; - letter-spacing: 0.12em; - color: var(--text-dim); -} -.stat-value { - font-family: var(--font-mono); - font-size: 2rem; - font-weight: 700; - color: var(--text-primary); - line-height: 1.1; - margin-top: 6px; -} -.stat-accent .stat-value { color: var(--accent); } -.stat-warn .stat-value { color: var(--amber); } - -/* ---------- QR / MFA pages ---------- */ -.mfa-qr { - display: block; - margin: 0 auto; - width: 200px; - height: 200px; - background: white; - padding: 12px; - border-radius: var(--radius-sm); - border: 1px solid var(--border); -} -.mfa-secret { - font-family: var(--font-mono); - font-size: .9rem; - background: var(--bg-elev-2); - border: 1px solid var(--border); - border-radius: var(--radius-sm); - padding: 8px 12px; - user-select: all; - word-break: break-all; - text-align: center; -} - -/* ---------- Footer ---------- */ -.footer { - max-width: 1320px; - margin: 0 auto; - padding: 18px 24px 36px; - display: flex; - align-items: center; - gap: 10px; - font-family: var(--font-mono); - font-size: .75rem; - color: var(--text-dim); - border-top: 1px solid var(--border); -} -/* ---------- Avatar panel (account page) ---------- */ -.avatar-row { - display: flex; - gap: 24px; - align-items: flex-start; - flex-wrap: wrap; -} -.avatar-preview { - width: 96px; height: 96px; - border-radius: 50%; - overflow: hidden; - flex: 0 0 auto; - border: 1px solid var(--border-strong); - background: var(--bg-elev-3); - display: inline-flex; - align-items: center; - justify-content: center; -} -.avatar-preview img { width: 100%; height: 100%; object-fit: cover; display: block; } -.avatar-initials { - font-family: var(--font-mono); - font-size: 1.8rem; - font-weight: 700; - color: var(--accent); -} -.avatar-actions { flex: 1 1 260px; min-width: 260px; } - -/* ---------- Log export / email actions ---------- */ -.log-actions { - display: flex; - gap: 12px; - align-items: center; - flex-wrap: wrap; -} -.log-email-form { - display: inline-flex; - gap: 8px; - align-items: center; -} -.log-email-form input[type="text"], -.log-email-form input[type="email"] { margin: 0; min-width: 220px; } -@media (max-width: 720px) { - .log-actions { width: 100%; } - .log-email-form { width: 100%; } - .log-email-form input { flex: 1; min-width: 0; } -} - -.footer-sep { opacity: .5; } -.footer-copy { - margin-left: auto; - color: var(--text-secondary); - letter-spacing: .02em; -} -.footer .status-pill { margin-left: 18px; } -@media (max-width: 720px) { - .footer { flex-wrap: wrap; } - .footer-copy { margin-left: 0; flex-basis: 100%; order: 3; } - .footer .status-pill { margin-left: auto; } -} -.kbd { - background: var(--bg-elev-2); - border: 1px solid var(--border); - border-radius: 3px; - padding: 1px 6px; - font-size: .72rem; - color: var(--text-secondary); -} -.status-pill { - margin-left: auto; - display: inline-flex; - align-items: center; - gap: 6px; - text-transform: uppercase; -} -.status-pill .led { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--accent); - box-shadow: 0 0 6px var(--accent); - animation: led-pulse 2.5s ease-in-out infinite; -} -@keyframes led-pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: .4; } -} - -/* ---------- Pagination ---------- */ -.pagination { - display: flex; - justify-content: center; - gap: 6px; - margin-top: 20px; - flex-wrap: wrap; -} -.pagination a, .pagination span { - font-family: var(--font-mono); - font-size: .82rem; - padding: 6px 10px; - border: 1px solid var(--border); - border-radius: var(--radius-sm); - color: var(--text-secondary); -} -.pagination a:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; } -.pagination .current { background: var(--accent-soft); color: var(--accent); border-color: var(--accent); } - -/* ---------- Misc ---------- */ -.row-spread { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; } -.row-gap { display: flex; gap: 12px; flex-wrap: wrap; } -.muted { color: var(--text-secondary); } -.dim { color: var(--text-dim); } -hr { border: 0; border-top: 1px dashed var(--border); margin: 24px 0; } - -@media (max-width: 800px) { - .topbar-inner { grid-template-columns: 1fr; gap: 12px; } - .topbar-nav { justify-self: flex-start; flex-wrap: wrap; } - .topbar-right { justify-self: flex-start; } -} diff --git a/Alert Hub System/app/static/favicon.svg b/Alert Hub System/app/static/favicon.svg deleted file mode 100644 index 6dd6096..0000000 --- a/Alert Hub System/app/static/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Alert Hub System/app/static/js/app.js b/Alert Hub System/app/static/js/app.js deleted file mode 100644 index 1d6a756..0000000 --- a/Alert Hub System/app/static/js/app.js +++ /dev/null @@ -1,73 +0,0 @@ -// ====== Theme toggle ======================================================= -(function () { - const btn = document.getElementById('theme-toggle'); - if (!btn) return; - btn.addEventListener('click', () => { - const root = document.documentElement; - const next = root.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'; - root.setAttribute('data-theme', next); - try { localStorage.setItem('alerthub-theme', next); } catch (_) {} - }); -})(); - -// ====== Countdown timer ==================================================== -// Each .countdown element has data-expires="YYYY-MM-DD" and renders 4 cells -// for days / hours / minutes / seconds. Updates every second. -(function () { - const els = document.querySelectorAll('.countdown[data-expires]'); - if (!els.length) return; - - function pad(n) { return n < 10 ? '0' + n : '' + n; } - - function render() { - const now = new Date(); - els.forEach((el) => { - const target = new Date(el.dataset.expires + 'T23:59:59'); - let diff = (target.getTime() - now.getTime()) / 1000; - const card = el.closest('.alert-card'); - const negative = diff < 0; - diff = Math.abs(diff); - - const days = Math.floor(diff / 86400); - const hours = Math.floor((diff % 86400) / 3600); - const minutes = Math.floor((diff % 3600) / 60); - const seconds = Math.floor(diff % 60); - - const segs = el.querySelectorAll('.countdown-value'); - if (segs.length === 4) { - segs[0].textContent = days; - segs[1].textContent = pad(hours); - segs[2].textContent = pad(minutes); - segs[3].textContent = pad(seconds); - } - - if (card) { - card.classList.remove('is-warning', 'is-critical', 'is-expired'); - if (negative) { - card.classList.add('is-expired'); - } else if (days < 7) { - card.classList.add('is-critical'); - } else if (days < 30) { - card.classList.add('is-warning'); - } - } - - const dotLabel = el.parentElement && el.parentElement.querySelector('.alert-state-text'); - if (dotLabel) { - if (negative) dotLabel.textContent = 'EXPIRED'; - else if (days < 7) dotLabel.textContent = 'CRITICAL'; - else if (days < 30) dotLabel.textContent = 'WARNING'; - else dotLabel.textContent = 'NOMINAL'; - } - }); - } - render(); - setInterval(render, 1000); -})(); - -// ====== Confirm-on-click for destructive actions =========================== -document.querySelectorAll('form[data-confirm]').forEach((form) => { - form.addEventListener('submit', (e) => { - if (!window.confirm(form.dataset.confirm)) e.preventDefault(); - }); -}); diff --git a/Alert Hub System/app/templates/account.html b/Alert Hub System/app/templates/account.html deleted file mode 100644 index faf373f..0000000 --- a/Alert Hub System/app/templates/account.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends "base.html" %} -{% block title %}Account{% endblock %} -{% block content %} -
-
- -

{{ current_user.username }}

-

{{ current_user.email }} · role {{ current_user.role }}

-
-
- -
-

Profile avatar

-
-
-
- {% if current_user.has_avatar %} - Current avatar - {% else %} - {{ current_user.initials }} - {% endif %} -
-
-
- {{ avatar_form.csrf_token }} -
{{ avatar_form.avatar.label }}{{ avatar_form.avatar(accept="image/*") }}
-
PNG, JPG, GIF or WebP. Squared and resized to {{ 256 }}×{{ 256 }} automatically. Max 2 MB.
-
- {{ avatar_form.submit(class_="btn btn-primary") }} - {% if current_user.has_avatar %} - - {% endif %} -
-
- {% if current_user.has_avatar %} -
- -
- {% endif %} -
-
-
-
- -
-
-

Change password

-
-
- {{ password_form.csrf_token }} -
{{ password_form.current_password.label }}{{ password_form.current_password(autocomplete="current-password") }}
-
{{ password_form.new_password.label }}{{ password_form.new_password(autocomplete="new-password") }}
-
{{ password_form.confirm.label }}{{ password_form.confirm(autocomplete="new-password") }}
- {{ password_form.submit(class_="btn btn-primary") }} -
-
-
- -
-
-

Multi-factor authentication

- - {{ 'enabled' if current_user.mfa_enabled else 'disabled' }} - -
-
- {% if current_user.mfa_enabled %} -

MFA is currently active on your account. You'll be prompted for a 6-digit code on every sign-in.

-
- - -
- {% else %} -

MFA is currently not configured. Strongly recommended for admin accounts.

- Set up MFA now - {% endif %} -
-
-
- -{% endblock %} diff --git a/Alert Hub System/app/templates/alert_form.html b/Alert Hub System/app/templates/alert_form.html deleted file mode 100644 index a2b4fb2..0000000 --- a/Alert Hub System/app/templates/alert_form.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if alert else 'New' }} alert{% endblock %} -{% block content %} -
-
- -

{{ 'Edit alert' if alert else 'New alert' }}

- {% if alert %}

Last updated {{ alert.updated_at.strftime('%Y-%m-%d %H:%M:%S') }} UTC.

{% endif %} -
- ← Back -
- -
-
-
- {{ form.csrf_token }} -
- {{ form.title.label }}{{ form.title(placeholder="e.g. Microsoft 365 Renewal") }} - {% for err in form.title.errors %}
{{ err }}
{% endfor %} -
-
-
- {{ form.category.label }}{{ form.category(placeholder="License, SSL, Domain, Contract …") }} - {% for err in form.category.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.expiration_date.label }}{{ form.expiration_date() }} - {% for err in form.expiration_date.errors %}
{{ err }}
{% endfor %} -
-
-
- {{ form.description.label }}{{ form.description(rows=4, placeholder="Optional detail shown on the alert card.") }} - {% for err in form.description.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.reminder_days.label }}{{ form.reminder_days() }} -
Comma-separated days BEFORE expiration when an email reminder fires. Example: 30,14,7,1
- {% for err in form.reminder_days.errors %}
{{ err }}
{% endfor %} -
-
{{ form.is_active() }} {{ form.is_active.label }}
-
- {{ form.submit(class_="btn btn-primary") }} - Cancel -
-
-
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/alerts_list.html b/Alert Hub System/app/templates/alerts_list.html deleted file mode 100644 index e0e2ed2..0000000 --- a/Alert Hub System/app/templates/alerts_list.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends "base.html" %} -{% block title %}Manage Alerts{% endblock %} -{% block content %} -
-
- -

Manage alerts

-

Create, modify, or retire alerts. Only administrators can make changes.

-
- {% if current_user.is_admin %} - + New alert - {% endif %} -
- -{% if alerts %} - - - - - - - - - - - - - {% for a in alerts %} - - - - - - - - - {% endfor %} - -
TitleCategoryExpiresRemindersStatusActions
{{ a.title }}{% if a.description %}
{{ a.description[:80] }}{% if a.description|length > 80 %}…{% endif %}{% endif %}
{% if a.category %}{{ a.category }}{% else %}{% endif %}{{ a.expiration_date.isoformat() }}{{ a.reminder_days|join(', ') }}d - - {{ 'active' if a.is_active else 'inactive' }} - - - {% if current_user.is_admin %} - Edit -
- - -
-
- - -
- {% else %} - view only - {% endif %} -
-{% else %} -
-

No alerts yet.

- {% if current_user.is_admin %}Create one{% endif %} -
-{% endif %} -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/audit_log.html b/Alert Hub System/app/templates/backoffice/audit_log.html deleted file mode 100644 index c78f147..0000000 --- a/Alert Hub System/app/templates/backoffice/audit_log.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "base.html" %} -{% block title %}Audit log{% endblock %} -{% block content %} -
-
- -

Audit log

-

Sign-ins, configuration changes, and alert mutations. Most-recent first.

-
-
- ⬇ Export CSV -
- {{ log_email_form.csrf_token }} - {{ log_email_form.log_recipient(placeholder="destination@example.com") }} - {{ log_email_form.submit(class_="btn btn-primary") }} -
-
-
- - - - - - - {% for e in pagination.items %} - - - - - - - - {% else %} - - {% endfor %} - -
Timestamp (UTC)UserActionDetailsIP
{{ e.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}{{ e.username or '—' }}{{ e.action }}{{ e.details or '' }}{{ e.ip_address or '' }}
No audit entries yet.
- -{% if pagination.pages > 1 %} - -{% endif %} -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/dashboard.html b/Alert Hub System/app/templates/backoffice/dashboard.html deleted file mode 100644 index 41b6226..0000000 --- a/Alert Hub System/app/templates/backoffice/dashboard.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "base.html" %} -{% block title %}Dashboard{% endblock %} -{% block content %} -
-
- -

Operations dashboard

-

System status as of {{ today.isoformat() }}.

-
-
- -
-
-
Active alerts
-
{{ active_alerts }}
-
-
-
Users
-
{{ user_count }}
-
-
-
Administrators
-
{{ admin_count }}
-
-
- -
-
-
-

Expiring soonest

- settings → -
-
- {% if expiring_soon %} - - - - - - {% for a in expiring_soon %} - {% set days = (a.expiration_date - today).days %} - - - - - - {% endfor %} - -
TitleExpiresDays
{{ a.title }}{% if a.category %} {{ a.category }}{% endif %}{{ a.expiration_date.isoformat() }}{{ days }}d
- {% else %} -

No upcoming alerts.

- {% endif %} -
-
- -
-

Recent activity

- full log → -
-
- {% if recent_audit %} -
    - {% for entry in recent_audit %} -
  • - {{ entry.action }} {% if entry.username %}· {{ entry.username }}{% endif %}{% if entry.details %}
    {{ entry.details }}{% endif %}
    - {{ entry.timestamp.strftime('%m-%d %H:%M') }} -
  • - {% endfor %} -
- {% else %} -

No activity yet.

- {% endif %} -
-
-
- -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/mail_config.html b/Alert Hub System/app/templates/backoffice/mail_config.html deleted file mode 100644 index 14ef9c0..0000000 --- a/Alert Hub System/app/templates/backoffice/mail_config.html +++ /dev/null @@ -1,90 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail configuration{% endblock %} -{% block content %} -
-
- -

SMTP configuration

-

External mail server used to dispatch alert reminders. Edits take effect immediately.

-
-
- -
-
-

Server settings

-
-
- {{ form.csrf_token }} -
-
- {{ form.smtp_host.label }}{{ form.smtp_host(placeholder="smtp.example.com") }} - {% for err in form.smtp_host.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.smtp_port.label }}{{ form.smtp_port() }} - {% for err in form.smtp_port.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.smtp_encryption.label }}{{ form.smtp_encryption() }} -
587 → STARTTLS · 465 → SSL/TLS · 25 → none
-
-
- {{ form.smtp_username.label }}{{ form.smtp_username(autocomplete="off") }} -
-
- {{ form.smtp_password.label }}{{ form.smtp_password(autocomplete="new-password") }} -
Leave blank to keep the current password.
-
-
- {{ form.smtp_from_address.label }}{{ form.smtp_from_address() }} -
-
- {{ form.smtp_from_name.label }}{{ form.smtp_from_name() }} -
-
- -
-

Sent-folder copy (IMAP)

-

When enabled, a copy of every message the platform sends is saved to the mailbox's Sent folder over IMAP, so it appears in your normal mail client.

-
{{ form.imap_enabled() }} {{ form.imap_enabled.label }}
-
-
- {{ form.imap_host.label }}{{ form.imap_host(placeholder="imap.purelymail.com") }} - {% for err in form.imap_host.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.imap_port.label }}{{ form.imap_port(placeholder="993") }} - {% for err in form.imap_port.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.imap_sent_folder.label }}{{ form.imap_sent_folder(placeholder="Sent") }} -
Usually Sent.
-
-
- {{ form.imap_username.label }}{{ form.imap_username(autocomplete="off") }} -
-
- {{ form.imap_password.label }}{{ form.imap_password(autocomplete="new-password") }} -
Blank keeps current; if never set, the SMTP password is used.
-
-
- - {{ form.submit(class_="btn btn-primary") }} -
-
-
- -
-

Send test email

-
-

Confirms credentials, port, and encryption are correct.

-
- {{ test_form.csrf_token }} -
{{ test_form.test_recipient.label }}{{ test_form.test_recipient(placeholder="you@example.com") }}
- {{ test_form.submit(class_="btn btn-ghost btn-block") }} -
-
-
-
- -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/mail_log.html b/Alert Hub System/app/templates/backoffice/mail_log.html deleted file mode 100644 index 3370c4b..0000000 --- a/Alert Hub System/app/templates/backoffice/mail_log.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail log{% endblock %} -{% block content %} -
-
- -

Mail log

-

Every message the platform has dispatched, whether a copy reached the Sent folder, and its delivery result. Most-recent first.

-
-
- ⬇ Export CSV -
- {{ log_email_form.csrf_token }} - {{ log_email_form.log_recipient(placeholder="destination@example.com") }} - {{ log_email_form.submit(class_="btn btn-primary") }} -
-
-
- - - - - - - - - - {% for m in pagination.items %} - - - - - - - - - - - {% else %} - - {% endfor %} - -
Timestamp (UTC)KindRecipientsSubjectStatusSent copyByInfo
{{ m.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}{{ m.kind }}{{ m.recipients or '—' }}{{ m.subject or '—' }} - {% if m.status == 'sent' %} - sent - {% else %} - failed - {% endif %} - - {% if m.sent_copy == 'saved' %} - saved - {% elif m.sent_copy == 'failed' %} - failed - {% elif m.sent_copy == 'disabled' %} - disabled - {% else %} - - {% endif %} - {{ m.triggered_by or 'system' }}{{ m.info or '' }}
No mail has been sent yet.
- -{% if pagination.pages > 1 %} - -{% endif %} -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/settings.html b/Alert Hub System/app/templates/backoffice/settings.html deleted file mode 100644 index f637740..0000000 --- a/Alert Hub System/app/templates/backoffice/settings.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "base.html" %} -{% block title %}Settings{% endblock %} -{% block content %} -
-
- -

Global settings

-

Default reminder cadence and scheduler controls.

-
-
- -
-
-

Default reminder schedule

-
-
- {{ form.csrf_token }} -
- {{ form.default_reminder_days.label }}{{ form.default_reminder_days() }} -
When creating a new alert, this is the default. Existing alerts are unaffected.
- {% for err in form.default_reminder_days.errors %}
{{ err }}
{% endfor %} -
- {{ form.submit(class_="btn btn-primary") }} -
-
-
- -
-

Scheduler

-
-

Reminder dispatch runs every {{ scheduler_interval }} minute(s).

-

Configured via the SCHEDULER_INTERVAL_MINUTES environment variable. Restart the container to change it.

- -
- -

You can trigger a check immediately to verify reminders dispatch correctly.

-
- - -
-
-
-
- -{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/user_form.html b/Alert Hub System/app/templates/backoffice/user_form.html deleted file mode 100644 index ee90e1a..0000000 --- a/Alert Hub System/app/templates/backoffice/user_form.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if user else 'New' }} user{% endblock %} -{% block content %} -
-
- -

{{ 'Edit user' if user else 'New user' }}

- {% if user %}

Created {{ user.created_at.strftime('%Y-%m-%d') }}

{% endif %} -
- ← Back -
- -
-
-
- {{ form.csrf_token }} -
-
{{ form.username.label }}{{ form.username() }} - {% for err in form.username.errors %}
{{ err }}
{% endfor %} -
-
{{ form.email.label }}{{ form.email() }} - {% for err in form.email.errors %}
{{ err }}
{% endfor %} -
-
-
-
{{ form.role.label }}{{ form.role() }}
-
{{ form.is_active() }} {{ form.is_active.label }}
-
-
- {{ form.password.label }}{{ form.password(autocomplete="new-password") }} -
{% if user %}Leave blank to keep the existing password.{% else %}Min {{ config.PASSWORD_MIN_LENGTH }} characters.{% endif %}
- {% for err in form.password.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.submit(class_="btn btn-primary") }} - Cancel -
-
-
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/backoffice/users_list.html b/Alert Hub System/app/templates/backoffice/users_list.html deleted file mode 100644 index 48a7e76..0000000 --- a/Alert Hub System/app/templates/backoffice/users_list.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users{% endblock %} -{% block content %} -
-
- -

Users

-

Manage accounts, roles, MFA, and lockouts.

-
- + New user -
- - - - - - - - - {% for u in users %} - - - - - - - - - - {% endfor %} - -
UsernameEmailRoleMFAStatusLast loginActions
{{ u.username }}{% if u.id == current_user.id %} (you){% endif %}{{ u.email }}{{ u.role }} - - {{ 'on' if u.mfa_enabled else 'off' }} - - - {% if u.is_locked %} - locked - {% else %} - {{ 'active' if u.is_active else 'disabled' }} - {% endif %} - - {% if u.last_login_at %}{{ u.last_login_at.strftime('%Y-%m-%d %H:%M') }}{% else %}never{% endif %} - - Edit - {% if u.mfa_enabled %} -
- - -
- {% endif %} - {% if u.is_locked %} -
- - -
- {% endif %} - {% if u.id != current_user.id %} -
- - -
- {% endif %} -
-{% endblock %} diff --git a/Alert Hub System/app/templates/base.html b/Alert Hub System/app/templates/base.html deleted file mode 100644 index 3b74e3b..0000000 --- a/Alert Hub System/app/templates/base.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - {% block title %}{{ brand_name }}{% endblock %} — {{ brand_name }}{% if is_backoffice %} · backoffice{% endif %} - - - - - - - - -
-
- - ▮▮ - {{ brand_name }} - {{ 'BACKOFFICE' if is_backoffice else 'FRONTOFFICE' }} - - - {% if current_user.is_authenticated and not session.get('mfa_pending') %} - - - - {% else %} -
- -
- {% endif %} -
-
- -
- {% with messages = get_flashed_messages(with_categories=true) %} - {% if messages %} -
- {% for cat, msg in messages %} -
- - {{ msg }} -
- {% endfor %} -
- {% endif %} - {% endwith %} - - {% block content %}{% endblock %} -
- - {% if request.endpoint != 'auth.login' %} -
- {{ brand_name }} - · - {{ 'admin console' if is_backoffice else 'alert console' }} - {{ footer_text }} - operational -
- {% endif %} - - - {% block scripts %}{% endblock %} - - diff --git a/Alert Hub System/app/templates/error.html b/Alert Hub System/app/templates/error.html deleted file mode 100644 index d964f8d..0000000 --- a/Alert Hub System/app/templates/error.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ code }} · Error{% endblock %} -{% block content %} -
-
-
error
-

{{ code }}

-

{{ message }}

- ← Return home -
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/index.html b/Alert Hub System/app/templates/index.html deleted file mode 100644 index 555e91f..0000000 --- a/Alert Hub System/app/templates/index.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base.html" %} -{% block title %}View · Alerts{% endblock %} -{% block content %} -
-
- -

Active alerts

-

Live countdown to expiration. Reminders are dispatched automatically by email per the configured schedule.

-
-
- today: {{ today_iso }} - {% if current_user.is_admin %} - + New alert - {% endif %} -
-
- -{% if alerts %} -
- {% for a in alerts %} - {% set state = 'is-expired' if a.days_left < 0 else ('is-critical' if a.days_left < 7 else ('is-warning' if a.days_left < 30 else '')) %} - {% set state_text = 'EXPIRED' if a.days_left < 0 else ('CRITICAL' if a.days_left < 7 else ('WARNING' if a.days_left < 30 else 'NOMINAL')) %} -
-
-

{{ a.title }}

- {% if a.category %}{{ a.category }}{% endif %} -
- {% if a.description %}

{{ a.description }}

{% endif %} - -
- {{ a.title }} · expires {{ a.expiration_date }} -
- -
-
days
-
hours
-
min
-
sec
-
- -
- {{ state_text }} - reminders: {{ a.reminder_days|join(', ') }}d -
-
- {% endfor %} -
-{% else %} -
-
▮▮
-

No active alerts.

- {% if current_user.is_admin %} -

Add your first one — license renewals, certificates, contracts, …

- Create the first alert - {% else %} -

Ask an administrator to create alerts for your team.

- {% endif %} -
-{% endif %} -{% endblock %} diff --git a/Alert Hub System/app/templates/login.html b/Alert Hub System/app/templates/login.html deleted file mode 100644 index 776e0ee..0000000 --- a/Alert Hub System/app/templates/login.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in{% endblock %} -{% block content %} -
-
-
authenticate
-

Sign in to {{ brand_name }}

-

{% if is_backoffice %}Administrator console.{% else %}Alert operations console.{% endif %}

-
- {{ form.csrf_token }} -
- {{ form.username.label }} - {{ form.username(autocomplete="username", autofocus=True) }} -
-
- {{ form.password.label }} - {{ form.password(autocomplete="current-password") }} -
- {{ form.submit(class_="btn btn-primary btn-block") }} -
-
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/mfa.html b/Alert Hub System/app/templates/mfa.html deleted file mode 100644 index c2275e2..0000000 --- a/Alert Hub System/app/templates/mfa.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "base.html" %} -{% block title %}Verify identity{% endblock %} -{% block content %} -
-
-
verify
-

Two-factor authentication

-

Enter the 6-digit code from your authenticator app.

-
- {{ form.csrf_token }} -
- {{ form.code.label }} - {{ form.code(autocomplete="one-time-code", inputmode="numeric", pattern="[0-9]{6}", autofocus=True, maxlength=6) }} -
- {{ form.submit(class_="btn btn-primary btn-block") }} -
-
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/mfa_setup.html b/Alert Hub System/app/templates/mfa_setup.html deleted file mode 100644 index 7c07a59..0000000 --- a/Alert Hub System/app/templates/mfa_setup.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "base.html" %} -{% block title %}Set up MFA{% endblock %} -{% block content %} -
-
- -

Enable multi-factor authentication

-

Scan the QR code with your authenticator (Google Authenticator, Authy, 1Password, …) and enter the 6-digit code to confirm.

-
-
- -
-
- MFA QR code -

Manual key (if you can't scan):

-
{{ secret }}
- -
- -
- {{ form.csrf_token }} -
- {{ form.code.label }} - {{ form.code(autocomplete="one-time-code", inputmode="numeric", pattern="[0-9]{6}", maxlength=6) }} -
Enter the current 6-digit code shown in your authenticator.
-
-
- {{ form.submit(class_="btn btn-primary") }} - Cancel -
-
-
-
-{% endblock %} diff --git a/Alert Hub System/app/templates/setup.html b/Alert Hub System/app/templates/setup.html deleted file mode 100644 index dffc1c5..0000000 --- a/Alert Hub System/app/templates/setup.html +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "base.html" %} -{% block title %}Initial setup{% endblock %} -{% block content %} -
-
-
first-run setup
-

Create administrator

-

No accounts exist yet. Create the first administrator to secure {{ brand_name }}.

-
- {{ form.csrf_token }} -
- {{ form.username.label }} - {{ form.username(autocomplete="username", autofocus=True) }} - {% for err in form.username.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.email.label }} - {{ form.email(autocomplete="email") }} - {% for err in form.email.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.password.label }} - {{ form.password(autocomplete="new-password") }} - {% for err in form.password.errors %}
{{ err }}
{% endfor %} -
-
- {{ form.confirm.label }} - {{ form.confirm(autocomplete="new-password") }} - {% for err in form.confirm.errors %}
{{ err }}
{% endfor %} -
- {{ form.submit(class_="btn btn-primary btn-block") }} -
-
-
-{% endblock %} diff --git a/Alert Hub System/docker-compose.yml b/Alert Hub System/docker-compose.yml deleted file mode 100644 index e7cbae8..0000000 --- a/Alert Hub System/docker-compose.yml +++ /dev/null @@ -1,34 +0,0 @@ -# docker-compose.yml -# All runtime configuration is read from the .env file in the same folder. -# This file intentionally contains NO secrets and NO environment values. - -services: - alerthub: - build: - context: . - dockerfile: Dockerfile - image: alerthub:latest - container_name: alerthub - restart: unless-stopped - env_file: - - .env - ports: - - "${FRONTOFFICE_PORT}:${FRONTOFFICE_PORT}" - volumes: - - alerthub_data:/data - # Hardening - read_only: false # SQLite needs to write to /data; the rest of FS is owned by non-root user - security_opt: - - no-new-privileges:true - cap_drop: - - ALL - healthcheck: - test: ["CMD", "curl", "-fsS", "http://127.0.0.1:${FRONTOFFICE_PORT}/login"] - interval: 30s - timeout: 5s - start_period: 15s - retries: 3 - -volumes: - alerthub_data: - name: alerthub_data diff --git a/Alert Hub System/entrypoint.sh b/Alert Hub System/entrypoint.sh deleted file mode 100644 index 16727fe..0000000 --- a/Alert Hub System/entrypoint.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# Starts the unified AlertHub app (frontoffice + /backoffice) on a single port. -# POSIX /bin/sh (dash) compatible. Uses exec so Gunicorn becomes the container's -# main process and receives signals directly for clean, graceful shutdown. - -set -eu - -PORT="${APP_PORT:-${FRONTOFFICE_PORT:-8080}}" -# A single worker guarantees exactly one reminder scheduler. Concurrency is -# handled with threads, which is plenty for this internal tool. You can raise -# GUNICORN_THREADS if needed; leave GUNICORN_WORKERS at 1 to avoid running the -# scheduler more than once. -WORKERS="${GUNICORN_WORKERS:-1}" -THREADS="${GUNICORN_THREADS:-4}" - -echo ">> AlertHub starting (frontoffice + /backoffice on one port)" -echo " listening -> 0.0.0.0:${PORT}" - -exec gunicorn --bind "0.0.0.0:${PORT}" \ - --workers "${WORKERS}" \ - --threads "${THREADS}" \ - --timeout 60 \ - --graceful-timeout 30 \ - --access-logfile - \ - --error-logfile - \ - "wsgi:application" diff --git a/Alert Hub System/requirements.txt b/Alert Hub System/requirements.txt deleted file mode 100644 index 7360340..0000000 --- a/Alert Hub System/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -Flask==3.1.3 -Flask-Login==0.6.3 -Flask-WTF==1.2.2 -WTForms==3.2.1 -SQLAlchemy==2.0.36 -Flask-SQLAlchemy==3.1.1 -bcrypt==4.2.1 -pyotp==2.9.0 -qrcode[pil]==8.0 -Pillow==11.1.0 -APScheduler==3.11.0 -python-dotenv==1.0.1 -gunicorn==23.0.0 -email-validator==2.2.0 diff --git a/Alert Hub System/wsgi.py b/Alert Hub System/wsgi.py deleted file mode 100644 index ee21a41..0000000 --- a/Alert Hub System/wsgi.py +++ /dev/null @@ -1,13 +0,0 @@ -"""WSGI entry point for AlertHub. - -Serves the whole application — the frontoffice at the root and the backoffice -under /backoffice — on a single port. -""" -from app import create_app - -application = create_app() - -if __name__ == "__main__": - import os - port = int(os.environ.get("APP_PORT", os.environ.get("FRONTOFFICE_PORT", "8080"))) - application.run(host="0.0.0.0", port=port, debug=False) diff --git a/Alert Hub System/wsgi_backoffice.py b/Alert Hub System/wsgi_backoffice.py deleted file mode 100644 index e31005a..0000000 --- a/Alert Hub System/wsgi_backoffice.py +++ /dev/null @@ -1,9 +0,0 @@ -"""WSGI entry point for the backoffice (port 9001).""" -from app import create_app - -application = create_app("backoffice") - -if __name__ == "__main__": - import os - port = int(os.environ.get("BACKOFFICE_PORT", "9001")) - application.run(host="0.0.0.0", port=port, debug=False) diff --git a/Alert Hub System/wsgi_frontoffice.py b/Alert Hub System/wsgi_frontoffice.py deleted file mode 100644 index cdc51cd..0000000 --- a/Alert Hub System/wsgi_frontoffice.py +++ /dev/null @@ -1,9 +0,0 @@ -"""WSGI entry point for the frontoffice (port 8080).""" -from app import create_app - -application = create_app("frontoffice") - -if __name__ == "__main__": - import os - port = int(os.environ.get("FRONTOFFICE_PORT", "8080")) - application.run(host="0.0.0.0", port=port, debug=False) diff --git a/Approval Workflow/.env.example b/Approval Workflow/.env.example deleted file mode 100644 index 51b61a3..0000000 --- a/Approval Workflow/.env.example +++ /dev/null @@ -1,18 +0,0 @@ -# NOTE: Docker Compose treats '$' in this file as variable substitution. -# If any value (e.g. a password) contains a literal '$', write it as '$$': -# MAIL_PASSWORD=xK9$$vh4pQ2 -> the container receives xK9$vh4pQ2 -# Otherwise you'll see a warning like: The "..." variable is not set. - -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/Dockerfile b/Approval Workflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow.zip deleted file mode 100644 index c6cf082d3aac8a4ac9ad680c1346d8d817dbe1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23404 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 F`ycA;T7m!o diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/.env.example deleted file mode 100644 index ed07a41..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,21 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Inbound email (IMAP) — leave IMAP_HOST empty to disable email intake --- -IMAP_HOST=imap.example.com -IMAP_USER=inbox@example.com -IMAP_PASSWORD=secret -IMAP_FOLDER=INBOX -IMAP_POLL_SECONDS=30 - -# --- Outbound email (SMTP) — leave SMTP_HOST empty to print mail to console (dev) --- -SMTP_HOST=smtp.example.com -SMTP_PORT=587 -SMTP_SECURITY=starttls # starttls | ssl | none -SMTP_USER=inbox@example.com -SMTP_PASSWORD=secret -SMTP_FROM=approvals@example.com diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/README.md deleted file mode 100644 index 44ab993..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests arrive by email (or through a login-protected web form), get redirected to an approver, and once approved or denied, **everyone involved up to that point** is notified by email. Every request keeps a full audit log of everything that happened to it. - -## What it does - -- **Email intake.** An IMAP poller watches a mailbox. When a message arrives from a workflow's allowed domain, a request is created and redirected to that workflow's approver with one-click **Approve** / **Deny** links. Mail from any other domain is rejected (and logged). -- **Decisions notify everyone.** On approve or deny, the requester, anyone CC'd on the original email, and the approver all receive the outcome email. -- **Full log.** Every request records: received, matched workflow, approval requested, decision, notifications sent, and any mail errors — each with a timestamp. -- **Multiple named workflows**, each personalized: its own allowed sender domain, approver, and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, IMAP_*, SMTP_* -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `SMTP_HOST` empty prints outgoing mail to the console and leaving `IMAP_HOST` empty disables email intake — handy for trying the app before wiring up a mailbox. - -## How email intake targets a workflow - -1. **Plus-addressing:** mail sent to `inbox+@your-domain` targets that workflow. -2. **Subject tag:** a subject containing `[]`. -3. **Fallback:** the first active workflow whose allowed domain matches the sender. - -Whichever way a workflow is matched, the sender's domain must equal the workflow's allowed domain or the request is marked **rejected** and logged. - -## The request lifecycle - -``` -email / web form - │ received + logged - ▼ - approval request → approver (approve/deny links) - │ logged - ▼ - approver clicks a link (or admin decides in the UI) - │ decision logged - ▼ - APPROVED or DENIED notice → everyone involved so far - (requester + CCs + approver) logged -``` - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{decided_by}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit-log helpers -pipeline.py approval request + decision/notification logic -poller.py IMAP inbox watcher (background thread) -mailer.py SMTP sending + template rendering -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/app.py deleted file mode 100644 index 110a2dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,284 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash - -import db -import pipeline -import poller -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) - - -# ---------------------------------------------------------------- helpers - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - if not subject or not body: - flash("Subject and message are both required.", "error") - else: - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - requester = user["email"] or user["username"] - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.source='web' AND (r.requester=? OR r.requester=?) ORDER BY r.id DESC LIMIT 15", - (session["username"], - (g.db.execute("SELECT email FROM users WHERE id=?", (session["user_id"],)).fetchone()["email"] or "-"), - )).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests) - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approver_email FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or req["approver_email"] - status, req2, message = pipeline.decide(token, action, decided_by) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)") - return redirect(url_for("admin_request", rid=rid)) - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - return render_template("request_detail.html", req=req, logs=logs, participants=participants) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - allowed_domain = f.get("allowed_domain", "").strip().lstrip("@").lower() - approver_email = f.get("approver_email", "").strip() - if not (name and allowed_domain and approver_email): - flash("Name, allowed domain and approver email are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, allowed_domain, approver_email, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), allowed_domain, - approver_email, 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created.", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, allowed_domain=?," - " approver_email=?, active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), allowed_domain, - approver_email, 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() -poller.start() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/db.py deleted file mode 100644 index 86604ae..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,157 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - allowed_domain TEXT NOT NULL, -- only senders @this domain are accepted - approver_email TEXT NOT NULL, -- who receives the approval request - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL, -- 'email' or 'web' - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied / rejected - token TEXT UNIQUE NOT NULL, -- secret for approve/deny links - decided_by TEXT DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed: {subject}", - "approval_body": ( - "A new request needs your decision.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - return con - - -def init_db(): - con = get_db() - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/mailer.py deleted file mode 100644 index e0da6b3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Outbound email (SMTP) and template rendering.""" -import os -import smtplib -from email.message import EmailMessage - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def send_mail(to_addrs, subject, body): - """Send a plain-text email. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - host = os.environ.get("SMTP_HOST", "") - port = int(os.environ.get("SMTP_PORT", "587")) - user = os.environ.get("SMTP_USER", "") - password = os.environ.get("SMTP_PASSWORD", "") - sender = os.environ.get("SMTP_FROM", user or "approvalflow@localhost") - security = os.environ.get("SMTP_SECURITY", "starttls").lower() # starttls / ssl / none - - msg = EmailMessage() - msg["From"] = sender - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not host: - # Dev mode: print instead of sending so the app is testable without SMTP. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - return True, "dev mode (SMTP_HOST not set) — printed to console" - - try: - if security == "ssl": - server = smtplib.SMTP_SSL(host, port, timeout=30) - else: - server = smtplib.SMTP(host, port, timeout=30) - if security == "starttls": - server.starttls() - if user: - server.login(user, password) - server.send_message(msg) - server.quit() - return True, f"sent to {', '.join(to_addrs)}" - except Exception as e: - return False, f"SMTP error: {e}" diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 3ac20b4..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Request pipeline shared by the web form and the email poller.""" -import os - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def _vars(wf, req, **extra): - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def send_approval_request(request_id): - """Redirect the request to the approver, asking for approval.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - v = _vars(wf, req) - ok, detail = send_mail(wf["approver_email"], - render(wf["approval_subject"], **v), - render(wf["approval_body"], **v)) - db.add_participants(con, request_id, [wf["approver_email"]]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Approval request to {wf['approver_email']} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def decide(token, action, decided_by): - """Approve or deny a request; notify everyone involved so far. - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - new_status = "approved" if action == "approve" else "denied" - con.execute("UPDATE requests SET status=?, decided_by=?, decided_at=? WHERE id=?", - (new_status, decided_by, db.now(), req["id"])) - db.log(con, req["id"], new_status, f"Decision by {decided_by}") - - participants = db.add_participants(con, req["id"], [decided_by]) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper()) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, f"Request #{req['id']} {new_status}. Everyone involved has been notified." - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/poller.py b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/poller.py deleted file mode 100644 index 98df3cf..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/poller.py +++ /dev/null @@ -1,146 +0,0 @@ -"""IMAP inbox poller. - -Watches a mailbox for new messages and turns them into approval requests. - -Workflow matching, in order: - 1. Plus-addressing: mail sent to inbox+@domain targets that workflow. - 2. Subject tag: a subject containing [] targets that workflow. - 3. Fallback: the first active workflow whose allowed_domain matches the sender. - -The sender's domain must match the matched workflow's allowed_domain, -otherwise the message is logged and rejected. -""" -import email -import email.utils -import imaplib -import os -import re -import threading -import time -import traceback - -import db -import pipeline - - -def _addr_list(msg, header): - raw = msg.get_all(header, []) - return [a.lower() for _, a in email.utils.getaddresses(raw) if a] - - -def _body_text(msg): - if msg.is_multipart(): - for part in msg.walk(): - if part.get_content_type() == "text/plain" and not part.get("Content-Disposition"): - try: - return part.get_payload(decode=True).decode(part.get_content_charset() or "utf-8", "replace") - except Exception: - continue - return "(no readable text body)" - payload = msg.get_payload(decode=True) - if payload is None: - return str(msg.get_payload()) - return payload.decode(msg.get_content_charset() or "utf-8", "replace") - - -def _match_workflow(con, sender, recipients, subject): - workflows = con.execute("SELECT * FROM workflows WHERE active=1").fetchall() - by_slug = {w["slug"]: w for w in workflows} - - # 1. plus-addressing: inbox+slug@... - for addr in recipients: - m = re.match(r"^[^+@]+\+([a-z0-9\-]+)@", addr) - if m and m.group(1) in by_slug: - return by_slug[m.group(1)], "plus-address" - - # 2. subject tag [slug] - for slug, w in by_slug.items(): - if f"[{slug}]" in subject.lower(): - return w, "subject tag" - - # 3. sender-domain fallback - domain = sender.split("@")[-1].lower() if "@" in sender else "" - for w in workflows: - if w["allowed_domain"].lower().lstrip("@") == domain: - return w, "sender domain" - return None, None - - -def process_message(raw_bytes): - msg = email.message_from_bytes(raw_bytes) - sender = (email.utils.parseaddr(msg.get("From", ""))[1] or "").lower() - recipients = _addr_list(msg, "To") + _addr_list(msg, "Cc") - subject = msg.get("Subject", "(no subject)") - body = _body_text(msg).strip() - - con = db.get_db() - try: - wf, how = _match_workflow(con, sender, recipients, subject) - if wf is None: - print(f"[poller] No workflow matched mail from {sender} — ignored.") - return - - sender_domain = sender.split("@")[-1] if "@" in sender else "" - allowed = wf["allowed_domain"].lower().lstrip("@") - if sender_domain != allowed: - rid, _ = db.create_request(con, wf["id"], "email", sender, subject, body) - con.execute("UPDATE requests SET status='rejected' WHERE id=?", (rid,)) - db.log(con, rid, "rejected", - f"Sender domain '{sender_domain}' is not the allowed domain '@{allowed}' for workflow '{wf['name']}'") - con.commit() - print(f"[poller] Rejected mail from {sender} for workflow {wf['name']} (wrong domain).") - return - - # CC'd people are "involved up to this point" too — everyone on To/Cc - # except the sender and the intake mailbox itself (incl. its +tag variants) - inbox_local = (os.environ.get("IMAP_USER") or "").split("@")[0].lower() - - def is_intake(addr): - base = addr.split("@")[0].split("+")[0] - return (inbox_local and base == inbox_local) or \ - addr.split("@")[0].endswith("+" + wf["slug"]) - - ccs = [a for a in recipients if a != sender and not is_intake(a)] - rid, token = db.create_request(con, wf["id"], "email", sender, subject, body, extra_participants=ccs) - db.log(con, rid, "matched", f"Matched workflow '{wf['name']}' via {how}") - con.commit() - - pipeline.send_approval_request(rid) - print(f"[poller] Request #{rid} created for workflow '{wf['name']}' from {sender}.") - except Exception: - traceback.print_exc() - finally: - con.close() - - -def poll_loop(): - host = os.environ.get("IMAP_HOST", "") - user = os.environ.get("IMAP_USER", "") - password = os.environ.get("IMAP_PASSWORD", "") - folder = os.environ.get("IMAP_FOLDER", "INBOX") - interval = int(os.environ.get("IMAP_POLL_SECONDS", "30")) - - if not host: - print("[poller] IMAP_HOST not set — email intake disabled (web form still works).") - return - - print(f"[poller] Watching {user} on {host} every {interval}s.") - while True: - try: - imap = imaplib.IMAP4_SSL(host) - imap.login(user, password) - imap.select(folder) - _, data = imap.search(None, "UNSEEN") - for num in data[0].split(): - _, msg_data = imap.fetch(num, "(RFC822)") - process_message(msg_data[0][1]) - imap.store(num, "+FLAGS", "\\Seen") - imap.logout() - except Exception as e: - print(f"[poller] Error: {e}") - time.sleep(interval) - - -def start(): - t = threading.Thread(target=poll_loop, daemon=True) - t.start() diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/static/style.css deleted file mode 100644 index f71bca8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied, .stamp.rejected { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 414608f..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
{{ stats.get('rejected', 0) }}Rejected
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - - {% else %} - - {% endfor %} -
NameIntake tagAllowed domainApproverStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
+{{ w.slug }} / [{{ w.slug }}]@{{ w.allowed_domain }}{{ w.approver_email }}{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectSourceStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.source }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 7fc20f3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 5b5579c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 9978c99..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index ed4950d..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · via {{ req.source }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Decided by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'pending' %} -
- - - Deciding here notifies everyone involved, same as the email links. -
- {% endif %} -
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index f62a879..0000000 --- a/Approval Workflow/OLD_VERSIONS/v1.0/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - {% if wf %}

Email intake: send to inbox+{{ wf.slug }}@your-domain or put [{{ wf.slug }}] in the subject.

{% endif %} -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {decided_by} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow.zip deleted file mode 100644 index ea8aeb52f5b95d100695d5ab9b0d19f446b7b1c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25118 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 c_3JH!Tk42NkoP40&gYs9pd1A7fdqr~m)} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/.env.example deleted file mode 100644 index ed07a41..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,21 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Inbound email (IMAP) — leave IMAP_HOST empty to disable email intake --- -IMAP_HOST=imap.example.com -IMAP_USER=inbox@example.com -IMAP_PASSWORD=secret -IMAP_FOLDER=INBOX -IMAP_POLL_SECONDS=30 - -# --- Outbound email (SMTP) — leave SMTP_HOST empty to print mail to console (dev) --- -SMTP_HOST=smtp.example.com -SMTP_PORT=587 -SMTP_SECURITY=starttls # starttls | ssl | none -SMTP_USER=inbox@example.com -SMTP_PASSWORD=secret -SMTP_FROM=approvals@example.com diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/README.md deleted file mode 100644 index c6d92f7..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests arrive by email (or through a login-protected web form), get redirected to an approver, and once approved or denied, **everyone involved up to that point** is notified by email. Every request keeps a full audit log of everything that happened to it. - -## What it does - -- **Email intake.** An IMAP poller watches a mailbox. Incoming messages become requests and enter the workflow's **approval chain** with one-click **Approve** / **Deny** links. -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester, anyone CC'd on the original email, and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, matched workflow, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, IMAP_*, SMTP_* -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `SMTP_HOST` empty prints outgoing mail to the console and leaving `IMAP_HOST` empty disables email intake — handy for trying the app before wiring up a mailbox. - -## How email intake targets a workflow - -1. **Plus-addressing:** mail sent to `inbox+@your-domain` targets that workflow. -2. **Subject tag:** a subject containing `[]`. -3. **Fallback:** if exactly one active workflow exists, it is used. - -Unmatched mail is ignored. - -## The request lifecycle - -``` -email / web form - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + CCs + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit-log helpers -pipeline.py approval request + decision/notification logic -poller.py IMAP inbox watcher (background thread) -mailer.py SMTP sending + template rendering -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/app.py deleted file mode 100644 index 4df65e7..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,298 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash - -import db -import pipeline -import poller -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - if not subject or not body: - flash("Subject and message are both required.", "error") - else: - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - requester = user["email"] or user["username"] - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.source='web' AND (r.requester=? OR r.requester=?) ORDER BY r.id DESC LIMIT 15", - (session["username"], - (g.db.execute("SELECT email FROM users WHERE id=?", (session["user_id"],)).fetchone()["email"] or "-"), - )).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests) - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - status, req2, message = pipeline.decide(token, action, decided_by) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)") - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() -poller.start() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/db.py deleted file mode 100644 index 1a9582c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,176 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL, -- 'email' or 'web' - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/mailer.py deleted file mode 100644 index e0da6b3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Outbound email (SMTP) and template rendering.""" -import os -import smtplib -from email.message import EmailMessage - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def send_mail(to_addrs, subject, body): - """Send a plain-text email. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - host = os.environ.get("SMTP_HOST", "") - port = int(os.environ.get("SMTP_PORT", "587")) - user = os.environ.get("SMTP_USER", "") - password = os.environ.get("SMTP_PASSWORD", "") - sender = os.environ.get("SMTP_FROM", user or "approvalflow@localhost") - security = os.environ.get("SMTP_SECURITY", "starttls").lower() # starttls / ssl / none - - msg = EmailMessage() - msg["From"] = sender - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not host: - # Dev mode: print instead of sending so the app is testable without SMTP. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - return True, "dev mode (SMTP_HOST not set) — printed to console" - - try: - if security == "ssl": - server = smtplib.SMTP_SSL(host, port, timeout=30) - else: - server = smtplib.SMTP(host, port, timeout=30) - if security == "starttls": - server.starttls() - if user: - server.login(user, password) - server.send_message(msg) - server.quit() - return True, f"sent to {', '.join(to_addrs)}" - except Exception as e: - return False, f"SMTP error: {e}" diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index c5ba954..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,153 +0,0 @@ -"""Request pipeline shared by the web form and the email poller. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - v = _vars(wf, req) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(wf["approval_body"], **v)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper()) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by): - """Handle a decision at the request's current step. - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/poller.py b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/poller.py deleted file mode 100644 index a9da7b5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/poller.py +++ /dev/null @@ -1,132 +0,0 @@ -"""IMAP inbox poller. - -Watches a mailbox for new messages and turns them into approval requests. - -Workflow matching, in order: - 1. Plus-addressing: mail sent to inbox+@domain targets that workflow. - 2. Subject tag: a subject containing [] targets that workflow. - 3. Fallback: if exactly one active workflow exists, it is used. - -Unmatched mail is ignored. -""" -import email -import email.utils -import imaplib -import os -import re -import threading -import time -import traceback - -import db -import pipeline - - -def _addr_list(msg, header): - raw = msg.get_all(header, []) - return [a.lower() for _, a in email.utils.getaddresses(raw) if a] - - -def _body_text(msg): - if msg.is_multipart(): - for part in msg.walk(): - if part.get_content_type() == "text/plain" and not part.get("Content-Disposition"): - try: - return part.get_payload(decode=True).decode(part.get_content_charset() or "utf-8", "replace") - except Exception: - continue - return "(no readable text body)" - payload = msg.get_payload(decode=True) - if payload is None: - return str(msg.get_payload()) - return payload.decode(msg.get_content_charset() or "utf-8", "replace") - - -def _match_workflow(con, recipients, subject): - workflows = con.execute("SELECT * FROM workflows WHERE active=1").fetchall() - by_slug = {w["slug"]: w for w in workflows} - - # 1. plus-addressing: inbox+slug@... - for addr in recipients: - m = re.match(r"^[^+@]+\+([a-z0-9\-]+)@", addr) - if m and m.group(1) in by_slug: - return by_slug[m.group(1)], "plus-address" - - # 2. subject tag [slug] - for slug, w in by_slug.items(): - if f"[{slug}]" in subject.lower(): - return w, "subject tag" - - # 3. single active workflow fallback - if len(workflows) == 1: - return workflows[0], "only active workflow" - return None, None - - -def process_message(raw_bytes): - msg = email.message_from_bytes(raw_bytes) - sender = (email.utils.parseaddr(msg.get("From", ""))[1] or "").lower() - recipients = _addr_list(msg, "To") + _addr_list(msg, "Cc") - subject = msg.get("Subject", "(no subject)") - body = _body_text(msg).strip() - - con = db.get_db() - try: - wf, how = _match_workflow(con, recipients, subject) - if wf is None: - print(f"[poller] No workflow matched mail from {sender} — ignored.") - return - - # CC'd people are "involved up to this point" too — everyone on To/Cc - # except the sender and the intake mailbox itself (incl. its +tag variants) - inbox_local = (os.environ.get("IMAP_USER") or "").split("@")[0].lower() - - def is_intake(addr): - base = addr.split("@")[0].split("+")[0] - return (inbox_local and base == inbox_local) or \ - addr.split("@")[0].endswith("+" + wf["slug"]) - - ccs = [a for a in recipients if a != sender and not is_intake(a)] - rid, token = db.create_request(con, wf["id"], "email", sender, subject, body, extra_participants=ccs) - db.log(con, rid, "matched", f"Matched workflow '{wf['name']}' via {how}") - con.commit() - - pipeline.send_approval_request(rid) - print(f"[poller] Request #{rid} created for workflow '{wf['name']}' from {sender}.") - except Exception: - traceback.print_exc() - finally: - con.close() - - -def poll_loop(): - host = os.environ.get("IMAP_HOST", "") - user = os.environ.get("IMAP_USER", "") - password = os.environ.get("IMAP_PASSWORD", "") - folder = os.environ.get("IMAP_FOLDER", "INBOX") - interval = int(os.environ.get("IMAP_POLL_SECONDS", "30")) - - if not host: - print("[poller] IMAP_HOST not set — email intake disabled (web form still works).") - return - - print(f"[poller] Watching {user} on {host} every {interval}s.") - while True: - try: - imap = imaplib.IMAP4_SSL(host) - imap.login(user, password) - imap.select(folder) - _, data = imap.search(None, "UNSEEN") - for num in data[0].split(): - _, msg_data = imap.fetch(num, "(RFC822)") - process_message(msg_data[0][1]) - imap.store(num, "+FLAGS", "\\Seen") - imap.logout() - except Exception as e: - print(f"[poller] Error: {e}") - time.sleep(interval) - - -def start(): - t = threading.Thread(target=poll_loop, daemon=True) - t.start() diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/static/style.css deleted file mode 100644 index f71bca8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied, .stamp.rejected { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index c617951..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
{{ stats.get('rejected', 0) }}Rejected
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - {% else %} - - {% endfor %} -
NameIntake tagApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
+{{ w.slug }} / [{{ w.slug }}]{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectSourceStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.source }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 7fc20f3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 92cc510..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 9978c99..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 46c2076..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · via {{ req.source }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'pending' %} -
- - - Same effect as the current approver's email links. -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 13df989..0000000 --- a/Approval Workflow/OLD_VERSIONS/v2.0/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - - {% if wf %}

Email intake: send to inbox+{{ wf.slug }}@your-domain or put [{{ wf.slug }}] in the subject.

{% endif %} -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow.zip deleted file mode 100644 index 55fe614d35c23a5071114d911b199fbd1c0814a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22775 zcmagF18{BKvNjyswr$(CZQHiBV`s-Ucaj}DJGO1x)|dC3`+x8K&OPV;t7^D>7gzus07C}{Cwn(T8#5bwcY0M7NC4oaE)}c4 zma7Le03gU;KmEr=;ad#K_YDMqZ^^k10yGF;1qAu9i-wwx)J2&U7vw zF8>f~`>AYo`Mv%{tn`>9&16#p>mu_ul|1cejTEhH`1P#x9aGX>)a|)V3{0R7z+YSc zQv>nut-p8tzaNx;-P+m3(8bdDpNfF~`yKyQJBM|B~kH;%Q?_ zXYB0!4@Lfi*ldlp*gZBR-zRkhOArfrEiB2dW<&!we6*k80MPr4!@#79O--bV1m#`l zd4WD6T@3p514QNRSvkJ}o7*JNG+pI%%cgRN`A@a3&9&Yux9Rt5`9Db@k3h>UCqQ0) z>@Um#Bg*11??{S{W%SfqktD$v?W2-|O4Bpk%^fWiZtEo2Qw#CHr|~DYN1HjOW+|pB zBv>K(MME?OldOwpM*K#Szm*B}5P!PavG^mZ$B0mjxyEQEf-+TI49HFL)|pUJfAc5ii>Q5w@xeBI``cvskMYeR zF{A&2k_x7CLXf$D3)xlW&rJA^8KVpyT@ZV!x{vfo@3YJY%y%7!oe+bk zwhiV&Q@sF8exHvc`u#0XZ_@5rsn2VH{Y;gr`wSdB!CgtR+jE&l_YUeYdi87V<14q< zvaYZrKsU)1;2T((>i~kjt^JH8gYiDU?jEh>+7aGr(M1+RFngc*CM6A?IsjZKGs?#b zfUpqg3MV+ZG7nQV9z8&Mz%w%C9&Q;6>iZ7y`F-9arZ{M@InP3vPsI-@68c-0#^UVl z8=54U9iD27hZkhU4ls!LTt1#Naae_nv9>$|C$PmFNZMQJgM)2t0e-_2qg@%gMljW& z6!WZuP6*oRZmhD5k}%az#1f0zy>ZI*h$`m=TyDlx(Fl1Oixe&hJsPiY0FF8G9DIxc zxxiRl2(Drm0U(S+7{Q{WMk&L*)9Y4llM}ul4(qRZ1yc-sw?J4puh}ElTONw=kL}ON z=g1tgM^K$8l2?5~lzNYj$__jnSpewrEN>k^dXJ>EhG2v6$==4;=qE?rIxmS67B@7I zUJB3ThS^oD6P!R4N7jBl3X*{go)tB5`z|mn__}fe_%mXT^`gGjPe2!M*&D{Lu(+%^ zh>sleC1}sD*xYYeG34Rxy*9wnJ5(72nI1SjbPqM*nJqED9l1h{-(@Uo!WZFiIC?2m zTz!m!8jf34ti>k$&vKZB{MX>Ao%2!^%v8h^VsE0OlujY&Eyg4H1|55oO79r@9t$Dv z;)K;h7gZ;l#mZ?c6{CY)D^+P40a;)P{~{5FML;Anl|_VP_P#C-XfsI!#tlq8S39yk|+D)yE=44zTIW{=WCJK*%B$~P5=1+~;ue9anP&i=b&Am9|*t2gp zUomUDRfWe}m-h!w6E=-H&8o;qp}Hi0Kh?<2gJ6)eYYYXq2s?Vp7(16XrO?k#m=DBu z%gIy(NI8EAjlsPHcqnxc!Y;m=8}yJ>xORsTPLceS89G_+H5%a!CImIRP?^5bp4Fuh zGNo$l%XTDpAxq|(y+YtRRH;+e`- zc#DzBGWUQ+Fe*L8iI_I8qhGqprJ|6)V~8%~V3#lEHKqx-ZXhKpccyk%Ekc$Y`8e&} z!{nloXui3)-L7&Pne4*py3({(ALhoKPib+@WmACV8zMw{xhA%~g3~Gue$30YCe>!A zPc$Ag?X;0Lw*xi~H}0RW%dl9`rS^)G^RWGZ$k2)Ami{^l@fAMqwtGYSgQrGGXHh6W zP2;w@U3&-PhswBN^DzOdo1iHCk^Q>b$zMS!{qg+SNE30g<9*M zTkPI5ql-+~!&hjC*^PvAoh^;k`x9fs&x4#70on`-ckJ$lb6XS`Pc~aig_%>}+^*hV zxLIU+R(-mOXR7&eECF)0ol9`LU(a6yU$BW)?^OVautv|*n4C)vF*E5XE6V#gA#J{& zEN})*6Kv5F`OfI(G!pK*>}Y@5O)~Er83~_@Ajjm+haVfDG&67#WlOI;A}kthlfc2X zWxBQpE0%U*+?YFN!e;Ik)-8aMjW4L~xcaEcL@ya^IpKP5Pj}v;EwlAsxNr*j&g_l~ zWbTPrk45Jup4~IoBYmUY@qu*3=Vnz+{P(Ds;NG87%o^=0eDw1Zjv*TlcGLh zw?By3bw>%c8C*Q`ZWB!cQ8eelDg+{3`Ah69RNe?)les@)Zo-9~bjBJu3dd=Lmf;+3#+DQ7Apw$s)}%umcJ4lpAh9!ofbilgt1^S#;^<1p?vM7 zUUby=VQr}7Qz#qpVagneV(8VDnM=~oA^3>U+Kg)u5UNk>NmP$Q$w3GwLy|s9rq4W< z!Qkq`0JHR-9TRmH{A~9dIH=gD#?oghjdZ0|sGm78#&6nfOhDf~UZ0s+OT>6gg^^?v zoCV}f)60K@lOYO1wkb^lR^g=TbrwAB0%eWCwv%A)?1zfv`Q}TlE*8^^N$4(=+QB$8 z&hmw0hYCEHE8x$;`kcgT_A7}bTB>Svl-CU&C;c3nM2IMKCa-}+-gTOY`y_d%LVbLY zW^SmKdZZZ}f-uBF`T-vydlDuDGKp;>!uFJdzD9cldaTAq8@Wm&ySeQ#g;owfW-Kra zoVcwD<`fI8P@08W!_Y=5D2!_kQb@f4R<;vX&Z`3wr|$%-^T_RBprV8VcY3p?=)mv{ z0x1YbcWKtrKT zSPfnHcZG>UaPTOf9YjCiB>77Q&LrE>D{HyDL~yw)@|U4nd6YA2b z>jA<=U`NjUfIjgcq9;Eg7toPv$SO?0=nVf33d<3s66eEi$?F9H8_WE!@?89TiGEn_~mSn+lc&XU~ZvEPorp7n)TNs+o8qa3nZ%7q%QXrKP2?)+R}_<-e`); z21ccmf;>29Dm&GdDtJs5(-Vbps+=fIPeAKoR1hEn2}HE8@|$ICit^*;5^s)UDTVPf zx!qb9E*cRFk6-v*Kmh_tf@+G^>Yf3C*H?|<HdJZrOb7WwY_6a67X6V%awVQfYqw~z2xoWk8wz@cbk1w(Xupu!BUt| z6frS)!=ydM*OPF&9eIlFdtrQ2ADiYu@Rc{41>1z?v2D}$1K9g_HV<6=KNh!ZrtQCB zUz?gtn+4c!D8pK}tC~Pv&^7*W`u8%~aoEQk-_6wAr`vQA{Q32$ES*!C=^=Z!v`xhkw;i330RCspj7`9BsZ327rXMUe!x-?xu$(j zQ2ew0D;7990K1mU$)7ucL8Qa+jzZXf-QYBjUIlU|P?}b4kKUjHxqJ~k0?P_zDGm0M z(_`xK61--K;3(3 z*d@Ax6>}`gT6U!;FNQ~r`y70?uMFYXrN7>~Ib@t!1y?}fPogQvq|9Zw6bh)|MKFTj zb&sN%KqyLRrG_!dnpdWQ11ymNIpJsgm+Jmz&2j4B8$Kmzlq>^^e5L&1KkHr!zxpL7 z(~g!jAD_-|4kMl6YI9nCg(&p8>h^bl6H7lIT&`9INPT0D#0W;T5#8z-VB0r)y-=x| z!dZl5f!M2v^ko7Uyyng4>D7W^bc2UC8top`I(&&?t+5C6?I^fH(#amw2d-t*TI74|QK=FXnTx|A=1{}IXuGS4CkQ#`CbGOs= z&i^RIacq*?cEYp`Qe17^{Ql#9@bDvB?`85=`O!71b6TGkdief$s*a!sk&-Ug`(c}( zvvy(Tgxh>K4xTWcbf@q(w2O%hScZz9WpTY6g%J1X*?5GyJ-L(o$CK&(s|ZMFNSZl= zvd^z`X3C4OB^f0CTurTZ9&YLNB|caH;CkgWB#()3wvo;3XK(?v6u<0FNXqp z+*E9_7r1cYRWMR2=`Qh5q8W~U($r;cN$HXq1@9Sc(fe_Rj@d!sNU5I0P2r~@42rkaSMroQ|; zm^qx;e=2`Vj^`X@mFT9JxA>|9x)NqnKTVt=5IBQRS9+ z$jzd?hR}A?K%2?wegl3;5-Leu*U`!wy!$|7jtCat&k|A0$67(^@CP7PAuK8Y<)HuH zKK&Qn2)~bOXZ_9krF}2_e}(iW_QuwxPPE4Mwhs2rrgWaRHvb#pC>tdR)z1I}a^)F1 z%v&BOnhPma9UvGJZPLDFU!dou=@zDIj(so?iwv+}#U%kZGc^I=O`nLk7*MhJegug2 zGnbOI!x(PpXgQY1XQCF%s_dTq%Xd+{L<|FSb{Sh!__(z0ZCBR%fX5f`|J8v8ah+}M z`}yGj0RYhdRR@uO=wS98oc_0GH;s{(|9YqMFIqu@-}`3SqM|x zJVZ^T_2}Ma{W;u(1M(Mh{_Z!et^%vc){VUZjua@ja zrs1FAm*N@ldvaA9NiiOJX*h$VJGChqPCtt+r4CI2+xPD*T=%BQ)Z?dp=aXYn1_~2q zlltjHeQ`?Ak+@XqaYtxI5i(%2I}(`xve7@eT~MX}m!19}HgYkwb+9pXF?IeYy?fI3 zZ)>-|jSli%3*L;cgTH?#18ryk0Lp(g`riWG?VYUuV!-uHO)OpLEL{HU2$g;3hQHRo zaMs0Y6LxDH2wg{%U^+!|fs1y|HYWKec8@A3(D!Wtf>Fj%kfK(SRIxi)%i+h!kCJW@ zA6l`vAeq6!6EGt$T`y)u8>HJw;SdJQ#nh$lLO&vG+h!|Eh}f^zf)p@mSk%wKuAgG4{#I?!@aD=EmR zOLXQ8%FrVTsR;z~u^UZF?eP?{g!tGXkF=ng07=|hJNQ*POhVZ$DRn=Uyx#{F>$fCf z22Rx)FB@E~N;%@PFFksRS`Va^1=Qp)Pt4kP^q8R8>W0jl9tcJv0QhOoR_7%53MeyR zo}>Y$H1=r}PFP{dfTMtGVQRdWCZdTZ4OB_*sR#jSzJj-nkIqUL5;}tZ%GPV;aX5xm zfulu~I>RBnh9lMATQgAu&k++M=LZ(OcaK4Uo!oAnfs>PL*S5htdn_a<|(lM8~&> zOfMBWH;!WO_x8L~vYlaN9(NuDH{QYNP?sDgsvGY0`d&>w=S}>8x==9&>(?`yv72)Y znN)zs&SWELMq4A8y-GL6=xtz0oT^1K)5Ic=`#wG6hZ3x< z+)|yLU&b?5cdwErtF66svq^EBGU3mjMY#cUJgA}QS%my~TDilQ048124p9ipxOQp? z-%iHd*jU2oAs?EzFdJcer6YmZfhYZX6mw*Sh=;=qIbJ02OC#*Mga$feXQsH>QL>;A zWtP%MRBqluiIqwaR`Jz#Zdb7wNWDX;D?P<_<~7F(o5W$Qh-?0)E~7uy9@}i@9P{C0 znb+o%jMyD#emumP5)7^#QbENeg-bc52T^gScqYlUOEf&2LkPXb_yj_Ee1|3v;}^e0 zntG=?*7?0#5ncjjPT8aZM{Wf|`LRx@*Au2daGsr2?gUE@e(4L*n&6eV4g28T2yg#m z6up!eztv0kGwMwM@;M$?uB<R@b9v8auGz?p`jSgM4&G6bE5=ewp zMRDwMUEwPtwYHsN?#~a;+}Wp&_kfzY$Z&95E++%W(og*VZ+MwshUmTq0sx4B001ET z&*8<;#MaX8|2M2;e}|QM286CF<>(-(C>2r#LOK&#Re?BEs&G7YxpNjfWbWn3k_Dw7 z;oFd&NP}*PvTf}OUaKR^cN1~l_Klgu+fS*|W(1>UJC2rTR6&J91BVdxQU~q^q17B- zH7Q-xR126MvS)|H7N4C5gILcWcj#H{F>2OYy4#@9B0UH^pra{&WENj$Z*e(8(#Sko zB(R66t;U&{Y|#?rGnB{jv5n;N3)$!cYg_#=gyaLIz$$i-V!#zZmlKy1C@x?qRx5y3 znGAcas46&QvFbI7WU7XAQnip1Kzo$!MP{RI*tYHeu&?Lf7~_%cPux&;_yWhpStcgT zv#2E2?hwent7j0*GZU8M6PvgHJo*@c7Qjq1!rwQ)@(0X2Z02cxBdC2%;C?tuR(4})a7UOMX0nDE_UD3tL$6HdKY-L1<**%2Am=|7vSdlUs<_yy0 z`#b5q*G1FK3UjTv71f&jOEb-rG9x0SK~g`3)1e{18dKBJ1Bj$pSjUWXJsE0@jkVf= zG$jLl3}VgN^><%}d~CS5j$<;5(=TM3m4P5mDY1QMuDOsz+el2*S1od!{+G&8)RyQ? zarvA(C0UBQp6V@6&t*x!-w-h=R3pZ@b~%<9H+^Xg3f_yS-D}XYy0>;Te^}X*78l$C zKjZ54VuD)n61;~%nQSX-*qnFyikhf%oOjUY`4%k2jeQjyoKN>G+=c`-Y4$yqVhPYBXY;J~J=ZH~3(e+MD%tvLWxd6?SDXZ}2+1CZY696m++-jeUY|LscB-w-qi zSj<;Ie=gld=7#|u;uJ(&s5wFTb8i0G_#U3()S0ey}oX%XKLqAghuWc{s$(IZUIoO&K=8;wmp{J=q(IC(o;E+=1!)b@o4pqFe7`X5rLpJhB*qChUB>pKe4(Ay0S z{bpK$9iDr0Sl6L-%5Wl-xOP@n*nnqu zr;TCtj0?!|C15MJu;O*k-U8y+S5x{P$KKXCrgz1R#Nf^`7~SL5GD8C+Yqzh?H^YJi zM^xU%f+bX*gP*FK!V3~dO?|M%6kXOegoZ4SmQ%WRhK(5rv1WDC1=C_WE>bS z+rv`6Wst)F3yFvG*lAq(8~d92RXk#yxgT@_DzBcW`jV9*zkr4@O~*FM*sQ3%_9%X? z%nT!8^Z!wc_EvnCD88lPP>SydqXw!LLU5@U{gle*t`;#6)>dHz3<&fz5}V#2<&o%K zzb}#nA7AYmkR!)n*Xn(tiM+n>zNUt4Q9P!qG#-7$QA6)beMFcT+X;E#oH7aqC2;eU zffUIZDBrx@7P;X_?p}5u3A%hGOxy;U{$;-Wr!Di@fl*w5S|95iPQ`xUV`GDreN3(@ zwpI}^E!#)aQZdZzU_OuKw52T7Tv=n33Y@5fkjR*&`j8g;0=1=scnZ z(<-{ut7;mmmLcdN8Y-}W=LJjVXj)bvkydgHW)a{w`ZB%xNcJ0nlN?DOp8N@Pg9_tTNjEKB&_!7q33-C@aN$P=%?4F+`d8d z^ZNp?sd7Dxt+Y0cb%~z79ifymW+{ertgf%xo#tA_oX7-DcKOD*n(Jn&| zWP3xaOAY8S*49c*R?OB%Ney#bpgj4hb2zIg8TZlwR6MeBYn!Of%E4Txp4}9|cQh!B z0mI}sB6#K2)2ml7N`OLYT?8v1&n1NBN=JU~S&kjWi!EY~IMJ%6%MiS-xH2h8X+_v1hFBKS*Zs zGr>>~TRN{r5_WM1vV(1xPm~l8psdy@*A0YC2_fN??~(0*Yh><0D|~s67xOb%0r39KW+nZ%x?tv=sb2mh>w5A61XQ*H6uJ428OG z<7H^3YwaLbwAf%!^k?Q2XL>#{?Oi|o_DNpVu<85Bff<}pH*EN2$MS&WmWQ>O_Yifl zozz75oR+dxcAE~!Jj>R37I*vQ$ZBua8cGy!m*8Cx8P0&Q^|*&CV~Q`r$2I%LI7C5brv8_$F0I}=o!I5i`0s69jBjp$BK=O@+QP1N#DU&DH@mr1LLl~cu4y_kdDE)<`@H34M!W5-{nBrGX_o%(twjbDozx-s(y=p?191$0IaC zGu88=w#%h_e&a^pQkz=q@1e?X<_Um=&1I$?@_=Qw`W$1)k_##lpz50TMRN}vj~fxW zT?v}rC%Lh8kU=!&Ul{_t*^ovUg6-mUD9EU<*5d+=_GLHy!ugI;MXO>Hu0UX=5QMQf z+^cb`WESqzr8WN&C4g{%C@SSiTqOn54g%pRhu7tJ4cj`eLY?0{QY^h!-8k%lE$M`F z%Q3c}7E99M;}uyK)V~AZeHh>h!5Gn}GjWe_l3qb5NC=))BVIu&Y-`Dxrq=!ZIlM0oH9!B!`r^PbUqWEnj*v8)Oy56Iul4odX|NTQQZIBB<@~iSD z4weRnju=0e93J*TDurX}{*fh)+y`1cNwqu>Ck=C+u`h-gP!$=8**GJm!!0eEm|{HO zgF|W%ueN&)4whJ(&5$&5HrmFLm)Ln^W3{LVu606}4G#n!9l#yj>IM&SuzYe8T$SWd z@%8v0PLgePie*(JvvBVO^USBdh&U5*7^1S9eqw9>!R-e-Emr(35{LWY`}HRn zr4R%(n;`VJ7_p_R`94FDIMdu=Rswe+nih8Dp{%b{wE|SD0iNj_DAYEL%}?BPoV%ZX zx*B9zd9iGgSPMJjJkiiam+EDuVw>!+rYxI%A*MyaV6w|1WyZ0H@MlcjGUcP`Aj zDN=Z&KH&@EfrXeef-;6Ayh@y zevJX9^GV$SXx7C7%e=p9dUa*Uum=to45c5g-+%(m7CMDgUTGIh@bisg1#Y!k6F!XQ zG{I-TFqsdzVw06j90Ygj*|`2m#w);~E#fXLLzLBwTiSn97v<)h>5^ zEH?MPSQ#jjoj&@vVimTJ2XhZE?4j;QOJbR0H5DJ>>QMs=)~}m1Xr=yzb}epSc{Q6z zN)k&{T@yM(+KcMj?`rv#h`inkE4*(4?#;o!RXr`wSLQu0O&PNVDN)5pOJ)q^8cU}P zyWx8i1qV_P*A5_Al~cE;IW6xyg#6ibxf@$i_8C^5G73Y59FLd|W!raC`v8i3SZZjN zb{YAUpgXXU;-E@u4!kg3WRjjU$#}x%e2^D0p1bq&j%;q8u(EUKXd1<4BTRuKEa3k{ zn|;(F_|)tB4cOgdB?9p%b-Qq)$ISZz1H?LEDGqVYg!D&bK3MY^SZrZ>Yby~uq0A21 z#NB-|ZsTO#mULn@v8FoYeK1I~*Ut*9Il3T?^2@QUa?FEgSoR+TikhE< zfuak!%q~s0j0%DkdFvq+i6yX$#H$}q0uj)+42^31pu2O62~Wra_yc|H0VW&IDOPZF ztVeAml1BxB>N#hR90lv+ok%DFvtmzN?zqM8*bgnW7!HrWfGq{>`lOzI8h7=G|M%f{ z|33Vi#iI!k--(d>n>YVoDrHw^Qzz%YPru>6FW0Ko#=h|@%ElYD9Vm!oK>0?=1z9{R z1Q+v|(X`RDs3JO_C-FmUO@eC+XCu{bB8{bs zgN3m^>?7(|t$ou(r$xm>!{T6EWJM1+R*yXcssz&LeBfcF`osLDACCQ-&=jA{stq!cy)Dy4Z&Tm z%Jf#$)7H6(hp4KS9h{%;lE3s{Dz$B`%4SqEY8%9~j}VUq%1T_f;b8Msf}B+_Db(g7 zQ{*hP6i2kQQu+2w*dmS=A^cFE`Xv*jn*>kBmJAOn>+m?8=X>`nV$hlOF%9FPdI#zcX7v3}43YI}MpF-VC}nAvJZCN+&%sm^;o!sW_S}@$d+6 zOV5BCB5s8-520^zNo68@US}(c?t&^9f$|qQC=ukxQg97xVDj9ZAvA%JL!@)_>dbS> zw~jeAn^F7uy8BL_EYX>cb}@A~mUNm!V|>}0V}y}(Oxx)%b??EWDNZ+_!Y0>iD>@RW zE~FMR93H}@NR?`@a3xZ&qK35i6RO)herCLckJs+e;?vR2C%O;|=vu-?k-lAyz7(A> z(MWHXnb`Mb)FAuAC{HF_z)3iN&G5V(!#gf<^chR+%cPQBezrgiFZ~VVj%RhvbQ+YCFJ=GXb6Rf{H`wsV)&23T#(4Yz^Ek&exp? zy>wo>2ck1P9){E}Vr)pE*` zSo23pD$WF#cR2U+OEK?3i+>mLy6Td8tv<_}K5X2}WK0DQznFzh5#9hKQ^CZ(`qh8y zcm6fQ5FHa8`s14nlljhZnE#sJ=uGY0=uABfzq?`o>=ynt#_(@mtuR&Wjr?X}I^U?l zd{#m^M)GM%4a(MB3FlW})l!Q~^CXbPRTd#Evj+V2S27Q00RxNDJ?}O%aUu%>*m(l) z{o2e6K4%ug_iA6=%jsraHSRSSQ0wdV+lVAe%jt>0_u9_ANl*8z*OJlAx;3k5C@twx zJnvjP_4;X@uKP!@K+BQBBCw(}4?){@r3$fov7X4y-qIcw#smZQMN?iii| zOK*rwT3#~^xpYN_WO05|8F?uKM)QZ z+9!7FVo0C-@-r5|jOE1^Dr3_f09IOP1 zNGgo~@G-^R&K3@WT<3h>7$;38Q(EZqgtV9LYjF(c^q8Hv(m$(@^}Q zc^Xe8|4uPx%Xk!daF?s;x)(&DikH@G^?4F4d-Taf0j0otZ*Jt3T8~p=#fMMn+V|u2 zcXS%f4`nhkNOG(BkDK1jgPBl&Mn8A2Mt4R&{Ft7iKg2rPV^4Diy*^umr8RZ2{N~Nm z1k^gIe$jU{uJ#(1Gj}(c4L6}*{m;O^B~z)D+f3Qa%lVCSt7`R^3ulfYS3YCV(|?(a zI9<a4f`#XKgN9r=|Ev;BRikk*olME#%DoX&SbS+FE0>JD!j{y)!j;< zy}y0FubT}%{B|{DZj2-|_Dp=2la$o(afA7C2^_~})s9GA+CU~>A!eCD};L*2|g z7Wsa#f8A1yRj#%Vf>)#S0C9h>W`~2M1y2PMA~uV#NnP*W0iWbzs@JMx6;4se=_VX3 zp1+VsWsU^tIVk%k1L)H`s)>fSiR#PUC9ulH%h{c`x6QEOxSgF%U0Q+`J%l?UK%Tu@n zcQRR#5uvHASYyB^ORyQe663C(@w28^&Pc06b1U^sgS`g-!F^^XRF|wLN2&R>l~*EA z>VTk|GGuf(km%0ZD>@(NRRor9Uo=T{OL)eiurpFOxl@M)W9*K`-mF{Alr()QJ0&W_ z>Xk_Vy1NXFe4WDOG5r(Jtr?%PEl)>Qa0+`d(T$=_kNu8YJpxH}Y`lQO^ah0SAC;7fuY&q;5SIK-hU_k%qSUM^4F{xOT%OA`Cbo zkvPHfLg;|QlL&=~SRROJEmq@701&~diy*&R36iv(N?rUbLj1gZq2o_wgbqX%TxVvM@lZGDYi7KZbCZ_sdbvmh?YI z9OEZW82H^ef3oYZQ;kHjNpKCwUD|QhU-vK^_;dQ*L$sFpjvGN#;L$jDtXKK8iOOH1 zX{N}hKcVp4B&YGJU0Uf2le##GVZoobVT}HYUB%DsCKM09f})$Nb%|2n4m>GTI6$;I4xJZHsa{ za-}-CSc}hl1pR4?&-(|eb*kT+LU9?FR!6R|NOPML%99nXnIa}6hs^M-wlihkZ4dis z8Gp5LCmzmTXJmZ=u+?e=&0Ya^pRQq+H6;NF%B50;#NdWXGaSii5EQv6d-fjk#dzdA{4$6y`+gweM(X6zed0#O^QOk=So;u&&@_EP*WXtSj^f%tm6IeA7VMW$|ej)(S|t&wJ4#JMO8Z{!g~*j+p2RK6lD zBiyzacC_zCN~P4eL$1pZmhTc3Y-c(zA9git?h)}MHF-WFsS&p;D8rH!{tmE0v1|Y8 zEEi27YyE|K@1SN$Isuq-XpNWyl+69yPTImRXAgswM%f0AyzL%-*wolMgUf5Y8b0bttUNTISRDM8e8= z4eD>4k%5;gs5dz0fmxKb8SRX6$#(a9Rcp278*uYVjmD=a6j{M3X~MHUUGoQb7)u?d zvv(UG&UN9&Y~nwIhwl}BI5UJqLTK<|X(PR+uiD3(L7j=oew>0;fQzWxG%d+{1he{7 zg!-h`FEFIR-5=O=yaKT;N`x!W(qi=PX^S|mQLl1Tv#L8)xp6R&sx(Uy*7mi~tnOoMQK zfwxxHXpl8+HRhn*$|`viw~}`T4HhN2jtU|&G2q8(3W%M)@8M($l#R-jT^IF2x_iaf zWWvLO&OC%OOAuVy+u^pS^_gs|=LB0}+v{25qbPjb)Q~y){`K?jpPn32CO|xhJ)^>( zL2yLYmS+ud<~?>y=C1=*kEXSAf3!oavFPY&bK)mqzLp4DnQeAuG8eQo0F zZ8#_`g+X-jY=mnt^?37j5$sOOdVqgnefDV6Qmw=6s%M#ZIdMtY@dyv|vM50xhoR)3 zZV5Hsh_F}`g?t(7)Lut^mV&eN%^G@|#4U)O$6jg7WCBkzF~KvRH<|l-!EahT?7$a0hWf7;tmU7l);$gH zZ;4-dhEosd_}Iyak#U0<`JE}ide)Wb326(IUhyPd5h1dCjni-Du9t5c?q{H7j)b(S zy%B{xd-}UPBn}sEgO1er)3h3tm88&N%}HyyKfqQ zEa8Mgd-B{IC5$#orlu4kYLLqrKN!*=gua61G=yI5x$AV%zXYi}s9NoOC2jxij`+fh zq7zt&9s8P5BOAQBVpOYk>z+$u-n^3M_6V9kMXiUd8d%kZi+!B*zkV9p((MYxi3#EZ z*Z6||o1yxv#Ch@0CARn;iGs!g06_ZJ634{ozgIZ_X8e9ZQ`>o$1I_P9y{sc8^1FIA zciUVpP{MO4Svg1qWaia%89gvaFEciYBNduM`SOh;8ACTZcHzIc6)-$IUcb-IWPmaL z9Exy=E{G4OfPCT*cg!GWAG^ILmAOoGIl>5=AMpc4`8aH#M7c&4sO&V1AVDn>V+Y<(uzv*wBrf%$g&8cw!^@AeaG@`H1g zDT~>}4Z%kuBn)}$Z6h=PZN=eylCR*)13#hty0jni8p9iTD>d0DO#%F6Q=d;uCd{9P zXT-H0BL+pX-$!(bq$e|;#L94cqctiauBLVY$xsl(7J_zRhFf|x7nKl)q=gGgXft{G z*XKg32`j}TO~=DWs(-&#s?8F5D)G1)=Lm&k=|ExLQ`n_MP0j=m>}!ri6^;&-mK>`H6jxB+_lIuw}NS7QUW4DE?wd z2Xpbt65F33HgC_EwH|AXX)JM;jr{Te;m@*U0?x6LA(XA-1$i7p+u{i%M1&lnNj{qW zDkm@L?ne_Hl3Ub3QzQwY+bH0h!@z*P?wju5IkOVXA83V2&!lFqDw&~PZn_~4w8GBs zPiV}aABcCtZYVR!c6X?J=uq76Wk!NRE%Wr_zxZT96b|Jv7$vR~4Fy3=3n2krUID|X z_(K(wjltA}(Vjy&(<3<9~U09DJ1n?d(JjldLc5~jm2eqkc7!>azvUgRtz4zV_ zF?hlccL>Qv>DrE4AoO-85j5(9bg$*5H{uSi5vco2zX6DG-De_)}`!G})jhERQAqqt9RxGr1? zr_*JSIGcv#QNeO0Fo$I!);K;P^FoZtrKNP&?JI0^EFVfLj{^i$vmz4EQ(&?5Ydnh% z1<~$_wA%vP|C9-&Vxau&8;f^YU521^BaY~8w*>noR+zdjj8Q;I&PWoIn7zQUTtSi> z2opOQR6wyP`+pia?|7>JM~~ZN&pJl-7AGkq5fWM1D_e(?y$%^s$SHe&?OFCXMmE{w z5E*fhRpu#)Y%0Iw=id80i0(OmoX7d+^?ZNc=d<3Q^LoA1c2rsSIh$laKs%%WsH>qd zP32$%j{xgHjl*~LfD|i{)Y|O|Y(glahrcgxQ_#V+w<(GE0Lb9747o`WhN&$+^yQ*{ zl!MEIKC>{r!B_F+^L#yKx5C@$hpPA7T`Fp7g8GN|SB9&-ZpafgI_TkQ##i_)sjmmr zSW`(p1Qd)G&=vrOP1{;b(pT}2F7Mx0>Ba8T;Ap9mg_7P@TgLJNoMp-yBRZ#ar@GBOLR<8b zzg*G^GdWa4X7tf=LIgQyZ<&Y?|uY#(8|+Ce%} zJ;NnJ*`VxCQ7uO_BuVk0Xs{RRsF_12qacCEjmcOKe=_{?(@;$M3W2g~z$={t%yQXo zmf-+e4P7>K07bh5l(<9vZPs|6o#=|{C93J4a2dV;6R{`O%QBodin2=mT9-Hb-^Vug zcr0$F#EJvRxSGvZdO24{qvO@U~p|*+8c?Jkgv2D*^6gQy{xoVcZSt=P1$}Ic0Ow?RbTicU2!6#;s{`CVP(C>pdFwFObymCr)UO zz8(^PK_*Tv5ED2VaRhRpE3B4llOTLWvMCG@o zec;|4^o4|5fj;ZzU(o5c7WT;;aiKlBts^oPE(_LY#*-LJQMTy8cux0gIyUQgjw zEbV=+WfQK-n#&R9qiiUlN+T~N>x}1;!j8kxJdwWQ(}$B9QCS$ci>xRhTGm0zFAF-? zx8RtQH&M`+n+ps82Z%11X+`KTME|T>etF+c@4$)I}Uus z*Y$%qfUARLR;6$+OKeF$|)MeJM2g%tAb5)hq_7Qm~EhtmyQ0iOMV-1WY zU)YJIsx;L30oCQ@;4)^@Z+eMk6l-YIs}7!gvn-+-M6{itQyG#)$ zAtoW=wcf)`4(VC3l}l`nnnqd@wcLDXTU^915I?B!LOA2zTi&1w-6+@Zi>tyvI!j+vrd|>hf3QaBhy!gpxZo3%nRdTV zKDr7Fgp=oC{LC>Ffy6>Z0Xa&_Fhmb#``MSK!OyD-A(XsALi- zJ4A>HehPG02btFA7i^}x!P@8hZ8`bbd#DMF2kC|($pC#Hky#}bxrMZd`M1!XQd+-W zSbmgY*$29qc&G<-Zw*H(SxtOHAh+?`u_4c~^FBBMLQF>PpEboMQ_9$QFGH|40< zQEl?v!N;l6EW^#2^;w_Hh}31q_#W3R#htA)wEZNzA>x2GNZF!tYr5B~^BPs82Zg&0 zKSr*fD$!`*?kxjt3=#>!*;&c-1pxtf+N5622$Sh8xKmUF43(Y8%(4tfcqOIJ#`IFO zN<~K-lT~ceUD+<2e1TBL^Nlo>C+A(y*>90aGT8i5Okcy*eNiTj5h#xlzff1sC{$SX zUFaR($G&85@Y`A)F_!#3RA`XMO;W;qK`k7iALgYOt1g?gewZsXVys`0VGzl1gJNkW z`-7x33v>1RORZF1tKD1OF0TTEUm-3*Z8cugl|KyJ@6GPQjkcxZ+Sezxmd3%+^yvii ztpX*O8W<$%n8V@06v0L?R+L8)5^Ub&7$b+Ueb&q{iGNV2pgj>0|kpin~ zAc>GCgJU;M2=PntBn5?s!P|!k_b?ORT$B#)oik^FO#GgCw(Um~gkXxOdoY1`7m4uB z9it<}>H5&ly2ZI+&@Ikr0LD_3PtDaQ=HBAmWxpJT4DsuDu*%<429MHK3u%vveeg|u zZ;<}By~;9Scd-RTB)n-2;N+nqDjK5(A$9VdNJ$=YSth)4Cm?T%o-M^bTv+9;1AYom z-CDK-+~ny`1!3W9ADMSjd>>24AuQQ1arplR_or&!3$Xe`$l@ln>&dE17vuCbu2$fm zpBI-cJ+sK^M>9du$nnzqOI|&6_-vnpC~9nDLXymDHACnV%+{@6MDDx@Rc~5VdKT=D z>t~lKZPKp|BEcasL1@Aq^>le(76$V4l^fXz^*oXzSh1;W`pI44rU+534OscQ|D;6R zMQjegNZrhMS<0&lTS}|S+)@U}NNAhe;=2g8U^Z^VwNEanid{HmIBEd_ugxn8rkgoougzWdL*D05C@L!{PuPn(;=|#OC154NG zvi5sTQbeX3WVFV<8JuvS%tQLC{03oCcl?NV&^J{>VIOF|6@xjdF-+yLf`4_!Lf@C! z+-EYj&NaM3{T7dvfD0{*w;fq4uQo}r3Sm+@;ytvvHXm>Wb~W`KqvHlcy?5~9AQoxK z*!Tc6-OfnCaNSl!y#g}3Koj_eX7NkC>wz{p(0 z=kc6gVD<}DgQ=T(RkIiGs19jNbtp7RD%5cyExA80m3pNlOIC?ocxNd*7T@UQ8l#Np z0!}d~iEesB2Pv)F?bkQR67|7eBB0fp#H>esNQFUDN^6Qo z@IO{#yB7eTyFHU<8p(3omSr*8afL^lIZ91%gvKf3B0vOtTUiJ$jpu2<=OfxaNsXB{ zG}%{KWzSyKE9&CdmL*O*h@eT7_-*2mLGsp(+AXhn3c^Wd_HsZzx`|J(ai4crXUW6c zz-F9}vWL}0r0kvqG$h?YA#tvG3eipatKG)hXO<(@Tr9ltpx9fqPNcU*0JFUN#uKLd zxufMWje>dNaW{RPSLNU;(?~u4>@5>HZLZ9|??4WcoXFsrR3`en0ilh-TMdu8t>}r@ zI*faF?{v$` ztLyMc67}Ca#%o{slai;K4^fE2=EFZCjz)dD(-3{sEhiEG*KmkZKCB}Aqw>+&=Iq!XF$ggXzfcV?Zft^bB2Gq%mH2dGpgO`m^NCq14{eQ z6LF6A=}Q=<+PO&ozlvGCI#JC ziNYKjE6>54wsWClvQZ|WV`rM<<}Q@{UruC)d%5xTse&%VJQl<@!Km^}U* zA6?i&>V)wBJk|fZ?&-BQx-PB43Eg8WZ/", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - status, req2, message = pipeline.decide(token, action, decided_by) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)") - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/db.py deleted file mode 100644 index b022965..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,176 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 33d3e6b..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Outbound email via Purelymail SMTP, and template rendering. - -The server is preconfigured for Purelymail (smtp.purelymail.com:465, SSL/TLS). -Only the account's email address and password need to be provided: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) -""" -import os -import smtplib -from email.message import EmailMessage - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def send_mail(to_addrs, subject, body): - """Send a plain-text email through Purelymail. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - return True, f"sent to {', '.join(to_addrs)}" - except Exception as e: - return False, f"SMTP error: {e}" diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index cf134a3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,153 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - v = _vars(wf, req) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(wf["approval_body"], **v)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper()) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by): - """Handle a decision at the request's current step. - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/static/style.css deleted file mode 100644 index f71bca8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied, .stamp.rejected { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 6055cf7..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
{{ stats.get('rejected', 0) }}Rejected
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 7fc20f3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 92cc510..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 9978c99..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 714a2c8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'pending' %} -
- - - Same effect as the current approver's email links. -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 869b6e5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v3.0/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow.zip deleted file mode 100644 index d0a46cd84f9a4fc5d940edc9b1338540265a4fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25121 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

W@Ds5NR=q>q9BgbdQ;eVY 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 ZL%5}m408ZnhYaGw*~9+cGPJI*{s%gMjt~F< diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/.env.example deleted file mode 100644 index 6e37c49..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/README.md deleted file mode 100644 index 79e7802..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/app.py deleted file mode 100644 index 9ec9b86..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,311 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash - -import db -import pipeline -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - if not subject or not body: - flash("Subject and message are both required.", "error") - else: - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - requester = user["email"] or user["username"] - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.source='web' AND (r.requester=? OR r.requester=?) ORDER BY r.id DESC LIMIT 15", - (session["username"], - (g.db.execute("SELECT email FROM users WHERE id=?", (session["user_id"],)).fetchone()["email"] or "-"), - )).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests) - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - status, req2, message = pipeline.decide(token, action, decided_by) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)") - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/db.py deleted file mode 100644 index 311a381..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,189 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 9a22444..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None): - """Send a plain-text email through Purelymail, keep a copy in the Sent - folder, and record the attempt in the mail log. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 0645181..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(wf["approval_body"], **v), - request_id=request_id) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper()) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v), - request_id=req["id"]) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by): - """Handle a decision at the request's current step. - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/static/style.css deleted file mode 100644 index f71bca8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied, .stamp.rejected { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 6055cf7..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
{{ stats.get('rejected', 0) }}Rejected
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index e1ceecc..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 92cc510..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 9978c99..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index a1f2bda..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — ApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 714a2c8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'pending' %} -
- - - Same effect as the current approver's email links. -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 869b6e5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v4.0 w/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow.zip deleted file mode 100644 index a9414d496ca49d00951e35735c81841eb5d31afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26299 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 diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/.env.example deleted file mode 100644 index 6e37c49..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/README.md deleted file mode 100644 index 492c09c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/app.py deleted file mode 100644 index 1c99b7f..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,322 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash - -import db -import pipeline -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/db.py deleted file mode 100644 index 8b7ea9d..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,204 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 9a22444..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None): - """Send a plain-text email through Purelymail, keep a copy in the Sent - folder, and record the attempt in the mail log. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 4264b1e..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,189 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(wf["approval_body"], **v), - request_id=request_id) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v), - request_id=req["id"]) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/static/style.css deleted file mode 100644 index f71bca8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied, .stamp.rejected { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 6055cf7..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
{{ stats.get('rejected', 0) }}Rejected
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index e1ceecc..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 9f5391a..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 35c4a26..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index a1f2bda..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — ApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index bf022c8..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 63776d5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v5.0 w/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow.zip deleted file mode 100644 index e31272463fab2258168934edd26f02e6916c93c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26994 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ℜjTfd2* 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 diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/.env.example deleted file mode 100644 index 6e37c49..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/README.md deleted file mode 100644 index 492c09c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/app.py deleted file mode 100644 index fb633a5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,377 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash - -import db -import pipeline -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/db.py deleted file mode 100644 index b182235..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,207 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 9a22444..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None): - """Send a plain-text email through Purelymail, keep a copy in the Sent - folder, and record the attempt in the mail log. Returns (ok, detail).""" - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index e63850d..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,196 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(body_t, **v), - request_id=request_id) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v), - request_id=req["id"]) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/static/style.css deleted file mode 100644 index ae26b67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,136 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 9163bca..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — ApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index e1ceecc..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -{% block title %}ApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- ApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
- - diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 9f5391a..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 35c4a26..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — ApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index f662b52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — ApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index a1f2bda..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — ApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 91d4afe..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — ApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 2df58dd..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — ApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 06b1a3c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v6.0 w/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — ApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow.zip deleted file mode 100644 index 4be3a953cda46cfda80cd0c89425b383391bb812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28521 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 diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/.env.example deleted file mode 100644 index 6e37c49..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/README.md deleted file mode 100644 index d7dd830..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one uploaded file (up to 15 MB). It is attached to **every approval mail** sent along the chain, and admins can download it from the request page. Files are stored next to the database in `data/attachments/`. -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/app.py deleted file mode 100644 index 223876f..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,411 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded file is too large — the limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(request.args.get("next") or url_for("index")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - upload = request.files.get("attachment") - file_data = upload.read() if upload and upload.filename else b"" - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif len(file_data) > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded file is too large — the limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if file_data: - stored = f"{rid}_{secure_filename(upload.filename) or 'attachment'}" - os.makedirs(db.ATTACH_DIR, exist_ok=True) - with open(db.attachment_path(stored), "wb") as fh: - fh.write(file_data) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", (stored, rid)) - db.log(g.db, rid, "attachment saved", - f"'{upload.filename}' ({len(file_data)} bytes) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -@app.route("/admin/request//attachment") -@admin_required -def request_attachment(rid): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None or not req["attachment"]: - abort(404) - path = db.attachment_path(req["attachment"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, - download_name=req["attachment"].split("_", 1)[-1]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/db.py deleted file mode 100644 index eb4f085..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,218 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '', -- stored filename of the uploaded file, if any - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 24033e3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - msg.set_content(body) - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index f516f33..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,216 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def load_attachment(req): - """Load the request's uploaded file (if any) as a send_mail attachment list.""" - if not req["attachment"]: - return None - path = db.attachment_path(req["attachment"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - return None - # the stored name is "_"; show the original name in the mail - original = req["attachment"].split("_", 1)[-1] - ctype = mimetypes.guess_type(original)[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - return [(original, data, maintype, subtype)] - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachment(req) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - render(body_t, **v), - request_id=request_id, - attachments=attachments) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - ok, detail = send_mail(participants, render(subj_t, **v), render(body_t, **v), - request_id=req["id"]) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 16fec52..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,143 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root { - --paper: #fafbfc; - --card: #ffffff; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --radius: 8px; - font-size: 16px; -} -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: #fff; -} -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: #f2f6f8; } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: #e4f3ee; border: 1px solid #bfe0d5; color: #0b5c4c; } -.flash.error { background: #f9e8e6; border: 1px solid #edc7c3; color: #872a24; } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: #f4f6f8; border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 98913ab..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index eb8b41a..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- {{ session['username'] }} - Sign out -
-
-{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz
- - diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 7cb6b61..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 1706e20..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index a6cb09d..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 1a8e5c2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.attachment %} -

Attachment: - {{ req.attachment.split('_', 1)[-1] }} - (included in every approval mail)

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 921350c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 4e12264..0000000 --- a/Approval Workflow/OLD_VERSIONS/v7.0 w/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,54 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow.zip deleted file mode 100644 index 0dedd1f6da8d14e3987eba62579726e63bc761b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34984 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 VM~97HF<}e<<`3NleZOD7{U5JEw?+T} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/.env.example deleted file mode 100644 index 6e37c49..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/README.md deleted file mode 100644 index 088672f..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one uploaded file (up to 15 MB). It is attached to **every approval mail** sent along the chain, and admins can download it from the request page. Files are stored next to the database in `data/attachments/`. -- **MFA.** Any user can enable two-factor authentication from their Account page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/app.py deleted file mode 100644 index b24ab4e..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,539 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded file is too large — the limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - upload = request.files.get("attachment") - file_data = upload.read() if upload and upload.filename else b"" - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif len(file_data) > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded file is too large — the limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if file_data: - stored = f"{rid}_{secure_filename(upload.filename) or 'attachment'}" - os.makedirs(db.ATTACH_DIR, exist_ok=True) - with open(db.attachment_path(stored), "wb") as fh: - fh.write(file_data) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", (stored, rid)) - db.log(g.db, rid, "attachment saved", - f"'{upload.filename}' ({len(file_data)} bytes) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -@app.route("/admin/request//attachment") -@admin_required -def request_attachment(rid): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None or not req["attachment"]: - abort(404) - path = db.attachment_path(req["attachment"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, - download_name=req["attachment"].split("_", 1)[-1]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/db.py deleted file mode 100644 index 7d5ca9e..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,227 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '', -- stored filename of the uploaded file, if any - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'
{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 732a911..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,236 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def load_attachment(req): - """Load the request's uploaded file (if any) as a send_mail attachment list.""" - if not req["attachment"]: - return None - path = db.attachment_path(req["attachment"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - return None - # the stored name is "_"; show the original name in the mail - original = req["attachment"].split("_", 1)[-1] - ctype = mimetypes.guess_type(original)[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - return [(original, data, maintype, subtype)] - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachment(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/account.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/account.html deleted file mode 100644 index aa1fbfe..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/account.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends "base.html" %} -{% block title %}Account — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Account

-

Signed in as {{ user.username }}{% if user.email %} · {{ user.email }}{% endif %}

- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 98913ab..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index ed990e5..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Account - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz
- - diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 7cb6b61..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 1706e20..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 1a8e5c2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.attachment %} -

Attachment: - {{ req.attachment.split('_', 1)[-1] }} - (included in every approval mail)

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 223e422..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,74 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users enable MFA themselves on their Account page; you can disable it here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 7678fc1..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,90 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/totp.py b/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/OLD_VERSIONS/v8.0 w/approvalflow/approvalflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow.zip deleted file mode 100644 index b69f098440a80d818177b50e670ee3fe32562610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36071 zcmafa1CVCjl5N>$mu=g&ZQHilRb94i+qSK*Y`eR<%-8>&dGF5q@126I=LCPE77pEt@shWB?j&Sp+-R?cR2X7;Ww^sb(+ z|8Q&fsbYQe$NuJ4W=e{7wzY{3z_LfJKsQ+{O(z%rb5Z6ubJFjqyDQrmxFB7izlQ#g z2qgXt{b$7gccJ}#Xct!_S1XhM2n77!kND3(4!o{)hjlx+aQ-;ACH^;o{HHe;S1(&L zdJ`9ye+2Rbq-MK`;F7y2W+Dbx6WRm6T{m#wJH2F^AUMGSJ;rV;> zQJI3AU++(az9I*j&|pDkzQQ^5+Pg|lDeWLFD#<&Ugvv}-{%hg9m4)IBbsw>iHej+H zaw}nRX~y|TP_Cg(-!cw%H;F)1by5<|g!*J{MUqCERvj@qsV9hHUOA75-gXK-Ee{K! z?Q4VvFJih{(D_8$EMq^JmA!qG`7%Pxu8C43njA zQAM6OUG*bxr1JH!Sv@oT7)fAd8Spsk@!gRW^?1tJ#}S}9iDlt(Cqt>`UhZo=^$C`k zb{_n;$H2*fdTXuU2qak{b+U`Kl&1$U(y$=-Rn{KWIv{~g3}vF)Bcrs|TD>w$7I1CV zlE=O=2qiAv!TW(y*im|#5&>c*t8?ZDgJ@2hf4?i&edoF*9p^G5^K3uz7M)AyqkO1S zpd1@n%2=?WsF!QCN=zJSo2ZIKxj%+o;U3>}ls}YfCXx~U;ZgvxD}d$DNLnMG3rF&T zAY#P9-?mMJj&be6a>TPWi^=U6hiB1_<2@}orZB!hZ`gxz)%yeWUX8P;S;LPZez;N? z2gsU#~w`Y`xzwndYaS>t_n;(Si z8&s8$70BD3u;_gl6ta0nATJv57qUIo1PP4VUN|B%UH{yH@)P0opkLphR{O0sWH9Vm zF(Gxxc$~1h?evBuVGsK7!BI*`9A>hSeu!T|toy~VrF0TqKHgv`n(?lZGfeJf!7PrE z!2M(j4*3TSwxvqiPKvjPV3jqY?hR_RxejzHGU3)3Hf3QKD4V6(QFN26u5P`z_c;rnPeOZN~TEq zI@h-@3jQoy*c3BlaqmVX8ChdQ;=)+uJS83h{dNJbMEn>nYgEv+|JzF=Ws^AJQX3M_ zKg>-5R(X%JI|8onC7gCm;56J=r{BiD5=o+D0jDhxYH6dL3;)CkL2S!~vS@&FkY^gy zU{vfktO32NlsVO}YGh5tP{`60TFx0N5LtS(M_?H`h>!{yf3CtIew0T`m z#NF~9$us^Xk81h`CU_GloetJ8jAzVJ?1G?YLSe(F1tZ;`UYKT=~3Su z3u6_rER9c$t?c@PFgYOiHraz!k>T~$UDWp7?LO-$_@k)5ypc3g z^5KVJ&VQF7qpQUsgfAunPd+`s^@Me2S923lZ7HLpjV52J;pc{H$s?-EA!Hc!hGBuEAFR*Tr#?oM6d^HuGiO6)8eGR4&e@tq`(iVdTYx7->yYWI_*yRHS+lybhw>5 z$7BdP^{wwjolTjQcIwyFe7w#ZtW=xB$hN4^(lRc{WDe!gP#-H{8REMs;b%I!gs`UA zHxcN0vmOs4#4q9(HavGAu?ChH`?u((genCf6K=Ah9u z(5jPGD{~S1i@>jmXzA_+Z6%Ita!ixP#xN>fauyLHc|j#6W}6`?8)Lmue%L;NwibK? zUVKQN36~XNnwP7c6H3BN-%^+0_wvg%^_lxBX&7#6rnC7l^R)=<{_}_G^ndQFI&tEf zQfAC0a0j@+x%IM&y_{p9tLb-Dlni_TIk4uPRI&Io;e|ynO4Rp7&P{rbfs}zi>PH|N z$UyJH^eLNE+G^8&$7>mAk{R1>;^D}$l$SY0hMRcFI=>(8Bh6&E=GWe;szXeD z?sRh3PhwEJC12FaI3*Fw+poegrhvNo(nV@FA+1uBhs2ZE*$&O7Y4mj^k9dgx1}?Qj zP4uio%*y+>xbD+hzIE%%hT#3SFh>>28ek^P^s!Y3iJ0is?2C z#bu(0kyu0mib>?mry^;6=iK!D+g&fpEOKS#fO$Ekv4|9Bb8QINxq4(JKVE9M4Xi5{ z?9)bMhb$A1CK|~MObVD|=0LItJmM_s+jN*_F z^jEXnoGTeMI? z5$OsDr!#ykehtv*;iRmHFKKI3*0WD;8ZPVatGBAM0oFH;LJBt8X+oY_Y}9Sc zTwB$zQw=)0^qC?NG+@Q0*c>!B${tHqQP<%x)lgG2qq*z9$Tw00{Rj@5qk%kgb zdMn@U;hc=EFo#;g3XUzh`PEP7OCF|S5{Hw->Fi=C&;jjt5yK7WV0+0O6f02Bjoqvq z`_KmH*t>2rENvAqsBm-yL!nfVC=7;K^lg!JKL?12@14pzwryqYf!mC6dNez~PqnS_ zr(+kK9vdSa1QLSf0B4)HFBeQyx79`yu2o{N92KRRvDSxT*Fq~IbM{8D8FJmv1}VZI zJ1oD{h3|cSQV2phe)A#wWe?6YDmG;TLRh#9Sql$VP&xY{)CKAozyoqEEJ{4=aU_*b z6<3N#^2zci*Amr^oWg1=Y{Iii`lKT_0=L!bajq&kQYbm$9WT5=v2tCr-HllSCsVZ+ zfToip^ z+}hGhBaQjlR=sV`AvvC(f>mW=Nkj%aPP~W8ty6r$efIrPm0wkw19dx#OKRk<%uZQl zHc`nh8auAt#kl2GvvLFUheV5B%|5$BXQ6p8yiKHb`Z^AO)nog~( z2Kew@(_sav6^*RA$}!e{Z+!Q3R6#0+5J{oG-hY8&6vAlRqf1=myqmotZvZxglMujo?qOr# z7%HedD~l!zi|HddM0|GE%?}!6DyE;W9lZiK3jUx9qf@+sk_RDqLoO8|Spo%k9~Y^3 zA?b$^Bv&#J8@@e;Zn%=#N}>BIKSs(HE!%~chR+AaM0WuaLqo6a1Mj+EEQMS94@vpR z{lq})$Ak4F#3qX*3yQJw{BCaYLz5%ove$gJvic}(P)7flP-R#VwX|FUrta~nP!tE| zSk?sbb(Sg38JHZVXz2v7?h=QWi$K9odNrXsZ7q)rjFda0xm(rBJuWl(fJ#OFWkfYi>eq#xhd2lDx{1(4)0x zRf{WRS(Pz~jAaDGn;kg_m;%5tPZ$Yd&+fUw_4D8=IFoX0lhE88Kn#tM@tBesk>nD` za>y59KIh{pfYz}U1zgw3*2tt5S-}%(lB$(WRP$wY5a0#&zalp_H|1?q7B{TIE~m_p`-{p3z`7F zM5+v#2<5EKhd$VAGw^>YNe>&8vtlU7!_Up>HUwrUwUDUDY>v|ws%WPs%TZ}rRU1rJ zNfbcR-bzolB26S+Sqnlsd=FR26y?@0i$0>xh^3gm71X`+smudv0rAJ#_eY+{AxTlJ zS%joAY=F!{_8U<|?)+s59y8}^R(=ljP=<*AgWbFvyXrpm(%<9v`z9n}ExWD0tR*?^;k}g|t%W3SORS=v|a9I*S^aJFh z)bX{YR;H8ssziyZ;}riopl(;2oFv%r721)m+$Pfq%J~>!kXmPeKog`t?t)#dgb9vg zKM6_}>WJh6%&oS9#p^LN;Y(4%k+^SK?%10ASpE-T;*J`^36lm8(L$iuC0G|-hhxn{Ah_XT_P_sjXwyQ{p;Hd#eaQd5O3 zSmj3@j^Eq0gS}lclpTytYi(2!v9WgGZ8v$NVR=*jw@iPGQmizIvT_7Otz!7464%aF z&Gsz&NC(Ji$yqdjjWukoRVomYrFGdlj-2hOI6i!HUo_KsI)D9vi zgF_jQGOnB17!38fevZgi!~OJ<4&U$i9hFru{@{R(-n3X+Z^KDR(9#}1;(DGcOn0kB zJN0j~i$@!@~f*d{O@;|D{@Jec@5TPcaO()U-CDPmIR-#PyX|Mp?Euo0!;7h z`T@@m2G;(c&hGgLar)V~cWjy%GL2p22@9*C|;mnF4d9@qF^1RF79hg}!fk%?7( zA1c>IXdOI1Z(~c@b8Fz-`*yj23O@De-(%I6)~{Bk1a4k0Yhe@TxNPeLl03)pq&;$3 z;$gg&@uA97pnU=0&$Sg9b?`!E-ABHK$O^09uUD$id12}*NQhE@_{HFM&WAM+Ww^1RP;T*>xS7haf{WP2zKem`)7E$!n)OcDW$mJ4_?m{C2wK zK>|L01mPLrASR;kw7e)(1EzVF$K~SCQqfVwbWbqp?I@7PSe73nwAyVgaTZ+*#naZ- z;eGvl_hpyxh+QUx`U&Jelr)+teXW94N5>=;(do!y*totBFi0iB6h}cGjjVv@;uG2W zyOm1Au{E?UjDPvKQ$|JFL3TeWNuImcPuLvk>zJCReWbtme1%W1Uqq2g+{72LaD&H+Ta5}5GIfG5nUU|>^7y1tpxE*8HCPPY=<0iNw+ zFVLur2qK=;;ELAXM>DUWW+i#qm6ng_25VvceglnlREZ!gsEPINT!Lk5=;q3y(dT~5 z0!>TU#|SBs`HfvvX=&bFc!;N`U(uWLD#0~_y8v$u=Dmb#!yJ{M^*fe@KE7SSQDn{? z!9Vf$mC?2CmIkXO8#EA54CcSV-*!e;wr0-sj$Z%3-&+7x>%Z)8oOO=or9Dmu`lo<` z5F;gPQmjSNw%mdmvB!2x2-^h?@wGj$1QI2@MCOBKIRX_|C1F0|0>xF*JrC}zTw_)- zjIqwqeuv+wxbv*Ts(B^AYx+pJ7;CdQc)JER!|vQ>9Lzmhx0cz6l*SZ)ig@NU;dC3_ zx%7@SCxp{Hf?9iQE#ULPq4dsnYFe0?DN88u+$y!gD^n+xrr@E7+L#<>!kNkh>xnOJ z-^I_}i|xhC^OsS*+9koSz8~nGCkwK4R(UT-VmejYxOU((`&~`@Kif7DPeUjp*9OK6 zY$%hPnpPsW)wqkH-yT1(WZ05A(#@F>cyEnKqUdy_YesYzQ&T&FxV~%8VcL4~b(-|* zXR0l$6@7i=?S$HLcE6gtvcXkX3}#iV02+~S+9%6F>);|>3YpteseYKHty*~G=FyKJ zKN0vp*Y4vtC`%bZ5t`)Gt~O!0n*US^7U8r@Q@KXg1>c$u1e&18MFkp!%b30w<~!-H zUZ&Fzjx<0`-hgTX;Qp8~J93)saqUq4ZUoyjoj(8gWLj}xopV3CX!W3We!<|ZVKY=L zb4~`X*ph&`(o5gQVEL<4*Cwe(F7rInk_!LGwBpq2O3n7L;uM)TDbFFCgx&BRI@wdo z$>S}E5(vwLfx6B6=;QS#D&fz>K|BcJ>!F>W2j;9^0X}a2zl`pd)@NRhU)Ilzp@j2L zXL(KE?@sF40^%wiF#IgaYBA}7D^7lhFr-FI@$^j&@e5K3Ki(aSqj4Kjl->6@paMO^ zi4m_OgtBzh3$;k7%C<p})n;R9YoaZu zU6UK@TPwd2f$m6%ljM;dV>fk_CNdA}iGI{YN3B89;GJ|SQuL}GP`}AF*j;(c&J;%e z{Bf}N2A%(OnGUUmhYL&wnZRClZbCANF$g*ojG#q?zb}}M4b7Kf9~0`s1E%QS0U}j0 z4RwBhZDwzp5Jd~2%ul8%D)64~!-~2gYpSFe_vkq-;X=B>x5HnuMLUwLb^y& zQ}8_ztF`^hiP8*T^Q^#25(7e_S}_t229(m{jl-X|2Av7IPR80nBXZ;Ec_AXThyUF3 z%UTxPdD07Mgffb$(8Vq>NkHYb!}A#U+?XyA%X>7aNWUIuWD?i;6C@N-@q43uzK&IBo#XDlw(_(9B~M^^tr^;gixZpyphq$+5hEeb+r z!3r{7sC^}JjieCWE0XxZNxxyAUFo^W?&VnIjJ23dY92+FajCw@E91f?Bwp})qb1*} zur=$*p0akd_tEg3@VN4V!@k&hq!}+;&!y>P4dMu*1pp?F!A>`>ftYd_QjQz0WBv3? zO-lnNTc)Le|CB;9OqbRu?iz)tVP?jitVZT6E}xbY&*crij57zTRR<=y&R976b=sqv z8shE8M{7J+RvAu4xPqE#`^D+P13GGkoghRg>o56LEAzEOVdLib`jB5aDZ364n*^A) zRW%RDK@+8pMBZKzW2&R9BfT(lbR9?UZV z$qn6>NeG6b5OS!@CRftma@vHTN|nC)y9Jc%dIA*=x^wXwZR8%qxdYF@caNku&Nw(v z?|fm-{18DaAQ;Zc&%$=1siqgd#$;ziTNO8co{USbgUZ2IR@*n=rAF97>nZ!Nk>-4} zHzd4*WY@f4bLIk;)ekt)yrlfFj;S=up6|ETYR_P+0JXFL_1LmrVXd%|Nf)$K`dh-OM>+P&1i1iYC$Zv5FlY!YT?#Bkk*!M&v~4 zFMbg=Rl;cunFtx)*~A4#^*y(3g?r83&CTB1$SamupLS)!aU4It{dxH5_I32&Iag5# z_k1(&G|b;`f7>+evti33MIONIC2P`j*606lf%x9MI)b3YX@y>AuMr;X)M*r}0`fxv zr9rmI&LB!RkMMozs74QPE@1ZckhN0Q1~xe%T>AU_d0*_#PZgV?&uxx9*Nsc=k(G5| zibM<;fOVzS4Yi=lxU?+`nXy27ct9)&vFIkIIBUrprEu)6HJ%gz`OKO1oJ(Cz1j}(M zXmuL$#zS&}$#QVyAt1Ttv+2c%WVgy8Ne=UJvf3;G&%X*wxu=5w^1}qlCR5}g&XfIB z;{bAnAZWFAMs*Kciear|%P=uc3F-<>#SQ6Vj5TxbalE<9rB;0zazSp&0;5x4ar;}% zw4OxPCJ<{IM`I&1c{#*W3{yGRMD7bu`KdyP-})7(E5jup>sNeFHt%6Ec|PR~f@t!< zz{Q|CbOa3%(dM}y8C4lj2&kRzOHMzrQJ0_Mhz3bB%lX3`gFjwVLNI0JV^6|G%oBl& z#(l$uG(W%{jpPmQYQ3m_+N#83(dXr4r8k9GLGDul?mKU476rA^5*6Jnl%h{i6Ly*h z;c%5Y7C7H3B2_IT6Yky~qPBOtIUhBkG1;6dJ%E(ZQ$F}<+9t$@J?bh6osWIFPKT%} zuR-`NJ8T@=_i2)!m(ZBwI={tiwAOFnFocA5%y#wpeC1f?rklgt>qr3XMuA(5{nA7V$CgyurN0R zK|ZImLEnxmt7L6>I@p(OKhmy5@qio_Z<&mh<5CYOh0)P9pr z9 z>S)xObAPQ(bfw)FggCmj@Z4Q?z0sC(KN?%qK`?YBbH@sCuQvN_YQxT=I=tWV*PWqV z@n(E@QAf&((N%rp+4jPHYu)<*%z|kQo6cDcabR~6fT(ySujf~~nFa^P?v8;7^i@)G z?+Q-EY}ah2fwCTTlZjU9%39#)wzcCZxarTPhEM7PN&) zwR9E#I&teQ0DAW@xA5bVet>L;Aut6l7c`G@*-E*e#ghaoX_i%d<+$crNwmJRN8}Wm z;YXqhHs?TG5<>FrMQ&4@!FmE>0V$hHTLKFVIml1o8P=GgK=x_>ylMY_DD%35!kadm z=H_u!?>f{^^!+ka&_QP4p1?GL;V0riv_1m^1ce{wt<;gk?+WOaYeRb`TC^8qAwT=( zTW3D4oNc0q($`yyDA)*$CCImW#Gans2XF z5a*I*b*mzoAzfeI%Y1gqJM~ANTshv@@&pHLgW)=&y!1(a`K0*k0zqt7+k$nz-+JSU z03G;tFJP9WD>)6W-|eTe;!c~C(B@O3lq4Q3FP!z`PXhj-?fIvyh!%N^ed$k0KmY~; z!u)$#5dBA4F#pq_{ZHkXRy$Ax5F)u&bP6!aL7Ca*BWs~- zMGv$YEa4>_Q@mIR^u1{(?|liM+PV*wt~PVL3hIk~sPY0B6Lyk1%3A|3-pZBmlHvJa z`+&bytit}>2x;|;9|bA_EQqt`6xN96KhL>(jX*FM*yfLGyy*2F-KzC^x92o7kEe&< zNMs@&%2#hE#dzwc;f|8+*QIDWrHH7<)B4{OT>mmhu4ZNV*^xeX z44mfYIfYcrX2wPr0Hq9P^$_3yKO95FgLPx#giOgXHfGQ_C4#8mn%&)(cpwnX z*|W~EY6_BwXhK`k67))y?(|K)Zk6e2DJ=%7S$_nRQVt|CXoj$sD84r5JtCO+!3a;u zM;0H=q)0OuJDfLBd8rFW&~w}|S4O)bXArIE*+`OGOA!ZJ`6B>oV7sHGl^Bx!&t)H8 z$0)sMswc-^-nXjY0rb{na~}tUh$PsU#3LYQXH$|A6D^cZ-X~@`VT&t^L5bBs_Ie8y zvC5<%a+9RRyHJ$HGWSf{GbR{zLeur)iideJYDKoyoR`y_rt!m+Ug7LjYRAb7j4fmZ zIk=nIOs){A7&aiuqg)_|2q~I-6Zf=~_>ZCPJBN{1bJ$+2>FaK`M+ySp+KDSEty~Bi zv*ql1n6R^a%P9k3N)j3+K#w8(oPX83MB`~g{^5Q2EY@{bNDIUOXRv~^iVOHge&8yz z9G#h4-T7#`A)+;!LCT}A73@_{1MFs=qA`O-;_|GLEn0R(>;t-L_sI4@h+mb$rs-M1 zTSo0-FO7mk0izCu)iBX4D)=8iFUF#jEhF`MNYa{(PNo5($w*qEoM70mA_@mMMfXf2 zl}+%U!CrQgIKkl=#Pcx+WJ^teI-%?h>M5qKm_%|d;Y3d@>t44T3;As&7;u_qC)IwGD(P@{nB3_uKI7MJGWCljB9A>z^fYVSaL4 zn$X);-|V2)*$LPkcQwP_MD3MsDV|1UASjfBpMq*!FhoVe}h%yE!EM!Wv%Ib4a zc8!MQ*}K)GhpYM$br!5*LWOnY?kvQw?y=#?8KxE}Lv@r;0zwsW--|0NwmSEL^CnSF zjkVgt6gS5ozpttzL+1aoNWU72NAxPFsnlvR7ezQcClX=BSl25F)J;@9 zuhx{t1s>s$K?DrB@zSm)c=+ljNBiEf^Pa`8uGy|EC(-APdUOg`#H)ru7P1)r6hSV$ z@}?C2xCcdmPv*7`m{)cWustcVbWys>--aS!w@2KF+bMO8uzt{cmhKw>c5S10$`nvu z7js`7q&V2fW)yWJ^d2uCL$ZUwqbid*Z9o1=m>^N&{5d?~FfHfWb_u?5jq!WZWw(3^ z?(OI3)-zwmjX;X4p7srW=1tJMq9r2A*DCG=8oIjK@GBLwgY*qsI!~Du@hB;paXfk1 zhb=*|d*V3-*pK8RbzGm6Wc5);vr4uKNE-5G{~zFZyUmnv0@cpdplLpM`RWc*vI-VO zKerV*Bd~GICT`J6uJoWdp``b+{cX*3;S6d8at9d<`0pOxe=UWpXsY{~WDlLT^_oQn z1s2rO)SUAl$l1wr5fbUSSnT#ucJh#Iy}-xbi>{Y)tI?-lXWoc$N{}zKjWkjBB5^d>9RZZ1RWgU>0VD@WBgu?$|l3#ARi*8{}bi z#zI_jl_IwsX%#f;_~UI=e9wQRBNs}+c1DSfHH_obUzyz3kPbFUqrq|E*8QHgC)K>7 zC~R|po;R>CO<5-lzvJVoudpXp{|qk6Ua++`AGF;SN4E!p5T3ZfwU$DByiG#0m!_{Z7gCwL2opx)xgk*&JzHFs=1V;LNLxPQL+FxMNW1klG zu~GMleHmU5ej*L?0GO@Meqoaw3-z$u2-Z>mjy#QOW9vQSuCSZ-=6)P-B(lbS1ZtNG z9xl_Vqe^CdiswTGzM^BJWvBk$8}-QeT7^B;D)zebY-`7;0p2>*v#s>|u|4`gnnC_B zYx0ZmgMQifG@}>qxToP`8x(mSU%WlW4z+$^*XI-TpB;v^;kB;slqmHj2oMl26c7;6 zfB#i8GPSd^|L4~XYFX9#FZ(;=t2Sf5%!t%`s}db79i>X9NJMW+rzYs2T8`_j%hj;d z?sjF!lcg?0h9CTg>1A~HXFqo@xKIAI_IqZRBWVWsr_LC96O!5TUAt>a^xmF-16QEz z#XCf{V`9;Xa#oh`1z^xddxc=&Cjorh?BGz{?#~o#3RS6ND?OZ^(mOZ+lJn7s!a228kAc> z^!+K_!NNEUf(w$+%|?SkEUM$2a@LKS#j@2B2C>{Y3E=%EcA|^Xw(Lmy!x~$7c!dPy z%Pad#-F~1?PgaQu%K+5`hi$RUP?b!=WfmeUN)n5%^skApyuMfwlZ3 zyO4Sk3RCs6Y-~Wv#Dc6dgV%cea>`M*IRW)s8pxnwvGy;{_ADQ4>24?@xaHiE*W3Hf;#n^qh=Zi87{G}8 z>c^aE4>sh9v*-=F#d!0zE89BT+;*>3*B%$9Q5r9s+vw8T6<#~nLj!Bqaeg(5^$LU8 zRqKF#R>S7=BEev~oX<|u`flrpHSTHOOisXN*S`7FLsU_d-p6AoCl2;jlNx-ETKOHA z8D|`gy90gwwix-%_@w&sjI#Hqtgojr`RFct?66D5F3aP>*E`}rvk1}nS{HxN)RO*B z7A5~V1Moj&k*$Npf6XGiRn>ndk&jW`jQ!K_`t8`P=Y$cfnsyB*12GCSQdo$*``(ja2A0aSe=R1LWtIdE}uP#>(l zeu9%PN_KW6{RmMUWFX)_=yRi#8C118>*X`E!eiF9EF`G1#3X0}&t%9=qwNJBb3l|V zyRM&E-O6Lx?x5uc?D*dKxYe9-q4f}64HcVpk={5yRzzGj3MQD{2)g}CPH=}}1$u=p zod{6<+TNlyhSQAiIUJNc5mwY}N*@obPqQE_;SklyjY|lz55EdxZy(uR3;3D3<(V(; zncC8rCJCVfoYRK=$i5>ahdWynwH5OSr51w0xz=hr3t=iK{G-z}VxkIOjrWfTt%(RT zE$)X~HXIv`K5R;8O1067#lBe^lmbYkFKv2Mi4(F=YXyemt>{F2uz7s-JP{k?wFx<+W8o-12a zP|sg{(hM6~T6oA(cf}DP3n&&GKKa8$vNqyP_^@Lg$5xIjIh1aq3(QdM8lgoU3R9tg z9^Z@a=4t~*KMQ%7R=r9Q(VjlhyZ5bzuIXs%PU;ugs~o+*rz#M!El$RDE>M)4s)NB< z5PxyZj#n!DPTfv3=1ncf{n_8#Vp3}NJ3GQ8V z#gpB=HozQn_~%0WtDL8a4*D?uAzM@+|Hp-BWp8Tc`M;L)?`ku#o1AdHr&Lf3!S+E` zTL|-6CWepmn`k4C^=DM^bmRc_R^5nP)^A{EBKOd5q%t2~*)QiOXi}sCcO)+_{_xK^ zj`0YQ;+$Kq%a+1v5VcJOuNpH^Z44lkkTQYLb3pBL6$C64FX$^@n80D6tQZ zE50Yt-FsoHlYC6=)qoRW5twBv`}E}0tZB67@|*UqWuo*5?WIE-acKWE-%6uw;+$yk z28lBx<~FN)_w&1;;)#Now%kgIW`-z7u@5in&tnjSV0Wwx&oSouD1Pw!gRaqi!R^*| z|F=gE$!?%Fr*Vb^Uri$=uzGS(R`Fbng-YfuKKSWFPZ83M+NZ7z9HdR^dvw{N-8_%m z{l~g_c(!Km#4YSxt|NHv86DW%`mgH|e$++{Y?of+SwaU{7UW;eVk#$98t-VNhsuGNqN#Y^u(>Z|W zxf?@w@9hcAJu@$U$chm7{r)?$YOpk7NB)zFjDL_7#ea{i{@O}6`0E6fo6G;2kTGg9 z_M41I+iz%~=wYaYEt_&0je$T?K_GINQc?8q(zsf-WJ<@1?(ignhzqEXq&W$uI*mDV z(r6Q2zfWeuH<|Vv;!4P&jKw%-d=nrU{c-KakWSfOpm&~ey-wvbaK~v3P~YEvW8NhH zE}d5O*HfFVRsCdYvuQQ12h<}bt|j((uERDxDIwBi|N5e=CY(TD;LYboDBMKvgf}Ew z^$p9fgz07}AJ8FubOg6KWMRw|G_lXTM5vhMD_0)k7GZbEUvp{+Y9S_Uv7Q0H6>2YL zUp*_`uZ|QSTrO7BW>8gWs>a*JXx*rGUsnD!4V=}&Y$hrvZD13@TaVx+Qmfq3!f0)_ zb^bX2eXu!n?Z=rk1O?|5owBP7tVJ0wNtYnV6*`H9VLO*L@ATs!n3m#D_z(uB>KBTv z6n+XsmT+{bZX|cEiSfol`3%I^NDv$`@;TKHaiFm-A+*s2_f699Qki>9RH1C$fi4+O zUpNb=Wl@ZXP(9q7HjN;*i=4vkN%kHLg~U!tE?`&TbGsx*u0z>w?0Sj#6220TrE|XF zOMXx@)MHngY7M8@#>AE=;XJWj7TO^!hNIJ}Z3cpiXGn7YuYkBd>*Ap=xj$PhAtE2G zJ}i&(?FY$a0HJ~Jz_Ybd%6&!iw5AnrZqQ;gDHuQCMpR$O?d$T|xAa`n(elIL@j|;q3`s`cConccAy|b5_RYde6k#rWOH>+>=>WTiUNc>k2WUuPnsb)8DyIqW1d9`xgf!w z%MxAjPW(I>ASUs0_PXMnkX=C^*tt=JJQd}PqG#E|eOFBQXcz3UxjC)86B91u?lt_( z&J1b2srLc>PP2Og!i>ldCUMj2Xdv@t`hGw1!|XSGKg6+};WLqQg_$|)n(zE<%>Zg+ z!2H*L>1C$=P=3)T!FS|1aF!_8UQV2TGqE`eFl841Q>-+@D-NM`A4@#dp0@XC<8p%mhHnml{^m!Rj6s6HfQ;5Me279jlA(B@XTC@EZ73p(x^9R(>#G&t-7M-g##d-_M{#- znQL9LV;w^te&2F^XeyiJVdsAW{!AD! zGL>bfqPraY_#!!q2}!XTG@C?Iy>io>600_kbk6MPl6S*?!S401>Nl)3fH4$xk7hdf z&_z4pYR*AT?XxtD9+eT5225`wt-*;Xts;ZIfpm`l++DSrzla|>3~;J;7e9dbN&#Z0 zE}|gVdLh4xIZJq#pk`@WN$a{*?Yt&quX> zA46mD_vHTJD9FQ{d+~1NhwJ=4&2KtrpZYDo{HemR8nvy%`6T@7JGtg}_Qk~M;pJE#LRL-G|BxBP02e@_Fz_$bY+@j4$!V%W_q56h?FcpyF{^Dpj?4_r z_H|vzseb8H@9VZ(Gq7AlmDYaxobhDgQZuFP3(mbQCF|wPi>imZipONEQwf^&0`*Ko zlhIYEjqjcF)Sl|XbdcZX;S1d?!(iNHQOk&d0;>8IidD4~XMWlX*>j@9X3d4<>DaeO z^U;)Zd8lT$K^6Ar(3}wVrS-gjO&U5 z<1%(J-`n;=&mn8#dM7^yiOF$a;`lkW0yOGyxrNwIrdGZ8k$1cMdd0r-%I)$3srtDb zJP-itOW&!Q&tD#dE}G1Fs*We!&h3=&RUSfa%Ou55+e|CQ{XsOR> z_vKfa#oW{4#|wVvTiGo6YL?fYw#-VoyGk#E>873Az3fsh)KwfFGW7AAwOc}w)Y^3z zX6<;>7;uthsp5Ber0AAO*&#-$krXU4-Bhd5h*FYlL!u614kC*NXaVcADjL*SiLs(X zZ!YTeZ+ch~&(g=~_k-u+|1n7yJQQJ@SZp+j#JMfP}%{`r60b zobNHVJs?*aw!(sg>uWy2{qe-{}uM+Xw29j zvLpTJLm;RdJMwl9bUy=OMcHSuc5)r;k zCsLQhT%2SP`W!wj-hC17CzO?N#-)wVx*O=`_TG=LUT~%9t03#Aog*m-&dOr3VGZ~M zLQ3;as>9MSpHJfi_9gxlWB7d!X{#5>XTCHY-?(~UV<-)&AYVYvapgEPYi4a4R^+H)uZaJwJtB5{Gn_!5lvB8+a~HG^MpFr02ydYsB4)N}wx=ujIa zW%nC=hZDHyha^J`Sxs=F9bx1_&~>zh0Ph6m4H+{-Jhp%;;$n){uc&228&{HwNAsN}pmk<0@9NQ~-@}4^k#uV-;~Hf_OpGFuB&Z*+dvhj(H)gjgYj)9WSa|AfRX(oi`j~x{6HpQFbcd z)jaRsaxg3^{sfSPuoZmQM>b1!1`%3@@P+lM>6n9Q{b_YdU%!{jl?MlXwM0t^`pfxC zEvEs|kuL1R0kC^qpQuvP>s|c`=c2F{jPIh#@s?f z#X!ltc!R*Y1S0)#T%TFwN_R6qnAM%#b}Y(tKV%9a~gNw}3-lTdmsm+at4ef+9OPxl6M^;Xe6( z^NKUyGR8&PX&)xWN;ZIIdu8^xt8W4mpEFT28wE@RRx>!4oRbBNCj_6Yfy7N@y|kfi zw^vO8tB@=d$`hAv?9;kDyT6#D_t(zzPESBc&pY3wB>3i9Ot{k)k9T@96M}`8i%Kyv zgqlcte~^<(_SqPof<-m}r_zKMX{{rp-T#2;b@9NKIfXWK(Sz&skHoCvM0WXpVrKO_ z4-98skV-?tj3I(tztR~GbVjPIL2tgym7CY)&3iY@OV8a!Zl7%QB2YZ~J}P$Qxn|U! zU+l8T`};Ti56^tv>Pl~Rxt!W2;*Te?X_eFxe6HApMw0+! zd*Xf6Y=<+cHk*>_N3L4=HH$MUUMnLBJK^ZKF?ep*Qlm8K2%IBb_i*-}GfyV!+`J0a zb{ghilpQ)w(V=V$b!bYo7{`%f9dwPx<2Ew|uWCcd3RZ0C;dNQBNodP-I?9K|*>SWn z7;tQTw~hlx&cDB4b9r!(2H-CJbkBA`_~TS~s?m!UV?e&SI#Ht9TU&2at{e2=XPtYY zY+QKmGCzB!q|!GZcy4lMccI2Sdo!k_E9QWAsZbuA8dzWaiaIDRj5%T(={UCUEmF`F z&z_}Omxn|9KaIU(bYCyi4N^^v?_8!G5uZ)W?Dt^HIr2^3MyRk+Gqj|jWUS~Ru@g7=gvN}!4? zh~*IccF(dXwMbm-7HBL&_;i_R>#2DoeZo23MKoLTBg7l&#|D3A&~a9l{ZB9?`jzG) zx`X-3lP9ptk^FtQ@OaLQMV%2Kn|t~!+nmHA4*>dh;rR9eNe+FMm)8T`OX516!?cmM zq8gK-J#KTnkszKsm6niEGpOxAtC0aXs*wy$)LE-9owO6kpU1C(GA>BIK@DWt;DbKg z?M$#&r579E;)KC^n`j0tK#{FJMwzo_gTw%gd33%B9D);YBB1nqWk&i!KY=jTU|jQ7 zhz9q_F9e2cGkp{WKH#McJcq0HGM#s$^!Q1fyJQ6}S9m@LgwQHBu%@7J9PY`9({hm> zh(A#bA?#XIEeYWsWcVhL#p`4XTG5B!ifHRtBGUa7HFo-@oJ72R$ zzbiy+-|r4D4>7eR_-JO9d4a!Hod5o(fj5=sR?~n7 z$E15spooV5!20Bi)t<3;byM7rt9EQtM#Gj`T-K1x_53NkE5N;)DLpo}%tWwHEViVn zQ#MzT2xyR%)7>;mLl|O2JHVgq@GINl%X+e}-jA4hE&2#q@Q@WAR(uFxS>*|N->>^3(=$jdw9zH35>lhvtumEm$8x8J_chjM10*{!lsgx*ts}Gm1Dg1K{Ze)Z)=V?mPz!XjQ9EvrMh@4jJno|%M% z#e@{0Mx>HC^5p@K?G|{rM9P zXdQ57Uj^AK!Fz-tAj*xD`!PU+8cB{g#6^}3X~Q5quwb!G??TYH>Q8*Cm7`*_6 z7;3Rum_>_8DK#%3ow6y8y-B?o=bLW1qzCkEwbaS&zZ9GrJ+;O5+`zI}h3v{CO349C zdGwnzndaKwthC{rT1{k~CI2{5#EhbovALDLki_8hSP;Stp%v4{Dwiz9Z#!P~8j8K3 z-yRYD$xv^q`9{QnMV*uPaMQOAD02FVO|UA`g2dx=n-4CXCsGrKSwMHN2*ty6?-5P+ zyolM(bXw5daIxK7wil`}7J6U7Wf=9a6IFqiB zL8!^;!s;$B4=VRng;9!q!Qhj(5I9sj-6a0i_`wmN!w)@*0hbcwACxXVmp7-194CHb z=Wj!>4lg8;Q@XreX_3^bvkigUx-YRUf(L?`gT)WC3XTVEjs# zNnFxPWd2yF06sEk2>yAYGSL6XH2il`%dfnd|M1{EprZZje$8i!vIwZwp}Hms?5r`A zw2;rtpJq|Szu-(r0i&KJK2*LyQqg6$;$pffD|hKo!6P0{V#K-i%4G9dZ@A#oq!;t% zxcre=A=RmO$n>(xo>-};pI+@GQDWR0zshXB$XJe93Y%G7Nz=mZjoEr~#Q=?l|;n|XRgKP$c6F?w+~X;Vg6DP>CcsiA4V12uy$M{tt-0PQ0wjxD;hCLK0e z=P6g^qO=$Fe6T#l7y!>kkpzclA{3piK>l!^EHPrN8bX4oVUkExLuQM3e7IYxdgW)@ zSm*U|s0Gp8m4jRf{qZN`0S&tIy7DSC`Yv?02Z!8(*5&!A*PVpAx~Jk>PiL3=ovso~ zvI*{zC(|IBmLrh1sqtWEh0yM0PyZr;`kDOU`+M+Kc=&0{nu^4%{z0a(h({DEx@jq- zpTNv{xY^waH9w;D5PoaaGA}3)1H&uN^{Gsbh4Z>(pSsq9ZkjV z?<`v|?RwVi_#G+Q2;h$mkr9QKCmTFpTf7ei@SuSN0C*2pQRnJpfe&-q@Yhega|hYK zX~gGh&Bj*^1+24BVM&@TXi8c0Bv+k8njaoPtUHS=oFF1ns6*(iw_z;(YKR!$fFd*HpDu zW1>h}kI4?eSb%y((!Lo}x#xNmJQM#2u!lEPB{t*+lDGHi!nY=fL<_;Ez1hu0>YaEj zaW3KwBQ+1jT`sQ~7+u-=pO4%j!uGjw97&4zn=N=M3U5o(iX zUHi2fc|WL1gM!rf3vbA*ef_M0Xw_!hM&TiVA5N4r5GN8uq#Pe^4FdLz_}c3u5rSeo z7Oe;_GEE-wmD7=%S%^;?zy^oPhESa;!u*FtYWIN6wG*IJX#}`kuS7wnE)5p6@B0(F zm%$*UGNbzvizpw{lfp6Uck&cjBMKcek;lmkRa!cwPAxGw#UhgXGi0};mjqYr#G3%{ zXRID}D4ntr1tk%nw7&HE=}>PSro^HZg)g{)RwA84UA7iYP(R*Y*?_fny$O^nR%itB zBNC828&ki4HMYW9v{YM3w2^?K&ax^5EU;R9As8XWw&(a14m4-Av6mn*IADk$AAp&) zhwN9;3V70pgf1~LE?Ht(oWABN;WNZpjQ|RDAk(a2p(GUbZPqJ}Wwq6hA6$^N61d44 zq7W$~U$UFKMO!J8wqy!}tyN z2zM6r35??^j(Q@k<^hi;Fvx-`?RsZF*Q66WknMifN2EMcz0;-Rq_QfSZ9bfSL%{)# zElNi!_kLY{Uruhi$a_}5i8$#y=C%@Ny*Xv1^TYOhxfCQh9lcAcbx90uW~paajHIPNTlow)10ajiG=Z}s88jdV?YS_Rqf zd~|x8*oc*YKV1uyIY8LO1$R)B+vL}C*f|*`doA`o>;(r?Sj`lYdq*ceL*Ol}F~pOj zoQAqGIr$pIG*8Ly?NHu%D8fDTxt-}0Fzz;1Qqr%zh}F+KroSSWZt|&~z6Rk*T`%>K zbY)HcEMCG+x;@Eqk1_&P(Qsgi*kk^-{RDlvwY%>@+gxsA+v%}nrDK7&o5~%2?S`G( zICDVZ5=*?A@k0Il8>VK)>rBfU{$1r)=7-J4P9Nr9@0;k1ZCvP#-Sj__jsHl-{za+z z52PAnMQh8CeZ9AHU3(V)0t9YjCqrnXaZ4TunRFUi%AY7GKaWF)xrj3}e{5dN7hxI# z1zKm~@!ImbY1!05j+b!c1ag;QUqhVA*Mtc80;~dEG=!jABP52%a#p%rpRZ+_PS9G` zO3Vj7K~s3fd(RQUFqR_8Pg7jP?2TGd4A;&sj>+X?W- zxS>GWeV(+?gp2}~)gu;Hm5A4RRVK5bt&w&_f|SM?x{TzOmqFgh=V{Y4O+WL#x70XI zs$}@aXcDe$HLOyj)L6iEf4Ucc=$U4^R(xmBYHCBaTazo8%Ilux)!EYGe{(D_cOFT{ zPnLV92DbL&lNfHa6pCh4BRGC#^2r1XPUP%L-;4dvMAMU@Tf+3R+GOPSN<0)oi5_BV zNUo_Z4Ql*-C(&lN7qY@Z*MaiIT+RhaYmqMu0 zaI-1~4HeL+Y3RLz*an^p7#{XT+)$!Wa^j>-3#k@eQ1X3hBI!AU%Tq%v@kzO_RV&Z|tey;`S{kU=G39@)C zMFRl9(E|WL{_6?&fi3;N)iq-u-;BTBf7#^v!DH#TCK|taN4+20O1i~g|AR!;wTvLl zU@n@iaWCO;ti_27MI44in4lY!e@3IS?3(y~_dI)yzU4d%986BJHomPgznlgsMXal> zxY(3tj7yE~=9EiZhjb}EJiHHG?Pu?)+qsPLkKOfyb{ZF#JRZ$z3dnG3GToJ`%dcYrm@f`T-wVg+ zv<`6xIkUe$(!#o*fAy-74v25#u6P}J%2sLj8w6#!&*#{FY@pboabBU4d!ZP^WqeIL zQ1#s}k6`3)7~Q@8V6b%U-B9~tqJZk*K7R#5%DToespPYbtf$&7&_k^)&p?JTuioMg zhuD_()*O_|>MtdeOHGnuBtptQSP=Jv{)9x|m+EolaDBY>nqJD6+3x+YugAsteFZR@ zF$R&*dUGhud$Xt5P{8Xwe3L)00^{bEYqHMCt4C^$E3=&=Rr(d59G@n{xMgR)dHkE( zvF>%uJ^EB;=G5|r>gm}74aJzAPs^71NW2>&@WUt50U~jJJtTy9f=oxSAd?@Y;L#`q zFo@nErqF=nJW~0OJL4Xnm)UO-yZJ|ZX2)HrI2~DUdYQm(+g6dba7A;0=zQ%1UpIXL zZkG>E%R3HEA=facg7Pvk~kVP6Mo-Inb3Z+?#_-`2S8oz;7iG^ zW?eB+(Bl?Mum+U@^$M#AQXsR(s>CEI~*g&r8aeW-46sF3a>Kk z0$@InG6=U>K@L)7tT@z0Fs4W{kpV#SZqB5k?CCekT6P>rsMuM7VG)Qy}7N=g0!O`YP?TvEa<>NX|*Yc6UJo3xQW@4kc<|6p4b~e8Q&~V z*lkLZGU0n=;7qO7(-~Y^Uo#vcrza;r{Rv-Soy;8V#@PkZXSGzKj;%3OzONReSy!=w z9|IqQRZ_E%hTGS7r^XA!({aZEm#Pd)1rQ_}kFe2nx^+k@Jsa%KOID&?6uQsF3WGOL z0akvk$S_JjNxVHK+D7V~2a^c*>-nQoII~%~ zrK&?Yi>{MF7J0gAKtyc(>@74Mn}T4u_?EY&^PuCiVR0-;+YF!zb!D6s_LS2S>1jVHYjB(~g6T%5nQS^fWMzy(qhK>`Y zsx5vZ$Z^hA$Z`?Fadh9>JjMG#7r)AYSD$#u@BQFGNd3`8Fix^_h%}#XSbD#lm*n&Mft~rk zS}t3$g5{oIecCh^gA%@WZ&d3y7Q-P-eU%NxqYkj7b4$}!&$MZ`7Ekox{w`P?t)1wKZN6aVEwN|EOc+6%|#^>Vd(oi&L>O7jk z9g~NdX8KjY<7#-6arZFr#Hd2#sP{@QMV1h0hrB)UmEvZK5kB1sn7{!G6~TsB^f}S| zi=D<^tn}tuEux8@8C$!mc!~RW`V{46cfQh!zFWvy7x=tgvC?y{wJ5(bgl>agpwqN) zrJl0Fm9#6C6jC0e%RR8l>^-R_1lRI_%cmpMf{!pf!cON1R0?nVhhIj5c zmqGUa9FW^9^@%>~4PQ)lRRUPBSka9&c-BKS@_mA(YHyc|1s21NqjgsJL8cZ31n8>R zj)hXias8knYHE$Hi@Qb*+gkSQE!lbySLBKL#f&~%}^8H*a5YzNI7r&oClMoL7|+gT9s;SLmy1y>Qg?ja1UMNyr)D~SQ#z4 zim^{)o4g(|H_PZD$gVZAcAs{SveevMS^_Xv^<{Otoh4?jzI>TX(LJuy8)EPiabXUw zG((wjurT0Q2w_3Sqp70`@>~&bz1kyLP37>u5F^Q*dp90P~$9mHzZ65QAW0oIT zJbPOC_xH81jyS_38uFYE&K{ zINyt7yAW+eLp2zIW>KK#9-)^95S{Z^XfDJz&Q%|U>c;7ijmBDK)@6^nupmZ4VNC?! zOpkT%P%=Ch1BEZAMZ*0ovUO~8JRe%AM5|`W6vhjoyBPq(To!=oBE`01L8YUJaxxqL z2u{AuYB``@X%T6Dx9qml8`#5O2@}}{5rd71%>b~X+(84u8!Q?HU~AKF8a<5sfNW=O zvbG~lf1ax&Zh|{c$PX1;q?PtL*kprZJPoc;47U3$@qYL%6MZWDil|wTU2WMfOE2^N z`m*2n#So?}OIx9=>TGq15d!jD%Am^v3I9RX8n8U@HnT?qe%--oWiYgV+o65ZuzD?t z#2UR_JUQ&KFs%y_f*BI(s+`#CNUu}@SkV2;n;BQFXcKJOW>ku|rfMX&p6>{Bh!L0U z!3dNH90NsWxXcSq%0ONwELk}A&VlTTh&wILDc}@<&NSS0|aK> zL;!cTO*tgQl*L_d*AJd_1mzQ)R*lV9tZnVE*!543VbttWGbb~;*Lxm8TBl2C*v&(i zjxab=6W>?wMXf(AhQm2Hc+GkcJXkoc?|XA{diQMLbn<2dTrmc9pD#bn>(^dJ9_)d* z(4L`Yc1|3tfQSbvU1f{T%x!8Vq-0%rGYA)aoYk0Xb{a7#Xu)21#QNQ4#j2onr9}~B z7DbE7W5v2kn2YRkU1*T|wrppHrO|A6j;V(#*1O@GqYnWm=uA<4K|CFda}rei&x%*O za^7)9A;LShh4dm)JZmN@VcW?8n)tYIUkVOPfv;{pNYs^9BFdYK&WG; zfzn}F5G|mup+4VI8RpC1AHkZ`fFP_ox#dl*2)6UijmS<{la@iIiCXMbYd0Qb5Wg5; zIl9*?A4aA4k=~hp?=iS*#be4Frgnq102N8T?{9xBBR{PWj$VAEFhG$B3q|0*Pb9P+ zLQS&I0{|^gNbL9AnF{8KL2(MJDDG?y*ui`4T0lT?a9{M#L#9&&Sm7uEtuQ3ynJOdY z$4o2_@bf)ChM0>b@5ygvY6COW=FBC3b2{C%5gS7I{DD&gjUa!wArZ_xMq-qE!E8L} z0yPccd{)!USBtHi5)8#QQI8Edg00Bal=lq`!@Jg6x&9xnaX*K?daF6v zGI>y~K*%iQTthCbSV)OKEv&L6@oIs&V@~ZF$Hw!rPl6$!Pb`()JDub-O)XMU2fkvgoZu{gWI^jN_JRZlrs3Il`_q`!8WoF@aE>Z( zjIPN7%&KEphFAXTxb$`(gSb=N=wxezGoIdyuN-n~18;kAB`Qa^-|}NcUge!d5=kh| zKH&|OHl$(X4uUq-zQTZQYWa|~N1=DJDd5}t^*HO`i-hD-rw7Til>N7dB?-l>izSVd z&-!(*(5r?JcU!d`%N`ItvMk&giuEcDs)y6NGf!>}S_X^q&Rpz!ujA5I7)5auVeNqS zb^f9DQ1*!$UcJ)IpaKb>zsDsDthmwmIb$&wrI;2hSNV>9C2~o~%@Q3w)QX~cd~?sd zI$r*Uz=^T#((lrxpMN!_UQsLR%+TXa#fDTECKpTcyi(&mNh3gdUKN#FOaHnMZJ>bGYAJqZo-+76$aQH$L7mH~7-?imS1fNr^1*-*r3ZuITXPg7G3IfL)u9F7>$w z`*)()R^rE&P9wrzmelKm+|1)D`>r1#6oh|SoKOo5=VyQt!0f?HJQ@sXemgHiU^FN= zLq1m^j-92aV7XNzIq}jg+*_#UG65OGKaAu_8v&Roz!6|q>eCCA4wlR*_smM)M_iE1 ztj+U4XO)y&^`%TssFS@a9tI9uoxJ}7H=oo@ZUbt<_x z^(_`cBlr9`@PPdc_tqbX;BLjs#sBm9<)M=UlW~aHoT1RY72?^hyPFg20FE8P6P%2; zYSxtV&pL24%QVoh3y}eMbXIJ!RG&E9zH>B>Gr(4BEDEGBvkdy;w7c_h8s9hB9PpWT z+helKx`H)JCc>t%MvI05aB9&ef2j;xaWw$q^ZbmjNP70IbizJq38dLU>d*S7m2l8-Ud>bK0VQ+20pFnufRI?T}0%YAFd(I^EWhtd`ZYQ9mD2>x{NQBX^ZX?X4w&8Y1%rZJ3+oIGj+pT7i+1@ENDm`@1GfDbg^4y`x%I0*C$? zcXT4ZB}OT${MUuP!W?NWCH~05-8jca*KgtDcG8A9flJ7~&)eVk>P_8+htHt)vcj1L zE15^Y^u1=3a^Uug z1@94UbKmP`Yt2$GZu4G}od{si{3B zTyXy3{*Exl5p(3(Ee*fhFbd4T2Z3cIEnoV|R%7Jc2;Op(XFh6gBi| z8{cPqMo7P+p&Bfvpx@b5AXiSPNFrPbs7N}!3R5rSzu@j3;)q)pJ7BArGZ)Vymnmr- zo{0(JY+FyFBNRlS(=wiIJ%;s4M6=2k%vAl;uWv;Jiq*8 zV?`*N`w9qOd!5IPP(=1H!Khg5scpEB-jA&6E6n>5a6L_Mr%Pi3P%(9ZdO~8gX>dr~ zjK)HjbI#DL6khSDvQZF(JK=_8D>|A#NVtJE36{Q`Q=w?7urDoZ-xmCCsUjuR;3yNg zQaH?G`oY=tq(ciWqo%kd^M4cPKK>5oYDxWk49C|{w8^F&^g`5!ywIo|nW3Dja>I+zn*YSH{m?U_70^A1VHb#A1n zyoT*atjYSKfClerGOr}C9{v;cr}}R~66eM$=q5BGE$2}g&1c#f6BoTp1>_E#b?=y7D zjw>Vf*y>==2VpUL5p4%MB$_(y`5BM%q4LVE#z=l*K%zZKm6ih2iieA?^!NL6Vj0RTYyYt-Aw;C}?Y7c?{- z(}$6Kma0+=#*D@F2PU(;uPBou#5rd0B<>~65)yawsxd~EA=JQ5DX3l_=6L(;kmIdX zbr#`k{IkxFY@a_Vpcr2-bxTp$XZ90z*5xs#hA=YbQNU&6ywAdCuZ8E;w;Q7jLb~he z6THKvevsbPr4x3p@bT5&HqwT+kuc}_H5KE%6Q{U(e0_rfts#3&vH0E!j`CpFXP2c^ z90mfwSb~*Z_89JQK6qmn)jw6rA7(n)Dy9m6xy|RcMk4xhI wZehkA&7`H@v}dk7 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 Q@$tj_(a1F`@Yi4eAFQCh+5i9m diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/.env.example deleted file mode 100644 index 51b61a3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,18 +0,0 @@ -# NOTE: Docker Compose treats '$' in this file as variable substitution. -# If any value (e.g. a password) contains a literal '$', write it as '$$': -# MAIL_PASSWORD=xK9$$vh4pQ2 -> the container receives xK9$vh4pQ2 -# Otherwise you'll see a warning like: The "..." variable is not set. - -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/README.md deleted file mode 100644 index 08601c1..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one uploaded file (up to 15 MB). It is attached to **every approval mail** sent along the chain, and admins can download it from the request page. Files are stored next to the database in `data/attachments/`. -- **Configure profile.** Every user has a profile page (top-right corner): first name, last name, unit location, e-mail, change password, and MFA. The profile e-mail pre-fills the mandatory "Request's e-mail" field when submitting a request. -- **MFA.** Any user can enable two-factor authentication from their Configure profile page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -> **If a value in `.env` contains a `$`** (common in passwords), escape it as `$$` — e.g. `MAIL_PASSWORD=xK9$$vh4pQ2`. Docker Compose otherwise treats `$word` as a variable and silently replaces it with a blank string, printing a warning like `The "word" variable is not set`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/app.py deleted file mode 100644 index 3021fe4..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,566 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded file is too large — the limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "profile": - email = request.form.get("email", "").strip().lower() - if email and "@" not in email: - flash("That e-mail address doesn't look valid.", "error") - else: - g.db.execute( - "UPDATE users SET first_name=?, last_name=?, unit_location=?, email=? WHERE id=?", - (request.form.get("first_name", "").strip(), - request.form.get("last_name", "").strip(), - request.form.get("unit_location", "").strip(), - email, user["id"])) - g.db.commit() - flash("Profile saved.", "ok") - return redirect(url_for("account")) - if act == "password": - if not check_password_hash(user["password_hash"], request.form.get("current_password", "")): - flash("Your current password is wrong.", "error") - elif not request.form.get("new_password"): - flash("The new password can't be empty.", "error") - elif request.form.get("new_password") != request.form.get("confirm_password"): - flash("The new passwords don't match.", "error") - else: - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(request.form["new_password"]), user["id"])) - g.db.commit() - flash("Password changed.", "ok") - return redirect(url_for("account")) - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - upload = request.files.get("attachment") - file_data = upload.read() if upload and upload.filename else b"" - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif len(file_data) > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded file is too large — the limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if file_data: - stored = f"{rid}_{secure_filename(upload.filename) or 'attachment'}" - os.makedirs(db.ATTACH_DIR, exist_ok=True) - with open(db.attachment_path(stored), "wb") as fh: - fh.write(file_data) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", (stored, rid)) - db.log(g.db, rid, "attachment saved", - f"'{upload.filename}' ({len(file_data)} bytes) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain) - - -@app.route("/admin/request//attachment") -@admin_required -def request_attachment(rid): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None or not req["attachment"]: - abort(404) - path = db.attachment_path(req["attachment"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, - download_name=req["attachment"].split("_", 1)[-1]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/db.py deleted file mode 100644 index f2dd27c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,234 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - first_name TEXT NOT NULL DEFAULT '', - last_name TEXT NOT NULL DEFAULT '', - unit_location TEXT NOT NULL DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '', -- stored filename of the uploaded file, if any - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - for col in ("first_name", "last_name", "unit_location"): - if ucols and col not in ucols: - con.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT NOT NULL DEFAULT ''") - print(f"[migrate] Added {col} to users.") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'
{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 732a911..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,236 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def load_attachment(req): - """Load the request's uploaded file (if any) as a send_mail attachment list.""" - if not req["attachment"]: - return None - path = db.attachment_path(req["attachment"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - return None - # the stored name is "_"; show the original name in the mail - original = req["attachment"].split("_", 1)[-1] - ctype = mimetypes.guess_type(original)[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - return [(original, data, maintype, subtype)] - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachment(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/account.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/account.html deleted file mode 100644 index 90eb590..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/account.html +++ /dev/null @@ -1,96 +0,0 @@ -{% extends "base.html" %} -{% block title %}Configure profile — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Configure profile

-

Signed in as {{ user.username }}

- -
-

Profile

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-

Change password

-
- -
-
- - -
-
-
- - -
-
- - -
-
- -
-
- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index 98913ab..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 5491762..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Configure profile - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz
- - diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 7cb6b61..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 1706e20..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index 1a8e5c2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if req.attachment %} -

Attachment: - {{ req.attachment.split('_', 1)[-1] }} - (included in every approval mail)

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 3f658f9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users fill in their own details (name, unit, e-mail, MFA) on their Configure profile page; you can disable MFA here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.first_name or u.last_name %}{{ u.first_name }} {{ u.last_name }}{% endif %} - {% if u.unit_location %}{{ u.unit_location }}{% endif %} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 7678fc1..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,90 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
- - - -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/totp.py b/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.0 final/approvalflow/approvalflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow.zip deleted file mode 100644 index 8cb7e2e3750dbe318816a29b7b55c3ac2b8aaaad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37734 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 JE!zd+0RTgF9Z3KH diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/.env.example deleted file mode 100644 index 51b61a3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,18 +0,0 @@ -# NOTE: Docker Compose treats '$' in this file as variable substitution. -# If any value (e.g. a password) contains a literal '$', write it as '$$': -# MAIL_PASSWORD=xK9$$vh4pQ2 -> the container receives xK9$vh4pQ2 -# Otherwise you'll see a warning like: The "..." variable is not set. - -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/README.md deleted file mode 100644 index d908d5c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one or more uploaded files (15 MB combined). They are attached to **every approval mail** sent along the chain, and admins can download each from the request page. Files are stored next to the database in `data/attachments/`. -- **Knowledge chain.** Next to each workflow's approval chain there is a knowledge chain: addresses that never approve anything but are informed by e-mail when a request is created and on every step approval, denial, or final approval. They are not counted as "involved" and don't receive the participant outcome notice — only their own FYI messages. -- **Configure profile.** Every user has a profile page (top-right corner): first name, last name, unit location, e-mail, change password, and MFA. The profile e-mail pre-fills the mandatory "Request's e-mail" field when submitting a request. -- **MFA.** Any user can enable two-factor authentication from their Configure profile page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -> **If a value in `.env` contains a `$`** (common in passwords), escape it as `$$` — e.g. `MAIL_PASSWORD=xK9$$vh4pQ2`. Docker Compose otherwise treats `$word` as a variable and silently replaces it with a blank string, printing a warning like `The "word" variable is not set`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Upgrading an existing instance (no data loss) - -All schema changes are applied automatically at boot by the built-in migrations — -the SQLite database and uploaded files live in `./data/`, which is a volume and is -never touched by rebuilding the image. - -```bash -cd /path/to/approvalflow -docker compose down # stop the app (data stays in ./data) -cp -r data data.backup-$(date +%F) # safety backup of DB + attachments -# replace the code with the new version, KEEPING .env and data/: -# unzip -o approvalflow.zip -d .. (or copy the new files over the old ones) -docker compose up -d --build # rebuild image, start; migrations run at boot -docker compose logs | grep migrate # optional: see what was migrated -``` - -Roll back = stop, restore `data.backup-…` to `data/`, start the previous image. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/app.py deleted file mode 100644 index 22bd546..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,579 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "profile": - email = request.form.get("email", "").strip().lower() - if email and "@" not in email: - flash("That e-mail address doesn't look valid.", "error") - else: - g.db.execute( - "UPDATE users SET first_name=?, last_name=?, unit_location=?, email=? WHERE id=?", - (request.form.get("first_name", "").strip(), - request.form.get("last_name", "").strip(), - request.form.get("unit_location", "").strip(), - email, user["id"])) - g.db.commit() - flash("Profile saved.", "ok") - return redirect(url_for("account")) - if act == "password": - if not check_password_hash(user["password_hash"], request.form.get("current_password", "")): - flash("Your current password is wrong.", "error") - elif not request.form.get("new_password"): - flash("The new password can't be empty.", "error") - elif request.form.get("new_password") != request.form.get("confirm_password"): - flash("The new passwords don't match.", "error") - else: - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(request.form["new_password"]), user["id"])) - g.db.commit() - flash("Password changed.", "ok") - return redirect(url_for("account")) - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - uploads = [(f, f.read()) for f in request.files.getlist("attachments") - if f and f.filename] - total = sum(len(data) for _, data in uploads) - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif total > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if uploads: - os.makedirs(db.ATTACH_DIR, exist_ok=True) - entries = [] - for i, (f, data) in enumerate(uploads, 1): - name = secure_filename(f.filename) or f"attachment-{i}" - stored = f"{rid}_{i}_{name}" - with open(db.attachment_path(stored), "wb") as fh: - fh.write(data) - entries.append({"stored": stored, "name": name}) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entries), rid)) - db.log(g.db, rid, "attachments saved", - ", ".join(f"'{e['name']}'" for e in entries) + - f" ({total} bytes total) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - pipeline.notify_knowledge(rid, f"New request created by {requester}") - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain, - attachments=pipeline.attachment_list(req)) - - -@app.route("/admin/request//attachment/") -@admin_required -def request_attachment(rid, idx): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None: - abort(404) - entries = pipeline.attachment_list(req) - if idx < 0 or idx >= len(entries): - abort(404) - path = db.attachment_path(entries[idx]["stored"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, download_name=entries[idx]["name"]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers, w.knowledge FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"Knowledge chain: {', '.join(pipeline.knowledge_chain(req)) or '(none)'}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - knowledge = [a.strip() for a in f.get("knowledge", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, knowledge, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?, knowledge=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/db.py deleted file mode 100644 index 145b578..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,249 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - first_name TEXT NOT NULL DEFAULT '', - last_name TEXT NOT NULL DEFAULT '', - unit_location TEXT NOT NULL DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - knowledge TEXT NOT NULL DEFAULT '[]', -- JSON list: informed of every event, never approve - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '[]', -- JSON list of {"stored": ..., "name": ...} - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - for col in ("first_name", "last_name", "unit_location"): - if ucols and col not in ucols: - con.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT NOT NULL DEFAULT ''") - print(f"[migrate] Added {col} to users.") - wcols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if wcols and "knowledge" not in wcols: - con.execute("ALTER TABLE workflows ADD COLUMN knowledge TEXT NOT NULL DEFAULT '[]'") - print("[migrate] Added knowledge chain to workflows.") - # single-attachment values -> JSON list format - if rcols and "attachment" in rcols: - for row in con.execute("SELECT id, attachment FROM requests " - "WHERE attachment != '' AND attachment NOT LIKE '[%'").fetchall(): - stored = row["attachment"] - entry = [{"stored": stored, "name": stored.split("_", 1)[-1]}] - con.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entry), row["id"])) - print(f"[migrate] Converted attachment of request #{row['id']} to list format.") - con.execute("UPDATE requests SET attachment='[]' WHERE attachment=''") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'
{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 9a77bab..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,291 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def attachment_list(req): - """Parse the request's attachment column into [{"stored":…, "name":…}, …].""" - try: - return json.loads(req["attachment"] or "[]") - except Exception: - return [] - - -def load_attachments(req): - """Load every uploaded file of the request as send_mail attachments.""" - out = [] - for entry in attachment_list(req): - path = db.attachment_path(entry["stored"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - continue - ctype = mimetypes.guess_type(entry["name"])[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - out.append((entry["name"], data, maintype, subtype)) - return out or None - - -def knowledge_chain(wf): - try: - chain = json.loads(wf["knowledge"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def notify_knowledge(request_id, event): - """Inform the workflow's knowledge chain of an event. These addresses are - never part of the approval chain — they only receive FYI messages.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - watchers = knowledge_chain(wf) - if not watchers: - return - chain = approver_chain(wf) - subject = f"[{wf['name']}] FYI — request #{req['id']}: {event}" - body = ( - f"For your information (you are on the knowledge chain of this workflow —\n" - f"no action is needed from you):\n\n" - f"{event}\n\n" - f"Workflow: {wf['name']}\n" - f"From: {req['requester']}\n" - f"Created: {req['created_at']}\n" - f"Subject: {req['subject']}\n" - f"Status: {req['status'].upper()}" - f" (step {min(req['current_step'], max(len(chain)-1, 0)) + 1} of {len(chain)})\n\n" - f"Message:\n{req['body']}\n" - ) - if req["deny_reason"]: - body += f"\nReason for denial:\n{req['deny_reason']}\n" - ok, detail = send_mail(watchers, subject, body, request_id=request_id) - db.log(con, request_id, - "knowledge chain informed" if ok else "mail error", - f"'{event}' to {', '.join(watchers)} — {detail}") - con.commit() - finally: - con.close() - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachments(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - notify_knowledge(req["id"], f"DENIED at step {step + 1}/{len(chain)} by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - notify_knowledge(req["id"], - f"FULLY APPROVED — final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - notify_knowledge(req["id"], f"Step {step + 1}/{len(chain)} approved by {decided_by} — " - f"now waiting on {chain[step + 1]}") - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/account.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/account.html deleted file mode 100644 index 90eb590..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/account.html +++ /dev/null @@ -1,96 +0,0 @@ -{% extends "base.html" %} -{% block title %}Configure profile — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Configure profile

-

Signed in as {{ user.username }}

- -
-

Profile

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-

Change password

-
- -
-
- - -
-
-
- - -
-
- - -
-
- -
-
- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index d42a305..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainKnowledge chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% for a in w.knowledge | fromjson %}{{ a }}{% if not loop.last %}
{% endif %}{% else %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 5491762..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Configure profile - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz
- - diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 4e54315..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 00215d2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index b6e8c1c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if attachments %} -

Attachments (included in every approval mail):
- {% for att in attachments %} - {{ att.name }}{% if not loop.last %} · {% endif %} - {% endfor %} -

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 3f658f9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users fill in their own details (name, unit, e-mail, MFA) on their Configure profile page; you can disable MFA here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.first_name or u.last_name %}{{ u.first_name }} {{ u.last_name }}{% endif %} - {% if u.unit_location %}{{ u.unit_location }}{% endif %} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 47202ae..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/totp.py b/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.1 patch/approvalflow/approvalflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow.zip deleted file mode 100644 index 9d2246971420fe229f70a12b363a310447d7dbc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37742 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 p8z%Dn9j<$k!lKJ`8V}T$If=J2M}ycb=p the container receives xK9$vh4pQ2 -# Otherwise you'll see a warning like: The "..." variable is not set. - -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/README.md deleted file mode 100644 index d908d5c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one or more uploaded files (15 MB combined). They are attached to **every approval mail** sent along the chain, and admins can download each from the request page. Files are stored next to the database in `data/attachments/`. -- **Knowledge chain.** Next to each workflow's approval chain there is a knowledge chain: addresses that never approve anything but are informed by e-mail when a request is created and on every step approval, denial, or final approval. They are not counted as "involved" and don't receive the participant outcome notice — only their own FYI messages. -- **Configure profile.** Every user has a profile page (top-right corner): first name, last name, unit location, e-mail, change password, and MFA. The profile e-mail pre-fills the mandatory "Request's e-mail" field when submitting a request. -- **MFA.** Any user can enable two-factor authentication from their Configure profile page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -> **If a value in `.env` contains a `$`** (common in passwords), escape it as `$$` — e.g. `MAIL_PASSWORD=xK9$$vh4pQ2`. Docker Compose otherwise treats `$word` as a variable and silently replaces it with a blank string, printing a warning like `The "word" variable is not set`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Upgrading an existing instance (no data loss) - -All schema changes are applied automatically at boot by the built-in migrations — -the SQLite database and uploaded files live in `./data/`, which is a volume and is -never touched by rebuilding the image. - -```bash -cd /path/to/approvalflow -docker compose down # stop the app (data stays in ./data) -cp -r data data.backup-$(date +%F) # safety backup of DB + attachments -# replace the code with the new version, KEEPING .env and data/: -# unzip -o approvalflow.zip -d .. (or copy the new files over the old ones) -docker compose up -d --build # rebuild image, start; migrations run at boot -docker compose logs | grep migrate # optional: see what was migrated -``` - -Roll back = stop, restore `data.backup-…` to `data/`, start the previous image. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/app.py deleted file mode 100644 index 22bd546..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,579 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "profile": - email = request.form.get("email", "").strip().lower() - if email and "@" not in email: - flash("That e-mail address doesn't look valid.", "error") - else: - g.db.execute( - "UPDATE users SET first_name=?, last_name=?, unit_location=?, email=? WHERE id=?", - (request.form.get("first_name", "").strip(), - request.form.get("last_name", "").strip(), - request.form.get("unit_location", "").strip(), - email, user["id"])) - g.db.commit() - flash("Profile saved.", "ok") - return redirect(url_for("account")) - if act == "password": - if not check_password_hash(user["password_hash"], request.form.get("current_password", "")): - flash("Your current password is wrong.", "error") - elif not request.form.get("new_password"): - flash("The new password can't be empty.", "error") - elif request.form.get("new_password") != request.form.get("confirm_password"): - flash("The new passwords don't match.", "error") - else: - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(request.form["new_password"]), user["id"])) - g.db.commit() - flash("Password changed.", "ok") - return redirect(url_for("account")) - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - uploads = [(f, f.read()) for f in request.files.getlist("attachments") - if f and f.filename] - total = sum(len(data) for _, data in uploads) - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif total > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if uploads: - os.makedirs(db.ATTACH_DIR, exist_ok=True) - entries = [] - for i, (f, data) in enumerate(uploads, 1): - name = secure_filename(f.filename) or f"attachment-{i}" - stored = f"{rid}_{i}_{name}" - with open(db.attachment_path(stored), "wb") as fh: - fh.write(data) - entries.append({"stored": stored, "name": name}) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entries), rid)) - db.log(g.db, rid, "attachments saved", - ", ".join(f"'{e['name']}'" for e in entries) + - f" ({total} bytes total) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - pipeline.notify_knowledge(rid, f"New request created by {requester}") - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain, - attachments=pipeline.attachment_list(req)) - - -@app.route("/admin/request//attachment/") -@admin_required -def request_attachment(rid, idx): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None: - abort(404) - entries = pipeline.attachment_list(req) - if idx < 0 or idx >= len(entries): - abort(404) - path = db.attachment_path(entries[idx]["stored"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, download_name=entries[idx]["name"]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers, w.knowledge FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"Knowledge chain: {', '.join(pipeline.knowledge_chain(req)) or '(none)'}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - knowledge = [a.strip() for a in f.get("knowledge", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, knowledge, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?, knowledge=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/db.py deleted file mode 100644 index 145b578..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,249 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - first_name TEXT NOT NULL DEFAULT '', - last_name TEXT NOT NULL DEFAULT '', - unit_location TEXT NOT NULL DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - knowledge TEXT NOT NULL DEFAULT '[]', -- JSON list: informed of every event, never approve - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '[]', -- JSON list of {"stored": ..., "name": ...} - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - for col in ("first_name", "last_name", "unit_location"): - if ucols and col not in ucols: - con.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT NOT NULL DEFAULT ''") - print(f"[migrate] Added {col} to users.") - wcols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if wcols and "knowledge" not in wcols: - con.execute("ALTER TABLE workflows ADD COLUMN knowledge TEXT NOT NULL DEFAULT '[]'") - print("[migrate] Added knowledge chain to workflows.") - # single-attachment values -> JSON list format - if rcols and "attachment" in rcols: - for row in con.execute("SELECT id, attachment FROM requests " - "WHERE attachment != '' AND attachment NOT LIKE '[%'").fetchall(): - stored = row["attachment"] - entry = [{"stored": stored, "name": stored.split("_", 1)[-1]}] - con.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entry), row["id"])) - print(f"[migrate] Converted attachment of request #{row['id']} to list format.") - con.execute("UPDATE requests SET attachment='[]' WHERE attachment=''") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'

{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 9a77bab..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,291 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def attachment_list(req): - """Parse the request's attachment column into [{"stored":…, "name":…}, …].""" - try: - return json.loads(req["attachment"] or "[]") - except Exception: - return [] - - -def load_attachments(req): - """Load every uploaded file of the request as send_mail attachments.""" - out = [] - for entry in attachment_list(req): - path = db.attachment_path(entry["stored"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - continue - ctype = mimetypes.guess_type(entry["name"])[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - out.append((entry["name"], data, maintype, subtype)) - return out or None - - -def knowledge_chain(wf): - try: - chain = json.loads(wf["knowledge"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def notify_knowledge(request_id, event): - """Inform the workflow's knowledge chain of an event. These addresses are - never part of the approval chain — they only receive FYI messages.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - watchers = knowledge_chain(wf) - if not watchers: - return - chain = approver_chain(wf) - subject = f"[{wf['name']}] FYI — request #{req['id']}: {event}" - body = ( - f"For your information (you are on the knowledge chain of this workflow —\n" - f"no action is needed from you):\n\n" - f"{event}\n\n" - f"Workflow: {wf['name']}\n" - f"From: {req['requester']}\n" - f"Created: {req['created_at']}\n" - f"Subject: {req['subject']}\n" - f"Status: {req['status'].upper()}" - f" (step {min(req['current_step'], max(len(chain)-1, 0)) + 1} of {len(chain)})\n\n" - f"Message:\n{req['body']}\n" - ) - if req["deny_reason"]: - body += f"\nReason for denial:\n{req['deny_reason']}\n" - ok, detail = send_mail(watchers, subject, body, request_id=request_id) - db.log(con, request_id, - "knowledge chain informed" if ok else "mail error", - f"'{event}' to {', '.join(watchers)} — {detail}") - con.commit() - finally: - con.close() - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachments(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - notify_knowledge(req["id"], f"DENIED at step {step + 1}/{len(chain)} by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - notify_knowledge(req["id"], - f"FULLY APPROVED — final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - notify_knowledge(req["id"], f"Step {step + 1}/{len(chain)} approved by {decided_by} — " - f"now waiting on {chain[step + 1]}") - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/account.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/account.html deleted file mode 100644 index 90eb590..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/account.html +++ /dev/null @@ -1,96 +0,0 @@ -{% extends "base.html" %} -{% block title %}Configure profile — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Configure profile

-

Signed in as {{ user.username }}

- -
-

Profile

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-

Change password

-
- -
-
- - -
-
-
- - -
-
- - -
-
- -
-
- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index d42a305..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainKnowledge chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% for a in w.knowledge | fromjson %}{{ a }}{% if not loop.last %}
{% endif %}{% else %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 208d9af..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Configure profile - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz - Version 9.2
- - diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 4e54315..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 00215d2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index b6e8c1c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if attachments %} -

Attachments (included in every approval mail):
- {% for att in attachments %} - {{ att.name }}{% if not loop.last %} · {% endif %} - {% endfor %} -

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 3f658f9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users fill in their own details (name, unit, e-mail, MFA) on their Configure profile page; you can disable MFA here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.first_name or u.last_name %}{{ u.first_name }} {{ u.last_name }}{% endif %} - {% if u.unit_location %}{{ u.unit_location }}{% endif %} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 47202ae..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/totp.py b/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.2 patch/approvalflow/approvalflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow.zip b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow.zip deleted file mode 100644 index 711c1e32d34e2a3ed70d9db71812bd83dddc11b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37771 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 diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/.env.example b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/.env.example deleted file mode 100644 index 51b61a3..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/.env.example +++ /dev/null @@ -1,18 +0,0 @@ -# NOTE: Docker Compose treats '$' in this file as variable substitution. -# If any value (e.g. a password) contains a literal '$', write it as '$$': -# MAIL_PASSWORD=xK9$$vh4pQ2 -> the container receives xK9$vh4pQ2 -# Otherwise you'll see a warning like: The "..." variable is not set. - -# --- Web app --- -SECRET_KEY=change-me-to-a-long-random-string -BASE_URL=http://localhost:8000 # public URL used in approve/deny links -PORT=8000 -ADMIN_USERNAME=admin # created on first run only -ADMIN_PASSWORD=changeme - -# --- Purelymail account (only login and password are needed) --- -# Server settings are preconfigured: smtp.purelymail.com, port 465, SSL/TLS. -# If Two Factor Authentication is enabled on the account, use an App Password. -# Leave MAIL_USER empty to print outgoing mail to the console (dev mode). -MAIL_USER=you@yourdomain.com -MAIL_PASSWORD=secret diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/Dockerfile b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/Dockerfile deleted file mode 100644 index 0121b92..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM python:3.12-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -ENV DATABASE_PATH=/data/approvalflow.db -VOLUME /data -EXPOSE 8000 -CMD ["gunicorn", "-b", "0.0.0.0:8000", "--workers", "1", "--threads", "8", "app:app"] diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/README.md b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/README.md deleted file mode 100644 index 4883066..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one or more uploaded files (15 MB combined). They are attached to **every approval mail** sent along the chain, and admins can download each from the request page. Files are stored next to the database in `data/attachments/`. -- **Knowledge chain.** Next to each workflow's approval chain there is a knowledge chain: addresses that never approve anything but are informed by e-mail when a request is created and on every step approval, denial, or final approval. They are not counted as "involved" and don't receive the participant outcome notice — only their own FYI messages, which include the request's attached files just like the approval mails. -- **Configure profile.** Every user has a profile page (top-right corner): first name, last name, unit location, e-mail, change password, and MFA. The profile e-mail pre-fills the mandatory "Request's e-mail" field when submitting a request. -- **MFA.** Any user can enable two-factor authentication from their Configure profile page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -> **If a value in `.env` contains a `$`** (common in passwords), escape it as `$$` — e.g. `MAIL_PASSWORD=xK9$$vh4pQ2`. Docker Compose otherwise treats `$word` as a variable and silently replaces it with a blank string, printing a warning like `The "word" variable is not set`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Upgrading an existing instance (no data loss) - -All schema changes are applied automatically at boot by the built-in migrations — -the SQLite database and uploaded files live in `./data/`, which is a volume and is -never touched by rebuilding the image. - -```bash -cd /path/to/approvalflow -docker compose down # stop the app (data stays in ./data) -cp -r data data.backup-$(date +%F) # safety backup of DB + attachments -# replace the code with the new version, KEEPING .env and data/: -# unzip -o approvalflow.zip -d .. (or copy the new files over the old ones) -docker compose up -d --build # rebuild image, start; migrations run at boot -docker compose logs | grep migrate # optional: see what was migrated -``` - -Roll back = stop, restore `data.backup-…` to `data/`, start the previous image. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/app.py b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/app.py deleted file mode 100644 index 22bd546..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/app.py +++ /dev/null @@ -1,579 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "profile": - email = request.form.get("email", "").strip().lower() - if email and "@" not in email: - flash("That e-mail address doesn't look valid.", "error") - else: - g.db.execute( - "UPDATE users SET first_name=?, last_name=?, unit_location=?, email=? WHERE id=?", - (request.form.get("first_name", "").strip(), - request.form.get("last_name", "").strip(), - request.form.get("unit_location", "").strip(), - email, user["id"])) - g.db.commit() - flash("Profile saved.", "ok") - return redirect(url_for("account")) - if act == "password": - if not check_password_hash(user["password_hash"], request.form.get("current_password", "")): - flash("Your current password is wrong.", "error") - elif not request.form.get("new_password"): - flash("The new password can't be empty.", "error") - elif request.form.get("new_password") != request.form.get("confirm_password"): - flash("The new passwords don't match.", "error") - else: - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(request.form["new_password"]), user["id"])) - g.db.commit() - flash("Password changed.", "ok") - return redirect(url_for("account")) - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - uploads = [(f, f.read()) for f in request.files.getlist("attachments") - if f and f.filename] - total = sum(len(data) for _, data in uploads) - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif total > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if uploads: - os.makedirs(db.ATTACH_DIR, exist_ok=True) - entries = [] - for i, (f, data) in enumerate(uploads, 1): - name = secure_filename(f.filename) or f"attachment-{i}" - stored = f"{rid}_{i}_{name}" - with open(db.attachment_path(stored), "wb") as fh: - fh.write(data) - entries.append({"stored": stored, "name": name}) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entries), rid)) - db.log(g.db, rid, "attachments saved", - ", ".join(f"'{e['name']}'" for e in entries) + - f" ({total} bytes total) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - pipeline.notify_knowledge(rid, f"New request created by {requester}") - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain, - attachments=pipeline.attachment_list(req)) - - -@app.route("/admin/request//attachment/") -@admin_required -def request_attachment(rid, idx): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None: - abort(404) - entries = pipeline.attachment_list(req) - if idx < 0 or idx >= len(entries): - abort(404) - path = db.attachment_path(entries[idx]["stored"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, download_name=entries[idx]["name"]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers, w.knowledge FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"Knowledge chain: {', '.join(pipeline.knowledge_chain(req)) or '(none)'}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - knowledge = [a.strip() for a in f.get("knowledge", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, knowledge, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?, knowledge=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/db.py b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/db.py deleted file mode 100644 index 145b578..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/db.py +++ /dev/null @@ -1,249 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - first_name TEXT NOT NULL DEFAULT '', - last_name TEXT NOT NULL DEFAULT '', - unit_location TEXT NOT NULL DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - knowledge TEXT NOT NULL DEFAULT '[]', -- JSON list: informed of every event, never approve - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '[]', -- JSON list of {"stored": ..., "name": ...} - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - for col in ("first_name", "last_name", "unit_location"): - if ucols and col not in ucols: - con.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT NOT NULL DEFAULT ''") - print(f"[migrate] Added {col} to users.") - wcols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if wcols and "knowledge" not in wcols: - con.execute("ALTER TABLE workflows ADD COLUMN knowledge TEXT NOT NULL DEFAULT '[]'") - print("[migrate] Added knowledge chain to workflows.") - # single-attachment values -> JSON list format - if rcols and "attachment" in rcols: - for row in con.execute("SELECT id, attachment FROM requests " - "WHERE attachment != '' AND attachment NOT LIKE '[%'").fetchall(): - stored = row["attachment"] - entry = [{"stored": stored, "name": stored.split("_", 1)[-1]}] - con.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entry), row["id"])) - print(f"[migrate] Converted attachment of request #{row['id']} to list format.") - con.execute("UPDATE requests SET attachment='[]' WHERE attachment=''") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/docker-compose.yml b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/mailer.py b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'
{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/pipeline.py b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/pipeline.py deleted file mode 100644 index 8db535a..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/pipeline.py +++ /dev/null @@ -1,292 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def attachment_list(req): - """Parse the request's attachment column into [{"stored":…, "name":…}, …].""" - try: - return json.loads(req["attachment"] or "[]") - except Exception: - return [] - - -def load_attachments(req): - """Load every uploaded file of the request as send_mail attachments.""" - out = [] - for entry in attachment_list(req): - path = db.attachment_path(entry["stored"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - continue - ctype = mimetypes.guess_type(entry["name"])[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - out.append((entry["name"], data, maintype, subtype)) - return out or None - - -def knowledge_chain(wf): - try: - chain = json.loads(wf["knowledge"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def notify_knowledge(request_id, event): - """Inform the workflow's knowledge chain of an event. These addresses are - never part of the approval chain — they only receive FYI messages.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - watchers = knowledge_chain(wf) - if not watchers: - return - chain = approver_chain(wf) - subject = f"[{wf['name']}] FYI — request #{req['id']}: {event}" - body = ( - f"For your information (you are on the knowledge chain of this workflow —\n" - f"no action is needed from you):\n\n" - f"{event}\n\n" - f"Workflow: {wf['name']}\n" - f"From: {req['requester']}\n" - f"Created: {req['created_at']}\n" - f"Subject: {req['subject']}\n" - f"Status: {req['status'].upper()}" - f" (step {min(req['current_step'], max(len(chain)-1, 0)) + 1} of {len(chain)})\n\n" - f"Message:\n{req['body']}\n" - ) - if req["deny_reason"]: - body += f"\nReason for denial:\n{req['deny_reason']}\n" - ok, detail = send_mail(watchers, subject, body, request_id=request_id, - attachments=load_attachments(req)) - db.log(con, request_id, - "knowledge chain informed" if ok else "mail error", - f"'{event}' to {', '.join(watchers)} — {detail}") - con.commit() - finally: - con.close() - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachments(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - notify_knowledge(req["id"], f"DENIED at step {step + 1}/{len(chain)} by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - notify_knowledge(req["id"], - f"FULLY APPROVED — final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - notify_knowledge(req["id"], f"Step {step + 1}/{len(chain)} approved by {decided_by} — " - f"now waiting on {chain[step + 1]}") - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/requirements.txt b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/static/style.css b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/account.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/account.html deleted file mode 100644 index 90eb590..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/account.html +++ /dev/null @@ -1,96 +0,0 @@ -{% extends "base.html" %} -{% block title %}Configure profile — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Configure profile

-

Signed in as {{ user.username }}

- -
-

Profile

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-

Change password

-
- -
-
- - -
-
-
- - -
-
- - -
-
- -
-
- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/admin.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/admin.html deleted file mode 100644 index d42a305..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainKnowledge chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% for a in w.knowledge | fromjson %}{{ a }}{% if not loop.last %}
{% endif %}{% else %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/base.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/base.html deleted file mode 100644 index 26533d9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Configure profile - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz - Version 9.3
- - diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/decision.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/decision.html deleted file mode 100644 index 4e54315..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/decision.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/index.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/index.html deleted file mode 100644 index 00215d2..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/login.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/mail_status.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/request_detail.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/request_detail.html deleted file mode 100644 index b6e8c1c..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/request_detail.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if attachments %} -

Attachments (included in every approval mail):
- {% for att in attachments %} - {{ att.name }}{% if not loop.last %} · {% endif %} - {% endfor %} -

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/users.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/users.html deleted file mode 100644 index 3f658f9..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/users.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users fill in their own details (name, unit, e-mail, MFA) on their Configure profile page; you can disable MFA here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.first_name or u.last_name %}{{ u.first_name }} {{ u.last_name }}{% endif %} - {% if u.unit_location %}{{ u.unit_location }}{% endif %} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/workflow_edit.html b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/workflow_edit.html deleted file mode 100644 index 47202ae..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/templates/workflow_edit.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/totp.py b/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/OLD_VERSIONS/v9.3 patch/approvalflow/approvalflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Approval Workflow/README.md b/Approval Workflow/README.md deleted file mode 100644 index 4883066..0000000 --- a/Approval Workflow/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# ApprovalFlow - -A self-hosted approval-workflow app. Requests are created on the site (login required), move through each workflow's ordered chain of approvers by email, and once approved or denied, **everyone involved up to that point** is notified. Every request keeps a full audit log of everything that happened to it. - -Outgoing mail is preconfigured for **Purelymail** — you only provide the account's login and password. - -## What it does - -- **Sequential multi-step approval.** Every workflow has an ordered chain of approvers. The request goes to the first person; each approval sends it on to the next; the last approval completes it. **A denial at any step stops the workflow immediately** — nobody later in the chain is contacted. -- **Decisions notify everyone.** On the final outcome (approved or denied), the requester and every approver involved **up to that point** receive the outcome email. -- **Full log.** Every request records: received, each approval request sent, each step's decision, notifications, and any mail errors — each with a timestamp. -- **Attachments.** A request can include one or more uploaded files (15 MB combined). They are attached to **every approval mail** sent along the chain, and admins can download each from the request page. Files are stored next to the database in `data/attachments/`. -- **Knowledge chain.** Next to each workflow's approval chain there is a knowledge chain: addresses that never approve anything but are informed by e-mail when a request is created and on every step approval, denial, or final approval. They are not counted as "involved" and don't receive the participant outcome notice — only their own FYI messages, which include the request's attached files just like the approval mails. -- **Configure profile.** Every user has a profile page (top-right corner): first name, last name, unit location, e-mail, change password, and MFA. The profile e-mail pre-fills the mandatory "Request's e-mail" field when submitting a request. -- **MFA.** Any user can enable two-factor authentication from their Configure profile page (TOTP — Google Authenticator, Authy, 1Password, …). Sign-in then requires password + 6-digit code. Admins can disable MFA for a user who lost their device. -- **Light and dark mode.** A toggle in the top bar (and on the login page) switches themes; the choice is remembered per browser and defaults to the system preference. -- **Images in emails.** Admins upload PNG/JPG/GIF images (up to 2 MB each) in the library shown below the Email wording section of any workflow. Placing an image's `{image:name}` tag in the approval request body, approved notice body, or denied notice body embeds the image at that spot (HTML email with a plain-text fallback). -- **Mail status page (admin only).** Every outgoing email is recorded with its delivery result and whether the Sent-folder copy succeeded, so you can confirm mail is going out and spot errors at a glance. -- **Multiple named workflows**, each personalized: its own approval chain and the wording of all three emails (approval request, approved notice, denied notice) with `{placeholders}`. -- **Main page (login required):** users pick a workflow they have access to and submit a request from the browser. -- **Admin pages:** create/edit/pause workflows, monitor all requests and open their full logs, decide directly from the UI, manage users, and set which users can access which workflows. - -## Quick start (Docker) - -```bash -cp .env.example .env # edit it: SECRET_KEY, BASE_URL, MAIL_USER, MAIL_PASSWORD -docker compose up -d -``` - -Open http://localhost:8000 and sign in with `ADMIN_USERNAME` / `ADMIN_PASSWORD` from `.env` (defaults `admin` / `changeme` — change them). The SQLite database lives in `./data/`. - -> **If a value in `.env` contains a `$`** (common in passwords), escape it as `$$` — e.g. `MAIL_PASSWORD=xK9$$vh4pQ2`. Docker Compose otherwise treats `$word` as a variable and silently replaces it with a blank string, printing a warning like `The "word" variable is not set`. - -## Quick start (bare Python) - -```bash -pip install -r requirements.txt -cp .env.example .env -set -a; source .env; set +a # or export the variables another way -python app.py -``` - -Leaving `MAIL_USER` empty prints outgoing mail to the console instead of sending it — handy for trying the app before entering the account. - -## Mail server - -The app is preconfigured for Purelymail's servers — you never enter host or port settings: - -| | | -|---|---| -| Outgoing (SMTP) | `smtp.purelymail.com`, port `465`, SSL/TLS | -| Sent-folder copy (IMAP) | `imap.purelymail.com`, port `993`, SSL/TLS | - -Every email the app sends is also saved as a copy to the account's **Sent** folder over IMAP, so the mailbox keeps a complete record of what went out. - -Only two settings are asked for in `.env`: `MAIL_USER` (the email address) and `MAIL_PASSWORD`. If the account uses Two Factor Authentication, use an **App Password** instead of the real password. - -## The request lifecycle - -``` -web form (login required) - │ received + logged - ▼ - approval request → approver 1 ── deny ──► STOP: DENIED notice to - │ approve everyone involved so far - ▼ - approval request → approver 2 ── deny ──► STOP: DENIED notice ... - │ approve - ▼ - ⋮ (… every approver in the chain, in order) - ▼ - last approver approves ──► APPROVED notice to everyone involved - (requester + all approvers) -``` - -Each step gets a fresh secret link, so an earlier approver's link cannot decide later steps. - -## Personalization placeholders - -Usable in every workflow's subject and body templates: -`{workflow}`, `{requester}`, `{subject}`, `{body}`, `{request_id}`, `{step}`, `{total_steps}`, `{decided_by}`, `{summary}` (creation + each approval with timestamps, for the approved notice), `{deny_reason}`, `{approve_url}`, `{deny_url}`. - -## Upgrading an existing instance (no data loss) - -All schema changes are applied automatically at boot by the built-in migrations — -the SQLite database and uploaded files live in `./data/`, which is a volume and is -never touched by rebuilding the image. - -```bash -cd /path/to/approvalflow -docker compose down # stop the app (data stays in ./data) -cp -r data data.backup-$(date +%F) # safety backup of DB + attachments -# replace the code with the new version, KEEPING .env and data/: -# unzip -o approvalflow.zip -d .. (or copy the new files over the old ones) -docker compose up -d --build # rebuild image, start; migrations run at boot -docker compose logs | grep migrate # optional: see what was migrated -``` - -Roll back = stop, restore `data.backup-…` to `data/`, start the previous image. - -## Security notes - -- Set a strong `SECRET_KEY` and put the app behind HTTPS (a reverse proxy such as Caddy or nginx) — the approve/deny links are secrets. -- Decision links are unguessable random tokens and work only once; a second click shows "already decided." -- Passwords are stored hashed (Werkzeug PBKDF2). Change the bootstrap admin password immediately. -- Non-admin users only ever see and use the workflows they've been granted. - -## Project layout - -``` -app.py Flask routes, auth, admin pages -db.py SQLite schema + audit/mail-log helpers -pipeline.py approval chain + decision/notification logic -mailer.py Purelymail SMTP sending, Sent-folder copy, mail log -templates/ pages static/style.css styling -``` diff --git a/Approval Workflow/app.py b/Approval Workflow/app.py deleted file mode 100644 index 22bd546..0000000 --- a/Approval Workflow/app.py +++ /dev/null @@ -1,579 +0,0 @@ -"""ApprovalFlow — self-hosted email approval workflows.""" -import functools -import json -import os -import re -import secrets - -from flask import (Flask, abort, flash, g, redirect, render_template, - request, send_file, session, url_for) -from werkzeug.security import check_password_hash, generate_password_hash -from werkzeug.utils import secure_filename - -import db -import pipeline -import totp -from mailer import send_mail -from db import DEFAULT_TEMPLATES - -app = Flask(__name__) -app.secret_key = os.environ.get("SECRET_KEY") or secrets.token_hex(32) -# 15 MB attachment limit (+ small allowance for the rest of the form) -app.config["MAX_CONTENT_LENGTH"] = db.MAX_ATTACHMENT_BYTES + 512 * 1024 - - -@app.errorhandler(413) -def too_large(e): - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - return redirect(url_for("index")) - - -# ---------------------------------------------------------------- helpers - -@app.template_filter("fromjson") -def fromjson_filter(s): - try: - return json.loads(s or "[]") - except Exception: - return [] - - -def slugify(name): - s = re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") - return s or "workflow" - - -def login_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - return view(*a, **kw) - return wrapped - - -def admin_required(view): - @functools.wraps(view) - def wrapped(*a, **kw): - if "user_id" not in session: - return redirect(url_for("login", next=request.path)) - if not session.get("is_admin"): - abort(403) - return view(*a, **kw) - return wrapped - - -@app.before_request -def open_db(): - g.db = db.get_db() - - -@app.teardown_request -def close_db(exc): - d = g.pop("db", None) - if d: - d.close() - - -def user_workflows(user_id): - if session.get("is_admin"): - return g.db.execute("SELECT * FROM workflows WHERE active=1 ORDER BY name").fetchall() - return g.db.execute( - "SELECT w.* FROM workflows w JOIN user_workflows uw ON uw.workflow_id=w.id " - "WHERE uw.user_id=? AND w.active=1 ORDER BY w.name", (user_id,)).fetchall() - - -# ---------------------------------------------------------------- auth - -def _start_session(user, next_url=None): - session.clear() - session["user_id"] = user["id"] - session["username"] = user["username"] - session["is_admin"] = bool(user["is_admin"]) - return redirect(next_url or url_for("index")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - user = g.db.execute("SELECT * FROM users WHERE username=?", - (request.form.get("username", "").strip(),)).fetchone() - if user and check_password_hash(user["password_hash"], request.form.get("password", "")): - if user["mfa_secret"]: - session.clear() - session["mfa_pending"] = user["id"] - session["mfa_next"] = request.args.get("next") or "" - return redirect(url_for("login_mfa")) - return _start_session(user, request.args.get("next")) - flash("Wrong username or password.", "error") - return render_template("login.html") - - -@app.route("/login/mfa", methods=["GET", "POST"]) -def login_mfa(): - uid = session.get("mfa_pending") - if not uid: - return redirect(url_for("login")) - user = g.db.execute("SELECT * FROM users WHERE id=?", (uid,)).fetchone() - if user is None or not user["mfa_secret"]: - session.clear() - return redirect(url_for("login")) - if request.method == "POST": - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - return _start_session(user, session.get("mfa_next") or None) - flash("Wrong verification code — try again.", "error") - return render_template("login.html", mfa_stage=True, username=user["username"]) - - -@app.route("/logout") -def logout(): - session.clear() - return redirect(url_for("login")) - - -# ---------------------------------------------------------------- account (MFA) - -@app.route("/account", methods=["GET", "POST"]) -@login_required -def account(): - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - setup_secret = session.get("mfa_setup") - - if request.method == "POST": - act = request.form.get("action") - if act == "profile": - email = request.form.get("email", "").strip().lower() - if email and "@" not in email: - flash("That e-mail address doesn't look valid.", "error") - else: - g.db.execute( - "UPDATE users SET first_name=?, last_name=?, unit_location=?, email=? WHERE id=?", - (request.form.get("first_name", "").strip(), - request.form.get("last_name", "").strip(), - request.form.get("unit_location", "").strip(), - email, user["id"])) - g.db.commit() - flash("Profile saved.", "ok") - return redirect(url_for("account")) - if act == "password": - if not check_password_hash(user["password_hash"], request.form.get("current_password", "")): - flash("Your current password is wrong.", "error") - elif not request.form.get("new_password"): - flash("The new password can't be empty.", "error") - elif request.form.get("new_password") != request.form.get("confirm_password"): - flash("The new passwords don't match.", "error") - else: - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(request.form["new_password"]), user["id"])) - g.db.commit() - flash("Password changed.", "ok") - return redirect(url_for("account")) - if act == "begin": - session["mfa_setup"] = totp.new_secret() - return redirect(url_for("account")) - if act == "cancel": - session.pop("mfa_setup", None) - return redirect(url_for("account")) - if act == "confirm" and setup_secret: - if totp.verify(setup_secret, request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret=? WHERE id=?", - (setup_secret, user["id"])) - g.db.commit() - session.pop("mfa_setup", None) - flash("Two-factor authentication is now enabled on your account.", "ok") - else: - flash("That code didn't match — scan the QR code and try again.", "error") - return redirect(url_for("account")) - if act == "disable" and user["mfa_secret"]: - if totp.verify(user["mfa_secret"], request.form.get("code", "")): - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", (user["id"],)) - g.db.commit() - flash("Two-factor authentication disabled.", "ok") - else: - flash("Wrong code — MFA was not disabled.", "error") - return redirect(url_for("account")) - - otpauth = totp.otpauth_uri(user["username"], setup_secret) if setup_secret else "" - return render_template("account.html", user=user, - setup_secret=setup_secret, otpauth=otpauth) - - -# ---------------------------------------------------------------- main page - -@app.route("/", methods=["GET", "POST"]) -@login_required -def index(): - workflows = user_workflows(session["user_id"]) - - user = g.db.execute("SELECT * FROM users WHERE id=?", (session["user_id"],)).fetchone() - - if request.method == "POST": - wf_id = request.form.get("workflow_id", type=int) - wf = next((w for w in workflows if w["id"] == wf_id), None) - if wf is None: - abort(403) # not allowed to use this workflow - requester = request.form.get("request_email", "").strip().lower() - subject = request.form.get("subject", "").strip() - body = request.form.get("body", "").strip() - uploads = [(f, f.read()) for f in request.files.getlist("attachments") - if f and f.filename] - total = sum(len(data) for _, data in uploads) - if not requester or "@" not in requester: - flash("Request's e-mail is required and must be a valid address.", "error") - elif not subject or not body: - flash("Subject and message are both required.", "error") - elif total > db.MAX_ATTACHMENT_BYTES: - flash("The uploaded files are too large — the combined limit is 15 MB.", "error") - else: - rid, _ = db.create_request(g.db, wf["id"], "web", requester, subject, body) - db.log(g.db, rid, "matched", f"Submitted on the web form by {session['username']}") - if uploads: - os.makedirs(db.ATTACH_DIR, exist_ok=True) - entries = [] - for i, (f, data) in enumerate(uploads, 1): - name = secure_filename(f.filename) or f"attachment-{i}" - stored = f"{rid}_{i}_{name}" - with open(db.attachment_path(stored), "wb") as fh: - fh.write(data) - entries.append({"stored": stored, "name": name}) - g.db.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entries), rid)) - db.log(g.db, rid, "attachments saved", - ", ".join(f"'{e['name']}'" for e in entries) + - f" ({total} bytes total) — included in every approval mail") - g.db.commit() - pipeline.send_approval_request(rid) - pipeline.notify_knowledge(rid, f"New request created by {requester}") - flash(f"Request #{rid} sent to the approver of “{wf['name']}”.", "ok") - return redirect(url_for("index")) - - my_requests = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "WHERE r.requester=? OR r.requester=? ORDER BY r.id DESC LIMIT 15", - (session["username"], (user["email"] or "-").lower())).fetchall() - return render_template("index.html", workflows=workflows, my_requests=my_requests, - user_email=user["email"] or "") - - -# ---------------------------------------------------------------- decision links (from email) - -@app.route("/decision//", methods=["GET", "POST"]) -def decision(token, action): - if action not in ("approve", "deny"): - abort(404) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.token=?", (token,)).fetchone() - if req is None: - return render_template("decision.html", stage="notfound"), 404 - - chain = pipeline.approver_chain(req) - approver = chain[min(req["current_step"], len(chain) - 1)] if chain else "" - if request.method == "POST": - decided_by = request.form.get("decided_by", "").strip() or approver - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain, - error="A reason for denial is required."), 400 - status, req2, message = pipeline.decide(token, action, decided_by, reason=reason) - return render_template("decision.html", stage="done", req=req2, message=message, - action=action, status=status) - return render_template("decision.html", stage="confirm", req=req, action=action, - approver=approver, chain=chain) - - -# ---------------------------------------------------------------- admin: dashboard & requests - -@app.route("/admin") -@admin_required -def admin(): - rows = g.db.execute( - "SELECT r.*, w.name wf_name FROM requests r JOIN workflows w ON w.id=r.workflow_id " - "ORDER BY r.id DESC LIMIT 200").fetchall() - stats = g.db.execute( - "SELECT status, COUNT(*) c FROM requests GROUP BY status").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - return render_template("admin.html", rows=rows, workflows=workflows, - stats={s["status"]: s["c"] for s in stats}) - - -@app.route("/admin/request/", methods=["GET", "POST"]) -@admin_required -def admin_request(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - if request.method == "POST" and req["status"] == "pending": - action = request.form.get("action") - reason = request.form.get("reason", "").strip() - if action == "deny" and not reason: - flash("A reason for denial is required.", "error") - return redirect(url_for("admin_request", rid=rid)) - if action in ("approve", "deny"): - pipeline.decide(req["token"], action, f"{session['username']} (admin)", reason=reason) - return redirect(url_for("admin_request", rid=rid)) - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - participants = json.loads(req["participants"]) - chain = pipeline.approver_chain(req) - return render_template("request_detail.html", req=req, logs=logs, - participants=participants, chain=chain, - attachments=pipeline.attachment_list(req)) - - -@app.route("/admin/request//attachment/") -@admin_required -def request_attachment(rid, idx): - req = g.db.execute("SELECT attachment FROM requests WHERE id=?", (rid,)).fetchone() - if req is None: - abort(404) - entries = pipeline.attachment_list(req) - if idx < 0 or idx >= len(entries): - abort(404) - path = db.attachment_path(entries[idx]["stored"]) - if not os.path.exists(path): - abort(404) - return send_file(path, as_attachment=True, download_name=entries[idx]["name"]) - - -@app.route("/admin/request//send-log", methods=["POST"]) -@admin_required -def send_request_log(rid): - req = g.db.execute("SELECT r.*, w.name wf_name, w.approvers, w.knowledge FROM requests r " - "JOIN workflows w ON w.id=r.workflow_id WHERE r.id=?", (rid,)).fetchone() - if req is None: - abort(404) - to = request.form.get("email", "").strip() - if not to or "@" not in to: - flash("A valid e-mail address is required to send the log.", "error") - return redirect(url_for("admin_request", rid=rid)) - - logs = g.db.execute("SELECT * FROM request_log WHERE request_id=? ORDER BY id", (rid,)).fetchall() - chain = pipeline.approver_chain(req) - participants = json.loads(req["participants"]) - - lines = [ - f"Full log of request #{req['id']} — {req['subject']}", - "=" * 60, - f"Workflow: {req['wf_name']}", - f"Requester: {req['requester']}", - f"Created: {req['created_at']}", - f"Status: {req['status'].upper()}", - ] - if req["decided_by"]: - lines.append(f"Final decision: by {req['decided_by']} at {req['decided_at']}") - if req["deny_reason"]: - lines.append(f"Denial reason: {req['deny_reason']}") - lines += [ - f"Approval chain: {' -> '.join(chain)}", - f"Knowledge chain: {', '.join(pipeline.knowledge_chain(req)) or '(none)'}", - f"People involved: {', '.join(participants)}", - "", - "Message:", - req["body"], - "", - "Event log:", - "-" * 60, - ] - for l in logs: - lines.append(f"{l['at']} | {l['event']}") - if l["detail"]: - lines.append(f"{'':25} {l['detail']}") - body = "\n".join(lines) - - ok, detail = send_mail(to, f"[{req['wf_name']}] Full log of request #{req['id']}: {req['subject']}", - body, request_id=rid) - db.log(g.db, rid, "log sent" if ok else "mail error", - f"Full log emailed to {to} by {session['username']} — {detail}") - g.db.commit() - flash(f"Full log sent to {to}." if ok else f"Could not send the log: {detail}", - "ok" if ok else "error") - return redirect(url_for("admin_request", rid=rid)) - - -# ---------------------------------------------------------------- admin: workflows - -WF_FIELDS = ("approval_subject", "approval_body", "approved_subject", - "approved_body", "denied_subject", "denied_body") - - -@app.route("/admin/workflows/new", methods=["GET", "POST"]) -@app.route("/admin/workflows/", methods=["GET", "POST"]) -@admin_required -def workflow_edit(wid=None): - wf = g.db.execute("SELECT * FROM workflows WHERE id=?", (wid,)).fetchone() if wid else None - if wid and wf is None: - abort(404) - - if request.method == "POST": - f = request.form - name = f.get("name", "").strip() - approvers = [a.strip() for a in f.get("approvers", "").splitlines() if a.strip()] - knowledge = [a.strip() for a in f.get("knowledge", "").splitlines() if a.strip()] - if not name or not approvers: - flash("A name and at least one approver are required.", "error") - else: - templates = {k: f.get(k, "").strip() or DEFAULT_TEMPLATES[k] for k in WF_FIELDS} - try: - if wf is None: - g.db.execute( - "INSERT INTO workflows (name, slug, description, approvers, knowledge, active," - " approval_subject, approval_body, approved_subject, approved_body," - " denied_subject, denied_body, created_at)" - " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], db.now())) - flash(f"Workflow “{name}” created with {len(approvers)} approval step(s).", "ok") - else: - g.db.execute( - "UPDATE workflows SET name=?, slug=?, description=?, approvers=?, knowledge=?," - " active=?, approval_subject=?, approval_body=?," - " approved_subject=?, approved_body=?, denied_subject=?, denied_body=? WHERE id=?", - (name, slugify(name), f.get("description", "").strip(), json.dumps(approvers), - json.dumps(knowledge), 1 if f.get("active") else 0, - *[templates[k] for k in WF_FIELDS], wid)) - flash(f"Workflow “{name}” saved.", "ok") - g.db.commit() - return redirect(url_for("admin")) - except Exception as e: - flash(f"Could not save: {e}", "error") - return render_template("workflow_edit.html", wf=wf, defaults=DEFAULT_TEMPLATES, - images=_email_images()) - - -# ---------------------------------------------------------------- admin: mail status - -@app.route("/admin/mail") -@admin_required -def mail_status(): - rows = g.db.execute("SELECT * FROM mail_log ORDER BY id DESC LIMIT 300").fetchall() - stats = {s["status"]: s["c"] for s in - g.db.execute("SELECT status, COUNT(*) c FROM mail_log GROUP BY status")} - copy_fails = g.db.execute( - "SELECT COUNT(*) c FROM mail_log WHERE sent_copy LIKE 'failed%'").fetchone()["c"] - configured = bool(os.environ.get("MAIL_USER")) - return render_template("mail_status.html", rows=rows, stats=stats, - copy_fails=copy_fails, configured=configured) - - -# ---------------------------------------------------------------- admin: email images - -def _email_images(): - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - return sorted(f for f in os.listdir(db.EMAIL_IMG_DIR) - if os.path.splitext(f)[1].lower() in db.EMAIL_IMAGE_TYPES) - - -@app.route("/admin/email-images/upload", methods=["POST"]) -@admin_required -def email_image_upload(): - nxt = request.form.get("next") or url_for("admin") - upload = request.files.get("image") - if not upload or not upload.filename: - flash("Choose an image file to upload.", "error") - return redirect(nxt) - name = secure_filename(upload.filename) - ext = os.path.splitext(name)[1].lower() - if ext not in db.EMAIL_IMAGE_TYPES: - flash("Only PNG, JPG and GIF images can be used in emails.", "error") - return redirect(nxt) - data = upload.read() - if len(data) > db.MAX_EMAIL_IMAGE_BYTES: - flash("Email images are limited to 2 MB each.", "error") - return redirect(nxt) - os.makedirs(db.EMAIL_IMG_DIR, exist_ok=True) - if os.path.exists(os.path.join(db.EMAIL_IMG_DIR, name)): - flash(f"An image named “{name}” already exists — delete it first or rename the file.", "error") - return redirect(nxt) - with open(os.path.join(db.EMAIL_IMG_DIR, name), "wb") as fh: - fh.write(data) - flash(f"Image “{name}” uploaded — use it with {{image:{name}}} in the email bodies.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/delete", methods=["POST"]) -@admin_required -def email_image_delete(): - nxt = request.form.get("next") or url_for("admin") - name = secure_filename(request.form.get("name", "")) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if name and os.path.isfile(path): - os.remove(path) - flash(f"Image “{name}” deleted.", "ok") - return redirect(nxt) - - -@app.route("/admin/email-images/") -@admin_required -def email_image(name): - name = secure_filename(name) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if not (name and os.path.isfile(path)): - abort(404) - return send_file(path) - - -# ---------------------------------------------------------------- admin: users & access - -@app.route("/admin/users", methods=["GET", "POST"]) -@admin_required -def users(): - if request.method == "POST": - f = request.form - act = f.get("action") - try: - if act == "create": - if not f.get("username") or not f.get("password"): - flash("Username and password are required.", "error") - else: - g.db.execute( - "INSERT INTO users (username, password_hash, email, is_admin, created_at) VALUES (?,?,?,?,?)", - (f["username"].strip(), generate_password_hash(f["password"]), - f.get("email", "").strip(), 1 if f.get("is_admin") else 0, db.now())) - flash(f"User “{f['username']}” created.", "ok") - elif act == "delete": - uid = f.get("user_id", type=int) - if uid == session["user_id"]: - flash("You can't delete your own account.", "error") - else: - g.db.execute("DELETE FROM users WHERE id=?", (uid,)) - flash("User deleted.", "ok") - elif act == "mfa_off": - g.db.execute("UPDATE users SET mfa_secret='' WHERE id=?", - (f.get("user_id", type=int),)) - flash("MFA disabled for that user — they can re-enable it from their Account page.", "ok") - elif act == "password": - g.db.execute("UPDATE users SET password_hash=? WHERE id=?", - (generate_password_hash(f["password"]), f.get("user_id", type=int))) - flash("Password updated.", "ok") - elif act == "access": - uid = f.get("user_id", type=int) - g.db.execute("DELETE FROM user_workflows WHERE user_id=?", (uid,)) - for wid in request.form.getlist("workflow_ids", type=int): - g.db.execute("INSERT OR IGNORE INTO user_workflows (user_id, workflow_id) VALUES (?,?)", - (uid, wid)) - flash("Access updated.", "ok") - g.db.commit() - except Exception as e: - flash(f"Error: {e}", "error") - return redirect(url_for("users")) - - all_users = g.db.execute("SELECT * FROM users ORDER BY username").fetchall() - workflows = g.db.execute("SELECT * FROM workflows ORDER BY name").fetchall() - access = {} - for row in g.db.execute("SELECT * FROM user_workflows"): - access.setdefault(row["user_id"], set()).add(row["workflow_id"]) - return render_template("users.html", users=all_users, workflows=workflows, access=access) - - -# ---------------------------------------------------------------- boot - -db.init_db() - -if __name__ == "__main__": - app.run(host=os.environ.get("HOST", "0.0.0.0"), - port=int(os.environ.get("PORT", "8000")), - debug=os.environ.get("FLASK_DEBUG") == "1") diff --git a/Approval Workflow/db.py b/Approval Workflow/db.py deleted file mode 100644 index 145b578..0000000 --- a/Approval Workflow/db.py +++ /dev/null @@ -1,249 +0,0 @@ -"""SQLite data layer for ApprovalFlow.""" -import json -import os -import secrets -import sqlite3 -from datetime import datetime, timezone - -from werkzeug.security import generate_password_hash - -DB_PATH = os.environ.get("DATABASE_PATH", os.path.join(os.path.dirname(__file__), "data", "approvalflow.db")) -ATTACH_DIR = os.path.join(os.path.dirname(DB_PATH), "attachments") -EMAIL_IMG_DIR = os.path.join(os.path.dirname(DB_PATH), "email_images") - -MAX_EMAIL_IMAGE_BYTES = 2 * 1024 * 1024 # 2 MB per email image -EMAIL_IMAGE_TYPES = {".png": "png", ".jpg": "jpeg", ".jpeg": "jpeg", ".gif": "gif"} - -MAX_ATTACHMENT_BYTES = 15 * 1024 * 1024 # 15 MB - - -def attachment_path(stored_name): - return os.path.join(ATTACH_DIR, stored_name) - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - email TEXT DEFAULT '', - first_name TEXT NOT NULL DEFAULT '', - last_name TEXT NOT NULL DEFAULT '', - unit_location TEXT NOT NULL DEFAULT '', - mfa_secret TEXT NOT NULL DEFAULT '', -- empty = MFA disabled - is_admin INTEGER NOT NULL DEFAULT 0, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS workflows ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT UNIQUE NOT NULL, - slug TEXT UNIQUE NOT NULL, - description TEXT DEFAULT '', - approvers TEXT NOT NULL DEFAULT '[]', -- JSON list, in approval order - knowledge TEXT NOT NULL DEFAULT '[]', -- JSON list: informed of every event, never approve - active INTEGER NOT NULL DEFAULT 1, - -- personalization (templates support {placeholders}) - approval_subject TEXT NOT NULL, - approval_body TEXT NOT NULL, - approved_subject TEXT NOT NULL, - approved_body TEXT NOT NULL, - denied_subject TEXT NOT NULL, - denied_body TEXT NOT NULL, - created_at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS user_workflows ( - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - workflow_id INTEGER NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, - PRIMARY KEY (user_id, workflow_id) -); - -CREATE TABLE IF NOT EXISTS requests ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - workflow_id INTEGER NOT NULL REFERENCES workflows(id), - source TEXT NOT NULL DEFAULT 'web', -- requests are created on the site - requester TEXT NOT NULL, -- email address (or username for web) - subject TEXT NOT NULL, - body TEXT NOT NULL, - participants TEXT NOT NULL DEFAULT '[]', -- JSON list of everyone involved so far - status TEXT NOT NULL DEFAULT 'pending', -- pending / approved / denied - current_step INTEGER NOT NULL DEFAULT 0, -- index into the workflow's approver chain - token TEXT UNIQUE NOT NULL, -- secret for the CURRENT step's approve/deny links - decided_by TEXT DEFAULT '', - deny_reason TEXT NOT NULL DEFAULT '', - attachment TEXT NOT NULL DEFAULT '[]', -- JSON list of {"stored": ..., "name": ...} - created_at TEXT NOT NULL, - decided_at TEXT -); - -CREATE TABLE IF NOT EXISTS decisions ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER NOT NULL REFERENCES requests(id) ON DELETE CASCADE, - step INTEGER NOT NULL, -- 1-based position in the chain - decided_by TEXT NOT NULL, - decision TEXT NOT NULL, -- approved / denied - at TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS request_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - request_id INTEGER REFERENCES requests(id) ON DELETE CASCADE, - at TEXT NOT NULL, - event TEXT NOT NULL, - detail TEXT DEFAULT '' -); - -CREATE TABLE IF NOT EXISTS mail_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - at TEXT NOT NULL, - request_id INTEGER, -- related request, if any - recipients TEXT NOT NULL, - subject TEXT NOT NULL, - status TEXT NOT NULL, -- sent / error / dev - detail TEXT DEFAULT '', -- SMTP error message, if any - sent_copy TEXT DEFAULT '' -- result of saving to the Sent folder -); -""" - -DEFAULT_TEMPLATES = { - "approval_subject": "[{workflow}] Approval needed ({step}/{total_steps}): {subject}", - "approval_body": ( - "A request needs your decision (approval step {step} of {total_steps}).\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Approve: {approve_url}\n" - "Deny: {deny_url}\n\n" - "If you approve, the request moves on to the next approver.\n" - "If you deny, the workflow stops and everyone involved is notified.\n" - ), - "approved_subject": "[{workflow}] Approved: {subject}", - "approved_body": ( - "The following request was APPROVED.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Summary:\n{summary}\n" - ), - "denied_subject": "[{workflow}] Denied: {subject}", - "denied_body": ( - "The following request was DENIED by {decided_by}.\n\n" - "Workflow: {workflow}\n" - "From: {requester}\n" - "Created: {created_at}\n" - "Subject: {subject}\n\n" - "Message:\n{body}\n\n" - "Reason for denial:\n{deny_reason}\n" - ), -} - - -def now(): - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S UTC") - - -def get_db(): - os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - con = sqlite3.connect(DB_PATH, timeout=15) - con.row_factory = sqlite3.Row - con.execute("PRAGMA foreign_keys = ON") - con.execute("PRAGMA journal_mode = WAL") - con.execute("PRAGMA busy_timeout = 15000") - return con - - -def _migrate(con): - """Upgrade a database created by the single-approver version, if present.""" - cols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if "approver_email" in cols and "approvers" not in cols: - con.execute("ALTER TABLE workflows ADD COLUMN approvers TEXT NOT NULL DEFAULT '[]'") - for w in con.execute("SELECT id, approver_email FROM workflows").fetchall(): - con.execute("UPDATE workflows SET approvers=? WHERE id=?", - (json.dumps([w["approver_email"]]), w["id"])) - print("[migrate] Converted single approver_email to approver chains.") - rcols = {r["name"] for r in con.execute("PRAGMA table_info(requests)")} - if rcols and "current_step" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN current_step INTEGER NOT NULL DEFAULT 0") - print("[migrate] Added current_step to requests.") - if rcols and "deny_reason" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN deny_reason TEXT NOT NULL DEFAULT ''") - print("[migrate] Added deny_reason to requests.") - if rcols and "attachment" not in rcols: - con.execute("ALTER TABLE requests ADD COLUMN attachment TEXT NOT NULL DEFAULT ''") - print("[migrate] Added attachment to requests.") - ucols = {r["name"] for r in con.execute("PRAGMA table_info(users)")} - if ucols and "mfa_secret" not in ucols: - con.execute("ALTER TABLE users ADD COLUMN mfa_secret TEXT NOT NULL DEFAULT ''") - print("[migrate] Added mfa_secret to users.") - for col in ("first_name", "last_name", "unit_location"): - if ucols and col not in ucols: - con.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT NOT NULL DEFAULT ''") - print(f"[migrate] Added {col} to users.") - wcols = {r["name"] for r in con.execute("PRAGMA table_info(workflows)")} - if wcols and "knowledge" not in wcols: - con.execute("ALTER TABLE workflows ADD COLUMN knowledge TEXT NOT NULL DEFAULT '[]'") - print("[migrate] Added knowledge chain to workflows.") - # single-attachment values -> JSON list format - if rcols and "attachment" in rcols: - for row in con.execute("SELECT id, attachment FROM requests " - "WHERE attachment != '' AND attachment NOT LIKE '[%'").fetchall(): - stored = row["attachment"] - entry = [{"stored": stored, "name": stored.split("_", 1)[-1]}] - con.execute("UPDATE requests SET attachment=? WHERE id=?", - (json.dumps(entry), row["id"])) - print(f"[migrate] Converted attachment of request #{row['id']} to list format.") - con.execute("UPDATE requests SET attachment='[]' WHERE attachment=''") - con.commit() - - -def init_db(): - con = get_db() - _migrate(con) - con.executescript(SCHEMA) - # bootstrap admin user on first run - if con.execute("SELECT COUNT(*) c FROM users").fetchone()["c"] == 0: - username = os.environ.get("ADMIN_USERNAME", "admin") - password = os.environ.get("ADMIN_PASSWORD", "changeme") - con.execute( - "INSERT INTO users (username, password_hash, is_admin, created_at) VALUES (?,?,1,?)", - (username, generate_password_hash(password), now()), - ) - print(f"[init] Created admin user '{username}'. Change the password immediately.") - con.commit() - con.close() - - -def log(con, request_id, event, detail=""): - con.execute( - "INSERT INTO request_log (request_id, at, event, detail) VALUES (?,?,?,?)", - (request_id, now(), event, detail), - ) - - -def add_participants(con, request_id, emails): - """Add people to the 'involved so far' list of a request.""" - row = con.execute("SELECT participants FROM requests WHERE id=?", (request_id,)).fetchone() - current = json.loads(row["participants"]) - for e in emails: - e = (e or "").strip().lower() - if e and e not in current: - current.append(e) - con.execute("UPDATE requests SET participants=? WHERE id=?", (json.dumps(current), request_id)) - return current - - -def create_request(con, workflow_id, source, requester, subject, body, extra_participants=()): - token = secrets.token_urlsafe(32) - cur = con.execute( - "INSERT INTO requests (workflow_id, source, requester, subject, body, token, created_at) " - "VALUES (?,?,?,?,?,?,?)", - (workflow_id, source, requester, subject, body, token, now()), - ) - rid = cur.lastrowid - add_participants(con, rid, [requester, *extra_participants]) - log(con, rid, "received", f"Request received via {source} from {requester}") - return rid, token diff --git a/Approval Workflow/docker-compose.yml b/Approval Workflow/docker-compose.yml deleted file mode 100644 index 32e4353..0000000 --- a/Approval Workflow/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -services: - approvalflow: - build: . - ports: - - "8000:8000" - env_file: .env - volumes: - - ./data:/data - restart: unless-stopped diff --git a/Approval Workflow/mailer.py b/Approval Workflow/mailer.py deleted file mode 100644 index 51c7fc9..0000000 --- a/Approval Workflow/mailer.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Outbound email via Purelymail, and template rendering. - -Preconfigured for Purelymail — only the account's login and password are needed: - - MAIL_USER=you@yourdomain.com (or you@purelymail.com) - MAIL_PASSWORD=... (use an App Password if 2FA is enabled) - -Every message is sent through SMTP (smtp.purelymail.com:465, SSL/TLS) and a -copy is saved to the account's Sent folder over IMAP -(imap.purelymail.com:993, SSL/TLS). Every attempt — success or failure — is -recorded in the mail_log table shown on the admin "Mail status" page. -""" -import html as html_mod -import imaplib -import os -import smtplib -import time -from email.message import EmailMessage -from email.utils import make_msgid - -import db - -SMTP_HOST = "smtp.purelymail.com" -SMTP_PORT = 465 # SSL/TLS -IMAP_HOST = "imap.purelymail.com" -IMAP_PORT = 993 # SSL/TLS - -SENT_FOLDER_CANDIDATES = ("Sent", "INBOX.Sent", "Sent Messages", "Sent Items") - - -def render(template: str, **vars) -> str: - """Safe {placeholder} substitution — unknown placeholders are left as-is.""" - out = template - for k, v in vars.items(): - out = out.replace("{" + k + "}", str(v)) - return out - - -def _save_to_sent(user, password, msg) -> str: - """Append a copy of the message to the account's Sent folder. Returns a status string.""" - try: - with imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT) as imap: - imap.login(user, password) - raw = msg.as_bytes() - stamp = imaplib.Time2Internaldate(time.time()) - last_err = "" - for folder in SENT_FOLDER_CANDIDATES: - status, resp = imap.append(folder, r"(\Seen)", stamp, raw) - if status == "OK": - return f"saved to '{folder}'" - last_err = (resp[0] or b"").decode("utf-8", "replace") if resp else "" - # No known folder worked — create "Sent" and try once more. - imap.create("Sent") - status, resp = imap.append("Sent", r"(\Seen)", stamp, raw) - if status == "OK": - return "saved to 'Sent' (folder created)" - return f"failed: {last_err or 'could not append to any Sent folder'}" - except Exception as e: - return f"failed: {e}" - - -def _record(request_id, recipients, subject, status, detail, sent_copy): - try: - con = db.get_db() - con.execute( - "INSERT INTO mail_log (at, request_id, recipients, subject, status, detail, sent_copy)" - " VALUES (?,?,?,?,?,?,?)", - (db.now(), request_id, ", ".join(recipients), subject, status, detail, sent_copy)) - con.commit() - con.close() - except Exception as e: - print(f"[mail] Could not record mail log entry: {e}") - - -def send_mail(to_addrs, subject, body, request_id=None, attachments=None, inline_images=None): - """Send an email through Purelymail, keep a copy in the Sent folder, and - record the attempt in the mail log. Returns (ok, detail). - - attachments: optional list of (filename, bytes, maintype, subtype). - inline_images: optional dict {marker_name: (bytes, subtype)}. When given, - an HTML alternative is built where each "{image:marker_name}" - in the body becomes an embedded ; the plain-text part - shows "[image: marker_name]" instead. - """ - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - to_addrs = [a for a in to_addrs if a] - if not to_addrs: - return False, "no recipients" - - user = os.environ.get("MAIL_USER", "") - password = os.environ.get("MAIL_PASSWORD", "") - - msg = EmailMessage() - msg["From"] = user or "approvalflow@localhost" - msg["To"] = ", ".join(to_addrs) - msg["Subject"] = subject - - if inline_images: - text = body - for name in inline_images: - text = text.replace("{image:" + name + "}", f"[image: {name}]") - msg.set_content(text) - - html = html_mod.escape(body).replace("\n", "
\n") - cids = {} - for name in inline_images: - cid = make_msgid(domain="martinhal.approvalflow") - cids[name] = cid - html = html.replace("{image:" + name + "}", - f'{html_mod.escape(name)}') - msg.add_alternative( - f'
{html}
', - subtype="html") - html_part = msg.get_payload()[-1] - for name, (data, subtype) in inline_images.items(): - html_part.add_related(data, maintype="image", subtype=subtype, cid=cids[name]) - else: - msg.set_content(body) - - for filename, data, maintype, subtype in (attachments or []): - msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=filename) - - if not user: - # Dev mode: print instead of sending so the app is testable without an account. - att = "".join(f"\n[attachment: {f} ({len(b)} bytes)]" for f, b, *_ in (attachments or [])) - img = "".join(f"\n[inline image: {n} ({len(d)} bytes, {s})]" for n, (d, s) in (inline_images or {}).items()) - print(f"[mail:DEV] To: {msg['To']}\nSubject: {subject}\n{body}{att}{img}\n{'-'*50}") - _record(request_id, to_addrs, subject, "dev", - "MAIL_USER not set — printed to console", "skipped (dev mode)") - return True, "dev mode (MAIL_USER not set) — printed to console" - - try: - with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT, timeout=30) as server: - server.login(user, password) - server.send_message(msg) - except Exception as e: - detail = f"SMTP error: {e}" - _record(request_id, to_addrs, subject, "error", detail, "skipped (send failed)") - return False, detail - - sent_copy = _save_to_sent(user, password, msg) - _record(request_id, to_addrs, subject, "sent", "", sent_copy) - return True, f"sent to {', '.join(to_addrs)}" diff --git a/Approval Workflow/pipeline.py b/Approval Workflow/pipeline.py deleted file mode 100644 index 8db535a..0000000 --- a/Approval Workflow/pipeline.py +++ /dev/null @@ -1,292 +0,0 @@ -"""Request pipeline for requests created on the site. - -Each workflow has an ordered chain of approvers. A request moves through the -chain one approver at a time: - - - DENY at any step -> the workflow STOPS; everyone involved so far gets - the denied notice. - - APPROVE -> the request moves to the next approver in the chain. - - APPROVE (last) -> the request is fully approved; everyone involved so - far gets the approved notice. - -Each step gets a fresh secret token, so an earlier approver's links cannot -decide later steps. -""" -import json -import mimetypes -import os -import secrets - -import db -from mailer import render, send_mail - -BASE_URL = os.environ.get("BASE_URL", "http://localhost:8000").rstrip("/") - - -def approver_chain(wf): - try: - chain = json.loads(wf["approvers"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def _vars(wf, req, **extra): - chain = approver_chain(wf) - v = { - "workflow": wf["name"], - "requester": req["requester"], - "subject": req["subject"], - "body": req["body"], - "request_id": req["id"], - "created_at": req["created_at"], - "step": min(req["current_step"], max(len(chain) - 1, 0)) + 1, - "total_steps": len(chain), - "approve_url": f"{BASE_URL}/decision/{req['token']}/approve", - "deny_url": f"{BASE_URL}/decision/{req['token']}/deny", - } - v.update(extra) - return v - - -def _record_decision(con, request_id, step, decided_by, decision): - con.execute("INSERT INTO decisions (request_id, step, decided_by, decision, at) VALUES (?,?,?,?,?)", - (request_id, step, decided_by, decision, db.now())) - - -def build_summary(con, req, total_steps): - """Human-readable history: when the request was created and who - approved (or denied) each step, with timestamps.""" - lines = [f" Created {req['created_at']} by {req['requester']}"] - for d in con.execute("SELECT * FROM decisions WHERE request_id=? ORDER BY id", (req["id"],)): - verb = "Approved" if d["decision"] == "approved" else "DENIED" - lines.append(f" Step {d['step']}/{total_steps} {verb} {d['at']} by {d['decided_by']}") - return "\n".join(lines) - - -def collect_inline_images(rendered_body): - """Find {image:name} markers in a rendered body and load those images - from the email image library. Returns a dict for send_mail, or None.""" - import re - names = set(re.findall(r"\{image:([A-Za-z0-9._\-]+)\}", rendered_body)) - images = {} - for name in names: - ext = os.path.splitext(name)[1].lower() - subtype = db.EMAIL_IMAGE_TYPES.get(ext) - path = os.path.join(db.EMAIL_IMG_DIR, name) - if subtype and os.path.isfile(path): - with open(path, "rb") as f: - images[name] = (f.read(), subtype) - return images or None - - -def attachment_list(req): - """Parse the request's attachment column into [{"stored":…, "name":…}, …].""" - try: - return json.loads(req["attachment"] or "[]") - except Exception: - return [] - - -def load_attachments(req): - """Load every uploaded file of the request as send_mail attachments.""" - out = [] - for entry in attachment_list(req): - path = db.attachment_path(entry["stored"]) - try: - with open(path, "rb") as f: - data = f.read() - except OSError: - continue - ctype = mimetypes.guess_type(entry["name"])[0] or "application/octet-stream" - maintype, subtype = ctype.split("/", 1) - out.append((entry["name"], data, maintype, subtype)) - return out or None - - -def knowledge_chain(wf): - try: - chain = json.loads(wf["knowledge"]) - except Exception: - chain = [] - return [a.strip() for a in chain if a and a.strip()] - - -def notify_knowledge(request_id, event): - """Inform the workflow's knowledge chain of an event. These addresses are - never part of the approval chain — they only receive FYI messages.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - watchers = knowledge_chain(wf) - if not watchers: - return - chain = approver_chain(wf) - subject = f"[{wf['name']}] FYI — request #{req['id']}: {event}" - body = ( - f"For your information (you are on the knowledge chain of this workflow —\n" - f"no action is needed from you):\n\n" - f"{event}\n\n" - f"Workflow: {wf['name']}\n" - f"From: {req['requester']}\n" - f"Created: {req['created_at']}\n" - f"Subject: {req['subject']}\n" - f"Status: {req['status'].upper()}" - f" (step {min(req['current_step'], max(len(chain)-1, 0)) + 1} of {len(chain)})\n\n" - f"Message:\n{req['body']}\n" - ) - if req["deny_reason"]: - body += f"\nReason for denial:\n{req['deny_reason']}\n" - ok, detail = send_mail(watchers, subject, body, request_id=request_id, - attachments=load_attachments(req)) - db.log(con, request_id, - "knowledge chain informed" if ok else "mail error", - f"'{event}' to {', '.join(watchers)} — {detail}") - con.commit() - finally: - con.close() - - -def current_approver(wf, req): - chain = approver_chain(wf) - if not chain: - return None - return chain[min(req["current_step"], len(chain) - 1)] - - -def send_approval_request(request_id): - """Send the approval request to the approver of the CURRENT step.""" - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE id=?", (request_id,)).fetchone() - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - approver = current_approver(wf, req) - if approver is None: - db.log(con, request_id, "error", f"Workflow '{wf['name']}' has no approvers configured") - con.commit() - return False - con.commit() # release any pending writes before slow mail I/O - v = _vars(wf, req) - body_t = wf["approval_body"] - if "{created_at}" not in body_t: # creation time is mandatory in every mail - body_t = "Request created: {created_at}\n\n" + body_t - attachments = load_attachments(req) - rendered_body = render(body_t, **v) - ok, detail = send_mail(approver, - render(wf["approval_subject"], **v), - rendered_body, - request_id=request_id, - attachments=attachments, - inline_images=collect_inline_images(rendered_body)) - db.add_participants(con, request_id, [approver]) - db.log(con, request_id, - "approval requested" if ok else "mail error", - f"Step {req['current_step'] + 1}/{len(chain)}: approval request to {approver} — {detail}") - con.commit() - return ok - finally: - con.close() - - -def _notify_outcome(con, wf, req, new_status, decided_by): - participants = db.add_participants(con, req["id"], [decided_by]) - summary = build_summary(con, req, len(approver_chain(wf))) - con.commit() # release the write lock before slow mail I/O (mail_log uses its own connection) - v = _vars(wf, req, decided_by=decided_by, decision=new_status.upper(), - summary=summary, deny_reason=req["deny_reason"]) - subj_t = wf["approved_subject"] if new_status == "approved" else wf["denied_subject"] - body_t = wf["approved_body"] if new_status == "approved" else wf["denied_body"] - # These are mandatory in the outcome notice: append them if the workflow's - # custom template doesn't include the placeholder. - if new_status == "approved" and "{summary}" not in body_t: - body_t += "\n\nSummary:\n{summary}\n" - if new_status == "denied" and "{deny_reason}" not in body_t: - body_t += "\n\nReason for denial:\n{deny_reason}\n" - if "{created_at}" not in body_t and "{summary}" not in body_t: - # creation time is mandatory in every mail ({summary} already includes it) - body_t = "Request created: {created_at}\n\n" + body_t - rendered_body = render(body_t, **v) - ok, detail = send_mail(participants, render(subj_t, **v), rendered_body, - request_id=req["id"], - inline_images=collect_inline_images(rendered_body)) - db.log(con, req["id"], - "participants notified" if ok else "mail error", - f"{new_status.capitalize()} notice to {', '.join(participants)} — {detail}") - - -def decide(token, action, decided_by, reason=""): - """Handle a decision at the request's current step. - - A denial requires a reason (callers enforce it as a mandatory field; - this is a second line of defense). - - Returns (status, request_row_or_None, message). - """ - assert action in ("approve", "deny") - reason = (reason or "").strip() - con = db.get_db() - try: - req = con.execute("SELECT * FROM requests WHERE token=?", (token,)).fetchone() - if req is None: - return "notfound", None, "This link is not valid — it may belong to a step that was already decided." - if req["status"] != "pending": - return "already", req, f"This request was already {req['status']}." - - wf = con.execute("SELECT * FROM workflows WHERE id=?", (req["workflow_id"],)).fetchone() - chain = approver_chain(wf) - step = req["current_step"] - - if action == "deny": - if not reason: - return "needreason", req, "A reason for denial is required." - # STOP the workflow, notify everyone involved so far. - con.execute("UPDATE requests SET status='denied', decided_by=?, decided_at=?, deny_reason=? WHERE id=?", - (decided_by, db.now(), reason, req["id"])) - _record_decision(con, req["id"], step + 1, decided_by, "denied") - db.log(con, req["id"], "denied", - f"Denied at step {step + 1}/{len(chain)} by {decided_by} — workflow stopped. Reason: {reason}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "denied", decided_by) - con.commit() - notify_knowledge(req["id"], f"DENIED at step {step + 1}/{len(chain)} by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} denied at step {step + 1} of {len(chain)}. " - "The workflow has stopped and everyone involved has been notified.") - - # approve - _record_decision(con, req["id"], step + 1, decided_by, "approved") - db.log(con, req["id"], "step approved", - f"Step {step + 1}/{len(chain)} approved by {decided_by}") - db.add_participants(con, req["id"], [decided_by]) - con.commit() - - if step + 1 >= len(chain): - # Last approver — fully approved. - con.execute("UPDATE requests SET status='approved', decided_by=?, decided_at=? WHERE id=?", - (decided_by, db.now(), req["id"])) - db.log(con, req["id"], "approved", - f"Final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - _notify_outcome(con, wf, req, "approved", decided_by) - con.commit() - notify_knowledge(req["id"], - f"FULLY APPROVED — final approval ({len(chain)}/{len(chain)}) by {decided_by}") - req = con.execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Request #{req['id']} fully approved ({len(chain)} of {len(chain)} steps). " - "Everyone involved has been notified.") - - # Move to the next approver with a fresh token (old links stop working). - new_token = secrets.token_urlsafe(32) - con.execute("UPDATE requests SET current_step=?, token=? WHERE id=?", - (step + 1, new_token, req["id"])) - con.commit() - notify_knowledge(req["id"], f"Step {step + 1}/{len(chain)} approved by {decided_by} — " - f"now waiting on {chain[step + 1]}") - send_approval_request(req["id"]) - req = db.get_db().execute("SELECT * FROM requests WHERE id=?", (req["id"],)).fetchone() - return "ok", req, (f"Step {step + 1} of {len(chain)} approved. The request was sent to the " - f"next approver ({chain[step + 1]}).") - finally: - con.close() diff --git a/Approval Workflow/requirements.txt b/Approval Workflow/requirements.txt deleted file mode 100644 index be005c9..0000000 --- a/Approval Workflow/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -flask>=3.0 -werkzeug>=3.0 -gunicorn>=21.0 diff --git a/Approval Workflow/static/style.css b/Approval Workflow/static/style.css deleted file mode 100644 index 73489e0..0000000 --- a/Approval Workflow/static/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* ApprovalFlow — cool paper + ink, rubber-stamp statuses, mono ledger */ -:root, [data-theme="light"] { - --paper: #fafbfc; - --card: #ffffff; - --field: #ffffff; - --hover: #f2f6f8; - --ink: #16232e; - --ink-soft: #5a6b78; - --line: #dfe5ea; - --approve: #0e7c66; - --deny: #b3372f; - --pending: #b7791f; - --focus: #2563a8; - --flash-ok-bg: #e4f3ee; --flash-ok-line: #bfe0d5; --flash-ok-ink: #0b5c4c; - --flash-err-bg: #f9e8e6; --flash-err-line: #edc7c3; --flash-err-ink: #872a24; - --radius: 8px; - font-size: 16px; -} -[data-theme="dark"] { - --paper: #10161c; - --card: #18212a; - --field: #10161c; - --hover: #1e2a35; - --ink: #e4ebf1; - --ink-soft: #93a5b2; - --line: #2b3945; - --approve: #35b598; - --deny: #e07067; - --pending: #d9a24a; - --focus: #6aa9e0; - --flash-ok-bg: #12352c; --flash-ok-line: #1d5a4a; --flash-ok-ink: #8fd8c3; - --flash-err-bg: #3c1f1c; --flash-err-line: #6b3530; --flash-err-ink: #f0b1aa; -} -[data-theme="dark"] body { color-scheme: dark; } -[data-theme="dark"] button, [data-theme="dark"] .btn { - border-color: var(--line); background: #26323e; -} -[data-theme="dark"] button:hover, [data-theme="dark"] .btn:hover { background: #31404e; } -[data-theme="dark"] .btn.approve { background: #14523f; border-color: #14523f; } -[data-theme="dark"] .btn.deny { background: #79312a; border-color: #79312a; } -[data-theme="dark"] .btn.ghost { background: transparent; color: var(--ink); } -* { box-sizing: border-box; } -body { - margin: 0; background: var(--paper); color: var(--ink); - font-family: "IBM Plex Sans", system-ui, sans-serif; line-height: 1.55; -} -.mono, code, .ledger, .stamp, .chip { font-family: "IBM Plex Mono", ui-monospace, monospace; } -a { color: var(--focus); text-decoration: none; } -a:hover { text-decoration: underline; } -:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; } - -/* top bar */ -.topbar { - display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; - padding: .8rem 1.5rem; background: var(--ink); color: #e9eef2; -} -.brand { font-weight: 700; font-size: 1.05rem; color: #fff; letter-spacing: .02em; } -.brand span { color: #7fd6c2; } -.topbar nav { display: flex; gap: 1.2rem; flex: 1; } -.topbar nav a { color: #b9c6cf; padding: .2rem 0; border-bottom: 2px solid transparent; } -.topbar nav a.on, .topbar nav a:hover { color: #fff; border-bottom-color: #7fd6c2; text-decoration: none; } -.who { display: flex; gap: 1rem; align-items: center; font-size: .9rem; } -.who a { color: #b9c6cf; } - -.wrap { max-width: 980px; margin: 2rem auto 4rem; padding: 0 1.25rem; } - -h1 { font-size: 1.6rem; margin: 0 0 .3rem; } -h2 { font-size: 1.15rem; margin: 2rem 0 .8rem; } -.sub { color: var(--ink-soft); margin: 0 0 1.6rem; } - -.card { - background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: 1.4rem 1.5rem; margin-bottom: 1.4rem; -} - -/* forms */ -label { display: block; font-weight: 600; font-size: .85rem; margin: 1rem 0 .3rem; } -label small { font-weight: 400; color: var(--ink-soft); } -input[type=text], input[type=password], input[type=email], select, textarea, input[type=file] { - width: 100%; padding: .55rem .7rem; font: inherit; color: var(--ink); - border: 1px solid var(--line); border-radius: 6px; background: var(--field); -} -input[type=file] { padding: .4rem .5rem; } -textarea { min-height: 130px; resize: vertical; } -textarea.tpl { font-family: "IBM Plex Mono", monospace; font-size: .85rem; min-height: 110px; } -.check { display: flex; gap: .5rem; align-items: center; font-weight: 400; margin-top: 1rem; } -.check input { width: auto; } - -button, .btn { - display: inline-block; margin-top: 1.1rem; padding: .55rem 1.3rem; - font: inherit; font-weight: 600; border-radius: 6px; cursor: pointer; - border: 1px solid var(--ink); background: var(--ink); color: #fff; -} -button:hover, .btn:hover { background: #223546; text-decoration: none; } -.btn.approve { background: var(--approve); border-color: var(--approve); } -.btn.deny { background: var(--deny); border-color: var(--deny); } -.btn.ghost { background: transparent; color: var(--ink); } -.btn.small, button.small { padding: .3rem .8rem; font-size: .82rem; margin-top: 0; } - -/* the signature: rubber-stamp status */ -.stamp { - display: inline-block; padding: .1rem .55rem; font-size: .72rem; font-weight: 600; - letter-spacing: .12em; text-transform: uppercase; border: 2px solid; - border-radius: 4px; transform: rotate(-2deg); -} -.stamp.approved { color: var(--approve); border-color: var(--approve); } -.stamp.denied { color: var(--deny); border-color: var(--deny); } -.stamp.pending { color: var(--pending); border-color: var(--pending); } -.stamp.big { font-size: 1.1rem; padding: .3rem 1rem; } - -.chip { - display: inline-block; font-size: .72rem; padding: .05rem .5rem; - border: 1px solid var(--line); border-radius: 999px; color: var(--ink-soft); -} - -/* tables */ -table { width: 100%; border-collapse: collapse; font-size: .9rem; } -th { text-align: left; font-size: .72rem; text-transform: uppercase; letter-spacing: .08em; - color: var(--ink-soft); padding: .5rem .6rem; border-bottom: 2px solid var(--line); } -td { padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; } -tr:hover td { background: var(--hover); } - -/* ledger (audit log) */ -.ledger { list-style: none; margin: 0; padding: 0; font-size: .85rem; } -.ledger li { - display: grid; grid-template-columns: 175px 170px 1fr; gap: 1rem; - padding: .55rem .2rem; border-bottom: 1px dashed var(--line); -} -.ledger .t { color: var(--ink-soft); } -.ledger .e { font-weight: 600; } -@media (max-width: 700px) { .ledger li { grid-template-columns: 1fr; gap: .1rem; } } - -/* stat row */ -.stats { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.5rem; } -.stat { flex: 1 1 120px; background: var(--card); border: 1px solid var(--line); - border-radius: var(--radius); padding: .8rem 1rem; } -.stat b { display: block; font-size: 1.5rem; font-family: "IBM Plex Mono", monospace; } -.stat span { font-size: .78rem; text-transform: uppercase; letter-spacing: .08em; color: var(--ink-soft); } - -.flash { padding: .7rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: .92rem; } -.flash.ok { background: var(--flash-ok-bg); border: 1px solid var(--flash-ok-line); color: var(--flash-ok-ink); } -.flash.error { background: var(--flash-err-bg); border: 1px solid var(--flash-err-line); color: var(--flash-err-ink); } - -/* login */ -.login-box { max-width: 380px; margin: 12vh auto 0; } -.login-box .brand-lg { font-size: 1.7rem; font-weight: 700; } -.login-box .brand-lg span { color: var(--approve); } - -.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1.5rem; } -@media (max-width: 700px) { .grid2 { grid-template-columns: 1fr; } } - -.rowline { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; } -form.inline { display: inline; } -details { margin-top: .4rem; } -summary { cursor: pointer; font-size: .85rem; color: var(--focus); } -.muted { color: var(--ink-soft); font-size: .85rem; } -.pre { white-space: pre-wrap; font-size: .9rem; background: var(--hover); border: 1px solid var(--line); - border-radius: 6px; padding: .8rem 1rem; } - -@media (prefers-reduced-motion: no-preference) { - .stamp.big { animation: stampIn .25s ease-out; } - @keyframes stampIn { from { transform: rotate(-2deg) scale(1.6); opacity: 0; } - to { transform: rotate(-2deg) scale(1); opacity: 1; } } -} - -/* footer */ -.footer { - max-width: 980px; margin: 0 auto; padding: 1.2rem 1.25rem 2rem; - font-size: .8rem; color: var(--ink-soft); text-align: center; - border-top: 1px solid var(--line); -} - -/* theme toggle */ -.theme-toggle { - margin: 0; padding: .15rem .55rem; font-size: 1rem; line-height: 1; - background: transparent; border: 1px solid #4a5b68; color: #b9c6cf; - border-radius: 999px; cursor: pointer; -} -.theme-toggle:hover { color: #fff; border-color: #7fd6c2; background: transparent; } -.theme-toggle.floating { - position: fixed; top: 1rem; right: 1rem; z-index: 10; - border-color: var(--line); color: var(--ink-soft); -} -.theme-toggle.floating:hover { color: var(--ink); border-color: var(--focus); } - -/* email image library */ -.imggrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } -.imgcard { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--field); } -.imgcard img { display: block; width: 100%; height: 110px; object-fit: contain; background: #fff; } -.imgmeta { padding: .5rem .6rem; display: flex; flex-direction: column; gap: .35rem; font-size: .78rem; } -.imgmeta span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.imgmeta .tag { - background: var(--hover); border: 1px dashed var(--line); border-radius: 5px; - padding: .15rem .4rem; cursor: copy; word-break: break-all; white-space: normal; -} diff --git a/Approval Workflow/templates/account.html b/Approval Workflow/templates/account.html deleted file mode 100644 index 90eb590..0000000 --- a/Approval Workflow/templates/account.html +++ /dev/null @@ -1,96 +0,0 @@ -{% extends "base.html" %} -{% block title %}Configure profile — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Configure profile

-

Signed in as {{ user.username }}

- -
-

Profile

-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- -
-

Change password

-
- -
-
- - -
-
-
- - -
-
- - -
-
- -
-
- -
-

Two-factor authentication (MFA)

- - {% if user.mfa_secret %} -

enabled

-

Signing in requires your password and a 6-digit code from your authenticator app.

-
- - - - -
- - {% elif setup_secret %} -

1 — Scan this QR code with Google Authenticator, Authy, 1Password, or any TOTP app. - If you can't scan, enter the secret manually.

-
-

Secret: {{ setup_secret }}

-

2 — Enter the 6-digit code the app shows to confirm.

-
- - - -
-
- - -
- - - - {% else %} -

disabled

-

Add a second sign-in step: your password plus a 6-digit code from an authenticator app on your phone.

-
- - -
- {% endif %} -
-{% endblock %} diff --git a/Approval Workflow/templates/admin.html b/Approval Workflow/templates/admin.html deleted file mode 100644 index d42a305..0000000 --- a/Approval Workflow/templates/admin.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}Workflows & requests — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Workflows & requests

-

Create workflows, watch every request, and open any of them for the full audit trail.

- -
-
{{ stats.get('pending', 0) }}Pending
-
{{ stats.get('approved', 0) }}Approved
-
{{ stats.get('denied', 0) }}Denied
-
- -

Workflows

-
- - - {% for w in workflows %} - - - - - - - - {% else %} - - {% endfor %} -
NameApproval chainKnowledge chainStatus
{{ w.name }}{% if w.description %}
{{ w.description }}{% endif %}
{% for a in w.approvers | fromjson %}{{ loop.index }}. {{ a }}{% if not loop.last %}
{% endif %}{% endfor %}
{% for a in w.knowledge | fromjson %}{{ a }}{% if not loop.last %}
{% endif %}{% else %}{% endfor %}
{% if w.active %}active{% else %}paused{% endif %}Edit
No workflows yet — create the first one.
- New workflow -
- -

Requests

-
- - - {% for r in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
#WorkflowFromSubjectStatusReceived
{{ r.id }}{{ r.wf_name }}{{ r.requester }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
No requests yet.
-
-{% endblock %} diff --git a/Approval Workflow/templates/base.html b/Approval Workflow/templates/base.html deleted file mode 100644 index 26533d9..0000000 --- a/Approval Workflow/templates/base.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -{% block title %}MartinhalApprovalFlow{% endblock %} - - - - - - -{% if session.get('user_id') %} -
- MartinhalApprovalFlow - -
- - Configure profile - {{ session['username'] }} - Sign out -
-
-{% else %} - -{% endif %} -
- {% with msgs = get_flashed_messages(with_categories=true) %} - {% for cat, m in msgs %}
{{ m }}
{% endfor %} - {% endwith %} - {% block content %}{% endblock %} -
-
© 2026 Martinhal IT - Joao Vaz - Version 9.3
- - diff --git a/Approval Workflow/templates/decision.html b/Approval Workflow/templates/decision.html deleted file mode 100644 index 4e54315..0000000 --- a/Approval Workflow/templates/decision.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "base.html" %} -{% block title %}Decision — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/templates/index.html b/Approval Workflow/templates/index.html deleted file mode 100644 index 00215d2..0000000 --- a/Approval Workflow/templates/index.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "base.html" %} -{% block title %}New request — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Send a request for approval

-

Pick a workflow, write your message, and it goes straight to that workflow's approver.

- -{% if workflows %} -
-
- - - - - - - - - - - -
-
-{% else %} -
-

You don't have access to any workflow yet. Ask an administrator to grant you access.

-
-{% endif %} - -{% if my_requests %} -

Your recent requests

-
- - - {% for r in my_requests %} - - - - - - - - {% endfor %} -
#WorkflowSubjectStatusSent
{{ r.id }}{{ r.wf_name }}{{ r.subject }}{{ r.status }}{{ r.created_at }}
-
-{% endif %} -{% endblock %} diff --git a/Approval Workflow/templates/login.html b/Approval Workflow/templates/login.html deleted file mode 100644 index 6254420..0000000 --- a/Approval Workflow/templates/login.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base.html" %} -{% block title %}Sign in — MartinhalApprovalFlow{% endblock %} -{% block content %} - -{% endblock %} diff --git a/Approval Workflow/templates/mail_status.html b/Approval Workflow/templates/mail_status.html deleted file mode 100644 index 929da67..0000000 --- a/Approval Workflow/templates/mail_status.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "base.html" %} -{% block title %}Mail status — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Mail status

-

Every email the app tried to send, with its delivery result and whether a copy was saved to the Sent folder.

- -{% if not configured %} -
Mail account not configured — MAIL_USER is empty, so messages are printed to the server console (dev mode) instead of being sent.
-{% endif %} - -
-
{{ stats.get('sent', 0) }}Sent
-
{{ stats.get('error', 0) }}Errors
-
{{ copy_fails }}Sent-copy failures
-
{{ stats.get('dev', 0) }}Dev mode
-
- -
- - - {% for m in rows %} - - - - - - - - - {% else %} - - {% endfor %} -
WhenToSubjectRequestDeliverySent folder
{{ m.at }}{{ m.recipients }}{{ m.subject }} - {% if m.detail %}
{{ m.detail }}{% endif %}
{% if m.request_id %}#{{ m.request_id }}{% else %}—{% endif %} - {% if m.status == 'sent' %}sent - {% elif m.status == 'error' %}error - {% else %}dev{% endif %} - - {% if m.sent_copy.startswith('saved') %}{{ m.sent_copy }} - {% elif m.sent_copy.startswith('failed') %}copy failed
{{ m.sent_copy }} - {% else %}{{ m.sent_copy }}{% endif %} -
No mail has been sent yet.
-
-{% endblock %} diff --git a/Approval Workflow/templates/request_detail.html b/Approval Workflow/templates/request_detail.html deleted file mode 100644 index b6e8c1c..0000000 --- a/Approval Workflow/templates/request_detail.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends "base.html" %} -{% block title %}Request #{{ req.id }} — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All requests

-
-

Request #{{ req.id }}

- {{ req.status }} -
-

Workflow {{ req.wf_name }} · received {{ req.created_at }}

- -
-

From: {{ req.requester }}
- Subject: {{ req.subject }}

-
{{ req.body }}
- {% if attachments %} -

Attachments (included in every approval mail):
- {% for att in attachments %} - {{ att.name }}{% if not loop.last %} · {% endif %} - {% endfor %} -

- {% endif %} - {% if req.decided_by %} -

Final decision by {{ req.decided_by }} at {{ req.decided_at }}

- {% endif %} - {% if req.status == 'denied' and req.deny_reason %} -

Reason for denial:

-
{{ req.deny_reason }}
- {% endif %} - {% if req.status == 'pending' %} -
-
- - Same effect as the current approver's email links. -
-
-
- - - -
- {% endif %} -
- -

Approval chain

-
-
    - {% for a in chain %} -
  • - step {{ loop.index }} / {{ chain | length }} - {{ a }} - - {% if req.status == 'denied' and loop.index0 == req.current_step %}denied here - {% elif loop.index0 < req.current_step or req.status == 'approved' %}approved - {% elif loop.index0 == req.current_step and req.status == 'pending' %}waiting - {% elif req.status == 'denied' %}never reached — workflow stopped - {% else %}not yet reached{% endif %} - -
  • - {% endfor %} -
-
- -

People involved so far

-
- {% for p in participants %}{{ p }} {% else %}None recorded.{% endfor %} -
- -

Full log

-
-
    - {% for l in logs %} -
  • {{ l.at }}{{ l.event }}{{ l.detail }}
  • - {% endfor %} -
-
- - -
-
-{% endblock %} diff --git a/Approval Workflow/templates/users.html b/Approval Workflow/templates/users.html deleted file mode 100644 index 3f658f9..0000000 --- a/Approval Workflow/templates/users.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "base.html" %} -{% block title %}Users — MartinhalApprovalFlow{% endblock %} -{% block content %} -

Users

-

Create accounts and choose which workflows each user can send requests to. Admins can use every workflow. Users fill in their own details (name, unit, e-mail, MFA) on their Configure profile page; you can disable MFA here if someone loses their device.

- -
-

Add a user

-
- -
-
-
-
-
-
- - -
-
- -{% for u in users %} -
-
- {{ u.username }} - {% if u.first_name or u.last_name %}{{ u.first_name }} {{ u.last_name }}{% endif %} - {% if u.unit_location %}{{ u.unit_location }}{% endif %} - {% if u.is_admin %}admin{% endif %} - {% if u.mfa_secret %}MFA on{% endif %} - {% if u.email %}{{ u.email }}{% endif %} - - {% if u.mfa_secret %} -
- - - -
- {% endif %} - {% if u.id != session['user_id'] %} -
- - - -
- {% endif %} -
- - {% if not u.is_admin %} -
- - - - {% for w in workflows %} - - {% else %} - No workflows exist yet. - {% endfor %} - {% if workflows %}{% endif %} -
- {% endif %} - -
- Reset password -
- - - - -
-
-
-{% endfor %} -{% endblock %} diff --git a/Approval Workflow/templates/workflow_edit.html b/Approval Workflow/templates/workflow_edit.html deleted file mode 100644 index 47202ae..0000000 --- a/Approval Workflow/templates/workflow_edit.html +++ /dev/null @@ -1,99 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ 'Edit' if wf else 'New' }} workflow — MartinhalApprovalFlow{% endblock %} -{% block content %} -

← All workflows

-

{{ 'Edit workflow' if wf else 'New workflow' }}

-

Each workflow has its own allowed sender domain, its own approver, and its own email wording.

- -
-
-

Basics

-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- -
- -
-

Email wording

-

Placeholders: {workflow} {requester} {subject} {body} {request_id} {step} {total_steps} {decided_by} {created_at} {summary} {deny_reason} {approve_url} {deny_url}. Leave a field empty to use the default.

- - - - - - -
-
- - - - -
-
- - - - -
-
-
- - -
- -
-

Images for email bodies

-

These images can be used in the approval request body, approved notice body and - denied notice body above. Copy an image's tag into the text where the image should appear — - it is embedded in the email at that spot. PNG, JPG or GIF, up to 2 MB each. The library is shared by all workflows.

- - {% if images %} -
- {% for name in images %} -
- {{ name }} -
- {{ name }} - {{ '{image:' + name + '}' }} -
- - - -
-
-
- {% endfor %} -
- {% else %} -

No images uploaded yet.

- {% endif %} - -
- - - -
-
-{% endblock %} diff --git a/Approval Workflow/totp.py b/Approval Workflow/totp.py deleted file mode 100644 index 909a241..0000000 --- a/Approval Workflow/totp.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Time-based one-time passwords (TOTP, RFC 6238) using only the standard -library. Compatible with Google Authenticator, Authy, 1Password, etc.""" -import base64 -import hashlib -import hmac -import secrets -import struct -import time -from urllib.parse import quote - -ISSUER = "MartinhalApprovalFlow" - - -def new_secret() -> str: - """A new base32 secret to enroll in an authenticator app.""" - return base64.b32encode(secrets.token_bytes(20)).decode() - - -def _code_at(secret: str, counter: int) -> str: - key = base64.b32decode(secret + "=" * (-len(secret) % 8), casefold=True) - digest = hmac.new(key, struct.pack(">Q", counter), hashlib.sha1).digest() - offset = digest[-1] & 15 - number = (struct.unpack(">I", digest[offset:offset + 4])[0] & 0x7FFFFFFF) % 1_000_000 - return f"{number:06d}" - - -def verify(secret: str, code: str) -> bool: - """Check a 6-digit code, allowing one 30s step of clock drift each way.""" - code = (code or "").strip().replace(" ", "") - if not (secret and code.isdigit() and len(code) == 6): - return False - counter = int(time.time() // 30) - return any(hmac.compare_digest(_code_at(secret, counter + drift), code) - for drift in (-1, 0, 1)) - - -def otpauth_uri(username: str, secret: str) -> str: - """URI encoded as a QR code for authenticator apps.""" - return (f"otpauth://totp/{quote(ISSUER)}:{quote(username)}" - f"?secret={secret}&issuer={quote(ISSUER)}&algorithm=SHA1&digits=6&period=30") diff --git a/Barcode/.dockerignore b/Barcode/.dockerignore deleted file mode 100644 index ec790d1..0000000 --- a/Barcode/.dockerignore +++ /dev/null @@ -1,38 +0,0 @@ -# Version control -.git -.gitignore -.gitattributes - -# Documentation that doesn't belong in the image -README.md -LICENSE -CHANGELOG.md -docs/ - -# Editor / OS junk -.vscode -.idea -.DS_Store -Thumbs.db -*.swp -*.swo -*~ - -# Local env files (use .env at the compose level, not inside the image) -.env -.env.local -.env.*.local - -# Build artefacts that shouldn't be shipped -node_modules -dist -build -*.log -npm-debug.log* - -# CI -.github/ - -# Test outputs -coverage/ -.nyc_output/ diff --git a/Barcode/.env.example b/Barcode/.env.example deleted file mode 100644 index c86015c..0000000 --- a/Barcode/.env.example +++ /dev/null @@ -1,5 +0,0 @@ -# Copy to `.env` and tweak as needed. -# These values feed docker-compose.yml. - -# Public port on the host machine. Defaults to 8080. -HOST_PORT=8080 diff --git a/Barcode/Dockerfile b/Barcode/Dockerfile deleted file mode 100644 index f6561ae..0000000 --- a/Barcode/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -# ============================================================================= -# Cipher Barcode Studio — production image -# Base: nginx 1.30.1 on Alpine 3.23 (unprivileged variant — runs as UID 101) -# ============================================================================= - -FROM nginxinc/nginx-unprivileged:1.30.1-alpine3.23-slim - -# OCI labels for traceability -LABEL org.opencontainers.image.title="Cipher Barcode Studio" \ - org.opencontainers.image.description="Static web app for generating barcodes in 22 symbologies and exporting JPG/PNG" \ - org.opencontainers.image.version="1.0.0" \ - org.opencontainers.image.licenses="MIT" \ - org.opencontainers.image.source="https://example.com/cipher-barcode-studio" - -# The unprivileged image runs as user 101 (nginx). All file ops use --chown. -USER root - -# Apply the latest Alpine security patches at build time, then strip the cache -RUN apk update && apk upgrade --no-cache && rm -rf /var/cache/apk/* - -# Replace the default nginx config with our hardened one -COPY --chown=nginx:nginx nginx/nginx.conf /etc/nginx/nginx.conf - -# Copy the static site -COPY --chown=nginx:nginx web/ /usr/share/nginx/html/ - -# Make sure runtime dirs the unprivileged user needs are writable -RUN mkdir -p /tmp/client_body /tmp/proxy /tmp/fastcgi /tmp/uwsgi /tmp/scgi \ - && chown -R nginx:nginx /tmp/client_body /tmp/proxy /tmp/fastcgi /tmp/uwsgi /tmp/scgi /var/log/nginx \ - && chmod -R 755 /usr/share/nginx/html - -# Drop back to the non-root user for runtime -USER nginx - -# Internal port — unprivileged nginx listens on 8080 -EXPOSE 8080 - -# Healthcheck driven by /healthz from nginx.conf -HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD wget --quiet --tries=1 --spider http://127.0.0.1:8080/healthz || exit 1 - -CMD ["nginx", "-g", "daemon off;"] diff --git a/Barcode/LICENSE b/Barcode/LICENSE deleted file mode 100644 index 8d15c60..0000000 --- a/Barcode/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -MIT License - -Copyright (c) 2026 Cipher Barcode Studio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- - -Third-party software shipped with this project retains its own license: - -* JsBarcode (MIT) — https://github.com/lindell/JsBarcode -* bwip-js (MIT) — https://github.com/metafloor/bwip-js -* nginx (BSD-2-Clause) — https://nginx.org/LICENSE diff --git a/Barcode/OLD_VERSIONS/Barcode.zip b/Barcode/OLD_VERSIONS/Barcode.zip deleted file mode 100644 index 8c791b360808fbcd32fb016ff35d33c7dc3d31bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291050 zcmZUZW3Xtwwx*YD+qP}nwrzVa+qSK}Y}>YN+pE8O`rhhuZl@}l^T(U2R5G7Al6OQw z8W;ox;J?a;Rin%!&cbkMwx zW@&764#Q^woy24H&R7e$sHPco%O%%Z5i@D9MS%ivZ!^XPe~6goI>#0qMEUAAkdE~Y zV_OV%v)~GRwQBUPS~A%4SW_$O2)w>LY5E&`>PrTDsbID_p|KAs&9nN3`Hf!AX~9Mr zz`EqWvAn9~R49!f#zwIyR50+`CKGzVo`s{y4mUpQ(HINFHzZKbWJh8yWe-P8J~JnqQ=xi1u?DBZm~C;TpT+;O5X%UW;O3}-YR!t+kX6f^$-|Pn9XT~J zO(&MWQd+o%PJciL4bw=6ikQfINMa_{`-LxgG_YHboqMU7s#-l)@?W=B>|TExxdQy> zc&QI&u9$%V0C>Ow0I>dTy#M!Wpf$F)b+C6frSr74sZrUCU1UJ;omGzpLLx|D14UCn zfUopL*Q&-PvTk41dy9pfLnti*Gn3rhS%B?sEHKKS#2r} znIrpIoUAM3+()J6YY3GFrA%vfTsq_qTwG2#_BMmXlNdC(^S2Gr#K!0m}@Os^S9J)LxeCXtG2hSuJFFL)Zc3G*Y(+ zprR{wq9@ql_b`iDBRLBE-mRgEpv+nH*GEKz460@Wm!wW2aFa6**QVGWptUqb$LlUf zlUu_Yx-!+udp6)O)pJMTWaZhEtlTuXvTrlK?dq?pGUtg)?bS)aLYt@@K6 zyT``$v|W0R^9Xh}x&5!#FxWHtBKdawZN@U#9oRJ-T``pQ-c((RP04QenKE@CliH2~ zp%sdV9T5tVWj;bkREqrgaFw*6$LE)xt`3Y}ZTTn?s?SA9^D^#I6S)w5kj~|?8 z9m=Q@HostEYoJY3w=HUvceU@_xdA6@#Z|F;YnFJv<+I&TbI|<|?9*zg^TaHOIIi-H z+{Bl_mSGufLYK$WSK<({K{oJ|bWN;rGWjS29)AZ<;zUU8CGq#}%K@UEf~1o4AIB#& zqtjTtrgl{E(H7AwU?#rv2Vuu9^x?R;?lEVR8vAnCch;@dqp5{OckoB3>`++8DU`ST zv+Z~A)*!nV3}YTVT-YM{_w!@TAA|?l7(TzK1MB$1743+d<3fH8VL#g~cxK=Gv-RrY zT_V^d&)Y-opLTbIQvs5ql8;oo_~H4&Ao7GPF9J@&aRLctC(Ai0S}G1lUs05gn3mN~ zbsjk_C6o06H~P3TUO{Rq?U;4^|3vL!3AWteAJp*wK@I8OP!svrkJrr7#t@0Oz%5zEa+}k)iKye8=W3SB z6;K;36#;W@sHj;7s@F35a|E@?kftCm&JA~D`rrd=|& zfma%wfqQ%GVVh`5bW2C`H(zNpc{@1s^nChwhqdD`G3{ulDjj|TgOhSv!uvLIs{1_w zd)a}BMdsCoSeczfn$@sJMcaBJl}|q2Y;xjPLYurV6>cLdM!8ZF3KBtUt$i$aXg?in_YKw}PEXM>xFEs+u8Ga2W>ra3Iu;^KnqIuA{l5d%(=cD@H;v ziF+*y1H&(u8_!^7npm;dS5A>Ls0$42zuw&ZyTXVFXptm7=yKpSrVC8UDw4q_-9URQ zDr4Ogxs(b7ZL^j?&@vc4CDu}xPyk$r$aMlzA*e8G*uul(^(Wz&Xnl6k`w4ehUjd{8 z1(^QNZVWqp4DR?{(N!1BpEzt$O(9MXbuXa6&2Zf_Rm>pVI%Fu8HWgB%n8bt`<+sZe z9P2Vf&;*$g?82O7E0ackLi{n>Lm7DW;`-JN-)A%X_ExPP64Eh6PfQWiWjOBNdV+=0?z0dRe=jGxg%DlTnGif0Z?3kDT#_$bQnN>35ri0e)EOlu~A z6jR2vFv$VVcKD>O82kRZvTE5yo?M>^KfwRwkw%9?74jb*SwH~*;Qx(B8A)MLIb~5_ zmFfSAcRin!V%{5~=V;df!0haft)VOx*~zAHb_Z-?mN@HhruP3Lk>RBUG+0En;=!XQ z@7-~=D^!Qw${{j-DVkmlp9{Wq8keWb*8{u)kK5Fc(AHQBG$l{V7Gj;kduhg!+273{ z)9MunoErS^2FQyVC4;vGmnA$EpuGSbJpwu)HLrq}XXsEsABgQ19 zx3arg$f=>FVQOKKTi!xeU5VU}s)lb&$Ne5nSTtR523>N`PRCs9uXW0&p#^j;>OYFH zun#kbd(BsdENo}r$|t-Re=$^!8~h3b0sk5hPssBaV{Xks&9X!C+I|!{p41&IGE^P)$?nlgH1q`kElB5=9ZDySahO zQ=i6O4NBK9yHF24Uw6#Au*D*CjwY|LUJo@xaSc$S~XAW|z+q%7;{EVd-mrpJekXT!|tm`&4=a`J~4jqjf zk0kR{$N3u?67cL*UL&A{Tn;=)^Fkt{4nI+Vh~RQfp{$fkvi( zjrFS8YPjTF{rG+BQZ+LA^&CE05D6v$wYhF&6;d0@VYhw@CmEzD9vt?$e{c^RE*Y(& zrh{?Y`h`znhj_r*kd=Qd+%$_g9MBblGC?67H^41E@;s1y)IXGN;dmJ#YO~Ugg?&bY zU&#j{=JD_@k)U`xj+ky0go-q2+kz#exLByZ^6bK*4GpQNLEuEEiz)X`)MBsn_||qy zg<%hcLTi56=!?pLANkK1<14p=ehrCt;LbZ2#$A(Ptj5LUv`kq=X`l)ieW z9Y|H@g?`m+)l3)_cJAHrs0y2XXX}mAM_eu&AHwvYc*jRxc@LT zAG0~JCS`1`;egmsI+sZWs~FxL&=IqE%S-QA5h{*(e`e=%7N7SC{Mb{A$QseUmb9uo ztvBh^eSwDr9ZgHLET?*rz*NjyO%O0TtkL}b3NZViwKhYqdD;abSZk{cd^;3vEY;#N z`>X=UmWyj%oSKR2nmq$NWJK7dBPH~h2Wf}V-(&R)NU-)J6Wj3$!n`y@Npx6~cnT$h z<&|ZthEE{u06D*qZbU+3#%``bX%gERDrO*V;uH%cO6Q$bjqszaTEtp+?{xL5`*#q=K=@41NOyPz`dd5p(-}Aml%fP z`fM8u!Mb931b2&bloEyrZ+#@kx%sYS8OB7)FxrfLHk()80;$TRbNO-Gd~nevw| zzrdJdp-5%pqdwG?HErM9I`xgGwkolVHb9p8!4}{Hz$Bcz!v&31W^-oovV39o12kxa zaFnP-G=RfSijMfqR)*h6CEzpa6#9?W$AO|V8Dd0NjRKeyp>8h!pN{m-+)lA~hmt;c z+(mQ5mOr%_EHMkhenQMRMTk^y)6(d*IvreD(&nvRJTvW zS+8T{c#xS6oG;Ks?YBX@6CNWmR<09&NRQ1`KQXZ|f0DF(^D>wozI2K*lrk~wP*?m_ zQgvoTYq2Nha*B_`tF(I*anyzf3EeG1w9gmCsv_lBu8}_S%4{L%^xFLp5do|(JDTMZ z@O>K=pD>wvEVmLG{y^kl+NM$3;e>_Ia0(3Z9J@i$>kgk&kNj%=%rCmckCAT zntzavK6HrcuJ~-4f6WwotR{X>G<;^OwhY~H$RxzY3?TZqwcAKIo`)?+8KZ$_v}@ou zS3NQDU1hX(&cAQY%*x=4doLyYhOgp)=aLk2=O|RIJ`5GGc9!;SSKKv9z1M!j_g_Y%L!zj2;&|L4}TBZKEg9vuKcfExe+@!tZYlBl4F ztSFtW$+otn^Q8zv&!swy9O_ViVq;xq352A-z>akIpqfBIJ!^}oiKGPyxfyjNFgYBG zC?L38cDwUF$ZxRzz$!0uVs>zyN_~<!8FPr+MisUQI+dM_z@{*IT!T7TO_=l97g* zVz%c_?HpCc+aV3DX?A5fxtOS1f$Dx-v04Jg`n_^WrBJFS;Y0=v=m@=vqLpIhq*6X> z%}HhWsQ-&x$wK`Ck=&$=jeQhFu8c~-LPKat+M{Bs$s$IP2^OSlhB=IN>4}gPqA9v% z; z$^JPJojK98065n|x%g}X4QWl2cyc}}5x?Y00imUW#cg__rTV9+($e70H5N_Om!sW@QiN(II%%qbuu(-g#}? z>2vt_cg(sOLacSJxz>A8u@Vb=#3+I6_lODiM6a{Q3HiN?njCcVl~?ZVXKrf?*^I|v zW5n8E>V99-sV(TivpEU{9ST|tTYa3aJvQzjRaua-;;h%!_SwizWDjMm-Gok0vIB@=sKQUjC}ViI;+|6n%ZY2qd&*4oH6orQrb<5h1I z+)pZS@__xc15;ItzLf*Ld#9B6rsx9@V8GqFVJ#K-7j(C}Tlx)S-xIiM2W#ZMIA_zd zlJN}h0zIzOG^aZ{4CJ?)v2-|@Qe!P)Q*NI>J59z&xa*n;svIV~lT28F^T$@uBiDBw zXjJ1)8}>w9p2GaNvkAs+tdlCVY))SXp4djl#@?S~?YnCTTxph4Pv}q&8Bck*cF!U} zf+?c>az#+$2$RL+4;dhbd+dWJBs8U)pGI`^zLXHPa2WH7T?z`MPPsu5k3zIYu7E7f zD641pER%E^#_9c_Ia2*fyt5VwM0B@{#Td&NI5vI!w3GMIOZmKD&|GO9Dk3e*9w4Cb zo~lrq6qZj}Lo!%IVo-_F#0A&+M;AGmlLLjE0WOPKiq)oUAyUlc=~hb3jTp=j)76=i zOWYY>6KoR}Q?2&hz67=Yr8R3v`J zv}hb3)dKd3F{B1{vi?2vMEq%>!S43Iweh5w8BDp<^?n6n`5;>1v1uznI07+)N}`e1 zlw&{ViD##Xm^qMK9ielb&CiV7(*Df=lY;Gl(Mvu!_Zae8fRHkifz@|P#fu!>FhkoT zCX6+md z-&t&qeYZ37ppZulyaZw9N}5FUw9`14@H&I3K)37iCUH{}TWaT$cQrM~hs#PH((bALXo@AI_#^@&;jtMRpw zR~ADPzWHO&6LNpM6E<6`_{msd;fgsm;YqZj&xP`e-M!Q8+q}9z_h%P_=fLwiIaq@| zbe+Nc6<+XjKnPoRsQtI4l<~3yE#K zw?$W;eEp2gBD8vU=k(9T?J8^YAI6;B@2^ecpQqiwyjsKd413Pz=Hy1c!)NuP*FPsm z^nc#?Evl>qFXDEwmFZgobEXZVc1#nK9@~&@ZoeXXKHiJ$W5@|vvjN|N9Zn=+ucB(E zYii%7jVtUfC`?)Lj=0gwd0Zv7kB zc>)CZ*?F)J$fsQ*Wq@+^p7SV=blyif!-Or?x%v3^^A?kOrJa5jdi5J=U*MD|M%*q8 zjf-AT4x6s`G0hXTvE&YvMUV*G?3X0+(cklV5UI>kAmQts?|Z$&J6=uL;f{+WN6u<_jP zbWw5?NX%z|GCTtAKl#SS_VDY7OgiJC^Byo2MB5x7B@?lJ!E?_#kGeM4oaqHNRxWm9 z3c+Ru{k7#4amh8A1Q2Mb6i_0&im1yzMaI=4*K^1GaK_yFJS;GXYw7^m?JwabL-Pe? zO9z^KRu2{5)P-4-mAx5LG)W=~omkxF#(0#@XG|y+u%e{GaThE|~ z10;@qYnD<^c6vVu&fYGHbHMZ7$LC|P7{f_spQ2F6KPWdN(CMikwOHIKbj6&7`GHOfc&}V&QM8+vX zG%i7$F?SMNHQqeOb%eu}L{!|*h_WfFmTjHN9;xZ5;z>06?6P0#+;NYkK;Gt&2h7~% zXQD=@b+9;L&HC91W=)_cwHxD{q>%3)(!b`DqVBkxzS!kDBI_K>E)d5aYj^VmfaO{6 zY>ZwS3Dc>)1|vL3zr%q(1REe*cNfKNl%%bIm;GaSo2^0$+9m*m2o;u=}?A5U-@XA}3r>k-z=$OY5>JB3U#pJshW7mFobEPnx8Jl7SrJh&w zz0r*JEgY59gmSe;Ge9u55`7_sx=~Mo>MyI>&_M;=dXaS2d)0)u=}(3bwi0NvL3d%A z)??g10pUX=#y+>lSr{+sD$w0m}$dt#*(s8rBLNVV~h6B0u0P-`f9A4g-VT zvlIaLyvY$oxo^}4SRe~Q-|Ek=@d421C>x9Tyhsp*RqPmG%TF(87rC=`$zgfw-T?KV zs9bOg3q0Iz%!UkUW^9b;ZIDW5d1y(jSV2XkUbx_p!a(pxqyQJ64>Y6L{^xQ}fv3)t z4GGXxcR5hfc#j99I;B3@`T?^$0yW6*ZDi*+*5L+70to+@k$8hrBOtRZ*tkWq;$SB>2a_7 zW+*N@>KZI8sCOfKZ{(OHcy46{8qkMkmdQ_PV~J1gG)v})M+c%3JBkq7Z#Jn3p&p?h z>(E3tty-8T(&oT3cyEARTcGw~F64wm2lVhOx3>KmZN`+cVj;k6aKI8YYDOzxQon8?=#HV%9}WtUev!Zn{dDfsqy)eVfKdqoFvF{2NU`8p3HY zF9j7$)ZMFq9FX6v2(`ad2!~YNs%EEG3R%9sbYzr9Vs;PYD6(fZdlRu@eprUAf~L20wK!Y4ii2jor%w(W=(9J&IlfVpYVoF*0ZqH7u%LKh>UHA70eO$Sas5^n2Q zv+*u6<0(4Wa5ZRV?S8%j&o_6D#3}Njg~`e<@Yu$9N(I|{AR~sXPUCoVfO4ApHSqHA zodiaq4Di?m=1!*x;6hjNGYCX>QaPiMaH_#p~RM0V|X&=$%6N2;fD{^H3bCd z&=!5`+-xn|c}|_PAJvy~PBgaR$4X(@utcb@){6CtkF|<%i2C7-oEYp}8$mS&%xgB; zH7bc(Rm|qWxyk^V`zdvh(!xWx0jiz$EYkw%M3L{n&bYzmmYLJjdM7AC0?mq{sq*F~ zw2b=F#zhy{SaD&^hCb0Rf3NvF2)xKR7roGf`^JGgPn}~`nWOEu9zMVnr^rHEOHkLo zel{h@p!e+v=Y@F;4|zh0FWkrsZjXT(0p-s(9H7zKsw%dVFu+kb<8_wl-ibgc8JH8O z)+w1tL6Wvo2q*D6#;K{z)ss+Tcw4mKGv`r6C2%vz>+S4f6u^>b(&KGl?_aoPEx!;j zY4c49zotQXFHuc~oBl5NU3;<;Yg*QEHrK*=yU9R!3W&}t^nQ+mX7 z1KEh>TbpX_TK}W1EqV6BkYhokjr`8rC(Dqz*vl41>0AIc|13~vDnG%qEv4T59zZ%r zXkdb7wQ816!+bpF_~BNzd>8&_*}X&s|CFZPti_2>;-LQ&PZ~$hg0+X+OFF@DhhpV0 z_z;AXv0cOc3tg$TSR9Sb`ig_d!IFAm_cXh%5XNa`@Rx6l5zJK7h!OT3hKWnl#0fKK z^PfBvqOER(nJgqr;QQ8o5}k*&R6= zXiP&b*C%pUleKd}fJXbr%gh<_YxgUjC$gPAUX{4`c6R85^6>bDzOJs}$KRTpx!S(^=9spa+N|aG39_^gYj1~1sA1p! z%Pf1aWDFKav!)*LdHQ$cGMvvB3X5%V|BWhS(7QFq(TKtR+&1b(8~VRb;IGXwnUPo9 zTpf-Y0XYP^lA!Al+*NzrY}q#jqeMcBm$*X%IqbqciZQua#%pqG4chGbrmo_BJlh`H zkejH~@*nQfKzNeITN>^RRq)f{@g&HGh*jqs&dPlwXV|j4$agc;PN15(&cU)Ea8b=v zL2P}QbW1jKl_iu?zHuKh^V$$_~}+e;ADT;`wmXpm0MEFp6?{y)>BLp z&Nx81W6yX4X*E#iM9P#;aVs+1Ywy3hGZXA+d03HrijuB8ZOOG8vbtIPS|HoU+yet|GK@6Zq=Y&4 zKA%1fK=t6ii#qJzIAFdw>&K9Bx3pXI{+vp-C{uTn%`+%RdP_&>9==7LCHIZuc^hoG zXN+cE0vGDLr{BeC1KV%v0FNC%c^NX($=W&x4qNopQ(c9YC2Ny8Xi)Dmu=RaMh{&2^ z0wIAZZ;9ZM9_E@$!1Z}lBGeDT#Veha+f7U{E|7k*2GrEsm8s z9Ffh|>j|ivR(*+y#@EF6*b>qQ)dHk@X|&P-Y@qH8)v2V|Z=*Yej>$LBtct0-Wp0J% z2d77J>118fJM`zO7Os2Gur)^>@njjX%K2?{!rxo~jr5rClu)~~oN4EQ-;h^s$x3@q z`UOACayo0qP36p#$I3kq%uo&w;?S(8Yph3Or7UBO-vFFWx(3UtKM@a6O{ZLE>b-6Q zSCzhEyNcejWuLySYGS`ufGimFEDjb|RpZ?>NLvTlUR}1gf8ocSt2I$cYRCkN{5^ws z!W+VA3TV4JfQKx}XEkHFjuSg4NTL6E*-Z1hzV>+y09FN+dQAaP*S(KCLdxOa^qxU% z|4i?y(O{1tGT9-^mxzALA;R_>-v)=qeah;ABc!6-jb}thL3lmsgdlqUFpXd#ZVsG+ zS3HCoc0fP!@Z7|OjlW8+Ev%qFH=ByV;yc=pUl|q1&a%qBvHgfN#1dArK9zTb%|wN` zCu_&){e%O^Mb}i?caGbXf%|Ug-4}jDhuUhpaBSrp+OL9QEQEz|0{uvXvwoqE_SGJr zPlw0jFc3#V*|d&P8e8R2yNxP%3#6mUY=S;ikIH@V3a|02l|NiaCLw;5G?>U!|F#<5 zvXf9oga7E`JX7yD8$3f-BYhs%fs35dy;M-Y!P0f#TUk5MWBlNC+Jd5Zb0eEsvDk83 zm!^`X-O!`#>!@fzWF6V4*|H#XC=^M`2cwXoy^qEfb?F9u~_p@a$pBIz}*<`lQBbhr>W=+n|yY<@o-5m@=%dRsy(f0hX zLCsK0CU=!#!?V34I%?1ga1xc0)5QJ^)`v{>^k;!U;{LlA}Ka8%4$OU?_sxA&h-r@~y*M ztY|uRPz_YN&@?r7r?X6az4vxJEpB$l@0gM?qHJe>gzp1*caC9>+UaUzxmR z*uf|)0U2LKkKenaT^lj$Bg9@lCukz%QfDTRp*GxbZ!|V8H0_2W7biL!+Wm~>y_8UA zH%52UT1qeHDDZgtuzURQ$gAR0Mf6A|N*A`!iFv z;Qp#TXbw)79H|+46d$yJ8A%Ud!ejLyZnhVZdG+=FYygs&{jMnV4%qSQNZROVYHsU3 zY}Iw%28e&2!NvSO6hV=Lr+loQEiY<`hZbfnv%~N5uso2BZtalA<0KHm|$I+l3V(&->ZK59duh;B{&<&c-!x-sd*QT#m1M%h&Mr z;>^bR=WJ`!tLl+UOcwbn-{>>o4=?PA;<3XYWuR7=iGLg;Yd;)T_5RiCnc7`0-;;BT z#|>`l*}SeMeTO{1lbrrWZ}Fe;(HHEbMs{#{w>;mM^Qz0mme1(ZUOw&}zx{dkLfOl& zv5qz!_?{SFvSmW7*8zfX^frXP+r2LG8+`4Vx%CV3xJ+Cg7q^@l3vqssxPy#lQ_X9| z3r%LI5k@_i>l-!meEqdSLX%`LJp1((hR<~HRxn*}o)vntmnq1KcY`kOo3pZb=rRU# zj@LT|9{jatxlTjgjk=DQ)Mo9~+u4YSto|uHpi$m=t4An1w!6dqVS+X*v755mKRehU z`(uz<9t(LJgm){}ujVfnBDWjt7P1$Wj1Xe0Q31SN?s#C%f0jDy2C)dscksdV5FU6B z3wFp8Y^4k@RFN%_NMx5sQ22@ajvSZ+`_DDCnWtb4$YY@`FEy`UhKun9@J93;*1Ilb zw-AT?1$TWkx`a58x_IvI$Z`>Fx_A08g&Wc{wb)-Omw#x&w=j&Bu{+gg%Hbul)73Ei zf9q^cfvyYjFow_nK)s32sLm!*uvFQ0D1UC9PYeH5!(6Z5KKz_MJNQbds#wh%J=`AQ zy8*fRI?I=ufbO__cxZ54w*}pQH~S~ur2JVKztIs1u1dH{Z4dW4T8nOMcypG2u~_5G z1`kfa)RYze*L+6M6=!2`?L`l2YpepOXUvn!g)bv1l%u>wyK_@@f3}RiXgUPhaIG>t ze={tJd9}#fQ+d0%J}$zFe#7xhF9LcqYw@#1<8XH+)?yJM3u$Zc8zEEgFI2L3U1JTp z*^TLD5S8IwzufBIMTp?I!N>#k;j$@l&YhYd_S#I~SwO0nx~Om=jB%3*Dd>wdgd4};jr|Y-+LSq41IQ1?*;-Ea54L6gBZ#bYBqhC)(;*TT5O&($ zbu0I5%Uzhs%;wV(|43I|IDfrayrMsXV$YE}d41p&LHpf&jVLaFr72e=f1M!~I+|*e z)fb)fL*3^XMw$>+2AW3I^V=TXYSuG!m!0E9ANz?)qN@+M3e@VS*4iVp%$D9^tSlgs z%UJU3L0ohFaav)z(^+sA+*_yHo>$FLFow~CMD>`>%c0f94*aughoPXZuz;>=2YQim z=kVGeAqM%&DUk~Ql0;k!J2rsKoah}vR5c^_!($}1ULdfGV~sF%MjEOdH0?PJT?nvAW7aDVHid>xc6C@?H+P=_n37rEC&}lK{a6F@e&yn zg@ac^=UspX6Hc2XGuf9KG226*u%9W2xyRmn<2VP_9xTe_e1EcE?TBYE=Si*U;dG*xU7eIU_!y%NTZXH z;c{P68@dD)HNwbDQ07y$hL}5OBA?ScfJ}~hQ$jQbvzebTj|vtW>b?HKGHI9OV&{}k zDtb;WWnItJHn??Bdq?51d!JDIY+eYY>^kX}J!nYo6d!z|NC$WtX`g&U^F$zl8(rjR z^^vCS<u9X>I^0p2@p|#?+H0OV(%U?6onVGtUI~bN8idc-c zkQHx40bP-mlf825-_oHyiI+H|lUzWB8&#zu#0#t9obkWvH7^`GR!9F=v9pXwi-q=*5 zQaX$$lFsL*am${OyWp*f%1`ltHtz;)9xu1(VccGIoPOK8!NQv&Fi zY7nU>3Zc}Ry!(zGI7dTbLo3ynUSfWOqPuae?YnU;$IZ^v=N1~}3h{{jB1EB#Nsr2#2(E~R(r)hx8t%l_e>5STjKYD6W zK3@A+O}&Vuqn@eP5MNJX9zUO{L2~t-Ugo9fKb%?8d1hA5vVv-}7cqxn< zW79V@x0MM#QAitujl_QK3%SIlDRJ6BIIYFx8<)A)#6GptHB>32>=hQtX6q+i zKCNTl2taJ%jdX+Z@RGOr;C7!J2TkkEyNm*%NOI+RW4LUmpg+*@yge>r$Mc7oIcYWr zD6G93*4Nc@ua@aqYaKdKTLy(L_>gv5KffL9VoW(#C$!6wq0?%SR53~*E+r6D;|*an znwT~e)QQOD+kpb}(LtOx3AOZ5t~0X1SIy(lg_G~YIKPsdqwd9f-%t6Enm6& zRH5}7BQHownT>OxNPk!53Xixex29>e4NcEe8+0Xil5OVVqQS^)=6`L2;D9AWSk;P5 zU`1^SPxUsKHHWqx8HDyTkt=uH9gk9tNiPX|Pej)C;+Sq6De}HI;T~?3#5u0zT{a+v zG3V?aV>*AqcQtB`cOPTj)xAbTDJp?`HOQrN_51(a=v;bMv@v$DW_h~X7jr<8(nc00 zlV4AZbrivPFmKIrTjGAj127_{JkW$4;WHqMR0C;9gPg|w?WsC(BbeUWjNeEEpaI;v z85lOR5As1cbnI^bR@q+y#1#+5j@Sm zn^R!S^Y18sfkxMq8p~KqW^)B-Qe&NQk1YIiO9vHP$^@C`nMW>nl+MZ47uCwdOD5f9 zwj+_EB=@n8w936)nQH2`MwqzzxqML{ehQnfL#+2~mfTn3*@XuAmdznqoE1LV7K!NjuabNkwHB7hMST ze3<=mriU_m#l?`W@>e}wOElq`gNv&-)sfmFO)%92z|pr8@qEmX1D`|K-8Y|WPTk4{ zi&iJ>S5vCz?rowi=#+8L$ez+r;FR+V*pNG#yw2t;tbWV|!1QOi=qH1)D%V4&ER7wCTMcQfV z#|VOBDtUjXXM-3d<#d76TPpAX$Rc;ud(4~mzWl8!ma#m&{e)suk^u!}mj1rj3A9=} zr2@(bOINM$%!rrd?9xMH3HplNLxVC&r`d-R7!hIp!-y&lg7aqxj+!^xgxGm@aqfH8~a)%nP zkX*C8tcwq+8-u*JYjsD%=IU=*7J4_C$X)8N+2)-(eo=(Ab;*s&C>wO53b25qr}#e? ztvZr&0=dK_<2=oFJ$4M@|W$kZFNS{H2a^`=W9W-nn9(crBlC^kVCzy?tyB-#p zOAUbv#PX1lPE4T40K?a+24u-s_LcdH%yu*IHhx@r0EMsZ4@#T)AsR2^MTb%b)rC9+ zt@!r)LK3>Q(&s0P$ts3Z&Is#J5%rqB+phs#-VY?^-X++H7_ z3isFkt-k3sBVF3V%%+D z(XzCnz(U~6H@nBCKW8~=nAkK+a=D*U4BuCHmoRPswC>pQ> z+$z+tB0K|}Ee`~*=~3{Q(kWFr6GE6v;9x}g#es+r!@wMf{7<+#4u%f5T)vI1M$XO3 z%S=(Hw{2D9{gpC(*PYYjbeg{R{y40!oKAu)p7`$W5&^DVG67SwW6nsiIXn*ia_BCp zy)K!)oiYmbNoiTQ!3=|`Xt}J?_VOCD711-786;gy;XKCixw=2`5}Q$pi4E5=y|@lk zV-pGF&{oNSIRAZvc7e>2;P8O`Csgl!HvmQ~ChvQgfe)%0Li3<|kdmv^o=xjZ3#LlP z)=Hn0#<`-mH)fj{LDX0N0_u4!lXC&K!KQR^%P$0v-&^z{_fQ$>X_W3QK z2qnZZPpe!t`}Ne4Je9Zak*8_n?^8*xE<1|2NgZ*+^&ewDLpK0qg;?Gto@9XgPj@UZ zJH>QY+>(kHAZb=JyTceljg``J*71Iw3P$EE+NQOmc}jlHB^TWK8yuXL`Z{eJ1+V0Z z3(J&tPfCd{9>-i6kL#h<&72`pWxqAP;dQdQF;VCexL*na4pL51M)fTdF@nE2cMlWN zUs1m2C)W7`u0W|^=ES_j=D`q~9}jmZVe8^vs-GX!a824@>c50M6~oqltdHghRn&kz zK3Bs^C0xP9=N5haqPVmJeJ@2CZN=A~vkmXxmH%xTTf3L;w zLklrvSm1*&v7(5n(u8I1kgUxj!Pj(yRN{p&AgiK4`rEOi;teHmqCAhH$6ASPrpnGZ zq3?AQ2u(2Y>exG63|APj+a0^ztLPPx-8F1gYHIiHiFELj7*kq(A`3ox+ANC|8>0{x z$_qYwgRpMw6&hO?x3}&1J4(b<%Q@jnnbTqFsnKhDH;Dr4}HojIMNOb*#(1g89G1SZ7j;v;OVUJzH^q1d34IucW-V8ELYYWTUxjw z^}B95oAfr3|4Mj88oSst$VUTdm~GP60l@|L1Y5-02Qyc$CPPa2#W{xK>{0COz5;lT>!Stz zpWo5~gJscBv_1vAz>(k@m?L{7W)KBRuMc)7Nw@L>wPvM-dqy8a*`u4LtkfnII&t`a z*m}n($(Al!w97`9ZQHhO+qP}nwryKoc9-p{F59?uzBk@EJ?^+aGDpUaxn|5YBVuRf z&dAtfco3>8Qyxt*hO{c{^Js=U7f9FrY0iOtYC|*%SfKs>O2}YER zBftufQ%ya%M7)vKphOtvvX>fe z4mivi{OD=1^*&A>UJe2iA_|xYQwHKLp;5K2)es3gSvr`8$pUn-i33zL5U}|>dPyd7 z3!8$+NDIZlQ6O|(@A3WED2p$BSlKMe!Rt8E~;x$W;q zj&*x~!&|?v8Tu3vr8<^-h)~nrJB_Dn-lEleh!!Z(>~aJ%;E2NtL8pZPJ()}yw+$9B zwjs*S@XHAYG5<_UI5AqOWE<3T6I&VFPqBZisr$nYsCiPpAC8S!D5M8{k|PhPorLFr z7Hjn};yC6!RTR9(i{xJlpQs~=Jmt>#999+uW^lT!ZJ@dd7UQ4DQxTh^x_ zbOv7mr5Stg&0fXLKUWO3OwuEi$1-ACQ@2T&$R|E^GsB$YmxrqC#Mu@`A{8Rg2%_BAlh zRZUY?uR$OlTV*YA=9q$U1K#@sVfvu0O#%MEt0=}{7Meqd6wMau(SR#-V5Iq1$tVG- zsch*_!z#Ui)CH~rK^5D~scc4^PQldKJSj!S>+UmPPmvFu0sgcd!e9*`!{L%SV(t4*i_9CD6#YoV&l>LR4IxodK;8F-oB-n~X!RkW%ODNeV{0(Qgo-E4xX2!2g zUB&d+zSbe5qhoBGLh+OcM6)5lpb>|s%;kqQV8sFmiTn{kPgx-BDK1=a*yPCjeT3Xq z37S8jB|4UhN8N}SNzk*5>ZoM!3h(9RqZ1k3DOUntE!pA;F|5+$nHkg$S=C1lxlpS4 zpdEC4arP}REqSsiq;KFoa}-_0K!aVx3yoC{AC80H0m*7~X9cNl-gMGe@=Vh!S@&5} zM3SvW<$9yI7Z?lDhtqr{(Im-wq4gV$^0>grgNPm39eK*hK*K5oe~CAvT9M|6KBTw> zN~A)tHdXtuLfph0*Q=-Z4;+~23NR|*p{(jtk)<;F1J-c(3EF~$Omc|`Q<4o*9fw3Ze@*V zVy45)2g*2+MiI7m`@EaunY=XCfS-T-lGu7JP$11qJAwq4Ffu!bxXxLNhW&nkh5Kqm zr{lq|Cq_dtItc?%o3P%3UFNjF=j?*0@@^LK~aWc;%}2~N9W z8wHjzrsq_R-GCMjEOy^Zt^x=Ex#`xLW!SQ=r@teB4|FSxDt}o~YCC=K@UrQUx8~jp z>1dW>I;BT2MH?wLi`}lsuYRu5KGEOMEo7JpdWSYE1b!tO1pR3ka*vig#JTq18aTcN z83mk!nD_cSiefYB>*jpH5foVh*-=uyGW|k^c;U`U0QA{5uAJe}GQ8=Eu*Qn;9x6hz zjdN}j0q|zK9=GQ1o~|+pgv4&*pos5()YsTbiioW5F@Vw5X}8TZLtk#$ZxTt{`vT!K zc33IRF?$qfzz9B$%lxpQ#Lc6#j9B`FTG3wd9mr^~g0r69Fnv86gIKz;a#(#Ox_+a7L^BgeLEwv-^9V3_XmMsW2akC{twU zY|Sn(<{L*k&CxH@{yxFwu9Gvf8H?K$Df}qx2@!%64O)uC^eE%h)1sIyi~iM*UsOes z+0AKl^Xttl*Y|eS6i>68IaBmR`6?0<6szg@Dy&ejIReZ|*TTX=A(s}8C&aGx`eRv4 zS|PQ#tYMu{O~fNJF5}?TQ2{r*5{svftvB8?q-%K6%W$%^pT{@XRGkB^M^;6@#d1F8 z04S1PhG26vd)>f0{S^nJq%_3InXpwvwJB7G&y(G*#u@Z86Pl*tR$F<|ixIc^q!v7A zCa3#3fNdwl`(rPW-2&BkP6fUII!~qesz&(?!WlbuY(kMu2kP@DNZO<;QFQa^tmA5B z<)XCU6gwIuA_;ULo{$4nb=X0u2odyvTWP`;^OOhxD~Z4WW}4F=RYw zSl_qg3fdu{NHNJd(TAlGwh^UD7298+28e!1D0xP&Jx+$n=ChNDeB#O%l}K(C8FBqP zuqFi6u*t!4!VpbcpoK!twsx%{Y9}wcM6@8ygRn%xDiecHPnO1e?2~|DLu^r%0re`u zC;(a=Kz#cJ_b8uzkm*W*SG3;Pkvy#mT(VX@TK&gz5;Nc`hS|hLIWC*i4T~?vdF}Bx*(Idck+l$sbyku5!$2)Lv&1L)cHH2#L5NZ zt|*S%J$&y%;T1_7Un58x_V6Ua2@#Tf?U=4Ee|2_7Mq3|+F2F5te{LDY(fE=wI|W>ffe>_^W$rk3Psxp0lrf z7GoUx>V-^8b+z3>o6{sfn}MGvU90Sm%#2f`FHMkC#M5r(c%tO1*%pfj%b( zvL;&9V3aX_%!?VKdc;a1H&`YCD2s*Q#_Js2WP8NWWF06h=IX^W>X+2^1x0HWI1qLG zu>dZWwXK$9D5P1-D7-}N4uv2_2k3BsAt=xm*NnDA z*T%c1tz!GkiCHhjnDyBjfLonFu zbBGc$;sTHF#65yBz#PVZtdpqwM1_@%SpJ|=WD}RTp->Ol89L+-2Jd0#FJW_5i6Y?2 zCY`jOF)Vnkve81W)4vzl+B|V&soZ&SbI}2W#@G<~`EG=3wJaZAesCJ)!l;&iB&nxIWWhGLFlz)1Kt8@mOfg16eJ1nB^~?&>O$ z=mGCUxD9Z%hUzK>GG$y&!IiDj+ZVWf8byY{y(Kne`aQGH*aGO6_Ev_<(t|+BrONM- zktv5iW3jiPGdOBR>Vg&Z(zEo|J+@`lT6O0NN`4FRqj_FSto&s7bJaXYNa(xNC3VJ$ zuFU~%yvfrzMd%K7k0^mEAb7Yc)&+-3TW{kzi?h#L5ZYUAG?xFlL_o&+SYK4aB($a zl?y3)hP>|Pc-uo0vT%zV_hp`+Vn@tdRl`@+uYrxo!`a9Vm*8_p9eXDnf+>3NMB+a* z=wl0X4?^S9=rCCxSMWzlP!>@=p2?DZU;Au)JQlo4H#gqu#=^_sDj$f@n-*&lQL0Xj zG<1tXX>OzKPhQ}|*ha~TFHE;ZZOx5dHw~&4S#=t{GRCF1Qr%}$Gm&Hs@1m8eogQek zGHujeRF&D2umwE@rLv=|;Rvi=`whb$VYx}ecE2sk;MVgsGzsW2A#QdBtKcc-eOn> zc5%9Z3pQyeXy6a!Y+Usw-yk}eH#8fY<9ITcY9(m2kvT1OJabax)sG}{gpE}^@=rI6 zRnB37J<;o+D(=nt(WG=MA~v8<#2B2MyAtP>SuuP1XUC*kh`rU;9z_&UuqSCo2`HIt ztc7kBk_Q&GGW zLrW|lDo?_w=|>5O1HwLLVH*ltxiOI+ep=b5wH;j;AZhi@9T4CZZ0PrY6^`&5;FWqx z(?pjFcXB!xqK#H4(WH$z&zFEZiOfRz-`alPMvyW&>PKetyeC5hpK~}H#+D7I+NA;= z{C0D4`(BD5D^y&3PXJ-Y)b@Q*#cz1>0o3>2rWkb0B-`5ug|tOiYr!pZ(M?mY9x1L#VNcJQY;i5EQ$3ijUnYwWKYX5bWSOo`BT$VSqa+ zQK;TI`n=TX^|-sd{_x2DAdySAp9ll{3H(dz1DGfH$=oT&U_P0g@e=P3*0B_=NPMg` ze>ArMYQu2DNF0x1fqI{x@D+m`iVz)lS%NaRP2eYj{afztkC@@3#$M^q;uT5n`4SCX zoWf$nrH9Yk-GQb<1Y-^>fpD&KhrQNUk>Mj1jL$`@1+hKnBg^Mex}JN#slH zXfpFEmthtfByfZCwJ4?I`Ox5w!+>MQ@BQVdBsu#m%VCJQP$mABh=TiaLZW^S z!6VQZPmMa930)vH#st2RtqK8?oqu3(LNAS7lg65F(YyOr8gynO(}6tQvR|y= zLS=N1pvjxNK1W^Nc!1aPo?H$#R|s2;pFCpIB}=cMFXDesJB4gbQJ`$pg>vm5=W{xQ zptt6-cVKg*6VBjfH-%j4C8p6qYCXvHh^TsO!5FFv}ZRvQto}XhNq&0lPWdzy* z1nDBd`1451=u!eA#FtYB9CzTEJ=e|cgy+j?_|~)R&^~2d>+HGj=PHtyz&SBBZPF!Gk_sH z*V!QE-2B0Z!l@hQ#xGHluZmZl9BzC{#deXncEI`IT8lVz%4vx`ON)EkFcetC9>qD zvdHG5#1)L%b_4Gfr-|*-SDrA?UK&i?2NlDpq_*$Ul69bTK zn1>-sEijjhWqRW9I1a=M^uL|467KYUa#6ETEyLO+B^=G#Xf2@(S&{EU% zVHcB+YpO<7-i>*NW?Ipa=EOv)eYE05xR}Q?=CB%En@it~3fxO0mb?>vAPjr#42Dr| z>%3_`jc%8KTUd*c%+4Rntfy}ezZqeSt(RrtPQRy?t?;^V=R`^@iyYrmR?Eren@HJ4@3y zhd)(d2v{xpY`qP8L)O}yGvCf0fT$ared>A?_lq&`z@vk*0H!97H!+3_mYkn`@0zyQ zfIayJcmL4y!Ax@VV5fd+@s^vXKkUCkc$mDk+4oU{Tp8qpj`tUYGSh^4@+k1f1@Fg_ zHrG#1s#tsD4rTN0jzJzKX9Z6u{^X|Zd~EGKY6E6C^|D zys?&*cy!CPNOPNOX&<;_+$0U`z}dy?|NejOFG z=_~z3QmFRUrp#C%7QdL&GtK>@W3Bh%Vae^eLId9a?6lSKXGhtm*B-tRU7Ou2TV}I< zggM;Bo5cud4U;?DeaK>uBOK#`UNuO!bCSC?>&K}-_h}6uUYI4jjjWIXS=hyW2tmS3 z1i#fxCsI8;_#Wt1cUT}FJnMO@@Ww0<9B}>T)2^71Az4_reI5FXnbr;>UPj{`@21Qp zvJ{(F!L_P~%$LK$)YrM&AXdg76@Zp8}P?nz9!H0Le*7q%Z?Zxz0w!wGr8l&xb4;3v<##7$QnvSU{ zd1Q6R$zS(IwM>iYI9#$#&(6cH|U3D2jbJ3{~>?dk!f#p93a ztufG!AmObThjortX0K3b{8-N{VVwMY4gN8b`)SPb)!4nqS-8<0LY%td?xUr++?2!9 z@gbkCDl5155WC^bqhZmZzJcTUGJV;8acFr=pQ_!VGk!EjSXhrJ!&(M1bl&Yj9s<%eQCRK*W()91DuJSPb{H8T;X ztSC;tYgV((;GkgQu03Ay=5v)pR14%^h6o9E>(vN>rJ-}OH|v+}{T;dC>a!!1+c7&; zJAbrKVwKH?e5_+tKq+WC+nB%J^&zYO=RuP?Gq{G2SZ}{LdmjyJZ8;=AqZU5?ZTsu> zB{`mS;V=a4lg*EMu;hZXUF_JS4_$*DeK<67X>*X`l8s>lTP@HaE6&;67s^C9Ewj!8 zP+C2?D(6B{zfQ{0uI6xW&_UMAzyD5IaJRud`flu{={TycAwPt^x9nhfnQoGbI$PD+ zs_KzdihbrVHw=}g-+Vc|V(!buTju;>jO^!8KFp~GG@AW!NPFh?JF+dr0T1h9f6%L8 z1YK5Cc$s9VWs#8}WhaZ2@%(fr>UozB>h~7F7urK>ZqwrJ6!GFP-HPZQtpP1TApvw@ zMQ4-6L^wB&hJj1J!yB&96&#gxcHbL}dAHacG1ze05;o^&I=G1SD0H&xI$9H1TjRV0j!o)C2vxg-OIcwnD9lSZc zymZwf^FoDBTq?t2Z9}H)@nj1dlujA9=bU}xu1>A`3RUzkb(iE8zCuyN+LXAzwQM8x z+nRO-S=sNlGvzB51e?Ie9=Il31`YYVQLs4Kt7e3?X3rED_7U?@pk4h0qq3ug(Rm$8$D#6P7-~-gd;T?uQpSqUzXT* zM?1Ww?Au-1&0K%XWEJ2v$#;Hw-OF6(5w-U+a`neDW*raT@cUmoGL?S4L-JlK!r(x2n15pSFqf<0nt<|NS&M(#?IaE3=6wrm30lTnk^HVo1nq8%rl;h~JknxSJJtX)e zi=snXVUMwYGRdHl>Nhp}zGPQ~D@|xDDDFf0cj#O8Dl;1O3DCa!qw4ZYLx4FXn%1C< z#l*q7NiaY#ZM*J%O2Pgf5Z{G_?t!%Q`~!Ka85TqjTj7t}qpd6)%&ITec0>()P(C>b z8Xz9=2q3&jJ+!!29$&qD#guEErlcvo<1ylH1EK7`f`83d^l~I!386``i#Z2J z$}9!m%5SIWxC`0HrIVT?Z^Tizlg%w90G4!(4oOcG4WI$H?W zpk0M~uMcx_`#uf=my*j`+hX(KXIXe&x-Y?2WYD0*AI<^=q0`E|1hYaMeJO^+I8o)F z^fFf&O5uqK31RiAcMFF>s6J>9=FBz0ewdx=NM|w7r*B43&KMsKCWR$I|p>%i*7Hew-hJ;tU2)J>UO`S z3VGM3xo?)o#9ngb4|JaP8q>KxRmRn-Tzz(E21B>4bpL*4weojpD_p;He;l3tb(wK^ zx4#~9JN;+YMIV2#)!X6ok8775P$<3k+c1RTD2%F)Qv4zRWa8p=hUx)dyE;tmOS4^; zkd!FQP=pEMdWitx9%O1mW%@Y+9u1d+Ddp%bQLHGf2wf!$=(~H&4vF^VdaD&mOx#Sf ztvZ(~T3^3|-;K;9*$?ivW^Z%2_o`tPrzkUbZd>s3R&TmQQ+Gd4lT`1pQ+Dj1cW6V` zqRMVc>)0G>AZSqgj9ilQ!*1YD@~Vb+Ztj7iJ9|HpklTz_>I+e#3rD~O6wtV07inbb z%^FChND^-k?S4dRwDnY~Tw9uxZ}ceAQrkemb>34!PSfOfJcoD(yb^Cn;|jG$8sl%! z)E+FCICzh-ZA^eJP7_0Oz%9lt>{$s5Q}VD%19kGlU_i4zfzqw{l^B=kr*Nsu%%XH` zIqsqWa}n!3xjj@n#86d=V=*bBHme5f^(0b&2rI15But=r{Tvc%0w5057VNUC#~NfI1r>Wtl3rnJfB z?YGB>iLFE@597rfn=rk$pUhmJqxO|rcK0(S@J2l<_e$z(3)x4yM<)j^5J2e25HjKu z>5l)IK0<_@(2v8>vX{eJm93T#Lf(HcWchgE>*!k@@a1CHNDUnrvju7FH_H07x z@aJQYvq588rJaeVNJD?!y& zb_?yrD;*SO2%F&^DP^0O%w7ma$myL%G0Z`w+oyx8%t?{D2|M!vUzoz%udPg}@pmcr4A*M^>-C z#)~)t;Azrl*@MmT1HvQ$Huceh#-J?HBP*l$3FO~w?;JsfqqVPc^b8(OE3)w@vP%Hi z%^)KL{{UJmf)5p##d72^LL4bQzlL$;$>klqe1kBfaOnQ+D8wxA7Qo=nLN2YThqV*F z#;vr`z>z}_%P%+rOP(UhCS`Fq_sN{px3c04s6k1pFF2>Iw3FN0M6%0BirJv$ zTgxm8YId3d;;eluj0km&h}kSBxwhinJwq5w9nD+pR=CzQM+29PD4q6mcWF%9=rFK; zTD{A_DMRJt+E>PNiQRgJly0&elN-&)>wTW{N?D9fH|`I><%~8KnH!I1fSR*RPrJ>s zi~R>+nrjjet*6%ATZl$$L$fGD|Sp5w{n&1a8t+TgZLtKOlj~Gr>CDWWW=1P>+`ap_X;0?Q|p2Tu47= zthD*qMT~UPn7W2?@+PPP164H&^=l($v*aa9yU?M2063vv@%iaYr!LsOn~0#-?(AK z?>u;X6_X+2Z<)8-1HhvrMT-hfM*D_Kvp9uTS>=G+iU%>Hny5pGP+l$o z?Jdx@M*>m5ZC6!A585a6MMJz7d(6eX3JsN3C?@m?uEYOu3Qd0ejrzMKEKBF3vZ>lAuEAW(TPn7^z+NW|CY;9 zp)ZE*>SKH~AoIaT9ECHIn9&w~%tKY3NB*k8U>I~x^EW)9;%tw!tj$lfS%DSKNiqW z;CH^@IQIz4H2Pgk6P{x%v8B98rl-1br!T&M5=%Q6t|ChAAr=A}KrBmkE5`wGD@n4| zp&gqnAc`k_~7k*|J)0u_GC?rq1#Ik`K!s>THWgp+sdRb^5)p9 zr$~d&cw+n=J{|9bOC98#oujC;Ec>GQN1;F6zGo@Ps5KCYq$qEKZu*OtADdMt>ItGE zgXn&|1Fnov!GJvgkhcw%H|t2UH;;B@RX$>wDi^p)i=P0mAX+2Xf;qot-FKI1Ij}xn zA6^+|$=D8cl_^c?2%;RhGtFpB`xC{iv}6ri`8`isud(-}F;gadThR(__T%5VjXQ&{ zLAx85?!VFRoO>{v`FlW-bz1v<~ zC1cULsZ$df*EXZqF1%2u+9xs@sfJn3+?t4wF7hz7WaV&p8CBdv7{ma_g(c7n5bV#T zT{&x*jxOjoSD3m*QESi;@-{DJ%G>8$lL~s44X0sR%V3u zA#CdRE=xe9r?}&FJ6C!!8_&gYUgr^bbpRWv4nVM_3}C2NJ{};!4oQ)z39T0BWX-jV zH!hfppxL}KrIM$h^=P{z*ENCcmu5U1 zj2v)A#Fcuno!9!H`TnT%7`H9mYyW1)*gYBeCem;hW~h5HpD)po17wDk+tA)XBZsMzI{dnB4lHk3W^lIUp90jf~%4#4L$1G5w$LLaCUtQrID^H28-Y!*4XCGE3-IKh@^^wfUpjk0st9B}q z28vay{k}8MV^!G^+BNevEo)(^V>+ZHnmPXGeBzI`JMm`Ksjui7g`7am=MY>o!=pQ zX+*tr6&ARsf!@VR9EH*!-Ni&4 z9W$l1CQtH?q|I9*f0_{O|Ahr76F??f;rdCAjR4JIk?7`_rf9Yx39Cx{&P+u57o8BFPq zQqAeEDARR^(;D5=Y0p`HB74*t@r2PY9~*zB0p1l98-1b~+DwjhwbiW)DwUm*aFs>U zvmP7wB!b=v65nN`Ia=x*iJH@WRT=pp8R}%EzNlkNViVsrqB&*>BIX96{zik0^d{b1 zku#g-4EtZ{N#ZCF?am$S#sEW5e@ubFH|jeBc-mrmq!cAV{BQdIzXY2+`Mk+pU)m2Gz z|INUeqx#O2_9e&g^bPA~Z<(Np9Ux(gpVQJ{f2ENoJym)+v?Z3RfF{Sy+G5F$s zi_bCpAc8s4O`eqf9wD2E)vUkuE-BJkze&Cex~1248y&SqJ|9$)V~l32Gu$m*KAA~u zjR}m~dJ;#ii9EGPd@x@0H^zIa>GUOKVK!R|=#E%4JSJ}G=7yBWOQI4>n)JgRWrq8|2;b^HF!Wmk*TX*GPmt7*kN~9C ze6l<;*`$AUS{J*DPALaf6 z?K=udFnw{)(S*9gPu5VKU-i&8=Py40m}@0tflDfSGHV&mHFmBrT1+cjwew;a$!<}i z3)U6%&;6wON=f)CC7Os#^VjEC+q%r(BWN?0;)Q_L6IyG=UKmA4W4=1HglXyac1b0 zXKbmem8g_KF%f2Trd(^ZOsl@-G^ac%sotTm2H8%gE-&YY=`RJ!rSYmkS!#G+jn1ey z=BB8=Juc9qB+AZ8aAT}NIuZm;4dKl`eChEay!g@xwuF%soAN07jRQoNg0BtuOlWZJyJp zD-7G@PSOEs;2n(5dP%}*>;Y42q`3L?s(Pz3sbii8XhwMKpQB=R)%gttI3KClpPQ1I zC-Dg9I}QRt*Y;`1C-)MVaF92}Ki}-{+J}@ohL-p|H;9L+Xxe24iNlWz z*tPd4wH>PcAKN7F)wLWt+c?#Q&TDFjyghTS;YoI}L$w*pzf9Fj&ub{5e|U?-gw1bg zDXl9`Qg=2hnXYbf7Ynj5%kktY!Y0tfO`=y^s*TXlfJhA9+QgKC<{l*xR~*&{2@4@+x^8NB~{jxf>@nwNEi1eV=Wxr+zg| zCp387bVW!g*X*5z`#P{oG$te+L2I}6R2!+M#~u#oP%ASnyuPiLf}DUum=L%V;?^GS$^eRE$8F$-JzZCn6gzWR}ZaQIwOS`;075=tJq zEEae_?mXL0Z1A*~F7+s>xTGxiDP6Vs-Bual`zM;BUDl#TM?wev%DFhWb(Zz`E&Jff zWF8qa)8Blr@l`!2h zn4DeVx~G=;9Yh!>5;Oq4OFBawF)wf?#fvtHhH4|BNcw{1$X7=mtW7rS<(LP*D~Yw` zBF8Lo|Ed`p{~0uJ^K{(-~>!tKd$s!y#L`aS$snh|W?kRYTj`@TCMBX>Jyk z-?XK&zTS_>&(L6uo}3a_Nz8IMPjdP!aEqwS`(TuKlE)eXFrgAqr;PO65^I)|0tglL zodKS?$wIMvHX*$U{<_KM@7|O*7rW{%Yo6G}$fo6L@z1nfN|4__d+3_Wx%w;x7F8X4 zZRuaBjCs&0R_1oNr+J0~z7e%vac+O)T)2{NdzTz|eo<}LeH@gx4P8A?t*SpMU-A2$ zl23V+(A)bO<_mgkpMBYd=mdR0*|Mt{!Yp-R9Jx*Di@24LJ6MtWz}flgx9XJ5`X{U^2TW{gFliuuKA~1gQ5qk7AK1^n^ zL-%6YX=GOIRr1FHdNphk^WLh^j4F((2jg@WM8-5Al zWvS5_!Gca!ahsuGhDG2dz4p`sIbFM6p{MHJElvP`6D59|o0u>#4rHh5n%$ewPn2~c zdV1Hmm19rDPH6mPM_6{*ZV-wIN%Nu3$&&1nwC9p!QdgMb2Aq)(gnLQ;XKC7$yFtFS zI57ADar{GV>;tcVPju?>K9&{&Bl zF2?slZrT}uXaR~O%!+y(q#nL>&rL7)_TO&$3#$9J>^C^8c26*dqKg>@&bvB;y@i&kS$nKcyibCWw_XA-|e z3hF)UdGRyvh;`4TN19(r&68)f>9yl%e9Mdmu#urFvD|)JnbnZ#vYT5YRy`F z6b>7|*I@c9xaXR@;h5|@mbw5Oa~0(3EVzk<&H})p!*dM74|-AK40w5eKU%qhUWSVL zs_4|91Bsz84diI`uG7HKK{L6^3}+Ad10&I{>&6_v;PpiY(sXOX>il=HaathJKJf;i z2Tchk@0^5IhOVQ*HPMbl(A1PB;XohJ*y`AYlp`ilAp{Orv=5$GVDAfX|pAgKVI zXfBihMf_#_`TfQHh5hI{iT{K49n5?D1*M|7Q27ta_p>-X1UL#X8!!+s5s(tt!(Vbe z$xl8{QBO`!LGNc@Taz~g8VCmnCSNsc_jZz-N79DFDx<5)L%Bq9nIqq{b%WQ zeXG`gy%F3;VQ0Snm*Q_H;{Fry?S$@Mv1nRr#s7KwBT*7l>^~88ZB3$oiRhwLlK6{P zLTfGN-%v{6Ux2ADME~XUJ@icf0z1)EQ~p=kw=>`KSF&{NO}Kwy-8?mE|EeW(Fz@`U z_PbfIzeE|+TvYz6BJz7s9Q`+d1mp(tW&)A7s9Dnfg9H$O5JQe5DS_){_5U}fBmX@- z%N|JhA3umNqy$nDc^SN(9jNvH>#zeT_y2bo0EPAr@81+Lfa+Pcj0h&_w2<_%2Qdk( z^xCEeqmFt1naLawm_$|v&q_hm(5*skVY`w)Y4o2%LY--R$p*AO3&9KDt0TZM|C!_@ zA-xfG!Mj%kT0?bIk++t{I4GGjYc1c&VE6k2g9a!Lfo`H7wZX3~z|j5iKR9GxD89F2$mJwiF1saL)8HJo>nB3ItgOe~~9j26<5f(Qjy0Sdg~Jo&bpz zkwCg#oLd|OYIweso7kvJTPqyJKOp6A(0N3VqR5^QNrjl0x7KvLvS(JDvZE=siqQc7 zcfA(TBb)xZF;R?Bz(m#ra4H1bZc=*m#nR4%XOGb*fG)>PF{ZA^jWKag)o^O_a|4bp z%QHgj_?Fg(2WNw*Y`6XO$#3pPS6d!$w>x{EPgdVf*WVY;BeJ(PYqPOA{PjcCmkmI6 z066~EKv;fIdKw^dAPYa7`2zd+scT^De$ey*Dg7Yhe1YL#|Ec5+&Bd#L*cx7O zJVH!Yy-2k8`L}K)Z|}#x)}K^&%iU$(c*hQ%VvS1H&v%#mRXZ7crdEDW(y)7$d)zO>chMc^ivw*1Q8?$}2pFEx*~N_!l= ziS$*ILz++_XIYN#76Z9qXI_p^RRRW`)MgJipzIMswt&#Sh$v}UzYb4Qy`ZSnzKbl8 zqf+eXQJ!xNnNiyo>FB9lwvcDeD1f2Pr|hVrjQG@^t~`OH>^Mbjtj@V8vd^W~A`ekh zFT%J%$28#Hgy-F=5S}s%(O5?4$Y)^^ROZeVQ@=Z(E6FmYFGpDNZ%K2)9;TQjXY`1g z++T}=CA@Pp7Kx2_r!W@DoYOa&wn(2dG@8~(pVPlbOK-fSzjZF0JfRCPNS%nnF~m0G zjLMQ^0AgQuMoX7*0OS^-QMN~`jFKwnh?2rz^}{g?j(0!(=98ylW+6;9hRAN1IHCV; zbnt|p;g>yH`gSuqwn*xnVHG2bU(TSKv5`mdC+6HRE&?_ ze6jVgP1qvS&f`%ygvaB=i-txxwg2E{f9W4+CBU4}JJ?L=A8dGhYyPJkW@$Cxk3*yY zBWhr4u!hJd|KO&bt^X(Whqwmbof4Nw4+(_77N$7(JsNu|5%5|RP2q@|{(%C_v~jvU zG|YD!2AomKc;Zmsul7>@Y3B(`B=y@^*us&OA1V`3u!R$&Swy_Eh6ih>u!hO;(8};-5YdZU9K{9cEs@7O839HNQEZL#g#!=b3uG zL1<|fBk~%ST!BTQGH3{^sAl8*XG&ekq++~i+wsgXEN5`nFHzOT`%Rqr!Ss>nVb+1I zfMEf~0Fe5Tr@Qx>UhDMf+1;Da0bWF`V%%S?7ytjPApd_WsE>*uryz0sWg$QYI1w=o?)i>$ty_R{@8u0>gauz_lZ=mAHDzR+&?y15DJhqUU2X+DIY%l10`ZD z;tDj&7UVz9H9{Oh{BnxYR#<`z^{3j#gh)AH`|+t3;a?Xab^QPH{2%BcQ2qx!v@Qe_ zgJSyszK0+xqV#@%`KtCm!JqqTeu%rD1J^30;+#jyB8xiwR~xx^$iGkdl)_c_5z$21>Ee209zT zIJ$0X1)}|5i{}8ge;guQlW{jNG453Mes|nZofB3_$BRgR;f(>X& zuPUbeGvNxFvdJ-C_AW4;vNRVcEzUtsrT3?U*p1XejTpy4f#ebyT!Z+c0lm_tB*#M< z0Urow50w|hf~q5ri|3DCQZ==zjw2*ZxDNLI=a;Z`p|x=_`=ZvcSez2q>{&xd;kGt^ zaeYfmJ#X~0HmwUuwi03q;$x&iV9S*1nl<8O7kGpLAjdR#$D_EuIvZU9Qz12r1#z|^ zMQ+p~Dn5An`3DBX0m1+=gtaBsC|yC;8XJUZn{XV+8G$q3EhQC_9wM%`Lx~$(HGV_y z6tjtO_{+dk?qGMofKP&&9ff)%UPrjR4D~%`hlH*1&+mXueI;2i@m>%Dh(CJ1pn0>E zhU$Tk9?7d$EyRWNPhmw=HXOzH?-)YJ?^JE9mQdP58Z9*A{#YMe`rut2)nXSSCoMM% ztpC>#mu>hwcne4cNOOPZ-cJydRqGJ2+t`JhsI&|%B1N_BsB53|ilhJeCbGzclTITn zkI9dmub-!cA^#X06KYG;f)%m#F)px?s)d(67tVm#O(Z~B z@PiZLI@tN24xB>8@N7cmZNx)snrXsTe^h8a6cs(r{aa)smo*$UGuF!G=O$hD9ke1vrUKP`db`J4sep4w={&KJcL2YWG!|A7(o$|ofk zr@%!hksPWBbNkvQ+N$%~g-Nx>8uIc5AGOGaQ3R(*7k#<&1{;W`((~3OJSFk-jx>=f z5COBx^rs&=2f$}aI$kwbBM2&e1#Z&{e`tt@xz+ma$F)zV@-2p;{$G1p|52g5{+s_~ zk888R_Cw+L{q=f@e~>sp{Ht)dJewan)%niWlyfOcJj2bwhmS)=o$dRloy8j>zO`sZm~^Yzefb>gEM6PoJX99IUlouW zru0NmQUBxp0H^KIfIHK5X7eIJw`+ai+X_EIh~Wh)N)CGTVo992s(V`0aPTY-ZVaM9 z$6iN2$>E!(H#HFV^CkcnCDi05!Smv>kX--1N^N)V-1C7+`6Q8f$fS>!k$>u8ya*E9 zLmbjay^8f9LyzN})ErS0K*@F-m2!?WD-w75p|m#ky3O%5>tTGO!YO_;sQoE&3FnN8Pm)vMYuFsv`p;w+|{OB+3`mAM#G@J zfM)P&Cav7#_CC1P@g>pD({?`-L44U+vV}V>s{G_@9e$$}dg36??tOT#4`mV#!}t>% zRe)M2K`gA_+k9>WfRnx*6(gTQwkD%k!%^-xpR#OCdhv3>+=)1rIEj1^9Yg_hrLx_+_MO`?qj7uZCm^ zq%LxEJ?^!H_SP7%#Z^WOe`9F>Duir1O=+G8!)*TExun6}ia)uN4vnY+iy$C;T6_JS zriu71U(D3uo64wv1XjB$leNMf5$#Gf6=!kPE=h^ zrtUe*17s>*eGTb6<8_^4n2o6 zGq}Fu*#qZYU|-`E7u-&%(D(~v46%K5(r;A{1&^5R-GW<|8eOVga1e4|@S_m+e0x~h zPf$mIoGx4YXEuJ>O9Krioyvr6K4OiZ4v7G%FKj~JpUPr|$nYcG8OI`l7ti)wyv9Gi zq)Mc);~t*PLGAbI*TYpcyO~JcSpp*I=HxcjFnn0ug{1nUIC9aFH#6>{Wz=tre-@YJ z)f3V~D|kp^oJ8C*xJbi<;SoZb!q@|QKJNwrhjIUbNYQ2Q>+MGDNN z*haRHq=aY*^lqytK09rE8x$j=KnM6?R1HQY8oJFPN}c)dnwi>SyLdfqzn@}AbLq_1 zw+oJewn4&p&-Rkea*5H7{EeWE;Mjf)b~8jXk@%yr+GhQ|{26BN^I@Ex6J!=(NO}bxS$!ay_=xPc|}Ik{xzUsB?5- z3>DFJ)juP3>v%n@F0sX;>H4EVPvh2nv^-|jCL_V< zmY-aBo3QnxLwCkR%XJ~(E`#P*L&Yutw*&O$4@*kS)o((kZ*oe9KD$|^69%VN$LSR5 z>IMmC7Ge@46Kpoen*8^9@2{~2yd?H8FX?f}~Cgu!yuCJrx*!v?+&jBwC=SYt1MoYxO zxrsM3q`a$0Md@Y8#>iNU-z)Dz6wnRSdR)rj$`eip-2B44p~$F8E|}}Jdc@##Oma}NmB@)y zwaSQYlIt($(o*a5 z*XL)5GbofZ!@RG&KQnhG1UBA9%`p?DbBY-+1gT%0EkxcqOUX#tZj^XlRe^^#HM&~q zCH|I$i&$11DN6h;3Ku#49`vj!|Lthp)ZI9S4TIfEMGLoA*3W)x>Wh{*4zO=_$XS|W zJ~qNfA)7?92SM#H02;$;!CgpAIh31GA=!oCKj z%igha52S-WYt6V^>sL__#l^dXc8zfuAeWLf@E5!1>jLOel?4Gcy!B%utS~U3P83Pc zswK`iT9TsD>^NACo1uL4-6$HY#ksF1Te&uf*;LDIyL1PQWnQ@Ic?~Q)4 zszAoq2({q`1|`o zBhcfwbgruDV2dOcgVg@}_F6MOb^_YP5mGt`od8X4R?CgFC|Eg(9wB@QVbcg(zFGUf+u7t5{IXipU)+kX8b5onF zXWbXx`LuL9+JTu%!DYD4KOTeN`uJCS|G2v`s#(a2So-+;xFRhgEWor5wjtJ2=!=Wn z8KT?Sq{i4B$#Y4^{i+^G3GFWSxhMOnFs4O(F-8oeEhVue&v?d$n?pin^*oQ@te)#_ z!MMUJFjv7vqkqprn!3dWoUwi%Y$?UuQ3Y;E9IQfZ>Y+7&&yW8(&Jzj_*Sl<-5PF%! z87f5Xd5v+x_8IFP>U0(T9^^Jg^^HSz5IyH1JI5|NBeKu(Qy?jN$hB;OeldROP1l^v zrz+C*n)la>-G0}%H#f%}h4uWQ?N`FPp0jTdXSsaB7=xzYEAtIux{WTg&$JwCW6Hu7&B-Zy3h&d?T-&wGZYR zC-!Ai90@?C;C;FA*652mxkXv+gD$pt-3fs9DrNTPjN7Cb8NJfV7V+f7-sx&Sv5#C; z{q7))piKAQQB0VIw_(Yxi{chX41ptL5-x^NuwBvTXaI4f8>Ov+b>-n+ z`@VO_1CaxN$av+RRtJi}T1mOiY2HgGWC6-dLjhnGOI7{aoyr06w{{JuETpDAR2eBZ zA)?v6ax%ijCGbOLYaRTzrYRxBb81XtvyEpY_xXl3KU|ou(*7^+X4{eYaI{h-uu(&F z3h_E7U}^C>S<%Eg-Rt4TKaO!6@j>uQy_LQzx`I#8-Fx~5zdRA0$THQu3!#;r=*aJc?^t8jfVs56zu_1-VsC|FCRL)IBn;Z(l~)(jK|iUI41|&T*tBWrV}C3!o?^KS_nE>K)pvkn?Dz?L#V>c6DHTAH+7hu>C1#F z1Kj#5QhoDJ)4+^M*IJvm*=mC&(+XWZ9>cJj=9~$oqB=A(%*qJ4H#hM-E-G1)Puap_ zY1HR)4cppF(}c5`;xDUA?|)L+OV>MUU&9#`UXLt{KhoJD+NP)5n<)Anv8{SpudS2- zb4HU-B1$zz+@sLjW=%NoQ7wt&W9)vtKV1syDDsMtS-tp&|5)!&`}kwqYGFh92_tYY z7ua~#O8IT&E;=vE-Tik-W!a4H6MUYwS&vE9J>yC_;?-*Y62^CoicXEbJ(enJ1+QGs z*BZeu>+}!0L>kU`qg=)|xz`*AtI{%mrB&0{l?V9I6bw)~KJ5h`^{GVC)z$N#ldn3a znvHzY9%(xYl3jKDrdpOg>nM}%`a1?O`k%{L|CmSPqSe!Eq)m9vajY+ojZ7%*Mr)ed zXqQJyAY39@iRC8pWMVw1Y6DS<_pJH*%jGi`u_%HRowZ^bs3mEbCR1bgu@c^*CRX$J z)kfCMwBXe=+v~0T4U$~H`A!RTj>i+FDJR~w729<W5~dEMq(00~>bkU1&2i4H3P8QDW#L)$-CoebB-G+L9 z?3**8FC%84YX@z~#;dl(=SOIdkv9t<)HTG5svS}Ww@$6{A=czlOBhUI61`xvb~4WR8yPkX_zMKH`!qwzr3EU^H`op!;V@ayrtF|oZVkMw`{sP zY!!v}f7etlH!HQ3HJa+D@y?Q{JIPC3uo5GnPs$NuKI=kTjoHgC?V?_P>0kG2;-L+{1md5rA#;dKA+UfE0 ziop6xfy7Y3^>h0O#F}~YLBz-> zC<7?vOEVkyf~MrUL^2`X&Od6lWO3xfe#2SU%?85XLk7bFQ;(HI`Fq!yutP~@zH7m5mjz#2?$db@9V$kB>VrbA_DvRRyO zeJ@-J<3!vFt{a0&>cmvJdn~*+@cK>6J!w9Vl#2{= z>{7sk&d;lc=^@RK^l{pVl^Oz9Q|I$;ih&(0rl#*1Y-`=xL%~tARG{#YOzV#J+5kh> z$DE_B0kP7oq?wH$+4HXDk)@tAh9Via*Z$g41A8{CNaISgsn!<8O>=tUs`D$4zgJJlaXq(p&Ee8I;-ZBq6vVS z)1MT8@R~^&!YNpoco`Lm#Yk7&m=))HeUd(&kLf^o&PxAB?#u&#A#Ba?iFCDG6UAI} zaWKNBna(D~BU7qH?={rMJc`zIbQ0GD=cFXjP9YnpC$K?&tRu9~$m6;pP`o&pauiub z*;7EIz7kykZh2DSOwzx_p)f-R&hM#s&C84G0@X3k5<@CvzMKk%)7_te9Z{N6WLSHi- z{RlUxlW}p+Insm_MEN69iT2^JT9nR!JWDFCS(JY<5PQYgm#dE(cy*#mz8#w5`vM0g zagL?2py;-@J9e`imJCZcpqK7+0>p&VuRPO2xl3LBsr#2ej;((nW)@pg49X08GLdH_kH5+K)1wfF-|8?T|Ri*2)}bj?Ci^$fcU-z++o zk%aAULs9#1+lyiXCD5&o6(bF68dO^$tz(QAWT{P=#Z+lQzPSl=bEQVPzv$Vs8D8wz zG@35n@@`ST@4wk8FY31{inpovOM^2=lrmx;kJvA~FjA4{6Y;g41`KBZ{=7yA)~L1? z6Rp3*vzS_@4Z@`d_!U`oCoJgpl*?F_KU&#MF3U|W*K?FAEF?7(sU6?xo4fif-$5L? z#(cm2`^foRF*1{LR1by0Q>4bcfC<`_#m>m_#nXt1etRS$;j5cv#-XXRM&F z8#G_}?AfEp5b5EnjRo$39=jNRjp5|Gk}h! z29x$6vDWQEzI7BD_WLE(o*EY!i8MvN5TBOZKKeJ=(^8qEpI4=Pg28t>~Ui#d6;iAU9A z=&OkxL(wSvt-cL@dh{%kTN%yojV|x4l5WLNS*ntlSjr^Om6^o}D|nd7p1ERjsg!2w@gefZ2mN~UDDi$^1j-8p`i(Amr4!rXNp+mUX(IaRInlU zsoWTZ6J16eTl!YHX9>dO0ClbK);TqJZ1gVtX^_T6z9jH6ZJ^#o03+qeZ3=%8;w!Fy{kyw3Huq(? z0zoErYN?7fQnoM-echdh+WybXgqjx?3~HAQaJ(6AQA4;86eeYHBGGl+4YHB3w}V05 ze5Nk9DP#+jjZ9#Ng}b0HsaDIk9&%#r|E{4i-$VzjQm|i&JBgTUO3LIE$9mfy@kVY~ zHJ!Byl;8NyeN}Ja>TwU*uyG6=%5EsPmp>nfX8{)Lj&d9AY8!Pp3wnf3$bekbgIrSd zA8_%BYb+AbY0V>TQP8+U5v?5z2wZPO}vOcB&tY9r>Qy47AJ80Y&r=q_tChqml9yE+o`haBs~HZE>{C(C_85K;dW%l-*CO6X_a>V210^Fi(;iRm*cX{i?n3UcJPGvjG z@Ue6~TYxuV!F0Y9>Q{wX6@Me!+xE3|pS(1#j2ko*#cPOlnkCYNRI=f070nEWu%Z{$ zI(OC09gZ*bhB8a48S||ZHLlE_=zgQOH~ao_E}SokIP?x3I1pm>^0Rt6eq2ygOl-Jp zQ#$i5M<^AfF7Gmv0SvI({&n@MUCGw-RR`U=~g7ei%@v^`7iQ_Zx zNpO|hKVUSTJm?dsu5mhrhF?%HY&(~+Ayb5H1IO3pD=%QswR!E5?m zG;GQZSOANAyOpTwkqr2IW!%WE5xps0-pmrZKFk|Fu=1Xs z2ZJ8S|F%uzymXcor!FL@J}tutqncgZE5pu-al{e3liryTeLsE@UDb$b+uXT8d%2aT z{Fs9@Tps_Fm@v{s-gR7D=6`9Z9X#9`Z`se#8pm7h7$8CP4JmPpE&VO18kk!L=R3?B zn49WSF}XXpMergwq5n$m>C(@>Na0iRMBezy=5@J;G9Q@R&L8-(I(T`rxNrwJdP)w= ztvT+SE}Xf$3Kej}r(7V|+NpgE%%vVs47^@Y%$?9mW6Q_)A^n>lo7Jb7p^Z$vsNwg% zOhxOrp%;(NJ4O1KE)N&PVlxzEO*v zbJ0xiPS$EVn`mLXa`)tEpc|_}ic3n0fnNPFuIg+KI!Jj!(XBmE$$3H{ocl-RbdT?D&^k!aSET9vIS3M_a`jX&>T4~nn=apEVnCsgZ z-f;2uZR83NA2vmk)t6yZEb&cOTRGn4QQFdMzWv5R+L6e=qVv1l1!r-kSu8$dZC@sT zPYCUET&*uTH9H#c?)>=ODcQ|QRLswLZtGNVjPR-5sNnb@-GY2{k$3n`Kg(FMfhNx{ zmaRDXct5dxV?eb{aqV{QhE_3KKTaJ(5a7YQe9Oinjz7WI6{TF78qd}hRWd(LB!Kyh61N48@t5u@Pf33SoId|0pK-o>#xUV+!s! zO<;*^{~*xAR@`EF6z+_VQ?w&T(jqx*I%=j`Lt>pUU$0csV(@E*Ubc_@0#fMawtnZ& zL7gzG;v9Q(3K?wiS?~3N6HaH2O2qx8Uq~QH6XG#?iRrI&qm)KDF3fr0?+EG!I#{Yh zW~-ld?bCc(()Xn^u^s2RAW{LT=*1j&Wwrx_&56WKiC_SKyp-D4Zb22057_{**Mfe# z)LEoi&mPsPG!IJq!%p12Ql=Mdf9W+bs)T7BJz)$iBG|M;H1lx zeI6fmUh|SBPBgIyh4$U^UfYfDm1#W7#TL;@9+YV?k^J&fQ(yz1?Rc#2T1LoxH1w*n zZm>ZG&6NSI2xSzZ_1xvvUSD&+Iq5G3JW=WVl!<^^ouh*dRzMlOn6Lv!*tPH3waZ?V zR3DXGv_3Btt#V@W*=)eJ6y;>!=%k0qzUI?+Z;L(-mbu)yoDr@QjiqdlE-r5>sMjnB&Yi z4bt2#+w4!(Mj3z*ln9y{zvwwJFe9VDzm@Xov`%o3KYhAEWKIB7Cw~wplDzm)g6(PI znSAx`d&Leld8ZZNPNF_T=XDlmw0cDHBF3D=X7|p%QVEUru!@{1=|SP(ZcsP&(U)X) zNWF}{dp7VFxFwF%6vvryBm*HQ@gQx2_1XQ|O2Io;^twi1qq{`WJGOwid+&U6xM(@v zYd#~@c~~rcBUAY%tVAzIQZn4jB?(^Q=<8O659l)4N!gwD7`1zQxjCB2lArc#?n;4t zK&LMGuogGG=#R3Sv7BnGvrptiEz3?8yBQhoRQXW$U)v=n8fkk?|2T=y@>h^2RZaLt zRdyb0RB&8djTJjhL7aigwd5^ARH*tJxnDnKEUKA4gq&Xe$Q8T~yOUWR7p|Lx!pQkj zf*xgJ9^ibGggMlch9|=YSUsl)xf{|@s&TW}%CsQ0{Iv*)iT=kD>W_A^V^Q~yj6=4K zp2Vn|CUAbAKi9l#8WNIi!0w&9CtN3Z=)CjN$S4jqvip@;DK26AY$;d0t)()2{zUez z8nTX9N5?lDb=IP0bR7n8*1n?g|oS)gIEJ;@r|aEYH3F8TRVLD z%n3PSK9`D3t0mT^6$*jmWSlDUv&7c}Oxibv?%H|eVZ}g9db<-y;}?wK?EA(f2^;3O zh+!cfok93n6~A959$vOhy;#^~!&yeC0r#cbTyi+x%z6&RQ4(^;Mv6hIQUToPo$*wy zmCUgVXn_<*Gu4Q5<0*+-8?y)Y=N2T7yWBO&Bp9WY61h$eWWI8Qf;%I^Bnr1j+~eP{ zGy*E$Anwk75ewc8_Z1H9%fwGsx6Rn%N2(ECp5fUdbj6@wYs7{bQSueo`mUqIR~q@T zEa~cXU96zYH%HOnY7d3l)o3OZ9xr9RU(6vGU2aWcJltv|u03_B%P_;MNUI#aa!v}j zy69w1Y0s|R&*8K;3a8Uwld^4<7CoLD1Hu6o>}lrK8;P6&BS!F^F6rGo75GNH73*s9 zh^9p2s-hl<+2W-@WuR$CL_GH?s-zI0c+MDTDW00~t1=wulm4=cAq}R$Bw`-IT+LAQ zzJR&-OJvpKSt27!44>&lp^2+uyed)ur(r6Z-vLXF>jCL7wD0z18Sk5;V1CDUypN0uU`ZvycE*peg08L`MEM zNcAf|awtawC1GnJgKt1Bv{qQo;(>x><}~G#!BSntWT^0${9A6;TAFf?%=^ru)xhPd zX%_e3b(0#8@paWg^9oLolvSgWxf(+wd$)EZTs$kPobenKcgEND1=k#$3>pCKPQ_Sw z_^^$mM~6~YiC!J~kY!b#+Dk*f&g@MYtLZCwh+E~`A`9te|4y9x_8faE97#vv)h|VN zaoNndVYkhAMe*{Pa-pqHdv%I~?uHjxvjU2(7SLD7x?>rHK#%g2PqJpfJWn{>682bX zD|q3(@8V_&(Kgz3toOwm`SuPxUq%eFggY3{C%>vmLxn155*WZ>NxIR4H^>!^Hy#HG z8FYdE$3p&*(4zsV(34Mg7j892{kqbX!jz)hdBqYXQNI1LkVD>T?Bs+OTek!kinroD`P^G3d< zafcf^hiRfHjL)~Rtcrxj=iAJ~w#1)v^&-rhf*FsnRVmkZTR5>X!8n z{Fx9NY~__!g^PR4W?P(;K*+M#i<$!vl)}5kH%Usj&DzJa;7^8Z|iNM^PFLLN2c;Pb_-@F8hZ^wMOLF*LW9g|AIAPnR6|%88R}zsgZL|+=s?E{qG1U z9e4iA=rb>ew_>Jj8Mz``kI;74UFYMoZ$SgKx#B6Bb-0c``dl?;y7ouHK>9Nb4 zOwpC_Sn*3$QeO3Po~OF$hZJRnwv-aztOj>engkk{D*wy4v@>ckqftSRwsZr|7jkPQ zU+I%Zg8icma2`j=uK|6UoOhy-U7TsjO~+pqj4tFpMto5#dZx2jFs8F=)B=uP+tb0f z9tviWS_s~^}0QS zWQme0)8AWBA#ce*C#i98(<{A{N$c?Z+Rh~M8KG|c@o{k(rJ{*yBNAWJDa>AP4`?v3 zGlo_Fri~Sb%_YLv>Xxh^tuG66rX8fSuS|$gRj?85>~B_4FcC+%yV-4nO9gA=}2mClAs(^D^yja45e6U zYfw}2Hgqe3zO0Ipg}tf6fjq`Q$`{TwPPRFP_{T9!?x6~^l@->keS+qw7k#zQXmo`- z`Q1XT>1VJb&B{{4GsG``s?#hWdkZCIi@=P5^SS9>%@@I6bp)svf(gc{Lc2R%HK-SR zl{;NHsP_A9R)0y)g6`9<)OF{-=k)Ns?SuauYLfF7B$I^Qua{VHH)xVM`4c~JaTV#G+AN5t1%dG}k%O}+j)*nVr& zdvdUiPtbg+;;`N0>!qI`h_CSu_j1g5o*ANhM?)$iY?gN;1xT%?~(+_8`-z-_5*`ue%jQ{T*#C7f-wJ< z21^Ys7%w0f?})G1zPLub9AmyX$&{E>%xXM|wT_MVH;qDkYtcA*IM3BbSKi=>?8th` zTFa&Ks}fWp2YV0T`G!BgD{{i#rM(TJ1U~__SWR_4SXU{Fip^e>Rdlqv$mq@< zCrRNF$-BH(-2Kw{MZ@6%D)}sC*;gSO-Y(4V?IlxAf<8Fp=XjVbfOl^0%nh`Yx7&X* z*FlQ22>BT|YB{2O0`-3686=-)?QHeJGd!pY5FMd9oi*{|!1ChwY8zZFU!m;vnUCM?|bs2*C6LUCc`<@T|Zs(LI{W^C5Wj#Vqd7YXlUmhdV!fNH!S*&ryZEhO$QvkZPbo zRq*e=|MR6JRD;RO@Q$RNtv4XGX_EeKe&wq@B_pnL-Q(M?ErX~=t3LhGebM+ z#2@4vC0%;thN+v1{8pI=XCx6ccD6nCHYKv~=tufw4=0|z;4lqUdiD&!i zkb;kXS~Tra1wAvvi8qxo@=gstSktIu8GO5LC=GFFt_X36@qHSR^5x1$??3A#?&oa? zaZu2PJDfo4Z&DU*T^c9Ly19Vg5%sMWLERA*P!b`Lfx~%Y4s}T832I0r%NiidI#Dqr z?C1Rm{V9curz1I1{-{=BnJuUyjHVo2LI+uJ4dm3Qrq@X19R|Yx0DB0nnvBj?Jh>X2 z%;a1=UNC10I0nPEbBML70j9yRAr8qnqOHS-WE^<{fMyDl|2p z9h)Pm*Ar47L{r!z{LMV2oWk}rP@C%Fv0l1Ojv(#hSE zNHt>@z0%#w>6D*aqL0agK4TcdZNllt%g>Btbm~u^(OsI?APIF0PLD&k<=TEpt3&s3 zhl5$2$9@(yfarI?^2A0MIL9(=qCf&g8$8n1-tjyDF#Ue>YFhCE&e_U0T*aiyKEi0J z-gzv$(;rw5)YKo)G0{N*@f@G0;A|6@UVpBp;5tIcnpOC?FSZKQTv2l-o!U3)gZ=D;bOfBek3Y}QSGb1P!<6Hm4O+O?vJx^|<`)tyW*1w%)XlTFpv;)j zCpy1(+Z4oFp6E2R;4F;W31};7ps6JV-$eYFQ`fN6G0@8|&qk!euE0{+Br*`*`dqRv z+Sux=MZ#BoET%i7V_wt7w58S~FpzOssnTds;WExHH$}O|i*0`xGqnErXNVxuT&Jt5 zHnMt4Gm}}^$@r7hg2Fd(!ZHa$%HO+m)!Jc{IC`U|;|yI#G75cT6jW07X7ZbHijk-I zww8R6wHidB=!o}(2XLEcj#J%xjgG#C1TD;y!}*Rt1BA!Z3(`eZDPdX1~6^!PT8Wm z2`%ZLc`_Q93tA4%t6#dmXWc5ohJMu-hwwejIg*|-KX4LS zpN3d@`+aoAm#b5f*yL^QeegN)^=ObvxOB!xL| z$Cex9d2;Tc^~aFuv#b++a}n#sye?RU!;NcRa|Q(JzgaiDx>IR_llg}tSW^*nOG-Y? z9^Q>?gf6kJmdcuZ1lQ(x9bC!+%fEzgXJ<$`QU))dPD$Jn4)sZR4Hj$@m=l^aWG$VE zaUP{E@*@S@+pBCYjd6e|+70EN&lZXzSbycf0_cJH{N2aaU)&a&tV}XOovy zEuHqzN*M`-l3cCqNDAbfN=$Sqh{s{O&RzGf7JHyzK-9@w@|!h~w@I!m#2c1YN{0_k zj4pxiDRw_0w}0d{`#5jJ#4r)8=lt2=w6LA|p7mkqO;gFt5`)||EXZdQ=b47|x@Qh& z{E0)sa(%R}i^8Bh!S`1&iPLdtD#h!ZVBKk2p}+x6EY5u8aRP}3S|T-)H<<#!@so1>e7kc&DJF2r|Z-<75oaH!t%!?WRq`%A5x&|gF0 zzlMi*1O3QW?F#I$k!SjP(pzqRcK0<-A1R7b_)}>j+nuKsJoN^$5&KQtn0Of6n7&_3 zWJiuMjbtNAUkqn=By>+chtT_-!!DmapR_YZoK6dGR_Bg8S1ZTr7jH4n_u*%fYDf-lxF0O6>EcG;*>uaJ=A>9Dwdvd3S{_3@qT9;+y+ zJFS}f>;v;Vepsk<$y}`Wo8HxE-C`NPN|)>3Bsjz=$=@AynC`r|wljr`$qp8T7% zDgm$p`~_xMYIV@uZRnKPdO$|!oO)wD8GA6VQ%^ed`-(7*shbZ703KV@H7)~?bith@>&2`>o&g>LwPhVeu}BVYkr#)fq z#)40;Rj!TDA^?S1m9^b(Ur*J1Z1(#0p8gek@_E4LtI!G1D~Ip#C$UyNG9%Fu^+SFj~9Q(*)Cn4@VfYhs}q3QzTtk?PBL>0%csKubno(}ralFu z=6=-tRRHtm5>0pT?^`|*t#pPd!#70eTXT4lyX>99jiH75G$VG7-Tq{#<%!+|&+PD_ z1r&0eTFH&HFp6vpY3&+{rZi1l7V4xy|9bnBc*w6B^vws>Lrb@xchO{7x_>$V1=<}2 zczDm|UlbDuN3^gd?&@Yvh`)T5Kw}}*zf-)j{WW`~>;}KulJ&L!1hU0t+-7A0Mb&Zx z$L9yUm9-&=p&I!`$6273q7ZOSsx}s=S`~n+8b^1A2JeMcG$tNL2Ol;jB@}NGM|U%2 z`1JCL^Ez_)H?#0}mvIzjQ)v#e?=IFcq{%EB$cH{q;yBz0+r4h3{ywP?y-m#fOh4Vw zgjMuTb@=9Ing?nnV(ZU2ew+?uezosl71YF+7tb8<^71t4yJrL_gK)dep~Tj}SuUhLfaW_!}9*^M4mpVXgFs z0lMid&FPK<>`toI*YF<(6bWHYd1XI#t;9-iR&<$Yn_9CJ9()aKua{Z%Zy!3koFOgl zW3_^+XL4TK9QiYbf7@9wa|W7}cg9$>^))u$866;;nK}pEAN`D9cqN2yJ3I6^rLbFi zWwzLE8q3cOJ#eOWYhId&H7MF}&SbokIec`GzU>?+d@bHQzswVUF_KO~I6G9^g)h$X z1&_Oeob`}P`7jj(6kIG=Llrj{otDe@7ohDpbLlFzH8kz z?%K9(+qP}nd)KyY+q`SrHfL>p`~SUHufD1|XQq>MlAfBL?xatWl^n%8E$5c+=IVBW zo{@$}+xkzPX7kUUMxWFcl}*#2TD4x7mfn@pMcCEgy9nYVI1wd6JlAYqg}aumJDyd#&Q3G=bLoMrDK&w8>?rkjriv)|=u zJSrz89=sPZuw86TsczB|cAp}?bth)!et)o%>s}2%`~5Bzv?%@|LZe_21vf7&rv8FL z3#17qSEzdK^xwjN0&a_HVJvNR)jPp6*2pcvP`OaZyqROc7=6v!yQhRL?}GgqV-ZFU ziu*UNoBjPb0k$KtwAy^!I5F;ji0x@c&WN?wK_;?xk8|=|VJhc>T0Rj+yA8csGxFZD zuXxr~kr#P$^IU_jdUyq{oR}_Wcm+b5p(>KOtnZ%4%1(|!AGKxWXLi;=QJ2Zes(j+1 zC?8^LjJ%x3zPza4u5W|CDnu=S@0T=%y)dtubNioJ= zg+4VljwUIEN3G~~s-ng#Aj#Ar#x1q+QmV=?NJxO-*`R>H(~dJNTCC_gRgk2bKt7ed zwyXAV93#}{&y6Y=HBK%vxwpJAbByIRsS9pV*D#ubyJ;l)#`$js&N*U1NSFr)hc`(> ztC@D`P+%Ckvi!Dtc3g0ODjo918I6KHiSjW0y_S9)20!uVW1NNZm>#*k%k$Zd^orwh zF^qnq(j)sX)~)lS5F#Yw8y)(HCw%lyB<^^@oowYl!2^o>BOAz{4c?ZJzKa z%l4TYnY$NRWY-pxlgrGq^cGV~r&)$q=Sdb`Pa@Hyiv`?g%?kNjguqP0H)7@z(Chxv zX@EuE;=;8TLMP)e9+<@W3=6KY+k@^D1hD%2aSO1G@1GdMWDsz3SVwKb6b8D^xXH&h zDC5#-TNvUAv=PRGC50Xru`uEW$Z5Rfs31jtrImy`1Z`E@iadpmK1^~2Qty0-C5Jxq2 zfn0t{AqauR!RLD;+RHpH<+aVqnWLMpX1k*siMnr1&kwNFwIj zaiu*nFu^mH%0ut7<}h&STK?YfZNz&S@GlgHtlcE^I|$xu_s(GCY=E{Px^@2_?kewP z8>&Y1BkoI`OcG6=wFdb&2VM&lEl67n7@&aHdd3fK|++vch)9V45p zeQxhV+l*dB&%0wv&jdQcI$6VWpAT={)`^7q%x>x~uiueVZZ8t6H_6sX?JnMK;?cYt!Q(7 zrtf=w*7uMDx4FF#aK&@Pd}9z4yy2zkAqn#yK+~NhdU8UKcW_eQ&soUlQrE_}#P+gT zi!~}~cbkHmKyZM>kf(QKmkux*QXIaiBel59xu?fIwyy=2U-PQfp5tl&2r_%788dLP zPZUFl#TS%uv}Dy|*_vJMHe}a>;-*h=4YN`Z<~MIn5s^-cr5 z&!9fF`iK31dUSgaRJHoHhk>6q486KF`?dkreo`BjKwhDA`YRx>y!lsL`yHQfH5=I# zcUU{PxLLTlS9n!;x!Eyrtg&L5WJl=NYN29D)j;^V{F&@oz}v zx3&KME{!`oIEE}x`r#m}+o$>gA~T{>`IuI$JHbe>Kz=??194QMV)IGfO()1}OCYc0TWj&%)nqPF1p-n3eOc10Z%QCz9Wb=9Ax%wp3|lUg}xruLf5KMQ%p$1&FoQZf_r zcWeD%BBTGV;nSA$xHgl}YAX%-hL{J>bmJoJZ3v0hQkA$Q{*VX%Nt@WcmnzZ^Vmo1w zS<&b2K~9n7T{W`c-MxSOQ+BR^#*YoTl$Si1d^Mvee;%U$>C+TpUN27}1;c#GVN9+2 zM7(Z)vMBIT$MG)m*sEkJ1nJ?4$skTQzsUbxnDpkZf2oq#s8das8Em6_J_@2o@v31l zfYPN8wjzIuV=-DZdlJ~OSo4teWZQDp*uHfgAc2rCZ5@&=#_q=A;=c}00o(v+#c zg3_K47e|Xk12Hof)#Z^B$6bPaq@4nwk<-yYP*oYDNz1@>CC^QZH1xVL@p{>zPvLWh zax;M-qhm3FzC)^reU@LS^YG#eA});f`{<&m=6~!pI%&%J(*M0t&7(^0|7oF|H~VQ# zN-83OONa+|5!T@w2%D>g@RkCd7PVmBjf;NPMIT z;sO(jLvsir^;QvzBt`L$Qz=T1p%aJj<{JachVT{}LnjFC6d1$&Knjh)69jXW7$GF` z?UWi|69m6eNp2%i-mHE^E1q)wcZZQg!>4#yp$ONjn)Q>B_%ICl!unB=>Y?%nt$Mmb z{y)S{9PS2=&D;1Eq5`cp`f7gQqOPk8L- zIk<;dir1f!eThkaLH;NooFK=qc$%wtNAW|)^uw9*0p0hd81>B+Wmd1Sxb9o}^`#l* zN$*ExDTAGoLsoHA*9;tAuzW$;Mxj5!&}>VMAc7&BaF{#@i`2->t^#EUr2>WUf+4M_ z%uiu)D(;PW^*=3EcuWX<;p7N`1BBo~f`5JQ2mtb-abp^;6!2Y>6fE$k#{yOrM2o}Pm>~ya7}rIIV-S)-2}v5AHPrwQ z)M)5jGP{tM>#{R~IzP8_uwmI5PN*mx)$id)Rkua1Rlr{`JU`=Q-`9go%L~e8B1r@L z{6kvbPH!ss>|)Oblwoq;u0UM6zSdO^21ea!aI~a69&`~381$BcB8WnA6$mu)Rlds7 zTi-VgTwgVI>B{cHR6Y%aEt;@KXHbNCA>vC!SRx0$x%`jq6E`3nHj<09yI+y6aHCnF zt;9!C>{`%k@FH8xoDE*sYoCGas105?ga&kRHlMP&F#F1*IW9j=DgNd6a5$2N(*JSx1lE{|{Oyx-N0J2+V!bk#!P&qo)}n?`D!6?8 zR9H8-ImfBCu5ir#T~V!6>EyQ7y*Q-Q2*3V?(481{21v zZy?y)G|YCM=y!kf@?h^w>wYUO6bI@M*I|5z6w>BvI5^r0Cu+e&(eS1xYvWLWsk)eX z$4O)e9WKFgac#bgesHS&^Wo=9o5^I6^(_$EuF~BC-abA7Vo0!xjL1`5#~8gGzFo*S zMKHYS(cq%-Cb^2877VD$Ln;OqzWf;`IsS{|E?J3x*>LFV9VHOl_X9RUrG`B`PX#KTa5D1G=$)Z z@Bj4fx8^L&hM)Xly>mR9jylNq$_1?6UGCgzawMXuYkI_xY??nzt}5VJLV!B0%EQ#e z=%tx#v&LQO&Qs@MdllQUfwDzIe*d{#xAjC37AS4$4w$zWvvlWG`6nd+&5WEk?r)3K znfJu5Jid6ku4a9^rTKNFxz6a}FT|;jKe&&7tU(RV2G&Qcunj}aI7ZRQP-yl%iU;sH7MFF(rJ&5v9W8AT$ygKfzuCYW}Ssr(s$}fsO zqmlG_51|hdz=Z zQj(w4)hhU6ijr31le@b^{RCi=lMGF}DCPtWNUEB=dk|0#kT>*}gm6e}y2AS?hG=QX z^x+_Dg>?|{>Kbdv{QUuCz#$^4gjirzB)|K!_?6O0(hr1zq$IiT{K-cJGnj~Ua3ROU zouKEB0?v`T*j?lGRdoVM3ex3!FR@H?1}b*RD-lqP#mgLqsxm0zCrvU7RDFM8-{Bu8 zrL|TZ{ljqHvBtxVhBll|;I<{vcx^9KL($zrlXJSwms=Q^7kwtKdwQEE-J=R3rooM!~{|{oj{N@2AXXM^@MSDE+{i_Ot*9Lc)*G5;NqBi3s5to4xf0iDA z2Xs|lknMa{u_g(?c|-I#M^~2elqPJk$!IN>_kg*opgms!W{)te{=xVs8@_EFiyT@^ zL-)JT>*yTmtC~iIzuwX?Iy>XU(2TDV{1cGwqKQn;y7!SgZ=W~oQ(rU9nV%vmp(~M^ zP@4g$D{J8#XQiZl0L*=2&5mAN-lhR8zI!pEuhf-jm< zZetdk0e~RD1y+)~k9UWZ5et*;aZy)s&ZKfINyv*WyM#;Z3bI0V8$RSqy|skxrZ6)Z z>%@}TH*ZDj5z6SDMiJ}8!kPawI}@+_HV*A)Lwoy~C~fEdm12Or?!xF=uQ~JJ=Nw}+ z*JGtakq&$DM|+QRcNyauiopLllCNZx94+OzE(i((E~u4!gAb{aDPe0zooiDr5mKU$ z7)G3wodjY46}E`cF_MKd|IOtQqL`*ec@!c@@J!mSmUeO_v2!Vf=YYkn%GxH{1gB8< z?2}gK4K=%bz8DK!BIgb!7Y&``92WT51Z^7*&Fr94+1#-biO`8!UEM+7xg|2VbpvnDN)blrT=hPg=@E1w9?Afc%6y#b+1eMS2~L6n+)!r05!o=R2?xLW3vV)Em< zM2h)GxY>7lidI<7tt`w{xL{NrVUl7mOHmGraJ_6G*-G+K6tb4pKkKnXq%(LhzXp+* zLx1#U15t|Y-9c5pg(d*%kp#4K5@5F3ZVd#0RZ3YTqr|jr_V?qHNm0f+1*5e-xCR#p z&k9@6!#Zr^W;OcgQBsX5fAC&-uYN}SUGd$P-+HRVfj0rz?Ht&x6lN1DY>K8%?T>re zBn9M5y*a7pqYNn_STx|w;#s>U-DK=f&Glb^mCc*rBzeN8xRIYn^1O*2yDCPY{r(p| zg+mSTE8~@%`OZgHh|C&^Y`18BR|i3d*a%Um#mxEAc{j?Hv#8Uw7^Y3=Lfb43()sDH zUO6;qpk6J(&Mej(=3-NdlEo?$SknTxu!!#K#f1_-@7aa+tPO*63fc(|ohwZpkI=H! z8O1+ru`VqW%hKu2n)sMg0juRqxFjgN?}PHJX6>`1%h4GA^B)hTR@Bp$`KMU`=|w~2 zBMUnuq#EOp!K_H~YNEX=RwS-OB8ISGDD;j<6ZdX5GdUfc>!H(%YD@>#D@}F8 zVyW20Z)-l)01I7FrQJXa{oibduVZmRVyh-5&X{>BAwq_DQuY7^8{V7WHAMCKD)7th42!0u=P_p(K-&9FNZ ze?prZiP;fZptMeP7H^&%G;PzbnDP!C!P_YDHZc2vD)DA*B|R-B@il|;W}A)!oRt8R zM&sp9sau^MxhhU#q0=DECa=)j&Q|l#Rx+zimj_MLeGSvULP%Z0wjbd36nof0@4U_F z7SnMCTul*Lm@4Tl(NYsZFGk9fA0{O)*PdH+Ny9da3m8I4TXn^9C(OXFTaM@(?W%tq zkWVrc9T$^5Fv5Z~*X>I+_rk-jY(*3tWeaZH4>_5eCb$ffbfTj5onjlqU}Xzhz_HES z)KBNIB&P-KC~Zyx0bDJ8y5>@c$bBvD|7ITvGc=rQNi%eM%*E#fy@~sa|6(|x$5tyc zM=lu!W>B+ApfTX&Mz?eVpx0Qs6)KF*+bJalVubKJG&#pdch+pv*XRqXLZ@`)%x*1R zX%(_%u{|o=xoxP}$J<{pci7m%xA&z|MC>upFnCX6ut|PR`TVhl@q*eJCXvCR_wjib*?-S-5a% z)SN<7ghgPR7MiW)mKv^R9h*yzEQ^n(MKGPrN``-vMA>Cq`cf@^q__$6yPH*{xM6Gh zsx91c6(5PLJDR1mP$zd?E8q3V-}RIn29-3@)z4}+SEI_`ZumirTVJRrOw8+i3QP4=&n5V;jRH1kjjsvv>q&;OKM?MV?A zXIT=Sv)_eXti9Wsd@fM5i2$PIFWOOgQ#S)f0m>fpw!y>VCCqja$fpVe z39T?egdIWVN%%?eE}xSyq~Vf>v~s?niT8bjjuNVS9r^Z912S&*DU2!M8$FO^J3+i? zhPG>tD>ef*L}gNE{%OFJYgxwYZMK?D2}Mo+n(8;2ZbM`ytQQ)fSBSI@MtB!^bx8r~ zGVg^n&*3uemg!Fx{L(~Fm?Xr}pU#8cRZ5u7|H+l};GI}U;u>C?PRt)dn8{xHs z(??x8Ja~7Ax%JtVTGw_vulA4-0_h1`tZS?>{Q5sNID`<;e+Bio{9Ctyw@S}#zO1R* za?rYpv28B3js6K4^japqT(9DByYIFK!oyzng@mNYO9IizOw#Z=s(Tv$w>~(temGra zLTmM2?aJz4$({M8A%!S2P&2WclelCu6)_R6@~7^&&Xfkf$X^l8SZ3WU+PAx99yo-jO5(Fh;(8L3 zmD$QwNA|M)r&2T zKNcu$0f13jw&v4QS`Lr@s)?=%f5+}RdDIl+cA@<_q0P)tCa z&0QyjoPZz(UVr}CO@sSH6&l&?f^WkPEtChxbnGYEOYdL<389F)o!&y~mj#Kng86M& zs*3zpr-0%;BUdjW-*W9s4srbME@seF=wl?J{6ebCvV;^suJ~8EJ9cYR4mw^NTn;7~ zmf9NGm!BM{AB$2N45>^4KiLIe((?4!uot-Tvr<#{w3__uQBOQ*7f=v8)i5007<^Y} z;DY+OV Sev8IrkIItAkiuO9b6KyYD#?Z3iV(=`FDB``S}h;8}5zk`>*OHH&q!# zCcFZ;icP|=?7)GW(?lec+1K4G2RkJ*sH$Niz&5$?t9RePs!CFd0xZO~F%V3-*1Vd+ zDHYd~Cl?+(Q}&I-S4M8AjU! z3hopM^sdZJ7nl@oa~9eFd^DGJA*rH)hv}CH0V9+6`Yy2z8cI1PC=eIuz=Gylp(7*} zKD{fqarT@wd+4KqZcThaP*p`DN4iKrwxPQ(bZ zvErNCAqk_(7#k?C$AkGO;nNl2lRIKJkjSMAIj)?-;1}1OpiEX5;e}6QYavt1fvWs^ z8e4#J7$Pw#x&v3J>t+nbNzuj%5c&w)epIHY{V7ddtl`Ct8duc)CMSL^8iN%X;~Fmq zXPssE#+sKZszJhz7hdr0TYJ-4!G$AlMf6t?)pGH*ei)TR+`bmigKRR-Ht%V!(F-p7w*`AHi;tP?Z zTOZHD_OOOxE8nVKu8^|%tpc&tU-4%c&FfmQ!dHxiu}4e^fhR`M?l=jgrv`9tlA~ZX zn3K%Ei7E4V@2pR#j#Ov!?7t7@k9mAv=2KEmN&al5e%$0c#jgorR6|6Fm2;i}X_`2n z{r%UPvX2Oc%CR4p=d^}#M`U%rsUPS8O3gA|v}Pq_yKg%qEtc%6#R=-WH7}BKVhVE* z$CRV{A_qhC$~W>oHAVk1kjr$SZORSbVJ7grSfXyG(J_jO&budolUBU!?cg%Eain*& zxAuAlAI2IInXBZP?bVGe)pFoN{Nid5Ad+yKm%BbhPpzh}=qUH6?eRK3p2y;_bAX0Y z&(*2+pZmYb9n3Kh4u9m{uQ)3g`&=EyLI0`S-uS&YH*~&hli!KPsXg0^JA$>NlK~m+ zmh>HT5#*2B>03@Fd?-FDv}#AhZUahBC~lOe#{w&ishMo)`8^JWtQ}j?6gVwji2&(e zOa9<~GK=oCEpAY>ZF9YU8s1u1VL@^KHQV6UoqVxwlRtjicyyXfBafVvsFJDAvt{=i zZf=SCpTBE z{4ngKVavo&JCO`=4%zsAtYDoSm0Z+11<3sCq-SHkqlU$Ls^)M{ZRJ&yW0LOkY|T_| zJ-GbY=)q<7^=<~17}^$~3PbsR>Y%PgO?B1jR;&AKxS=n9`JD6_tTGnnfN4at=vOYj z-+Q5*YpjSvlf7F3W_ic<;{bT0Z#X~qTYzaYz*{RujAgrCH*Pif|yTchtB&aAc%tveT@27 z@k@*I^&v5mL-K5hna)3yp;NmGVFs zow8l3=AwQDGWv&_atl)Wdov#>gvG=cjWe6_o7ObOuw)?a`f=u2jdwHRcX5gu4hVPJ z%D)uBmy?kX3!x23tdFn1EI<%=Z^S#Z+g?$ zRJU0r4tTa1p##)Q#R)xc_TX|eWfAjYsT2_Gvuzx)*h~R`{ZOdZ9CYPYPd=OeDmsWY z#gp_eF@dm!7BX=G;)d%httz%4k;6T?Vjo)|mA;(`QR`{GoeNy}7NB~A_ts2Nt}ER< z9X?%BSP>yL}j4=Q~TV zA^VQidar3zoT?? z)V((r883^#^Zv`E?7^Lk?s>lt;k24R7NyCU@lQ+uQszJ>mFjIlZX2=s7SEWUPg5UA zBMCEKVgrr64;HSIy%*^inZ^?3Pdss)dH+kHL-tP)z9fcH?}jh%qJ*bdRcdWkh*pnI z6D9mubEQ_X>WHhPrmyv%9ncLbaz&S7&`ShJIkkz{I$+?P*c3djxWm!i@Z!Lc78`x_xhcM6;hIR|&=8Hl}O#j;MC@Z9hiS z_cBj$BKDN^Aj|oWD-}w0bK5u?<@^=C;Q_)>OPI&M$i+AEHnF*y{bNqkVbGboM|U^x?StO zwcvj+o?s^|S#0*(18amQ{U})$>`eBid;Wn8Z#+4HOt5C))6`iU?DzI)yVL_3f%hoW zOzik}fxdi1zxD;+7~Vu4BF|E1>5BCteK9`QA0`4OB{D)Af0-dpBW0D^%R|M1M(`t? z0&$4{^3DUn8pQ{7_LtH}8vPa7M?eqx0p!((a|pBT&$9cwbRQ$jgq_M>b+4))$kYjX znmG%Dz0v-7ck-Wxe{#}!7Af58&WY=$-54j;$Ra{|&bym2uP3h3gQ8#UI?TauX1#{fpcF9; zT+(p>6I+hWDbcj6ncI~Q{`$&BddpI2`8GP=A!Sd+z;^KOpWU(PMaUtFJV%5s#2h4KvCU3n(FQ<+Xcx~?H z6JU1B+a%m!?OhBcMPGav;5fT1$Z;NlARN)8P=$%bxLQGD4VS350fsy zpfh!3!U9)5Ecx9imt{*JEe4PK)~^&=85_9qV#e%xP8cDrA~sEi#-y8JVP~Uq@VSLkEFc*4e#XKi2a`WEB7^+5Lz#&4#Z3AmoUNpc}A}Wq7Q5amH_$0i?(`W z_RXKa&+Br3ocSO+8lvx}gZivDKOEkH<`CAQ3H!TwaKWiVpEELDBX?heo&N+nrS7b&T zhvtF?7=AYF7U>?(zTRxCTdAqPrrD0|{He|3_`R?5se*G=xk9*U*IRphM}<^OXswknDs1}JfwP%rTcAHHc&DmpyB!s%{#W6UeCz4SR< z4knko<3J!FTA(rR7-HJmPj@_xS*YpIItF!_xVcXA&8E@gU85Q&Z4?u&gR?HOUjn7jy|h}j}i*#L76 zeDoO5{$-$+J2MH?zI3zVr>bU2TiF<233^R7qwjs2xIEPR@MImVlUdyvO_Kp4EYUGS zdOeBV#c#UB`!)xtT|Ykzj1FQ?EKJUyYwl<+X*z3%+vdUH=!MtfmmiT(+$SWh5f{Tr zXyg{5iI0QFJ4Xudsi$QiAq_1iF3P1bkx6gl3$4%I1u54hUEk-v(%JZc;XiTeybkbK zkt>kxM>zfU^ou{4@eS98+RfKPvfu`OC|lF1X}=mlS2rJ?CsQ99BB=tl7I(tkHP+3) z2G5BQNuUbf!n?4#HuwXco92h7I4sHn`bW7hUQ^RRUE;IOaNO!7M?K1_Ha~2S1Sa?}NohIhk%9pHXA#FpQLpgI@rAr$T5 zLKC8LGpYz1AcnBRcjabN&zlmDPstYJRb&MdsCUyBP@nKZC3p5^^K0TI_>U@QH4p#|; zCic1@V3?^7N1A=ZR;a*`uz|pV0dXU)C`}wtG4?lRrCMS(+0z=XL59)wiVVU)SRmo| zaM)ZV+@N@1@K20enOy3~qwof2gcA{T7ixxmjSp;d7he@i^d=dU)dq~OguCVFRT8)B zlVZc699t>FrY>~;Q$8fVp^@+Xh(l?*)C&j%uEdKG1g@0(LIBxwJx`-@PpN15+uw5! z4%gJ+OVsRWHM82z`7+Oon7(Wi2Mc7<*pOLR11*W|*78#@lTYrNW;Yl2CU}vtMkwY& zOfNRxDYEL_B{NiwkqE{7GG)Z6{o&}sHFN%%`rpC--tdL!MVi{_g@2Hd`n^&fkrAc{gOPN()TL>gnffwq73%H@a zaG(JP?IGi-LDh=A2&p!19;VQ$Rc;`Rf*U%3Vx;)wx?A_uru$iwF&o0vToE(7!csvZ zRxjnba|*)Lu1BdJ+H?u5JU3NhtxWuJS0aHtwQGCWcxt+T@-A<0nc4}bngOdx#Yz>n zFSPxDdI?DQl^}BPN|VeqJxr6#R6UN9%yd1_lFSr5Qj$)}@3@t6OpY`Za#W5qlyY2- zJZiYYMOb4ZSWgfbZQsWPHhR+tXL-&NB8A41`J4}MAD0F3wlCl2@VI74ZishXQ< zoT-xAX`HE+8)m$*j9Y5_UfBbMXX^jzrSQPKl6=yB*Cn3=d$gvUlRADc>G8JYQOIqV zTso8ce{~i^WoXdV#*Hoe^DINrf2+xk+?rK?ZMFZ@P0_Dnp4eQ`JfEJw)u~k2~n)mOp@Hi)~y8|Z3j

!tBo2Hfz1ZRl>QM|8 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 H#H;@S&teod diff --git a/Barcode/OLD_VERSIONS/BarcodeStudio v1.0.zip b/Barcode/OLD_VERSIONS/BarcodeStudio v1.0.zip deleted file mode 100644 index 3fd4b240ee1523064960083c8f7b9f6741ceb6e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308072 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 z 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
    _DQ{bv%-c{P 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�)s=oJYY_&?+j34a7=&iHV>W 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 z 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 bSB_tC(61JE006<&r~YckBdzQYpZ5O&@M9>H diff --git a/Barcode/README.md b/Barcode/README.md deleted file mode 100644 index 6cedcdd..0000000 --- a/Barcode/README.md +++ /dev/null @@ -1,385 +0,0 @@ -# Cipher · Barcode Studio - -A self-contained, browser-based barcode generator that converts text or numeric sequences into 22 different barcode symbologies and exports them as downloadable JPG (or PNG) images. Designed to run as a single hardened Docker container with no backend, no database, and no telemetry — everything happens in the user's browser. - -![status](https://img.shields.io/badge/status-stable-success) ![docker](https://img.shields.io/badge/docker-compose-blue) ![license](https://img.shields.io/badge/license-MIT-lightgrey) - ---- - -## Table of Contents - -1. [Features](#features) -2. [Supported Barcode Formats](#supported-barcode-formats) -3. [Architecture](#architecture) -4. [Requirements](#requirements) -5. [Quick Start](#quick-start) -6. [Configuration](#configuration) -7. [Project Structure](#project-structure) -8. [Security](#security) -9. [Dependency Versions & Vulnerability Status](#dependency-versions--vulnerability-status) -10. [Operations](#operations) -11. [Updating & Maintenance](#updating--maintenance) -12. [Troubleshooting](#troubleshooting) -13. [Development](#development) -14. [License](#license) - ---- - -## Features - -* **22 barcode symbologies** spanning retail/GS1, linear/industrial, pharma, postal and 2D matrix codes. -* **Live example preview** — every symbology shows a sample render the moment it's selected. -* **Batch generation** — paste lines into the input area and each line becomes its own barcode card. -* **Per-card text toggle** — show or hide the human-readable caption beneath each barcode, then download it in that state. -* **JPG and PNG export** — individual downloads per barcode plus a one-click "Download All as JPG" for the whole batch. -* **Adjustable scale and JPG quality** for print-ready output. -* **Fully offline-capable** once loaded — every library is vendored locally, no third-party CDN at runtime (web fonts are the only external request and are optional). -* **No backend** — runs entirely as static assets served by nginx. No database, no API, no user data leaves the browser. - ---- - -## Supported Barcode Formats - -| Group | Symbology | Notes | -|---|---|---| -| Retail · GS1 | EAN-13, EAN-8, UPC-A, UPC-E, ISBN-13, GS1 DataBar, GS1-128 | ISBN-10 auto-converts to ISBN-13 | -| Linear · Industrial | Code-128, Code-39, Code-39 Full ASCII, Code-93, Code-11, Code 2of5 Interleaved, MSI Plessey, Flattermarken, Telepen Alpha | | -| Pharma · Specialty | Pharmacode One-Track, Pharmacode Two-Track | Laetus binary codes | -| Postal | KIX | Dutch PostNL routing | -| 2D · Matrix | QR Code, Data Matrix, PDF417 | | - ---- - -## Architecture - -``` -┌─────────────────────────────────────────────────────────────┐ -│ Browser │ -│ ┌───────────────────────────────────────────────────┐ │ -│ │ index.html (UI + state) │ │ -│ │ ├── JsBarcode (linear codes) │ │ -│ │ └── bwip-js (specialty + 2D codes) │ │ -│ │ ─→ HTMLCanvasElement → JPG / PNG Blob │ │ -│ └───────────────────────────────────────────────────┘ │ -└──────────────────────────────┬──────────────────────────────┘ - │ HTTP (static assets only) - ▼ -┌─────────────────────────────────────────────────────────────┐ -│ Docker container · nginx 1.30.1 · alpine 3.23 │ -│ • runs as non-root (UID 101) │ -│ • read-only root filesystem │ -│ • all caps dropped, no-new-privileges │ -│ • CSP / HSTS / nosniff / X-Frame-Options / COOP / CORP │ -└─────────────────────────────────────────────────────────────┘ -``` - -Encoding happens **entirely in the browser** — the container only ships static HTML/JS. The image cannot leak data because there is no application server to leak through. - ---- - -## Requirements - -| Component | Minimum version | Why | -|---|---|---| -| Docker Engine | **24.0+** | Buildkit, compose-v2 features | -| Docker Compose | **v2.20+** | Modern compose schema (`deploy.resources`, `tmpfs` options) | -| Host OS | Linux / macOS / Windows (WSL2) | Anything Docker supports | -| RAM | 64 MB free | Container reserves 32 MB, caps at 128 MB | -| Disk | ~50 MB | Image is ~40 MB | -| Open port | one host port (default 8080) | Reconfigurable via `.env` | - -Verify your toolchain: - -```bash -docker --version # → Docker version 24.x.x or newer -docker compose version # → Docker Compose version v2.20+ or newer -``` - -If you're on an older Docker that only has the standalone `docker-compose` binary, the file still works — just replace `docker compose` with `docker-compose` in the commands below. - ---- - -## Quick Start - -```bash -# 1. Unzip and enter the project -unzip cipher-barcode-studio.zip -cd cipher-barcode-studio - -# 2. (Optional) override the host port -cp .env.example .env # then edit HOST_PORT if needed - -# 3. Build and start -docker compose up -d --build - -# 4. Open in browser -# http://localhost:8080 -``` - -That's it. To stop: - -```bash -docker compose down -``` - -To stop and remove the built image as well: - -```bash -docker compose down --rmi local -``` - ---- - -## Configuration - -All runtime configuration lives in `.env` (copied from `.env.example`): - -| Variable | Default | Description | -|---|---|---| -| `HOST_PORT` | `8080` | Port published on the host machine | - -The container itself always listens on `8080` internally — only the host-side port is configurable. - -### Putting it behind a reverse proxy - -If you're running this behind Traefik, Caddy, nginx, or similar: - -```yaml -# example with Traefik labels -services: - cipher: - # ...existing config... - labels: - - "traefik.enable=true" - - "traefik.http.routers.cipher.rule=Host(`barcode.example.com`)" - - "traefik.http.routers.cipher.tls=true" - - "traefik.http.routers.cipher.tls.certresolver=letsencrypt" - - "traefik.http.services.cipher.loadbalancer.server.port=8080" -``` - -When fronted by HTTPS, the `Strict-Transport-Security` header in `nginx.conf` will kick in automatically. - ---- - -## Project Structure - -``` -cipher-barcode-studio/ -├── docker-compose.yml # Orchestration + runtime hardening -├── Dockerfile # Image build steps -├── .dockerignore # Keep the build context lean -├── .env.example # Template for runtime config -├── LICENSE # MIT + third-party attributions -├── README.md # You are here -├── nginx/ -│ └── nginx.conf # Hardened nginx config w/ CSP & security headers -└── web/ - ├── index.html # The full application (single HTML file) - └── vendor/ - ├── JsBarcode.all.min.js - └── bwip-js-min.js -``` - ---- - -## Security - -This image is built with a defense-in-depth posture even though it serves static content with no user data: - -### Container hardening - -| Control | Mechanism | -|---|---| -| Non-root execution | Image's `USER` is `nginx` (UID 101). Compose pins `user: "101:101"`. | -| Read-only rootfs | `read_only: true` in compose; writable paths exposed via `tmpfs`. | -| Capability drop | `cap_drop: [ALL]` — no Linux capabilities granted. | -| No privilege escalation | `security_opt: no-new-privileges:true`. | -| Resource limits | CPU capped at 0.5 cores, memory at 128 MB. | -| Minimal base | `nginxinc/nginx-unprivileged:alpine3.23-slim` — Alpine, no extra packages, security upgrades applied at build. | -| Restricted log size | json-file driver capped at 5 MB × 3 rotations. | - -### HTTP hardening (in `nginx/nginx.conf`) - -| Header | Purpose | -|---|---| -| `Content-Security-Policy` | Restricts scripts/styles/fonts/images to `self` + Google Fonts only | -| `Strict-Transport-Security` | One-year HSTS with subdomain coverage (effective behind TLS) | -| `X-Frame-Options: DENY` + CSP `frame-ancestors 'none'` | Clickjacking protection | -| `X-Content-Type-Options: nosniff` | Disables MIME sniffing | -| `Referrer-Policy: strict-origin-when-cross-origin` | Limits referrer leakage | -| `Permissions-Policy` | Disables camera, mic, geolocation, USB, payment APIs | -| `Cross-Origin-Opener-Policy: same-origin` | Window isolation | -| `Cross-Origin-Resource-Policy: same-origin` | Resource isolation | -| `server_tokens off` | Hides nginx version | - -Also: request size capped at 1 KB (this is a static GET-only service), hidden files (`/\.`) blocked, `/healthz` lightweight endpoint for orchestrators. - -### Supply chain - -* JavaScript libraries are **vendored** under `web/vendor/`, not loaded from CDN at runtime. -* Each ` - - - - - - -
    -
    -
    Barcode Studio · v1.1
    -
    J.Vaz 2026
    -
    -
    - System Live - Formats 22 - Output JPG / PNG -
    -
    - -
    -

    Encode anything.
    Print everything.

    -
    - Studio Manual - A precision instrument for converting text and numbers into industrial-grade barcodes. - Select a symbology, paste your data line-by-line, and export downloadable JPG images — - one per line, or all at once. -
    -
    - -
    - - - - - -
    - - -
    -
    -

    -
    Select a format
    -

    Pick a symbology from the panel on the left to begin.

    -
    -
    -
    -
    Loading…
    -
    -
    - - -
    -
    -

    Data Input

    -
    One barcode per line · to add another
    -
    - - -
    - - - -
    - -
    - - - -
    -
    - - -
    -
    -

    Output

    -
    Generated · 0
    -
    -
    -
    No barcodes generated yet
    -
    -
    - -
    -
    - -
    -
    Barcode Studio
    -
    -
    JPG · PNG · Print-Ready
    -
    - -
    Saved
    - - - - - diff --git a/Barcode/web/vendor/JsBarcode.all.min.js b/Barcode/web/vendor/JsBarcode.all.min.js deleted file mode 100644 index 80d1092..0000000 --- a/Barcode/web/vendor/JsBarcode.all.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! JsBarcode v3.12.3 | (c) Johan Lindell | MIT license */ -!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=16)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.default=function t(e,n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.data=e,this.text=n.text||e,this.options=n}},function(t,e,n){"use strict";var r;function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}Object.defineProperty(e,"__esModule",{value:!0});var i=e.SET_A=0,a=e.SET_B=1,u=e.SET_C=2,f=(e.SHIFT=98,e.START_A=103),c=e.START_B=104,s=e.START_C=105;e.MODULO=103,e.STOP=106,e.FNC1=207,e.SET_BY_CODE=(o(r={},f,i),o(r,c,a),o(r,s,u),r),e.SWAP={101:i,100:a,99:u},e.A_START_CHAR=String.fromCharCode(208),e.B_START_CHAR=String.fromCharCode(209),e.C_START_CHAR=String.fromCharCode(210),e.A_CHARS="[\0-_È-Ï]",e.B_CHARS="[ -È-Ï]",e.C_CHARS="(Ï*[0-9]{2}Ï*)",e.BARS=[11011001100,11001101100,11001100110,10010011e3,10010001100,10001001100,10011001e3,10011000100,10001100100,11001001e3,11001000100,11000100100,10110011100,10011011100,10011001110,10111001100,10011101100,10011100110,11001110010,11001011100,11001001110,11011100100,11001110100,11101101110,11101001100,11100101100,11100100110,11101100100,11100110100,11100110010,11011011e3,11011000110,11000110110,10100011e3,10001011e3,10001000110,10110001e3,10001101e3,10001100010,11010001e3,11000101e3,11000100010,10110111e3,10110001110,10001101110,10111011e3,10111000110,10001110110,11101110110,11010001110,11000101110,11011101e3,11011100010,11011101110,11101011e3,11101000110,11100010110,11101101e3,11101100010,11100011010,11101111010,11001000010,11110001010,1010011e4,10100001100,1001011e4,10010000110,10000101100,10000100110,1011001e4,10110000100,1001101e4,10011000010,10000110100,10000110010,11000010010,1100101e4,11110111010,11000010100,10001111010,10100111100,10010111100,10010011110,10111100100,10011110100,10011110010,11110100100,11110010100,11110010010,11011011110,11011110110,11110110110,10101111e3,10100011110,10001011110,10111101e3,10111100010,11110101e3,11110100010,10111011110,10111101110,11101011110,11110101110,11010000100,1101001e4,11010011100,1100011101011]},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.SIDE_BIN="101",e.MIDDLE_BIN="01010",e.BINARIES={L:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],G:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"],R:["1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"],O:["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],E:["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"]},e.EAN2_STRUCTURE=["LL","LG","GL","GG"],e.EAN5_STRUCTURE=["GGLLL","GLGLL","GLLGL","GLLLG","LGGLL","LLGGL","LLLGG","LGLGL","LGLLG","LLGLG"],e.EAN13_STRUCTURE=["LLLLLL","LLGLGG","LLGGLG","LLGGGL","LGLLGG","LGGLLG","LGGGLL","LGLGLG","LGLGGL","LGGLGL"]},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(2);e.default=function(t,e,n){var o=t.split("").map((function(t,n){return r.BINARIES[e[n]]})).map((function(e,n){return e?e[t[n]]:""}));if(n){var i=t.length-1;o=o.map((function(t,e){return e=200){i=t.shift()-105;var a=u.SWAP[i];void 0!==a?o=e.next(t,n+1,a):(r!==u.SET_A&&r!==u.SET_B||i!==u.SHIFT||(t[0]=r===u.SET_A?t[0]>95?t[0]-96:t[0]:t[0]<32?t[0]+96:t[0]),o=e.next(t,n+1,r))}else i=e.correctIndex(t,r),o=e.next(t,n+1,r);var f=i*n;return{result:e.getBar(i)+o.result,checksum:f+o.checksum}}}]),e}(a.default);e.default=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mod10=function(t){for(var e=0,n=0;n10*n.width?10*n.width:n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"encode",value:function(){return this.options.flat?this.encodeFlat():this.encodeGuarded()}},{key:"leftText",value:function(t,e){return this.text.substr(t,e)}},{key:"leftEncode",value:function(t,e){return(0,i.default)(t,e)}},{key:"rightText",value:function(t,e){return this.text.substr(t,e)}},{key:"rightEncode",value:function(t,e){return(0,i.default)(t,e)}},{key:"encodeGuarded",value:function(){var t={fontSize:this.fontSize},e={height:this.guardHeight};return[{data:o.SIDE_BIN,options:e},{data:this.leftEncode(),text:this.leftText(),options:t},{data:o.MIDDLE_BIN,options:e},{data:this.rightEncode(),text:this.rightText(),options:t},{data:o.SIDE_BIN,options:e}]}},{key:"encodeFlat",value:function(){return{data:[o.SIDE_BIN,this.leftEncode(),o.MIDDLE_BIN,this.rightEncode(),o.SIDE_BIN].join(""),text:this.text}}}]),e}(a(n(0)).default);e.default=u},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"valid",value:function(){return-1!==this.data.search(/^[0-9]{12}$/)&&this.data[11]==u(this.data)}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var t="";return t+="101",t+=(0,o.default)(this.data.substr(0,6),"LLLLLL"),t+="01010",t+=(0,o.default)(this.data.substr(6,6),"RRRRRR"),{data:t+="101",text:this.text}}},{key:"guardedEncoding",value:function(){var t=[];return this.displayValue&&t.push({data:"00000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),t.push({data:"101"+(0,o.default)(this.data[0],"L"),options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(1,5),"LLLLL"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),t.push({data:"01010",options:{height:this.guardHeight}}),t.push({data:(0,o.default)(this.data.substr(6,5),"RRRRR"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),t.push({data:(0,o.default)(this.data[11],"R")+"101",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:"00000000",text:this.text.substr(11,1),options:{textAlign:"right",fontSize:this.fontSize}}),t}}]),e}(i(n(0)).default);function u(t){var e,n=0;for(e=1;e<11;e+=2)n+=parseInt(t[e]);for(e=0;e<11;e+=2)n+=3*parseInt(t[e]);return(10-n%10)%10}e.default=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n0?e.fontSize+e.textMargin:0)+e.marginTop+e.marginBottom}function u(t,e,n){if(n.displayValue&&ee&&(e=t[n].height);return e},e.getEncodingHeight=a,e.getBarcodePadding=u,e.calculateEncodingAttributes=function(t,e,n){for(var r=0;r=i(t);return e+String.fromCharCode(r?206:205)+u(t,r)}e.default=function(t){var e=void 0;if(a(t).length>=2)e=r.C_START_CHAR+f(t);else{var n=o(t)>i(t);e=(n?r.A_START_CHAR:r.B_START_CHAR)+u(t,n)}return e.replace(/[\xCD\xCE]([^])[\xCD\xCE]/,(function(t,e){return String.fromCharCode(203)+e}))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n10*n.width?r.fontSize=10*n.width:r.fontSize=n.fontSize,r.guardHeight=n.height+r.fontSize/2+n.textMargin,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),r(e,[{key:"valid",value:function(){return this.isValid}},{key:"encode",value:function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()}},{key:"flatEncoding",value:function(){var t="";return t+="101",t+=this.encodeMiddleDigits(),{data:t+="010101",text:this.text}}},{key:"guardedEncoding",value:function(){var t=[];return this.displayValue&&t.push({data:"00000000",text:this.text[0],options:{textAlign:"left",fontSize:this.fontSize}}),t.push({data:"101",options:{height:this.guardHeight}}),t.push({data:this.encodeMiddleDigits(),text:this.text.substring(1,7),options:{fontSize:this.fontSize}}),t.push({data:"010101",options:{height:this.guardHeight}}),this.displayValue&&t.push({data:"00000000",text:this.text[7],options:{textAlign:"right",fontSize:this.fontSize}}),t}},{key:"encodeMiddleDigits",value:function(){var t=this.upcA[0],e=this.upcA[this.upcA.length-1],n=s[parseInt(e)][parseInt(t)];return(0,o.default)(this.middleDigits,n)}}]),e}(i.default);function p(t,e){for(var n=parseInt(t[t.length-1]),r=c[n],o="",i=0,u=0;u=3&&this.number<=131070}}]),e}(((r=i)&&r.__esModule?r:{default:r}).default);e.pharmacode=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.codabar=void 0;var r,o=function(){function t(t,e){for(var n=0;n":["(%)","I"],"?":["(%)","J"],"@":["(%)","V"],"[":["(%)","K"],"\\":["(%)","L"],"]":["(%)","M"],"^":["(%)","N"],_:["(%)","O"],"`":["(%)","W"],a:["(+)","A"],b:["(+)","B"],c:["(+)","C"],d:["(+)","D"],e:["(+)","E"],f:["(+)","F"],g:["(+)","G"],h:["(+)","H"],i:["(+)","I"],j:["(+)","J"],k:["(+)","K"],l:["(+)","L"],m:["(+)","M"],n:["(+)","N"],o:["(+)","O"],p:["(+)","P"],q:["(+)","Q"],r:["(+)","R"],s:["(+)","S"],t:["(+)","T"],u:["(+)","U"],v:["(+)","V"],w:["(+)","W"],x:["(+)","X"],y:["(+)","Y"],z:["(+)","Z"],"{":["(%)","P"],"|":["(%)","Q"],"}":["(%)","R"],"~":["(%)","S"],"":["(%)","T"]}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n0?(n=0,o.textAlign="left"):"right"==t.textAlign?(n=e.width-1,o.textAlign="right"):(n=e.width/2,o.textAlign="center"),o.fillText(e.text,n,r))}},{key:"moveCanvasDrawing",value:function(t){this.canvas.getContext("2d").translate(t.width,0)}},{key:"restoreCanvas",value:function(){this.canvas.getContext("2d").restore()}}]),t}();e.default=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(){function t(t,e){for(var n=0;n0&&(this.drawRect(a-e.width*i,r,e.width*i,e.height,t),i=0);i>0&&this.drawRect(a-e.width*(i-1),r,e.width*i,e.height,t)}},{key:"drawSVGText",value:function(t,e,n){var r,o,i=this.document.createElementNS(f,"text");e.displayValue&&(i.setAttribute("font-family",e.font),i.setAttribute("font-size",e.fontSize),e.fontOptions.includes("bold")&&i.setAttribute("font-weight","bold"),e.fontOptions.includes("italic")&&i.setAttribute("font-style","italic"),o="top"==e.textPosition?e.fontSize-e.textMargin:e.height+e.textMargin+e.fontSize,"left"==e.textAlign||n.barcodePadding>0?(r=0,i.setAttribute("text-anchor","start")):"right"==e.textAlign?(r=n.width-1,i.setAttribute("text-anchor","end")):(r=n.width/2,i.setAttribute("text-anchor","middle")),i.setAttribute("x",r),i.setAttribute("y",o),i.appendChild(this.document.createTextNode(n.text)),t.appendChild(i))}},{key:"setSvgAttributes",value:function(t,e){var n=this.svg;n.setAttribute("width",t+"px"),n.setAttribute("height",e+"px"),n.setAttribute("x","0px"),n.setAttribute("y","0px"),n.setAttribute("viewBox","0 0 "+t+" "+e),n.setAttribute("xmlns",f),n.setAttribute("version","1.1")}},{key:"createGroup",value:function(t,e,n){var r=this.document.createElementNS(f,"g");return r.setAttribute("transform","translate("+t+", "+e+")"),n.appendChild(r),r}},{key:"setGroupOptions",value:function(t,e){t.setAttribute("fill",e.lineColor)}},{key:"drawRect",value:function(t,e,n,r,o){var i=this.document.createElementNS(f,"rect");return i.setAttribute("x",t),i.setAttribute("y",e),i.setAttribute("width",n),i.setAttribute("height",r),o.appendChild(i),i}}]),t}();e.default=c},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n=0&&$k[i]!==Infinity;i--);if(i<0){throw new Error("array-marker-not-found")}a=$k.splice(i+1,$j-1-i);$j=i}else if(!(a instanceof Array)){a=new Array(+arguments[0]);for(var i=0,l=a.length;i=0&&$k[mark]!==Infinity;mark-=2){if($k[mark-1]===Infinity){throw new Error("dict-malformed-stack")}}if(mark<0){throw new Error("dict-marker-not-found")}var d=new Map;for(var i=mark+1;i<$j;i+=2){var k=$k[i];var t=typeof k;if(t=="number"||t=="string"){d.set(k,$k[i+1])}else if(k instanceof Uint8Array){d.set($z(k),$k[i+1])}else{throw new Error("dict-not-a-valid-key("+k+")")}}$j=mark;return d}function $s(v){var t=typeof v;if(t==="number"){return new Uint8Array(v)}if(t!=="string"){v=""+v}var s=new Uint8Array(v.length);for(var i=0,l=v.length;i=0;i--){d[o+i]=s[i]}}}else if(d instanceof Array){var darr=d.b;var doff=o+d.o;var sarr=s.b;var soff=s.o;for(var i=0,l=s.length;i0&&$k[--$j]!==Infinity);}function $m(){for(var i=$j-1;i>=0&&$k[i]!==Infinity;i--);return $j-i-1}function $q(a){for(var i=0,l=a.length,b=a.b,o=a.o;ib}function $ge(a,b){if(a instanceof Uint8Array){a=$z(a)}if(b instanceof Uint8Array){b=$z(b)}return a>=b}function $an(a,b){return typeof a==="boolean"?a&&b:a&b}function $or(a,b){return typeof a==="boolean"?a||b:a|b}function $xo(a,b){return typeof a==="boolean"?a!=b:a^b}function $nt(a){return typeof a=="boolean"?!a:~a}function $bs(v,n){return n<0?$flr(v/$pow(2,-n)):v*$pow(2,n)}var $f=function(fa){return v=>{return(v|0)==v?v:(fa[0]=v,fa[0])}}(new Float32Array(1));function bwipp_raiseerror(){var info=$k[--$j];var name=$k[--$j];bwipp_error.set("errorname",name);bwipp_error.set("errorinfo",info);if(typeof info=="string"||info instanceof Uint8Array){throw new Error($z(name)+": "+$z(info))}else{throw $z(name)}}const _textOptions=new Map([["",""],["subspace",""],["split",""],["linegaps",1.2],["color","unset"],["xalign","left"],["yalign","above"],["direction","forward"],["font","OCR-B"],["size",10],["xoffset",0],["yoffset",0],["gaps",0]]);function bwipp_inittextoptions(){for(var grp=1;grp<=9;grp++){var map=_textOptions;for(var keys=map.keys(),i=0,l=map.size;i=3){var _k=$k[$j-1];var _l=$G(_k,0,3);var _m=$_.ctrl;var _n=$has(_m,_l);$k[$j++]=_m;$k[$j++]=_l;if(_n){$_.j=$_.j-1;var _p=$k[--$j];var _q=$k[--$j];$p($_.msg,$_.j,$g(_q,_p));$_.j=$_.j+1;var _v=$k[--$j];$k[$j++]=$G(_v,3,_v.length-3);break}else{$j-=2}}var _x=$k[$j-1];if(_x.length>=2){var _y=$k[$j-1];var _z=$G(_y,0,2);var _10=$_.ctrl;var _11=$has(_10,_z);$k[$j++]=_10;$k[$j++]=_z;if(_11){$_.j=$_.j-1;var _13=$k[--$j];var _14=$k[--$j];$p($_.msg,$_.j,$g(_14,_13));$_.j=$_.j+1;var _19=$k[--$j];$k[$j++]=$G(_19,2,_19.length-2);break}else{$j-=2}}var _1B=$k[$j-1];if(_1B.length>=3){var _1C=$k[$j-1];var _1D=$G(_1C,0,3);$k[$j++]=true;for(var _1E=0,_1F=_1D.length;_1E<_1F;_1E++){var _1G=$g(_1D,_1E);if(_1G<48||_1G>57){$k[$j-1]=false}}var _1H=$k[--$j];if(_1H){var _1I=$k[$j-1];var _1K=$i($G(_1I,0,3));$k[$j++]=_1K;if(_1K>255){$j-=2;$k[$j++]="bwipp.invalidOrdinal#492";$k[$j++]="Ordinal must be 000 to 255";bwipp_raiseerror()}$_.j=$_.j-1;var _1N=$k[--$j];$p($_.msg,$_.j,_1N);$_.j=$_.j+1;var _1Q=$k[--$j];$k[$j++]=$G(_1Q,3,_1Q.length-3)}}}if($_.parseonly||!$_.parsefnc||$g($_.msg,$_.j-1)!=94){break}$_.j=$_.j-1;var _1Y=$k[$j-1];if(_1Y.length<1){$k[$j-1]="bwipp.truncatedCaret#511";$k[$j++]="Caret character truncated";bwipp_raiseerror()}var _1Z=$k[$j-1];if($g(_1Z,0)==94){$p($_.msg,$_.j,94);$_.j=$_.j+1;var _1e=$k[--$j];$k[$j++]=$G(_1e,1,_1e.length-1);break}var _1g=$k[$j-1];if(_1g.length<3){$k[$j-1]="bwipp.truncatedFNC#521";$k[$j++]="Function character truncated";bwipp_raiseerror()}var _1h=$k[$j-1];if($eq($G(_1h,0,3),"ECI")&&$_.eci){var _1k=$k[$j-1];if(_1k.length<9){$k[$j-1]="bwipp.truncatedECI#526";$k[$j++]="ECI truncated";bwipp_raiseerror()}var _1l=$k[$j-1];var _1m=$G(_1l,3,6);$k[$j++]=_1m;for(var _1n=0,_1o=_1m.length;_1n<_1o;_1n++){var _1p=$g(_1m,_1n);if(_1p<48||_1p>57){$j-=2;$k[$j++]="bwipp.invalidECI#532";$k[$j++]="ECI must be 000000 to 999999";bwipp_raiseerror()}}var _1q=$k[--$j];var _1t=0;$F(_1q,function(){var _1r=$k[--$j];_1t=$f(_1t-(_1r-48))*10});$p($_.msg,$_.j,~~(_1t/10)-1e6);$_.j=$_.j+1;var _1x=$k[--$j];$k[$j++]=$G(_1x,9,_1x.length-9);break}var _1z=$k[$j-1];if(_1z.length<4){$k[$j-1]="bwipp.truncatedFNC#543";$k[$j++]="Function character truncated";bwipp_raiseerror()}var _20=$k[$j-1];var _21=$G(_20,0,4);var _23=$has($_.fncvals,_21);$k[$j++]=_21;if(!_23){var _24=$k[--$j];var _25=$s(_24.length+28);$P(_25,28,_24);$P(_25,0,"Unknown function character: ");$k[$j-1]="bwipp.unknownFNC#549";$k[$j++]=_25;bwipp_raiseerror()}var _29=$k[--$j];$p($_.msg,$_.j,$g($_.fncvals,_29));$_.j=$_.j+1;var _2E=$k[--$j];$k[$j++]=$G(_2E,4,_2E.length-4);break}}else{break}}if(!$_.parseonly){$k[$j++]=$G($_.msg,0,$_.j)}else{$k[$j++]=$s($_.j);for(var _2O=0,_2N=$_.j-1;_2O<=_2N;_2O+=1){var _2P=$k[$j-1];$p(_2P,_2O,$g($_.msg,_2O))}}$_=$__}function bwipp_gs1process(){if(!bwipp_gs1process.globals){var $__=$_;$_=bwipp_gs1process.globals={};$_.gs1process_primes=$a([2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83]);$_.gs1process_daysinmonth=$a([31,-1,31,30,31,30,31,31,30,31,30,31]);var _3=new Map([["cset","N"],["min",18],["max",18],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _6=new Map([["parts",$a([_3])],["dlpkey",$a([])]]);var _8=new Map([["cset","N"],["min",14],["max",14],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _E=new Map([["parts",$a([_8])],["ex",$a(["255","37"])],["dlpkey",$a([$a(["22","10","21"]),$a(["235"])])]]);var _G=new Map([["cset","N"],["min",14],["max",14],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _M=new Map([["parts",$a([_G])],["ex",$a(["01","03"])],["req",$a([$a([$a(["37"])])])]]);var _O=new Map([["cset","N"],["min",14],["max",14],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _R=new Map([["parts",$a([_O])],["ex",$a(["01","02","37"])],["dlattr",false]]);var _T=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _c=new Map([["parts",$a([_T])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["03"]),$a(["8006"]),$a(["8026"])])])]]);var _e=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmd0"])]]);var _n=new Map([["parts",$a([_e])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["03"]),$a(["8006"]),$a(["8026"])])])]]);var _p=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmd0"])]]);var _u=new Map([["parts",$a([_p])],["req",$a([$a([$a(["8020"])])])]]);var _w=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmd0"])]]);var _15=new Map([["parts",$a([_w])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["03"]),$a(["8006"]),$a(["8026"])])])]]);var _17=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmd0"])]]);var _1H=new Map([["parts",$a([_17])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["03"]),$a(["255"]),$a(["8006"]),$a(["8026"])])])]]);var _1J=new Map([["cset","N"],["min",2],["max",2],["opt",false],["linters",$a([])]]);var _1R=new Map([["parts",$a([_1J])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["8006"]),$a(["8026"])])])]]);var _1T=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _1b=new Map([["parts",$a([_1T])],["ex",$a(["235"])],["req",$a([$a([$a(["01"]),$a(["03"]),$a(["8006"])])])],["dlattr",false]]);var _1d=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _1i=new Map([["parts",$a([_1d])],["req",$a([$a([$a(["01"])])])],["dlattr",false]]);var _1k=new Map([["cset","X"],["min",1],["max",28],["opt",false],["linters",$a([])]]);var _1p=new Map([["parts",$a([_1k])],["req",$a([$a([$a(["01"])])])],["dlattr",false]]);var _1r=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _1z=new Map([["parts",$a([_1r])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["8006"]),$a(["8026"])])])]]);var _21=new Map([["cset","N"],["min",1],["max",6],["opt",false],["linters",$a([])]]);var _29=new Map([["parts",$a([_21])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["8006"]),$a(["8026"])])])]]);var _2B=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _2G=new Map([["parts",$a([_2B])],["req",$a([$a([$a(["01"])])])]]);var _2I=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _2Q=new Map([["parts",$a([_2I])],["req",$a([$a([$a(["01"]),$a(["8006"])]),$a([$a(["21"])])])]]);var _2S=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _2Y=new Map([["parts",$a([_2S])],["req",$a([$a([$a(["01"]),$a(["8006"])])])]]);var _2a=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _2c=new Map([["cset","X"],["min",1],["max",17],["opt",true],["linters",$a([])]]);var _2f=new Map([["parts",$a([_2a,_2c])],["dlpkey",$a([])]]);var _2h=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _2m=new Map([["parts",$a([_2h])],["req",$a([$a([$a(["414"])])])],["dlattr",false]]);var _2o=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _2q=new Map([["cset","N"],["min",1],["max",12],["opt",true],["linters",$a([])]]);var _2u=new Map([["parts",$a([_2o,_2q])],["ex",$a(["01","02","415","8006","8020","8026"])],["dlpkey",$a([])]]);var _2w=new Map([["cset","N"],["min",1],["max",8],["opt",false],["linters",$a([])]]);var _32=new Map([["parts",$a([_2w])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _34=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3B=new Map([["parts",$a([_34])],["ex",$a(["310n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3D=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3K=new Map([["parts",$a([_3D])],["ex",$a(["311n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3M=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3T=new Map([["parts",$a([_3M])],["ex",$a(["312n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3V=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3c=new Map([["parts",$a([_3V])],["ex",$a(["313n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3e=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3l=new Map([["parts",$a([_3e])],["ex",$a(["314n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3n=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _3u=new Map([["parts",$a([_3n])],["ex",$a(["315n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _3w=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _43=new Map([["parts",$a([_3w])],["ex",$a(["316n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _45=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4C=new Map([["parts",$a([_45])],["ex",$a(["320n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4E=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4L=new Map([["parts",$a([_4E])],["ex",$a(["321n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4N=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4U=new Map([["parts",$a([_4N])],["ex",$a(["322n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4W=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4d=new Map([["parts",$a([_4W])],["ex",$a(["323n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4f=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4m=new Map([["parts",$a([_4f])],["ex",$a(["324n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4o=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _4v=new Map([["parts",$a([_4o])],["ex",$a(["325n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _4x=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _54=new Map([["parts",$a([_4x])],["ex",$a(["326n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _56=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5D=new Map([["parts",$a([_56])],["ex",$a(["327n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _5F=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5M=new Map([["parts",$a([_5F])],["ex",$a(["328n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _5O=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5V=new Map([["parts",$a([_5O])],["ex",$a(["329n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _5X=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5e=new Map([["parts",$a([_5X])],["ex",$a(["330n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _5g=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5n=new Map([["parts",$a([_5g])],["ex",$a(["331n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _5p=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _5w=new Map([["parts",$a([_5p])],["ex",$a(["332n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _5y=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _65=new Map([["parts",$a([_5y])],["ex",$a(["333n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _67=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6E=new Map([["parts",$a([_67])],["ex",$a(["334n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _6G=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6N=new Map([["parts",$a([_6G])],["ex",$a(["335n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _6P=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6W=new Map([["parts",$a([_6P])],["ex",$a(["336n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _6Y=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6e=new Map([["parts",$a([_6Y])],["ex",$a(["337n"])],["req",$a([$a([$a(["01"])])])]]);var _6g=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6n=new Map([["parts",$a([_6g])],["ex",$a(["340n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _6p=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _6w=new Map([["parts",$a([_6p])],["ex",$a(["341n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _6y=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _75=new Map([["parts",$a([_6y])],["ex",$a(["342n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _77=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7E=new Map([["parts",$a([_77])],["ex",$a(["343n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7G=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7N=new Map([["parts",$a([_7G])],["ex",$a(["344n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7P=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7W=new Map([["parts",$a([_7P])],["ex",$a(["345n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7Y=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7f=new Map([["parts",$a([_7Y])],["ex",$a(["346n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7h=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7o=new Map([["parts",$a([_7h])],["ex",$a(["347n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7q=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _7x=new Map([["parts",$a([_7q])],["ex",$a(["348n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _7z=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _86=new Map([["parts",$a([_7z])],["ex",$a(["349n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _88=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8F=new Map([["parts",$a([_88])],["ex",$a(["350n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _8H=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8O=new Map([["parts",$a([_8H])],["ex",$a(["351n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _8Q=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8X=new Map([["parts",$a([_8Q])],["ex",$a(["352n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _8Z=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8g=new Map([["parts",$a([_8Z])],["ex",$a(["353n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _8i=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8p=new Map([["parts",$a([_8i])],["ex",$a(["354n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _8r=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _8y=new Map([["parts",$a([_8r])],["ex",$a(["355n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _90=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _97=new Map([["parts",$a([_90])],["ex",$a(["356n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _99=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9G=new Map([["parts",$a([_99])],["ex",$a(["357n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _9I=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9P=new Map([["parts",$a([_9I])],["ex",$a(["360n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _9R=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9Y=new Map([["parts",$a([_9R])],["ex",$a(["361n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _9a=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9h=new Map([["parts",$a([_9a])],["ex",$a(["362n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _9j=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9q=new Map([["parts",$a([_9j])],["ex",$a(["363n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _9s=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _9z=new Map([["parts",$a([_9s])],["ex",$a(["364n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _A1=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _A8=new Map([["parts",$a([_A1])],["ex",$a(["365n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _AA=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _AH=new Map([["parts",$a([_AA])],["ex",$a(["366n"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _AJ=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _AQ=new Map([["parts",$a([_AJ])],["ex",$a(["367n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _AS=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _AZ=new Map([["parts",$a([_AS])],["ex",$a(["368n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _Ab=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _Ai=new Map([["parts",$a([_Ab])],["ex",$a(["369n"])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _Ak=new Map([["cset","N"],["min",1],["max",8],["opt",false],["linters",$a([])]]);var _As=new Map([["parts",$a([_Ak])],["req",$a([$a([$a(["00"])]),$a([$a(["02"]),$a(["8026"])])])]]);var _Au=new Map([["cset","N"],["min",1],["max",15],["opt",false],["linters",$a([])]]);var _B1=new Map([["parts",$a([_Au])],["ex",$a(["390n","391n","394n","8111"])],["req",$a([$a([$a(["255"]),$a(["8020"])])])]]);var _B3=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso4217"])]]);var _B5=new Map([["cset","N"],["min",1],["max",15],["opt",false],["linters",$a([])]]);var _BB=new Map([["parts",$a([_B3,_B5])],["ex",$a(["391n"])],["req",$a([$a([$a(["8020"])])])]]);var _BD=new Map([["cset","N"],["min",1],["max",15],["opt",false],["linters",$a([])]]);var _BP=new Map([["parts",$a([_BD])],["ex",$a(["392n","393n"])],["req",$a([$a([$a(["01"])]),$a([$a(["30"]),$a(["31nn"]),$a(["32nn"]),$a(["35nn"]),$a(["36nn"])])])]]);var _BR=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso4217"])]]);var _BT=new Map([["cset","N"],["min",1],["max",15],["opt",false],["linters",$a([])]]);var _Bd=new Map([["parts",$a([_BR,_BT])],["ex",$a(["393n"])],["req",$a([$a([$a(["30"]),$a(["31nn"]),$a(["32nn"]),$a(["35nn"]),$a(["36nn"])])])]]);var _Bf=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a([])]]);var _Bl=new Map([["parts",$a([_Bf])],["ex",$a(["394n","8111"])],["req",$a([$a([$a(["255"])])])]]);var _Bn=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _Bx=new Map([["parts",$a([_Bn])],["ex",$a(["392n","393n","395n","8005"])],["req",$a([$a([$a(["30"]),$a(["31nn"]),$a(["32nn"]),$a(["35nn"]),$a(["36nn"])])])]]);var _Bz=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _C1=new Map([["parts",$a([_Bz])]]);var _C3=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a(["lintgcppos1"])]]);var _C6=new Map([["parts",$a([_C3])],["dlpkey",$a([])]]);var _C8=new Map([["cset","N"],["min",17],["max",17],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _CB=new Map([["parts",$a([_C8])],["dlpkey",$a([])]]);var _CD=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _CI=new Map([["parts",$a([_CD])],["req",$a([$a([$a(["00"])])])]]);var _CK=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _CM=new Map([["parts",$a([_CK])]]);var _CO=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _CT=new Map([["parts",$a([_CO])],["dlpkey",$a([$a(["254"]),$a(["7040"])])]]);var _CV=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _Cc=new Map([["parts",$a([_CV])],["req",$a([$a([$a(["8020"])])])],["dlpkey",$a([$a(["8020"])])]]);var _Ce=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _Cg=new Map([["parts",$a([_Ce])]]);var _Ci=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _Cm=new Map([["parts",$a([_Ci])],["dlpkey",$a([$a(["7040"])])]]);var _Co=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Cr=new Map([["parts",$a([_Co])],["ex",$a(["421"])]]);var _Ct=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _Cv=new Map([["cset","X"],["min",1],["max",9],["opt",false],["linters",$a([])]]);var _Cy=new Map([["parts",$a([_Ct,_Cv])],["ex",$a(["4307"])]]);var _D0=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _D9=new Map([["parts",$a([_D0])],["ex",$a(["426"])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["8006"]),$a(["8026"])])])]]);var _DB=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _DD=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _DF=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _DH=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _DJ=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _DQ=new Map([["parts",$a([_DB,_DD,_DF,_DH,_DJ])],["ex",$a(["426"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _DS=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _DZ=new Map([["parts",$a([_DS])],["ex",$a(["426"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Db=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _Dd=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _Df=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _Dh=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _Dj=new Map([["cset","N"],["min",3],["max",3],["opt",true],["linters",$a(["lintiso3166"])]]);var _Dq=new Map([["parts",$a([_Db,_Dd,_Df,_Dh,_Dj])],["ex",$a(["426"])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Ds=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166"])]]);var _Dy=new Map([["parts",$a([_Ds])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _E0=new Map([["cset","X"],["min",1],["max",3],["opt",false],["linters",$a([])]]);var _E8=new Map([["parts",$a([_E0])],["req",$a([$a([$a(["01"]),$a(["02"])]),$a([$a(["422"])])])]]);var _EA=new Map([["cset","X"],["min",1],["max",35],["opt",false],["linters",$a(["lintpcenc"])]]);var _EF=new Map([["parts",$a([_EA])],["req",$a([$a([$a(["00"])])])]]);var _EH=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _EM=new Map([["parts",$a([_EH])],["req",$a([$a([$a(["00"])])])]]);var _EO=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _ET=new Map([["parts",$a([_EO])],["req",$a([$a([$a(["4302"])])])]]);var _EV=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _Ea=new Map([["parts",$a([_EV])],["req",$a([$a([$a(["00"])])])]]);var _Ec=new Map([["cset","X"],["min",2],["max",2],["opt",false],["linters",$a(["lintiso3166alpha2"])]]);var _Eh=new Map([["parts",$a([_Ec])],["req",$a([$a([$a(["00"])])])]]);var _Ej=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _Eo=new Map([["parts",$a([_Ej])],["req",$a([$a([$a(["00"])])])]]);var _Eq=new Map([["cset","N"],["min",10],["max",10],["opt",false],["linters",$a(["lintlatitude"])]]);var _Es=new Map([["cset","N"],["min",10],["max",10],["opt",false],["linters",$a(["lintlongitude"])]]);var _Ex=new Map([["parts",$a([_Eq,_Es])],["req",$a([$a([$a(["00"])])])]]);var _Ez=new Map([["cset","X"],["min",1],["max",35],["opt",false],["linters",$a(["lintpcenc"])]]);var _F4=new Map([["parts",$a([_Ez])],["req",$a([$a([$a(["00"])])])]]);var _F6=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _FB=new Map([["parts",$a([_F6])],["req",$a([$a([$a(["00"])])])]]);var _FD=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _FI=new Map([["parts",$a([_FD])],["req",$a([$a([$a(["4312"])])])]]);var _FK=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _FP=new Map([["parts",$a([_FK])],["req",$a([$a([$a(["00"])])])]]);var _FR=new Map([["cset","X"],["min",2],["max",2],["opt",false],["linters",$a(["lintiso3166alpha2"])]]);var _FW=new Map([["parts",$a([_FR])],["req",$a([$a([$a(["00"])])])]]);var _FY=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Fd=new Map([["parts",$a([_FY])],["req",$a([$a([$a(["00"])])])]]);var _Ff=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _Fk=new Map([["parts",$a([_Ff])],["req",$a([$a([$a(["00"])])])]]);var _Fm=new Map([["cset","X"],["min",1],["max",35],["opt",false],["linters",$a(["lintpcenc"])]]);var _Fr=new Map([["parts",$a([_Fm])],["req",$a([$a([$a(["00"])])])]]);var _Ft=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a(["lintyesno"])]]);var _Fy=new Map([["parts",$a([_Ft])],["req",$a([$a([$a(["00"])])])]]);var _G0=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmd0"])]]);var _G2=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["linthhmi"])]]);var _G7=new Map([["parts",$a([_G0,_G2])],["req",$a([$a([$a(["00"])])])]]);var _G9=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _GE=new Map([["parts",$a([_G9])],["req",$a([$a([$a(["00"])])])]]);var _GG=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _GI=new Map([["cset","X"],["min",1],["max",1],["opt",true],["linters",$a(["linthyphen"])]]);var _GO=new Map([["parts",$a([_GG,_GI])],["ex",$a(["4331"])],["req",$a([$a([$a(["00"])])])]]);var _GQ=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _GS=new Map([["cset","X"],["min",1],["max",1],["opt",true],["linters",$a(["linthyphen"])]]);var _GY=new Map([["parts",$a([_GQ,_GS])],["ex",$a(["4330"])],["req",$a([$a([$a(["00"])])])]]);var _Ga=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _Gc=new Map([["cset","X"],["min",1],["max",1],["opt",true],["linters",$a(["linthyphen"])]]);var _Gi=new Map([["parts",$a([_Ga,_Gc])],["ex",$a(["4333"])],["req",$a([$a([$a(["00"])])])]]);var _Gk=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _Gm=new Map([["cset","X"],["min",1],["max",1],["opt",true],["linters",$a(["linthyphen"])]]);var _Gs=new Map([["parts",$a([_Gk,_Gm])],["ex",$a(["4332"])],["req",$a([$a([$a(["00"])])])]]);var _Gu=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a([])]]);var _H2=new Map([["parts",$a([_Gu])],["req",$a([$a([$a(["01"]),$a(["02"]),$a(["8006"]),$a(["8026"])])])]]);var _H4=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _HA=new Map([["parts",$a([_H4])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _HC=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _HE=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["linthhmi"])]]);var _HK=new Map([["parts",$a([_HC,_HE])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _HM=new Map([["cset","N"],["min",1],["max",4],["opt",false],["linters",$a([])]]);var _HR=new Map([["parts",$a([_HM])],["req",$a([$a([$a(["01","10"])])])]]);var _HT=new Map([["cset","X"],["min",1],["max",12],["opt",false],["linters",$a([])]]);var _HZ=new Map([["parts",$a([_HT])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Hb=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _Hh=new Map([["parts",$a([_Hb])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Hj=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _Hl=new Map([["cset","N"],["min",6],["max",6],["opt",true],["linters",$a(["lintyymmdd"])]]);var _Hr=new Map([["parts",$a([_Hj,_Hl])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Ht=new Map([["cset","X"],["min",1],["max",3],["opt",false],["linters",$a([])]]);var _Hz=new Map([["parts",$a([_Ht])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _I1=new Map([["cset","X"],["min",1],["max",10],["opt",false],["linters",$a([])]]);var _I7=new Map([["parts",$a([_I1])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _I9=new Map([["cset","X"],["min",1],["max",2],["opt",false],["linters",$a([])]]);var _IF=new Map([["parts",$a([_I9])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _IH=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _IJ=new Map([["cset","N"],["min",4],["max",4],["opt",true],["linters",$a(["linthhmi"])]]);var _IP=new Map([["parts",$a([_IH,_IJ])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _IR=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _IZ=new Map([["parts",$a([_IR])],["req",$a([$a([$a(["01"]),$a(["8006"])]),$a([$a(["416"])])])]]);var _Ib=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Ih=new Map([["parts",$a([_Ib])],["req",$a([$a([$a(["01"]),$a(["8006"])])])]]);var _Ij=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Io=new Map([["parts",$a([_Ij])],["req",$a([$a([$a(["7021"])])])]]);var _Iq=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a(["lintgcppos1"])]]);var _Is=new Map([["parts",$a([_Iq])]]);var _Iu=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintiso3166999"])]]);var _Iw=new Map([["cset","X"],["min",1],["max",27],["opt",false],["linters",$a([])]]);var _J2=new Map([["parts",$a([_Iu,_Iw])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _J4=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a([])]]);var _J6=new Map([["cset","X"],["min",1],["max",1],["opt",false],["linters",$a([])]]);var _J8=new Map([["cset","X"],["min",1],["max",1],["opt",false],["linters",$a([])]]);var _JA=new Map([["cset","X"],["min",1],["max",1],["opt",false],["linters",$a(["lintimporteridx"])]]);var _JC=new Map([["parts",$a([_J4,_J6,_J8,_JA])],["dlattr",false]]);var _JE=new Map([["cset","X"],["min",1],["max",4],["opt",false],["linters",$a(["lintpackagetype"])]]);var _JJ=new Map([["parts",$a([_JE])],["req",$a([$a([$a(["00"])])])],["dlattr",false]]);var _JL=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _JQ=new Map([["parts",$a([_JL])],["req",$a([$a([$a(["01"])])])]]);var _JS=new Map([["cset","X"],["min",2],["max",2],["opt",false],["linters",$a([])]]);var _JU=new Map([["cset","X"],["min",1],["max",28],["opt",false],["linters",$a([])]]);var _Ja=new Map([["parts",$a([_JS,_JU])],["req",$a([$a([$a(["01"]),$a(["8004"])])])]]);var _Jc=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Ji=new Map([["parts",$a([_Jc])],["req",$a([$a([$a(["01"]),$a(["8006"])])])]]);var _Jk=new Map([["cset","N"],["min",2],["max",2],["opt",false],["linters",$a(["lintmediatype"])]]);var _Jq=new Map([["parts",$a([_Jk])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])]]);var _Js=new Map([["cset","X"],["min",1],["max",25],["opt",false],["linters",$a([])]]);var _Jy=new Map([["parts",$a([_Js])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])]]);var _K0=new Map([["cset","N"],["min",8],["max",8],["opt",false],["linters",$a(["lintyyyymmdd"])]]);var _K6=new Map([["parts",$a([_K0])],["ex",$a(["7251"])],["req",$a([$a([$a(["8018"])])])]]);var _K8=new Map([["cset","N"],["min",8],["max",8],["opt",false],["linters",$a(["lintyyyymmdd"])]]);var _KA=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["linthhmi"])]]);var _KG=new Map([["parts",$a([_K8,_KA])],["ex",$a(["7250"])],["req",$a([$a([$a(["8018"])])])]]);var _KI=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a(["lintiso5218"])]]);var _KN=new Map([["parts",$a([_KI])],["req",$a([$a([$a(["8018"])])])]]);var _KP=new Map([["cset","X"],["min",1],["max",40],["opt",false],["linters",$a(["lintpcenc"])]]);var _KW=new Map([["parts",$a([_KP])],["ex",$a(["7256","7259"])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])]]);var _KY=new Map([["cset","X"],["min",1],["max",10],["opt",false],["linters",$a([])]]);var _Kf=new Map([["parts",$a([_KY])],["ex",$a(["7256","7259"])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])]]);var _Kh=new Map([["cset","X"],["min",1],["max",90],["opt",false],["linters",$a(["lintpcenc"])]]);var _Kn=new Map([["parts",$a([_Kh])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])]]);var _Kp=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintpcenc"])]]);var _Ku=new Map([["parts",$a([_Kp])],["req",$a([$a([$a(["8018"])])])]]);var _Kw=new Map([["cset","X"],["min",3],["max",3],["opt",false],["linters",$a(["lintposinseqslash"])]]);var _L1=new Map([["parts",$a([_Kw])],["req",$a([$a([$a(["8018","7259"])])])]]);var _L3=new Map([["cset","X"],["min",1],["max",40],["opt",false],["linters",$a(["lintpcenc"])]]);var _L9=new Map([["parts",$a([_L3])],["ex",$a(["7256"])],["req",$a([$a([$a(["8018"])])])]]);var _LB=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["lintnonzero"])]]);var _LD=new Map([["cset","N"],["min",5],["max",5],["opt",false],["linters",$a(["lintnonzero"])]]);var _LF=new Map([["cset","N"],["min",3],["max",3],["opt",false],["linters",$a(["lintnonzero"])]]);var _LH=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a(["lintwinding"])]]);var _LJ=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a([])]]);var _LO=new Map([["parts",$a([_LB,_LD,_LF,_LH,_LJ])],["req",$a([$a([$a(["01"])])])]]);var _LQ=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _LS=new Map([["parts",$a([_LQ])]]);var _LU=new Map([["cset","N"],["min",1],["max",1],["opt",false],["linters",$a(["lintzero"])]]);var _LW=new Map([["cset","N"],["min",13],["max",13],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _LY=new Map([["cset","X"],["min",1],["max",16],["opt",true],["linters",$a([])]]);var _Lb=new Map([["parts",$a([_LU,_LW,_LY])],["dlpkey",$a([])]]);var _Ld=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a(["lintgcppos1"])]]);var _Lh=new Map([["parts",$a([_Ld])],["dlpkey",$a([$a(["7040"])])]]);var _Lj=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a([])]]);var _Lp=new Map([["parts",$a([_Lj])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _Lr=new Map([["cset","N"],["min",14],["max",14],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _Lt=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["lintpieceoftotal"])]]);var _Ly=new Map([["parts",$a([_Lr,_Lt])],["ex",$a(["01","37"])],["dlpkey",$a([$a(["22","10","21"])])]]);var _M0=new Map([["cset","X"],["min",1],["max",34],["opt",false],["linters",$a(["lintiban"])]]);var _M5=new Map([["parts",$a([_M0])],["req",$a([$a([$a(["415"])])])]]);var _M7=new Map([["cset","N"],["min",6],["max",6],["opt",false],["linters",$a(["lintyymmdd"])]]);var _M9=new Map([["cset","N"],["min",2],["max",2],["opt",false],["linters",$a(["linthh"])]]);var _MB=new Map([["cset","N"],["min",2],["max",2],["opt",true],["linters",$a(["lintmi"])]]);var _MD=new Map([["cset","N"],["min",2],["max",2],["opt",true],["linters",$a(["lintss"])]]);var _MJ=new Map([["parts",$a([_M7,_M9,_MB,_MD])],["req",$a([$a([$a(["01"]),$a(["02"])])])]]);var _ML=new Map([["cset","X"],["min",1],["max",50],["opt",false],["linters",$a([])]]);var _MR=new Map([["parts",$a([_ML])],["req",$a([$a([$a(["00"]),$a(["01"])])])]]);var _MT=new Map([["cset","Y"],["min",1],["max",30],["opt",false],["linters",$a(["lintgcppos1"])]]);var _MX=new Map([["parts",$a([_MT])],["dlpkey",$a([$a(["8011"])])]]);var _MZ=new Map([["cset","N"],["min",1],["max",12],["opt",false],["linters",$a(["lintnozeroprefix"])]]);var _Me=new Map([["parts",$a([_MZ])],["req",$a([$a([$a(["8010"])])])],["dlattr",false]]);var _Mg=new Map([["cset","X"],["min",1],["max",20],["opt",false],["linters",$a([])]]);var _Mm=new Map([["parts",$a([_Mg])],["req",$a([$a([$a(["01"]),$a(["8006"])])])]]);var _Mo=new Map([["cset","X"],["min",1],["max",25],["opt",false],["linters",$a(["lintcsumalpha","lintgcppos1"])]]);var _Mr=new Map([["parts",$a([_Mo])],["dlpkey",$a([])]]);var _Mt=new Map([["cset","X"],["min",1],["max",25],["opt",false],["linters",$a(["lintcsumalpha","lintgcppos1","linthasnondigit"])]]);var _My=new Map([["parts",$a([_Mt])],["req",$a([$a([$a(["01"])])])],["dlattr",false]]);var _N0=new Map([["cset","N"],["min",18],["max",18],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _N5=new Map([["parts",$a([_N0])],["ex",$a(["8018"])],["dlpkey",$a([$a(["8019"])])]]);var _N7=new Map([["cset","N"],["min",18],["max",18],["opt",false],["linters",$a(["lintcsum","lintgcppos1"])]]);var _NC=new Map([["parts",$a([_N7])],["ex",$a(["8017"])],["dlpkey",$a([$a(["8019"])])]]);var _NE=new Map([["cset","N"],["min",1],["max",10],["opt",false],["linters",$a([])]]);var _NK=new Map([["parts",$a([_NE])],["req",$a([$a([$a(["8017"]),$a(["8018"])])])],["dlattr",false]]);var _NM=new Map([["cset","X"],["min",1],["max",25],["opt",false],["linters",$a([])]]);var _NR=new Map([["parts",$a([_NM])],["req",$a([$a([$a(["415"])])])],["dlattr",false]]);var _NT=new Map([["cset","N"],["min",14],["max",14],["opt",false],["linters",$a(["lintcsum","lintgcppos2"])]]);var _NV=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a(["lintpieceoftotal"])]]);var _Nb=new Map([["parts",$a([_NT,_NV])],["ex",$a(["02","8006"])],["req",$a([$a([$a(["37"])])])]]);var _Nd=new Map([["cset","Z"],["min",1],["max",90],["opt",false],["linters",$a([])]]);var _Nr=new Map([["parts",$a([_Nd])],["req",$a([$a([$a(["00"]),$a(["01","21"]),$a(["253"]),$a(["255"]),$a(["8003"]),$a(["8004"]),$a(["8006","21"]),$a(["8010","8011"]),$a(["8017"]),$a(["8018"])])])]]);var _Nt=new Map([["cset","N"],["min",15],["max",15],["opt",false],["linters",$a([])]]);var _Ny=new Map([["parts",$a([_Nt])],["req",$a([$a([$a(["01","21"])])])],["dlattr",false]]);var _O0=new Map([["cset","N"],["min",15],["max",15],["opt",false],["linters",$a([])]]);var _O5=new Map([["parts",$a([_O0])],["req",$a([$a([$a(["01","21","8040"])])])],["dlattr",false]]);var _O7=new Map([["cset","N"],["min",32],["max",32],["opt",false],["linters",$a([])]]);var _OC=new Map([["parts",$a([_O7])],["req",$a([$a([$a(["01","21","8040"])])])],["dlattr",false]]);var _OE=new Map([["cset","N"],["min",18],["max",18],["opt",false],["linters",$a([])]]);var _OG=new Map([["cset","N"],["min",1],["max",2],["opt",true],["linters",$a([])]]);var _OL=new Map([["parts",$a([_OE,_OG])],["req",$a([$a([$a(["01","21","8040"])])])],["dlattr",false]]);var _ON=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintcouponcode"])]]);var _OP=new Map([["parts",$a([_ON])]]);var _OR=new Map([["cset","N"],["min",4],["max",4],["opt",false],["linters",$a([])]]);var _OW=new Map([["parts",$a([_OR])],["req",$a([$a([$a(["255"])])])]]);var _OY=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a(["lintcouponposoffer"])]]);var _Oa=new Map([["parts",$a([_OY])]]);var _Oc=new Map([["cset","X"],["min",1],["max",70],["opt",false],["linters",$a([])]]);var _Oh=new Map([["parts",$a([_Oc])],["req",$a([$a([$a(["01"])])])],["dlattr",false]]);var _Oj=new Map([["cset","X"],["min",1],["max",30],["opt",false],["linters",$a([])]]);var _Ol=new Map([["parts",$a([_Oj])]]);var _On=new Map([["cset","X"],["min",1],["max",90],["opt",false],["linters",$a([])]]);var _Op=new Map([["parts",$a([_On])]]);var _Oq=new Map([["00",_6],["01",_E],["02",_M],["03",_R],["10",_c],["11",_n],["12",_u],["13",_15],["15",_15],["16",_15],["17",_1H],["20",_1R],["21",_1b],["22",_1i],["235",_1p],["240",_1z],["241",_1z],["242",_29],["243",_2G],["250",_2Q],["251",_2Y],["253",_2f],["254",_2m],["255",_2u],["30",_32],["3100",_3B],["3101",_3B],["3102",_3B],["3103",_3B],["3104",_3B],["3105",_3B],["3110",_3K],["3111",_3K],["3112",_3K],["3113",_3K],["3114",_3K],["3115",_3K],["3120",_3T],["3121",_3T],["3122",_3T],["3123",_3T],["3124",_3T],["3125",_3T],["3130",_3c],["3131",_3c],["3132",_3c],["3133",_3c],["3134",_3c],["3135",_3c],["3140",_3l],["3141",_3l],["3142",_3l],["3143",_3l],["3144",_3l],["3145",_3l],["3150",_3u],["3151",_3u],["3152",_3u],["3153",_3u],["3154",_3u],["3155",_3u],["3160",_43],["3161",_43],["3162",_43],["3163",_43],["3164",_43],["3165",_43],["3200",_4C],["3201",_4C],["3202",_4C],["3203",_4C],["3204",_4C],["3205",_4C],["3210",_4L],["3211",_4L],["3212",_4L],["3213",_4L],["3214",_4L],["3215",_4L],["3220",_4U],["3221",_4U],["3222",_4U],["3223",_4U],["3224",_4U],["3225",_4U],["3230",_4d],["3231",_4d],["3232",_4d],["3233",_4d],["3234",_4d],["3235",_4d],["3240",_4m],["3241",_4m],["3242",_4m],["3243",_4m],["3244",_4m],["3245",_4m],["3250",_4v],["3251",_4v],["3252",_4v],["3253",_4v],["3254",_4v],["3255",_4v],["3260",_54],["3261",_54],["3262",_54],["3263",_54],["3264",_54],["3265",_54],["3270",_5D],["3271",_5D],["3272",_5D],["3273",_5D],["3274",_5D],["3275",_5D],["3280",_5M],["3281",_5M],["3282",_5M],["3283",_5M],["3284",_5M],["3285",_5M],["3290",_5V],["3291",_5V],["3292",_5V],["3293",_5V],["3294",_5V],["3295",_5V],["3300",_5e],["3301",_5e],["3302",_5e],["3303",_5e],["3304",_5e],["3305",_5e],["3310",_5n],["3311",_5n],["3312",_5n],["3313",_5n],["3314",_5n],["3315",_5n],["3320",_5w],["3321",_5w],["3322",_5w],["3323",_5w],["3324",_5w],["3325",_5w],["3330",_65],["3331",_65],["3332",_65],["3333",_65],["3334",_65],["3335",_65],["3340",_6E],["3341",_6E],["3342",_6E],["3343",_6E],["3344",_6E],["3345",_6E],["3350",_6N],["3351",_6N],["3352",_6N],["3353",_6N],["3354",_6N],["3355",_6N],["3360",_6W],["3361",_6W],["3362",_6W],["3363",_6W],["3364",_6W],["3365",_6W],["3370",_6e],["3371",_6e],["3372",_6e],["3373",_6e],["3374",_6e],["3375",_6e],["3400",_6n],["3401",_6n],["3402",_6n],["3403",_6n],["3404",_6n],["3405",_6n],["3410",_6w],["3411",_6w],["3412",_6w],["3413",_6w],["3414",_6w],["3415",_6w],["3420",_75],["3421",_75],["3422",_75],["3423",_75],["3424",_75],["3425",_75],["3430",_7E],["3431",_7E],["3432",_7E],["3433",_7E],["3434",_7E],["3435",_7E],["3440",_7N],["3441",_7N],["3442",_7N],["3443",_7N],["3444",_7N],["3445",_7N],["3450",_7W],["3451",_7W],["3452",_7W],["3453",_7W],["3454",_7W],["3455",_7W],["3460",_7f],["3461",_7f],["3462",_7f],["3463",_7f],["3464",_7f],["3465",_7f],["3470",_7o],["3471",_7o],["3472",_7o],["3473",_7o],["3474",_7o],["3475",_7o],["3480",_7x],["3481",_7x],["3482",_7x],["3483",_7x],["3484",_7x],["3485",_7x],["3490",_86],["3491",_86],["3492",_86],["3493",_86],["3494",_86],["3495",_86],["3500",_8F],["3501",_8F],["3502",_8F],["3503",_8F],["3504",_8F],["3505",_8F],["3510",_8O],["3511",_8O],["3512",_8O],["3513",_8O],["3514",_8O],["3515",_8O],["3520",_8X],["3521",_8X],["3522",_8X],["3523",_8X],["3524",_8X],["3525",_8X],["3530",_8g],["3531",_8g],["3532",_8g],["3533",_8g],["3534",_8g],["3535",_8g],["3540",_8p],["3541",_8p],["3542",_8p],["3543",_8p],["3544",_8p],["3545",_8p],["3550",_8y],["3551",_8y],["3552",_8y],["3553",_8y],["3554",_8y],["3555",_8y],["3560",_97],["3561",_97],["3562",_97],["3563",_97],["3564",_97],["3565",_97],["3570",_9G],["3571",_9G],["3572",_9G],["3573",_9G],["3574",_9G],["3575",_9G],["3600",_9P],["3601",_9P],["3602",_9P],["3603",_9P],["3604",_9P],["3605",_9P],["3610",_9Y],["3611",_9Y],["3612",_9Y],["3613",_9Y],["3614",_9Y],["3615",_9Y],["3620",_9h],["3621",_9h],["3622",_9h],["3623",_9h],["3624",_9h],["3625",_9h],["3630",_9q],["3631",_9q],["3632",_9q],["3633",_9q],["3634",_9q],["3635",_9q],["3640",_9z],["3641",_9z],["3642",_9z],["3643",_9z],["3644",_9z],["3645",_9z],["3650",_A8],["3651",_A8],["3652",_A8],["3653",_A8],["3654",_A8],["3655",_A8],["3660",_AH],["3661",_AH],["3662",_AH],["3663",_AH],["3664",_AH],["3665",_AH],["3670",_AQ],["3671",_AQ],["3672",_AQ],["3673",_AQ],["3674",_AQ],["3675",_AQ],["3680",_AZ],["3681",_AZ],["3682",_AZ],["3683",_AZ],["3684",_AZ],["3685",_AZ],["3690",_Ai],["3691",_Ai],["3692",_Ai],["3693",_Ai],["3694",_Ai],["3695",_Ai],["37",_As],["3900",_B1],["3901",_B1],["3902",_B1],["3903",_B1],["3904",_B1],["3905",_B1],["3906",_B1],["3907",_B1],["3908",_B1],["3909",_B1],["3910",_BB],["3911",_BB],["3912",_BB],["3913",_BB],["3914",_BB],["3915",_BB],["3916",_BB],["3917",_BB],["3918",_BB],["3919",_BB],["3920",_BP],["3921",_BP],["3922",_BP],["3923",_BP],["3924",_BP],["3925",_BP],["3926",_BP],["3927",_BP],["3928",_BP],["3929",_BP],["3930",_Bd],["3931",_Bd],["3932",_Bd],["3933",_Bd],["3934",_Bd],["3935",_Bd],["3936",_Bd],["3937",_Bd],["3938",_Bd],["3939",_Bd],["3940",_Bl],["3941",_Bl],["3942",_Bl],["3943",_Bl],["3950",_Bx],["3951",_Bx],["3952",_Bx],["3953",_Bx],["3954",_Bx],["3955",_Bx],["400",_C1],["401",_C6],["402",_CB],["403",_CI],["410",_CM],["411",_CM],["412",_CM],["413",_CM],["414",_CT],["415",_Cc],["416",_Cg],["417",_Cm],["420",_Cr],["421",_Cy],["422",_D9],["423",_DQ],["424",_DZ],["425",_Dq],["426",_Dy],["427",_E8],["4300",_EF],["4301",_EF],["4302",_EM],["4303",_ET],["4304",_Ea],["4305",_Ea],["4306",_Ea],["4307",_Eh],["4308",_Eo],["4309",_Ex],["4310",_F4],["4311",_F4],["4312",_FB],["4313",_FI],["4314",_FP],["4315",_FP],["4316",_FP],["4317",_FW],["4318",_Fd],["4319",_Fk],["4320",_Fr],["4321",_Fy],["4322",_Fy],["4323",_Fy],["4324",_G7],["4325",_G7],["4326",_GE],["4330",_GO],["4331",_GY],["4332",_Gi],["4333",_Gs],["7001",_H2],["7002",_HA],["7003",_HK],["7004",_HR],["7005",_HZ],["7006",_Hh],["7007",_Hr],["7008",_Hz],["7009",_I7],["7010",_IF],["7011",_IP],["7020",_IZ],["7021",_Ih],["7022",_Io],["7023",_Is],["7030",_J2],["7031",_J2],["7032",_J2],["7033",_J2],["7034",_J2],["7035",_J2],["7036",_J2],["7037",_J2],["7038",_J2],["7039",_J2],["7040",_JC],["7041",_JJ],["710",_JQ],["711",_JQ],["712",_JQ],["713",_JQ],["714",_JQ],["715",_JQ],["716",_JQ],["717",_JQ],["7230",_Ja],["7231",_Ja],["7232",_Ja],["7233",_Ja],["7234",_Ja],["7235",_Ja],["7236",_Ja],["7237",_Ja],["7238",_Ja],["7239",_Ja],["7240",_Ji],["7241",_Jq],["7242",_Jy],["7250",_K6],["7251",_KG],["7252",_KN],["7253",_KW],["7254",_KW],["7255",_Kf],["7256",_Kn],["7257",_Ku],["7258",_L1],["7259",_L9],["8001",_LO],["8002",_LS],["8003",_Lb],["8004",_Lh],["8005",_Lp],["8006",_Ly],["8007",_M5],["8008",_MJ],["8009",_MR],["8010",_MX],["8011",_Me],["8012",_Mm],["8013",_Mr],["8014",_My],["8017",_N5],["8018",_NC],["8019",_NK],["8020",_NR],["8026",_Nb],["8030",_Nr],["8040",_Ny],["8041",_O5],["8042",_OC],["8043",_OL],["8110",_OP],["8111",_OW],["8112",_Oa],["8200",_Oh],["90",_Ol],["91",_Op],["92",_Op],["93",_Op],["94",_Op],["95",_Op],["96",_Op],["97",_Op],["98",_Op],["99",_Op]]);$_.gs1syntax=_Oq;$k[$j++]=Infinity;var _Or=$a(["00","01","02","03","04","11","12","13","14","15","16","17","18","19","20","31","32","33","34","35","36","41"]);for(var _Os=0,_Ot=_Or.length;_Os<_Ot;_Os++){var _Ou=$g(_Or,_Os);$k[$j++]=_Ou;$k[$j++]=_Ou}var _Ov=$d();$_.aifixed=_Ov;$k[$j++]=Infinity;$k[$j++]=0;for(var _Ow=0,_Ox="!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".length;_Ow<_Ox;_Ow++){var _Oy=$g("!\"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz",_Ow);var _Oz=$k[--$j];$k[$j++]=_Oy;$k[$j++]=_Oz;$k[$j++]=_Oz+1}$j--;var _P0=$d();$_.cset82=_P0;$k[$j++]=Infinity;$k[$j++]=0;for(var _P1=0,_P2="#-/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".length;_P1<_P2;_P1++){var _P4=$k[--$j];$k[$j++]=$g("#-/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",_P1);$k[$j++]=_P4;$k[$j++]=_P4+1}$j--;var _P5=$d();$_.cset39=_P5;$k[$j++]=Infinity;$k[$j++]=0;for(var _P6=0,_P7="23456789ABCDEFGHJKLMNPQRSTUVWXYZ".length;_P6<_P7;_P6++){var _P9=$k[--$j];$k[$j++]=$g("23456789ABCDEFGHJKLMNPQRSTUVWXYZ",_P6);$k[$j++]=_P9;$k[$j++]=_P9+1}$j--;var _PA=$d();$_.cset32=_PA;$k[$j++]=Infinity;$k[$j++]=0;for(var _PB=0,_PC="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".length;_PB<_PC;_PB++){var _PE=$k[--$j];$k[$j++]=$g("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",_PB);$k[$j++]=_PE;$k[$j++]=_PE+1}$j--;var _PF=$d();$_.cset64=_PF;$k[$j++]=Infinity;var _PG=$a(["004","008","010","012","016","020","024","028","031","032","036","040","044","048","050","051","052","056","060","064","068","070","072","074","076","084","086","090","092","096","100","104","108","112","116","120","124","132","136","140","144","148","152","156","158","162","166","170","174","175","178","180","184","188","191","192","196","203","204","208","212","214","218","222","226","231","232","233","234","238","239","242","246","248","250","254","258","260","262","266","268","270","275","276","288","292","296","300","304","308","312","316","320","324","328","332","334","336","340","344","348","352","356","360","364","368","372","376","380","384","388","392","398","400","404","408","410","414","417","418","422","426","428","430","434","438","440","442","446","450","454","458","462","466","470","474","478","480","484","492","496","498","499","500","504","508","512","516","520","524","528","531","533","534","535","540","548","554","558","562","566","570","574","578","580","581","583","584","585","586","591","598","600","604","608","612","616","620","624","626","630","634","638","642","643","646","652","654","659","660","662","663","666","670","674","678","682","686","688","690","694","702","703","704","705","706","710","716","724","728","729","732","740","744","748","752","756","760","762","764","768","772","776","780","784","788","792","795","796","798","800","804","807","818","826","831","832","833","834","840","850","854","858","860","862","876","882","887","894"]);for(var _PH=0,_PI=_PG.length;_PH<_PI;_PH++){var _PJ=$g(_PG,_PH);$k[$j++]=_PJ;$k[$j++]=_PJ}var _PK=$d();$_.iso3166=_PK;$k[$j++]=Infinity;var _PL=$a(["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]);for(var _PM=0,_PN=_PL.length;_PM<_PN;_PM++){var _PO=$g(_PL,_PM);$k[$j++]=_PO;$k[$j++]=_PO}var _PP=$d();$_.iso3166alpha2=_PP;$k[$j++]=Infinity;var _PQ=$a(["008","012","032","036","044","048","050","051","052","060","064","068","072","084","090","096","104","108","116","124","132","136","144","152","156","170","174","188","191","192","203","208","214","222","230","232","238","242","262","270","292","320","324","328","332","340","344","348","352","356","360","364","368","376","388","392","396","398","400","404","408","410","414","417","418","422","426","430","434","446","454","458","462","480","484","496","498","504","512","516","524","532","533","548","554","558","566","578","586","590","598","600","604","608","634","643","646","654","682","690","694","702","704","706","710","728","748","752","756","760","764","776","780","784","788","800","807","818","826","834","840","858","860","882","886","901","925","927","928","929","930","931","932","933","934","936","938","940","941","943","944","946","947","948","949","950","951","952","953","955","956","957","958","959","960","961","962","963","964","965","967","968","969","970","971","972","973","975","976","977","978","979","980","981","984","985","986","990","994","997","999"]);for(var _PR=0,_PS=_PQ.length;_PR<_PS;_PR++){var _PT=$g(_PQ,_PR);$k[$j++]=_PT;$k[$j++]=_PT}var _PU=$d();$_.iso4217=_PU;$k[$j++]=Infinity;var _PV=$a(["01","02","03","04","05","06","07","08","09","10","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99"]);for(var _PW=0,_PX=_PV.length;_PW<_PX;_PW++){var _PY=$g(_PV,_PW);$k[$j++]=_PY;$k[$j++]=_PY}var _PZ=$d();$_.aidcmediatype=_PZ;$k[$j++]=Infinity;var _Pa=$a(["1A","1B","1D","1F","1G","1W","200","201","202","203","204","205","206","210","211","212","2C","3A","3H","43","44","4A","4B","4C","4D","4F","4G","4H","5H","5L","5M","6H","6P","7A","7B","8","8A","8B","8C","9","AA","AB","AC","AD","AF","AG","AH","AI","AJ","AL","AM","AP","APE/AT","AV","B4","BB","BC","BD","BE","BF","BG","BGE","BH","BI","BJ","BK","BL","BM","BME","BN","BO","BP","BQ","BR","BRI","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CBL","CC","CCE","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DG","DH","DI","DJ","DK","DL","DM","DN","DP","DPE","DR","DS","DT","DU","DV","DW","DX","DY","E1","E2","E3","EC","ED","EE","EF","EG","EH","EI","EN","FB","FC","FD","FE","FI","FL","FO","FOB","FP","FPE","FR","FT","FW","FX","GB","GI","GL","GR","GU","GY","GZ","HA","HB","HC","HG","HN","HR","IA","IB","IC","ID","IE","IF","IG","IH","IK","IL","IN","IZ","JB","JC","JG","JR","JT","JY","KG","KI","LAB","LE","LG","LT","LU","LV","LZ","MA","MB","MC","ME","MPE","MR","MS","MT","MW","MX","NA","NE","NF","NG","NS","NT","NU","NV","OA","OB","OC","OD","OE","OF","OK","OPE","OT","OU","P2","PA","PAE","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL","PLP","PN","PO","POP","PP","PPE","PR","PT","PU","PUE","PV","PX","PY","PZ","QA","QB","QC","QD","QF","QG","QH","QJ","QK","QL","QM","QN","QP","QQ","QR","QS","RB1","RB2","RB3","RCB","RD","RG","RJ","RK","RL","RO","RT","RZ","S1","SA","SB","SC","SD","SE","SEC","SH","SI","SK","SL","SM","SO","SP","SS","ST","STL","SU","SV","SW","SX","SY","SZ","T1","TB","TC","TD","TE","TEV","TG","THE","TI","TK","TL","TN","TO","TR","TRE","TS","TT","TTE","TU","TV","TW","TWE","TY","TZ","UC","UN","UUE","VA","VG","VI","VK","VL","VN","VO","VP","VQ","VR","VS","VY","WA","WB","WC","WD","WF","WG","WH","WJ","WK","WL","WM","WN","WP","WQ","WR","WRP","WS","WT","WU","WV","WW","WX","WY","WZ","X11","X12","X15","X16","X17","X18","X19","X20","X3","XA","XB","XC","XD","XF","XG","XH","XJ","XK","YA","YB","YC","YD","YF","YG","YH","YJ","YK","YL","YM","YN","YP","YQ","YR","YS","YT","YV","YW","YX","YY","YZ","ZA","ZB","ZC","ZD","ZF","ZG","ZH","ZJ","ZK","ZL","ZM","ZN","ZP","ZQ","ZR","ZS","ZT","ZU","ZV","ZW","ZX","ZY","ZZ"]);for(var _Pb=0,_Pc=_Pa.length;_Pb<_Pc;_Pb++){var _Pd=$g(_Pa,_Pb);$k[$j++]=_Pd;$k[$j++]=_Pd}var _Pe=$d();$_.packagetype=_Pe;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_gs1process.globals);var _Pf=$k[--$j];if($eq(_Pf,"ai")){var _Pg=$k[--$j];$ax(_Pg,"(");var _Ph=$k[--$j];if(!_Ph){$k[$j-1]="bwipp.GS1aiMissingOpenParen#2920";$k[$j++]="AIs must start with '('";bwipp_raiseerror()}$j--;var _Pj=$k[--$j];$k[$j++]=Infinity;$k[$j++]=_Pj;for(;;){var _Pk=$k[$j-1];if(_Pk.length==0){$j--;break}var _Pl=$k[--$j];$X(_Pl,")");var _Pm=$k[--$j];if(!_Pm){$l();$k[$j++]="bwipp.GS1aiMissingCloseParen#2926";$k[$j++]="AIs must end with ')'";bwipp_raiseerror()}var _Pn=$k[--$j];$j--;var _Pq=$k[--$j];$k[$j++]=_Pn;$X(_Pq,"(");var _Pr=$k[--$j];if(_Pr){var _Ps=$k[--$j];$j--;var _Pv=$k[--$j];$k[$j++]=_Ps;$k[$j++]=_Pv}else{$k[$j++]=""}}var _Pw=$m();$k[$j++]=_Pw;if(_Pw>0){var _Px=$k[--$j];for(var _Pz=_Px,_Py=~~(_Px/2)+1;_Pz>=_Py;_Pz-=1){$r(_Pz,-1)}}else{$j--}$as($a(~~($m()/2)));var _Q2=$k[--$j];$_.ais=_Q2;$as($a($m()));var _Q6=$k[--$j];$k[$j++]=Infinity;$F(_Q6,function(){$k[$j++]=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);bwipp_parseinput()});var _Q9=$a();$_.vals=_Q9;$j--}else{var _QA=$k[--$j];$ax(_QA,"http://");var _QB=$k[--$j];if(!_QB){var _QC=$k[--$j];$ax(_QC,"HTTP://");var _QD=$k[--$j];if(!_QD){var _QE=$k[--$j];$ax(_QE,"https://");var _QF=$k[--$j];if(!_QF){var _QG=$k[--$j];$ax(_QG,"HTTPS://");var _QH=$k[--$j];if(!_QH){$k[$j-1]="bwipp.GS1dlURIbadScheme#2945";$k[$j++]="Scheme must be http:// HTTP:// https:// or HTTPS://";bwipp_raiseerror()}}}}$j--;var _QI=$k[--$j];$X(_QI,"/");var _QJ=$k[--$j];if(!_QJ){$k[$j-1]="bwipp.GS1dlMissingDomainOrPathInfo#2951";$k[$j++]="URI must contain a domain and path info";bwipp_raiseerror()}$j-=2;var _QK=$k[--$j];$X(_QK,"#");var _QL=$k[--$j];if(_QL){var _QM=$k[--$j];$j--;$k[$j-1]=_QM}var _QQ=$k[--$j];$X(_QQ,"?");var _QR=$k[--$j];if(!_QR){var _QS=$k[--$j];$k[$j++]="";$k[$j++]=null;$k[$j++]=_QS}var _QT=$k[--$j];$_.pp=_QT;$j--;var _QU=$k[--$j];$_.qp=_QU;$k[$j++]=Infinity;$k[$j++]=0;$k[$j++]=0;$k[$j++]=$_.pp;for(;;){var _QW=$k[--$j];$X(_QW,"/");var _QX=$k[--$j];if(!_QX){$j--;break}var _QY=$k[--$j];$j--;var _Qa=_QY.length+1;var _Qb=$k[--$j];var _Qc=$k[$j-1];$k[$j++]=$f(_Qa+_Qc);$k[$j++]=_Qb}$as($a($m()-1));var _Qf=$k[--$j];$_.pipos=_Qf;$j-=2;if($_.pipos.length<=1){$k[$j++]="bwipp.GS1dlNoAIinfo#2976";$k[$j++]="The path was too short to contain AI info";bwipp_raiseerror()}$k[$j++]=false;for(var _Qi=$_.pipos.length-2;_Qi>=0;_Qi-=2){var _Qk=$g($_.pipos,_Qi);var _Qo=$G($_.pp,_Qk,$f($g($_.pipos,_Qi+1)-_Qk)-1);var _Qq=$has($_.gs1syntax,_Qo);$k[$j++]=_Qi;$k[$j++]=_Qo;if(_Qq){var _Qs=$k[--$j];if($has($g($_.gs1syntax,_Qs),"dlpkey")){var _Qv=$k[--$j];$k[$j-1]=_Qv;$k[$j++]=true;break}}else{$j--}$j--}var _Qx=$k[--$j];if(!_Qx){$k[$j++]="bwipp.GS1dlNoAIinfo#2995";$k[$j++]="The path does not contain a valid primary key";bwipp_raiseerror()}var _Qz=$k[--$j];var _R0=$g($_.pipos,_Qz);$_.pp=$G($_.pp,_R0,$f($_.pp.length-_R0));$_.uriunescape=function(){var _R4=$k[--$j];$_.qq=_R4;var _R5=$k[--$j];$_.in=_R5;$_.out=$s($_.in.length);$_.badhex=false;$k[$j++]=0;$k[$j++]=0;for(;;){var _R9=$k[$j-2];if(_R9>=$_.in.length){break}var _RD=$k[$j-2];var _RE=$g($_.in,_RD);$k[$j++]=_RE;if(_RE==43&&$_.qq){$j--;var _RH=$k[--$j];$p($_.out,_RH,32);$k[$j-1]+=1;$k[$j++]=_RH+1}else{var _RJ=$k[$j-1];var _RL=$k[$j-3];if(_RJ==37&&_RL<$_.in.length-2){$j--;var _RP=$k[$j-2];var _RQ=$G($_.in,_RP+1,2);$k[$j++]=0;for(var _RR=0,_RS=_RQ.length;_RR<_RS;_RR++){var _RT=$g(_RQ,_RR);$k[$j++]=_RT;if(_RT>=48&&_RT<=57){$k[$j-1]-=48}else{var _RV=$k[$j-1];if(_RV>=65&&_RV<=70){$k[$j-1]-=55}else{var _RX=$k[$j-1];if(_RX>=97&&_RX<=102){$k[$j-1]-=87}else{$j-=2;$_.badhex=true;$k[$j++]=0;break}}}var _RZ=$k[--$j];var _Ra=$k[--$j];$k[$j++]=$f(_RZ+_Ra*16)}if($_.badhex){$j-=2;break}var _Rd=$k[--$j];var _Re=$k[--$j];$p($_.out,_Re,_Rd);$k[$j-1]+=3;$k[$j++]=_Re+1}else{var _Rh=$k[--$j];var _Ri=$k[--$j];$p($_.out,_Ri,_Rh);$k[$j-1]+=1;$k[$j++]=_Ri+1}}}if($_.badhex){$l();$k[$j++]="bwipp.GS1dlBadHexCharacter#3030";$k[$j++]="Invalid hex character";bwipp_raiseerror()}var _Rm=$k[--$j];$_.out=$G($_.out,0,_Rm);$k[$j-1]=$_.out};$_.isvaliddlpkeyseq=function(){var _Rp=$k[--$j];$_.in=_Rp;var _Rt=$g($_.gs1syntax,$g($_.in,0));$k[$j++]=false;$F($g(_Rt,"dlpkey"),function(){var _Rv=$k[--$j];$_.seq=_Rv;$_.i=1;$_.j=0;for(;;){if($_.i>=$_.in.length){break}if($_.j>=$_.seq.length){break}if($eq($g($_.in,$_.i),$g($_.seq,$_.j))){$_.i=$_.i+1}$_.j=$_.j+1}if($_.i==$_.in.length){$k[$j-1]=true;return true}})};$_.ais=$a(99);$_.vals=$a(99);$k[$j++]=Infinity;$k[$j++]=0;$k[$j++]=$_.pp;for(;;){var _SD=$k[--$j];$X(_SD,"/");var _SE=$k[--$j];if(_SE){var _SG=$k[--$j];$j--;var _SI=$k[--$j];var _SJ=$k[$j-1];$p($_.ais,_SJ,_SG);$X(_SI,"/");var _SK=$k[--$j];if(_SK){var _SL=$k[--$j];$k[$j-1]=_SL}else{var _SN=$k[--$j];$k[$j++]="";$k[$j++]=_SN}var _SP=$k[--$j];var _SR=$k[$j-2];$k[$j++]=$_.vals;$k[$j++]=_SR;$k[$j++]=_SP;$k[$j++]=false;$_.uriunescape();var _SS=$k[--$j];var _ST=$k[--$j];var _SU=$k[--$j];$p(_SU,_ST,_SS)}else{$j--;break}var _SV=$k[--$j];$k[$j-1]+=1;$k[$j++]=_SV}var _SX=$k[--$j];$_.plen=_SX;$k[$j++]=_SX;if(_SX>1){$k[$j++]=$G($_.ais,0,$_.plen);$_.isvaliddlpkeyseq();var _Sb=$k[--$j];if(!_Sb){$l();$k[$j++]="bwipp.GS1dlBadPathInfo#3076";$k[$j++]="The AIs in the path are not a valid key-qualifier sequence for the key";bwipp_raiseerror()}}$k[$j++]=$_.qp;for(;;){var _Sd=$k[$j-1];if(_Sd.length==0){$j--;break}var _Se=$k[--$j];$X(_Se,"&");var _Sf=$k[--$j];if(_Sf){var _Sg=$k[--$j];$k[$j-1]=_Sg}else{var _Si=$k[--$j];$k[$j++]="";$k[$j++]=_Si}var _Sj=$k[--$j];$X(_Sj,"=");var _Sk=$k[--$j];if(_Sk){var _Sl=$k[$j-1];var _So=true;$F(_Sl,function(){var _Sm=$k[--$j];_So=_So&&(_Sm>=48&&_Sm<=57)});if(_So){var _Sq=$k[--$j];$j--;var _Ss=$k[--$j];var _Su=$k[$j-2];$p($_.ais,_Su,_Sq);$k[$j++]=$_.vals;$k[$j++]=_Su;$k[$j++]=_Ss;$k[$j++]=true;$_.uriunescape();var _Sw=$k[--$j];var _Sx=$k[--$j];var _Sy=$k[--$j];$p(_Sy,_Sx,_Sw);var _Sz=$k[--$j];$k[$j-1]+=1;$k[$j++]=_Sz}else{$j-=3}}else{$j--}}var _T3=$k[$j-1];var _T5=$G($_.ais,$_.plen,$f(_T3-$_.plen));for(var _T6=0,_T7=_T5.length;_T6<_T7;_T6++){var _T8=$g(_T5,_T6);var _TA=$has($_.gs1syntax,_T8);$k[$j++]=_T8;if(_TA){var _TC=$k[$j-1];var _TD=$g($_.gs1syntax,_TC);var _TE=$has(_TD,"dlattr");$k[$j++]=_TD;$k[$j++]="dlattr";if(_TE){var _TF=$k[--$j];var _TG=$k[--$j];$k[$j++]=$g(_TG,_TF)}else{$j-=2;$k[$j++]=true}}else{$k[$j++]=$_.dontlint}var _TJ=$k[--$j];if(!_TJ){var _TK=$k[$j-1];var _TL=_TK.length;var _TM=$s(_TL+46);$P(_TM,0,"AI (");$P(_TM,4,_TK);$P(_TM,_TL+4,") is not a valid GS1 DL URI data attribute");$j--;var _TQ=$m()+2;$k[$j++]="bwipp.GS1dlInvalidDataAttribute#3110";$k[$j++]=_TM;$r(_TQ+1,2);$l();bwipp_raiseerror()}$j--}var _TT=$k[$j-1];var _TV=$G($_.ais,$_.plen,$f(_TT-$_.plen));for(var _TW=0,_TX=_TV.length;_TW<_TX;_TW++){$k[$j++]=$g(_TV,_TW);for(var _Ta=$_.plen;_Ta>=1;_Ta-=1){var _Tb=$k[$j-1];$k[$j++]=_Ta;$k[$j++]=_Tb;$k[$j++]=Infinity;$q($G($_.ais,0,$_.plen));$r($m()+3,-2);var _Tg=$k[--$j];var _Th=$k[--$j];$k[$j++]=_Tg;$r(_Th,1);var _Ti=$a();$k[$j++]=_Ti;$_.isvaliddlpkeyseq();var _Tj=$k[--$j];if(_Tj){var _Tk=$k[--$j];$k[$j-1]=_Tk;var _Tm=$k[$j-1];var _Tn=_Tm.length;var _To=$s(_Tn+50);$P(_To,0,"AI (");$P(_To,4,_Tm);$P(_To,_Tn+4,") from query params should be in the path info");$j--;var _Ts=$m()+2;$k[$j++]="bwipp.GS1dlAttributeMustBeQualifier#3128";$k[$j++]=_To;$r(_Ts+1,2);$l();bwipp_raiseerror()}}$j--}var _Tu=$k[--$j];$_.ais=$G($_.ais,0,_Tu);$_.vals=$G($_.vals,0,_Tu);$j--;for(var _U0=0,_Tz=$_.ais.length-1;_U0<=_Tz;_U0+=1){$k[$j++]=_U0;if($eq($g($_.ais,_U0),"01")){var _U3=$k[$j-1];var _U5=$g($_.vals,_U3);var _U6=_U5.length;$k[$j++]=_U5;if(_U6==8||(_U6==12||_U6==13)){var _U8=$Z($s(14),"00000000000000");$k[$j++]=_U8;$k[$j++]=_U8;var _U9=$k[$j-3];var _UA=$k[$j-1];$P(_UA,14-_U9.length,_U9);var _UC=$k[$j-2];$j-=3;var _UD=$k[$j-1];$p($_.vals,_UD,_UC)}else{$j--}}$j--}}$k[$j++]=Infinity;var _UE=$_.ais;for(var _UF=0,_UG=_UE.length;_UF<_UG;_UF++){var _UH=$g(_UE,_UF);$k[$j++]=true;$k[$j++]=_UH;if(_UH.length>=2){var _UI=$k[--$j];if($has($_.aifixed,$G(_UI,0,2))){$k[$j-1]=false}}else{$j--}}$_.fncs=$a();$_.lintnumeric=function(){var _UM=$k[--$j];$k[$j++]=true;$F(_UM,function(){var _UN=$k[--$j];if(_UN<48||_UN>57){$k[$j-1]=false;return true}});var _UO=$k[--$j];if(!_UO){$k[$j-1]="bwipp.GS1notNumeric#3170";$k[$j++]="Not numeric";$k[$j++]=false;return true}};$_.lintcset82=function(){var _UP=$k[--$j];$k[$j++]=true;$F(_UP,function(){var _UR=$k[--$j];if(!$has($_.cset82,_UR)){$k[$j-1]=false;return true}});var _UT=$k[--$j];if(!_UT){$k[$j-1]="bwipp.GS1badCSET82character#3175";$k[$j++]="Invalid CSET 82 character";$k[$j++]=false;return true}};$_.lintcset39=function(){var _UU=$k[--$j];$k[$j++]=true;$F(_UU,function(){var _UW=$k[--$j];if(!$has($_.cset39,_UW)){$k[$j-1]=false;return true}});var _UY=$k[--$j];if(!_UY){$k[$j-1]="bwipp.GS1badCSET39character#3180";$k[$j++]="Invalid CSET 39 character";$k[$j++]=false;return true}};$_.lintcset64=function(){var _UZ=$k[$j-1];$X(_UZ,"=");var _Ua=$k[--$j];if(_Ua){var _Ub=$k[--$j];$k[$j-1]=_Ub.length%3;$k[$j++]=_Ub;var _Ue=$k[$j-2];var _Uf=$k[$j-3];$k[$j-3]=$k[$j-1];$j-=2;$k[$j++]=_Uf;$k[$j++]=_Ue;$k[$j++]=false;if(_Ue==1&&$eq(_Uf,"=")){$k[$j-1]=true}var _Uh=$k[$j-2];var _Ui=$k[$j-3];if(_Uh==2&&_Ui.length==0){$k[$j-1]=true}var _Uj=$k[--$j];if(!_Uj){$j-=5;$k[$j++]="bwipp.GS1badCSET64padding#3189";$k[$j++]="Invalid CSET 64 padding";$k[$j++]=false;return true}$j-=2;var _Uk=$k[--$j];var _Ul=$k[--$j];$k[$j++]=_Uk;$k[$j++]=_Ul}$j--;var _Um=$k[--$j];$k[$j++]=true;$F(_Um,function(){var _Uo=$k[--$j];if(!$has($_.cset64,_Uo)){$k[$j-1]=false;return true}});var _Uq=$k[--$j];if(!_Uq){$k[$j-1]="bwipp.GS1badCSET64character#3195";$k[$j++]="Invalid CSET 64 character";$k[$j++]=false;return true}};$_.lintgcppos1=function(){var _Ur=$k[$j-1];if(_Ur.length<2){$j-=2;$k[$j++]="bwipp.GS1gcpTooShort#3199";$k[$j++]="Value is too short to contain a GS1 Company Prefix";$k[$j++]=false;return true}var _Us=$k[--$j];var _Ut=$g(_Us,0);var _Uu=$g(_Us,1);if(_Ut<48||_Ut>57||(_Uu<48||_Uu>57)){$k[$j-1]="bwipp.GS1badGCP#3202";$k[$j++]="Non-numeric GS1 Company Prefix";$k[$j++]=false;return true}};$_.lintgcppos2=function(){var _Uv=$k[$j-1];if(_Uv.length<1){$j-=2;$k[$j++]="bwipp.GS1valueTooShortForOffsetGCP#3207";$k[$j++]="Value is too short to contain an offset GS1 Company Prefix";$k[$j++]=false;return true}var _Uw=$k[--$j];$k[$j++]=$G(_Uw,1,_Uw.length-1);$_.lintgcppos1()};$_.lintimporteridx=function(){var _Uy=$k[--$j];$X("-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz",_Uy);var _Uz=$k[--$j];if(!_Uz){$j-=2;$k[$j++]="bwipp.GS1badImporterIndex#3213";$k[$j++]="Invalid importer index";$k[$j++]=false;return true}$j-=3};$_.lintcsum=function(){var _V1=$k[--$j];var _V2=_V1.length%2==0?3:1;$k[$j++]=Infinity;$k[$j++]=_V2;$F(_V1,function(){var _V3=$k[--$j];var _V4=$k[--$j];$k[$j++]=(_V3-48)*_V4;$k[$j++]=4-_V4});$j--;var _V5=$m()+1;$k[$j++]=0;for(var _V6=0,_V7=_V5-1;_V6<_V7;_V6++){var _V8=$k[--$j];var _V9=$k[--$j];$k[$j++]=$f(_V9+_V8)}var _VA=$k[--$j];$j--;if(_VA%10!=0){$k[$j-1]="bwipp.GS1badChecksum#3222";$k[$j++]="Bad checksum";$k[$j++]=false;return true}};$_.lintcsumalpha=function(){var _VD=$k[$j-1];if(_VD.length<2){$j-=2;$k[$j++]="bwipp.GS1alphaTooShort#3226";$k[$j++]="Alphanumeric string is too short to check";$k[$j++]=false;return true}var _VE=$k[$j-1];$k[$j++]=_VE.length-2;var _VH=$G(_VE,0,_VE.length-2);$k[$j++]=Infinity;$F(_VH,function(){var _VI=$k[$j-1];var _VK=$has($_.cset82,_VI);if(_VK){var _VM=$k[--$j];$k[$j++]=$g($_.cset82,_VM)}else{$k[$j++]=-1;return true}});var _VO=$k[$j-1];if(_VO==-1){$l();$j-=3;$k[$j++]="bwipp.GS1UnknownCSET82Character#3232";$k[$j++]="Unknown CSET 82 character";$k[$j++]=false;return true}$as($a($m()));var _VR=$k[--$j];$k[$j-1]=_VR;var _VT=$k[$j-2];var _VU=$k[$j-3];$k[$j-3]=$k[$j-1];$j-=2;var _VX=$G(_VU,_VT,2);$k[$j++]=Infinity;$F(_VX,function(){var _VY=$k[$j-1];var _Va=$has($_.cset32,_VY);if(_Va){var _Vc=$k[--$j];$k[$j++]=$g($_.cset32,_Vc)}else{$k[$j++]=-1;return true}});var _Ve=$k[$j-1];if(_Ve==-1){$l();$j-=2;$k[$j++]="bwipp.GS1UnknownCSET32Character#3238";$k[$j++]="Unknown CSET 32 character";$k[$j++]=false;return true}$as($a($m()));var _Vh=$k[--$j];$j--;var _Vm=$k[--$j];var _Vn=_Vm.length;$k[$j++]=$f($g(_Vh,0)*32+$g(_Vh,1));$k[$j++]=_Vm;$k[$j++]=$_.gs1process_primes;$k[$j++]=_Vn;if(_Vn>$_.gs1process_primes.length){$j-=5;$k[$j++]="bwipp.GS1alphaTooLong#3243";$k[$j++]="Alphanumeric string is too long to check";$k[$j++]=false;return true}var _Vo=$k[--$j];var _Vp=$k[--$j];var _Vq=$G(_Vp,0,_Vo);for(var _Vr=0,_Vs=_Vq.length;_Vr<_Vs;_Vr++){var _Vu=$k[--$j];$k[$j++]=$g(_Vq,_Vr);$k[$j++]=_Vu}var _Vv=$k[--$j];$k[$j++]=0;$F(_Vv,function(){var _Vw=$k[$j-3];var _Vx=$k[$j-1];var _Vy=$k[$j-2];$j-=3;$k[$j++]=$f(_Vy+_Vw*_Vx)});var _Vz=$k[--$j];var _W0=$k[--$j];if(_W0!=_Vz%1021){$k[$j-1]="bwipp.GS1badAlphaCheckCharacters#3246";$k[$j++]="Bad alphanumeric check characters";$k[$j++]=false;return true}};$_.lintiso3166=function(){var _W2=$k[--$j];if(!$has($_.iso3166,_W2)){$k[$j-1]="bwipp.GS1UnknownCountry#3250";$k[$j++]="Unknown country code";$k[$j++]=false;return true}};$_.lintiso3166999=function(){var _W4=$k[$j-1];if($ne(_W4,"999")){var _W6=$k[--$j];if(!$has($_.iso3166,_W6)){$k[$j-1]="bwipp.GS1UnknownCountryOr999#3255";$k[$j++]="Unknown country code or not 999";$k[$j++]=false;return true}}else{$j--}};$_.lintiso3166alpha2=function(){var _W9=$k[--$j];if(!$has($_.iso3166alpha2,_W9)){$k[$j-1]="bwipp.GS1UnknownCountryAlpha#3262";$k[$j++]="Unknown country alpha code";$k[$j++]=false;return true}};$_.lintiso4217=function(){var _WC=$k[--$j];if(!$has($_.iso4217,_WC)){$k[$j-1]="bwipp.GS1UnknownCurrency#3266";$k[$j++]="Unknown currency code";$k[$j++]=false;return true}};$_.lintiso5218=function(){var _WE=$k[--$j];if($ne(_WE,"0")&&($ne(_WE,"1")&&($ne(_WE,"2")&&$ne(_WE,"9")))){$k[$j-1]="bwipp.GS1biologicalSexCode#3271";$k[$j++]="Invalid biological sex code";$k[$j++]=false;return true}};$_.lintiban=function(){var _WF=$k[$j-1];if(_WF.length<=4){$j-=2;$k[$j++]="bwipp.GS1tooShort#3276";$k[$j++]="IBAN too short";$k[$j++]=false;return true}var _WG=$k[$j-1];$k[$j++]=true;$F(_WG,function(){var _WH=$s(1);$k[$j++]=_WH;$k[$j++]=_WH;$k[$j++]=0;$r(4,-1);var _WI=$k[--$j];var _WJ=$k[--$j];var _WK=$k[--$j];$p(_WK,_WJ,_WI);var _WL=$k[--$j];$X("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",_WL);var _WM=$k[--$j];if(!_WM){$j-=2;$k[$j++]=false;return true}$j-=3});var _WN=$k[--$j];if(!_WN){$j-=2;$k[$j++]="bwipp.GS1badIBANcharacter#3283";$k[$j++]="Invalid IBAN character";$k[$j++]=false;return true}var _WO=$k[$j-1];$k[$j++]=Infinity;$k[$j++]=Infinity;$F(_WO);$r($m(),-4);$as($a($m()));var _WW=$k[--$j];$j--;$F(_WW,function(){var _WZ=$k[--$j];var _Wa=_WZ-48;$k[$j++]=_Wa;if(_Wa>9){var _Wb=$k[--$j];var _Wc=_Wb-7;$k[$j++]=~~(_Wc/10);$k[$j++]=_Wc%10}});$as($a($m()));var _Wf=$k[--$j];$j--;var _Wk=0;$F(_Wf,function(){var _Wi=$k[--$j];_Wk=$f(_Wi+_Wk*10)%97});if(_Wk!=1){$j-=2;$k[$j++]="bwipp.GS1badIBANchecksum#3288";$k[$j++]="IBAN checksum incorrect";$k[$j++]=false;return true}var _Wl=$k[--$j];$k[$j++]=$G(_Wl,0,2);$_.lintiso3166alpha2()};$_.lintzero=function(){var _Wn=$k[--$j];if($ne(_Wn,"0")){$k[$j-1]="bwipp.GS1zeroRequired#3293";$k[$j++]="Zero is required";$k[$j++]=false;return true}};$_.lintnonzero=function(){var _Wo=$k[--$j];$k[$j++]=false;$F(_Wo,function(){var _Wp=$k[--$j];if(_Wp!=48){$k[$j-1]=true}});var _Wq=$k[--$j];if(!_Wq){$k[$j-1]="bwipp.GS1zeroNotPermitted#3298";$k[$j++]="Zero not permitted";$k[$j++]=false;return true}};$_.lintnozeroprefix=function(){var _Wr=$k[--$j];if(_Wr.length>1&&$g(_Wr,0)==48){$k[$j-1]="bwipp.GS1badZeroPrefix#3303";$k[$j++]="Zero prefix is not permitted";$k[$j++]=false;return true}};$_.linthasnondigit=function(){var _Wt=$k[--$j];$k[$j++]=false;$F(_Wt,function(){var _Wu=$k[--$j];if(_Wu<48||_Wu>57){$k[$j-1]=true;return true}});var _Wv=$k[--$j];if(!_Wv){$k[$j-1]="bwipp.GS1requiresNonDigit#3309";$k[$j++]="A non-digit character is required";$k[$j++]=false;return true}};$_.linthyphen=function(){var _Ww=$k[--$j];if($ne(_Ww,"-")){$k[$j-1]="bwipp.GS1hyphenRequired#3313";$k[$j++]="A hyphen is required";$k[$j++]=false;return true}};$_.lintyyyymmd0=function(){var _Wx=$k[$j-1];var _Wz=$i($G(_Wx,4,2));$k[$j++]=_Wz;if(_Wz<1||_Wz>12){$j-=3;$k[$j++]="bwipp.GS1badMonth#3317";$k[$j++]="Invalid month";$k[$j++]=false;return true}var _X0=$k[--$j];if(_X0==2){var _X1=$k[$j-1];var _X3=$i($G(_X1,0,4));$k[$j++]=_X3%400==0||_X3%4==0&&_X3%100!=0?29:28}else{var _X5=$k[$j-1];$k[$j++]=$g($_.gs1process_daysinmonth,$i($G(_X5,4,2))-1)}var _X8=$k[--$j];var _X9=$k[--$j];if(_X8<$i($G(_X9,6,2))){$k[$j-1]="bwipp.GS1badDay#3323";$k[$j++]="Invalid day of month";$k[$j++]=false;return true}};$_.lintyyyymmdd=function(){var _XB=$k[$j-1];if(_XB.length!=8){$j-=2;$k[$j++]="bwipp.GS1badDateLength#3327";$k[$j++]="Invalid length for yyyymmdd date";$k[$j++]=false;return true}var _XC=$k[$j-1];if($i($G(_XC,6,2))<1){$j-=2;$k[$j++]="bwipp.GS1badDay#3328";$k[$j++]="Invalid day of month";$k[$j++]=false;return true}$_.lintyyyymmd0()};$_.lintyymmd0=function(){var _XE=$k[$j-1];var _XG=$i($G(_XE,0,2));var _XH=_XG-21;$k[$j++]=_XG;$k[$j++]=_XH;if(_XH>=51){$k[$j-1]="19"}else{var _XI=$k[--$j];if(_XI<=-50){$k[$j++]="21"}else{$k[$j++]="20"}}var _XJ=$k[--$j];$k[$j-1]=_XJ;var _XL=$s(8);$k[$j++]=_XL;$k[$j++]=_XL;$k[$j++]=0;$r(4,-1);var _XM=$k[--$j];var _XN=$k[--$j];var _XO=$k[--$j];$P(_XO,_XN,_XM);var _XP=$k[$j-1];$k[$j++]=_XP;$k[$j++]=2;$r(4,-1);var _XQ=$k[--$j];var _XR=$k[--$j];var _XS=$k[--$j];$P(_XS,_XR,_XQ);$_.lintyyyymmd0()};$_.lintyymmdd=function(){var _XT=$k[$j-1];if(_XT.length!=6){$j-=2;$k[$j++]="bwipp.GS1badDateLength#3340";$k[$j++]="Invalid length for yymmdd date";$k[$j++]=false;return true}var _XU=$k[$j-1];if($i($G(_XU,4,2))<1){$j-=2;$k[$j++]="bwipp.GS1badDay#3341";$k[$j++]="Invalid day of month";$k[$j++]=false;return true}$_.lintyymmd0()};$_.linthh=function(){var _XW=$k[--$j];if($i($G(_XW,0,2))>23){$k[$j-1]="bwipp.GS1badHour#3346";$k[$j++]="Invalid hour of day";$k[$j++]=false;return true}};$_.lintmi=function(){var _XY=$k[--$j];if($i($G(_XY,0,2))>59){$k[$j-1]="bwipp.GS1badMinute#3350";$k[$j++]="Invalid minute in the hour";$k[$j++]=false;return true}};$_.lintss=function(){var _Xa=$k[--$j];if($i($G(_Xa,0,2))>59){$k[$j-1]="bwipp.GS1badSecond#3354";$k[$j++]="Invalid second in the minute";$k[$j++]=false;return true}};$_.linthhmi=function(){var _Xc=$k[$j-1];if($i($G(_Xc,0,2))>23){$j-=2;$k[$j++]="bwipp.GS1badHour#3358";$k[$j++]="Invalid hour of day";$k[$j++]=false;return true}var _Xe=$k[--$j];if($i($G(_Xe,2,2))>59){$k[$j-1]="bwipp.GS1badMinute#3359";$k[$j++]="Invalid minute in the hour";$k[$j++]=false;return true}};$_.lintmmoptss=function(){var _Xg=$k[$j-1];var _Xh=_Xg.length;if(_Xh!=2&&_Xh!=4){$k[$j-1]="bwipp.GS1badTimeLength#3364";$k[$j++]="Invalid length for optional minutes and seconds";$k[$j++]=false;return true}var _Xi=$k[$j-1];if($i($G(_Xi,0,2))>59){$j-=2;$k[$j++]="bwipp.GS1badMinute#3366";$k[$j++]="Invalid minute in the hour";$k[$j++]=false;return true}var _Xk=$k[$j-1];if(_Xk.length>=4){var _Xl=$k[$j-1];if($i($G(_Xl,2,2))>59){$j-=2;$k[$j++]="bwipp.GS1badSecond#3368";$k[$j++]="Invalid second in the minute";$k[$j++]=false;return true}}$j--};$_.lintyesno=function(){var _Xn=$k[--$j];if($ne(_Xn,"0")&&$ne(_Xn,"1")){$k[$j-1]="bwipp.GS1badBoolean#3375";$k[$j++]="Neither 0 nor 1 for yes or no";$k[$j++]=false;return true}};$_.lintwinding=function(){var _Xo=$k[--$j];if($ne(_Xo,"0")&&($ne(_Xo,"1")&&$ne(_Xo,"9"))){$k[$j-1]="bwipp.GS1badWinding#3381";$k[$j++]="Invalid winding direction";$k[$j++]=false;return true}};$_.lintpieceoftotal=function(){var _Xp=$k[$j-1];if(_Xp.length%2!=0){$j-=2;$k[$j++]="bwipp.GS1badPieceTotalLength#3386";$k[$j++]="Invalid piece/total length";$k[$j++]=false;return true}var _Xq=$k[$j-1];var _Xs=$i($G(_Xq,0,~~(_Xq.length/2)));$k[$j++]=_Xs;if(_Xs==0){$j-=3;$k[$j++]="bwipp.GS1badPieceNumber#3388";$k[$j++]="Invalid piece number";$k[$j++]=false;return true}var _Xt=$k[--$j];var _Xu=$k[--$j];var _Xv=~~(_Xu.length/2);var _Xx=$i($G(_Xu,_Xv,_Xv));$k[$j++]=_Xt;$k[$j++]=_Xx;if(_Xx==0){$j-=3;$k[$j++]="bwipp.GS1badPieceTotal#3390";$k[$j++]="Invalid total number";$k[$j++]=false;return true}var _Xy=$k[--$j];var _Xz=$k[--$j];if($gt(_Xz,_Xy)){$k[$j-1]="bwipp.GS1pieceExceedsTotal#3391";$k[$j++]="Piece number exceeds total";$k[$j++]=false;return true}};$_.lintposinseqslash=function(){var _Y0=$k[--$j];$X(_Y0,"/");var _Y1=$k[--$j];if(!_Y1){$j-=2;$k[$j++]="bwipp.invalidPosInSeqFormat#3396";$k[$j++]="Invalid / format";$k[$j++]=false;return true}var _Y2=$k[--$j];$k[$j-1]=_Y2;var _Y4=$k[$j-1];if(_Y4.length==0){$j-=3;$k[$j++]="bwipp.invalidPosInSeqFormat#3400";$k[$j++]="Invalid / format";$k[$j++]=false;return true}var _Y6=$k[$j-2];if(_Y6.length==0){$j-=3;$k[$j++]="bwipp.invalidPosInSeqFormat#3403";$k[$j++]="Invalid / format";$k[$j++]=false;return true}var _Y7=$k[$j-1];$k[$j++]=true;$F(_Y7,function(){var _Y8=$k[--$j];if(_Y8<48||_Y8>57){$k[$j-1]=false;return true}});var _Y9=$k[--$j];if(!_Y9){$j-=3;$k[$j++]="bwipp.positionNotNumeric#3408";$k[$j++]="Position is not numeric";$k[$j++]=false;return true}var _YB=$k[$j-2];$k[$j++]=true;$F(_YB,function(){var _YC=$k[--$j];if(_YC<48||_YC>57){$k[$j-1]=false;return true}});var _YD=$k[--$j];if(!_YD){$j-=3;$k[$j++]="bwipp.endNotNumeric#3412";$k[$j++]="End is not numeric";$k[$j++]=false;return true}var _YE=$k[$j-1];if($g(_YE,0)==48){$j-=3;$k[$j++]="bwipp.positionZeroPrefix#3413";$k[$j++]="Position cannot have zero prefix";$k[$j++]=false;return true}var _YH=$k[$j-2];if($g(_YH,0)==48){$j-=3;$k[$j++]="bwipp.endZeroPrefix#3414";$k[$j++]="End cannot have zero prefix";$k[$j++]=false;return true}var _YJ=$k[--$j];var _YK=$k[--$j];if($i(_YK)<$i(_YJ)){$k[$j-1]="bwipp.positionExceedsEnd#3416";$k[$j++]="Position exceeds end";$k[$j++]=false;return true}};$_.lintpcenc=function(){for(;;){var _YL=$k[--$j];$X(_YL,"%");var _YM=$k[--$j];if(!_YM){$j--;break}$j-=2;var _YN=$k[$j-1];if(_YN.length<2){$j-=2;$k[$j++]="bwipp.GS1badPercentEscape#3422";$k[$j++]="Invalid % escape";$k[$j++]=false;break}var _YO=$k[$j-1];var _YP=$G(_YO,0,2);$k[$j++]=true;for(var _YQ=0,_YR=_YP.length;_YQ<_YR;_YQ++){var _YT=$s(1);$p(_YT,0,$g(_YP,_YQ));$X("0123456789ABCDEFabcdef",_YT);var _YU=$k[--$j];if(!_YU){$j-=2;$k[$j++]=false;break}$j-=3}var _YV=$k[--$j];if(!_YV){$j-=2;$k[$j++]="bwipp.GS1badPercentChars#3429";$k[$j++]="Invalid characters for percent encoding";$k[$j++]=false;break}}};$_.lintcouponcode=function(){var _YW=$k[$j-1];$k[$j++]=true;$F(_YW,function(){var _YX=$k[--$j];if(_YX<48||_YX>57){$k[$j-1]=false;return true}});var _YY=$k[--$j];if(!_YY){$j-=2;$k[$j++]="bwipp.GS1couponNotNumeric#3437";$k[$j++]="Coupon not numeric";$k[$j++]=false;return true}var _YZ=$k[$j-1];if(_YZ.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortGCPVLI#3441";$k[$j++]="Coupon too short: Missing GCP VLI";$k[$j++]=false;return true}var _Ya=$k[$j-1];var _Yc=$i($G(_Ya,0,1));$k[$j++]=_Yc;if(_Yc>6){$j-=3;$k[$j++]="bwipp.GS1couponBadGCPVLI#3444";$k[$j++]="Coupon GCP length indicator must be 0-6";$k[$j++]=false;return true}var _Yd=$k[--$j];var _Ye=$k[$j-1];$k[$j++]=_Yd+6+1;if(_Yd+6+1>_Ye.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortGCP#3448";$k[$j++]="Coupon too short: GCP truncated";$k[$j++]=false;return true}var _Yf=$k[--$j];var _Yg=$k[--$j];var _Yh=$G(_Yg,_Yf,$f(_Yg.length-_Yf));$k[$j++]=_Yh;if(_Yh.length<6){$j-=2;$k[$j++]="bwipp.GS1couponTooShortOfferCode#3454";$k[$j++]="Coupon too short: Offer Code truncated";$k[$j++]=false;return true}var _Yi=$k[--$j];var _Yj=$G(_Yi,6,_Yi.length-6);$k[$j++]=_Yj;if(_Yj.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortSaveValueVLI#3460";$k[$j++]="Coupon too short: Missing Save Value VLI";$k[$j++]=false;return true}var _Yk=$k[$j-1];var _Ym=$i($G(_Yk,0,1));$k[$j++]=_Ym;if(_Ym<1||_Ym>5){$j-=3;$k[$j++]="bwipp.GS1couponBadSaveValueVLI#3463";$k[$j++]="Coupon Save Value length indicator must be 1-5";$k[$j++]=false;return true}var _Yn=$k[--$j];var _Yo=$k[$j-1];$k[$j++]=_Yn+1;if(_Yn+1>_Yo.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortSaveValue#3467";$k[$j++]="Coupon too short: Save Value truncated";$k[$j++]=false;return true}var _Yp=$k[--$j];var _Yq=$k[--$j];var _Yr=$G(_Yq,_Yp,$f(_Yq.length-_Yp));$k[$j++]=_Yr;if(_Yr.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort1stPurchaseRequirementVLI#3473";$k[$j++]="Coupon too short: Missing 1st Purchase Requirement VLI";$k[$j++]=false;return true}var _Ys=$k[$j-1];var _Yu=$i($G(_Ys,0,1));$k[$j++]=_Yu;if(_Yu<1||_Yu>5){$j-=3;$k[$j++]="bwipp.GS1couponBad1stPurchaseRequirementVLI#3476";$k[$j++]="Coupon 1st Purchase Requirement length indicator must be 1-5";$k[$j++]=false;return true}var _Yv=$k[--$j];var _Yw=$k[$j-1];$k[$j++]=_Yv+1;if(_Yv+1>_Yw.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShort1stPurchaseRequirement#3480";$k[$j++]="Coupon too short: 1st Purchase Requirement truncated";$k[$j++]=false;return true}var _Yx=$k[--$j];var _Yy=$k[--$j];var _Yz=$G(_Yy,_Yx,$f(_Yy.length-_Yx));$k[$j++]=_Yz;if(_Yz.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort1stPurchaseRequirementCode#3486";$k[$j++]="Coupon too short: Missing 1st Purchase Requirement Code";$k[$j++]=false;return true}var _Z0=$k[$j-1];var _Z2=$i($G(_Z0,0,1));if(_Z2>4&&_Z2!=9){$j-=2;$k[$j++]="bwipp.GS1couponBad1stPurchaseRequirementCode#3489";$k[$j++]="Coupon 1st Purchase Requirement Code must be 0-4 or 9";$k[$j++]=false;return true}var _Z3=$k[--$j];var _Z4=$G(_Z3,1,_Z3.length-1);$k[$j++]=_Z4;if(_Z4.length<3){$j-=2;$k[$j++]="bwipp.GS1couponTooShort1stPurchaseFamilyCode#3495";$k[$j++]="Coupon too short: 1st Purchase Family Code truncated";$k[$j++]=false;return true}var _Z5=$k[--$j];var _Z6=$G(_Z5,3,_Z5.length-3);$k[$j++]=_Z6;if(_Z6.length>=1){var _Z7=$k[$j-1];if($i($G(_Z7,0,1))==1){var _Z9=$k[--$j];var _ZA=$G(_Z9,1,_Z9.length-1);$k[$j++]=_ZA;if(_ZA.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortAdditionalPurchaseRulesCode#3505";$k[$j++]="Coupon too short: Missing Additional Purchase Rules Code";$k[$j++]=false;return true}var _ZB=$k[$j-1];if($i($G(_ZB,0,1))>3){$j-=2;$k[$j++]="bwipp.GS1couponBadAdditionalPurchaseRulesCode#3508";$k[$j++]="Coupon Additional Purchase Rules Code must be 0-3";$k[$j++]=false;return true}var _ZD=$k[--$j];var _ZE=$G(_ZD,1,_ZD.length-1);$k[$j++]=_ZE;if(_ZE.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseRequirementVLI#3514";$k[$j++]="Coupon too short: Missing 2nd Purchase Requirement VLI";$k[$j++]=false;return true}var _ZF=$k[$j-1];var _ZH=$i($G(_ZF,0,1));$k[$j++]=_ZH;if(_ZH<1||_ZH>5){$j-=3;$k[$j++]="bwipp.GS1couponBad2ndPurchaseRequirementVLI#3517";$k[$j++]="Coupon 2nd Purchase Requirement length indicator must be 1-5";$k[$j++]=false;return true}var _ZI=$k[--$j];var _ZJ=$k[$j-1];$k[$j++]=_ZI+1;if(_ZI+1>_ZJ.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseRequirement#3521";$k[$j++]="Coupon too short: 2nd Purchase Requirement truncated";$k[$j++]=false;return true}var _ZK=$k[--$j];var _ZL=$k[--$j];var _ZM=$G(_ZL,_ZK,$f(_ZL.length-_ZK));$k[$j++]=_ZM;if(_ZM.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseRequirementCode#3527";$k[$j++]="Coupon too short: Missing 2nd Purchase Requirement Code";$k[$j++]=false;return true}var _ZN=$k[$j-1];var _ZP=$i($G(_ZN,0,1));if(_ZP>4&&_ZP!=9){$j-=2;$k[$j++]="bwipp.GS1couponBad2ndPurchaseRequirementCode#3530";$k[$j++]="Coupon 2nd Purchase Requirement Code must be 0-4 or 9";$k[$j++]=false;return true}var _ZQ=$k[--$j];var _ZR=$G(_ZQ,1,_ZQ.length-1);$k[$j++]=_ZR;if(_ZR.length<3){$j-=2;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseFamilyCode#3536";$k[$j++]="Coupon too short: 2nd Purchase Family Code truncated";$k[$j++]=false;return true}var _ZS=$k[--$j];var _ZT=$G(_ZS,3,_ZS.length-3);$k[$j++]=_ZT;if(_ZT.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseGCPVLI#3542";$k[$j++]="Coupon too short: Missing 2nd Purchase GCP VLI";$k[$j++]=false;return true}var _ZU=$k[$j-1];var _ZW=$i($G(_ZU,0,1));$k[$j++]=_ZW;if(_ZW>6&&_ZW!=9){$j-=3;$k[$j++]="bwipp.GS1couponBad2ndPurchaseGCPVLI#3545";$k[$j++]="Coupon 2nd Purchase GCP length indicator must be 0-6 or 9";$k[$j++]=false;return true}var _ZX=$k[$j-1];if(_ZX!=9){$k[$j-1]+=6}else{$k[$j-1]=0}var _ZZ=$k[--$j];var _Za=$k[$j-1];$k[$j++]=_ZZ+1;if(_ZZ+1>_Za.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShort2ndPurchaseGCP#3549";$k[$j++]="Coupon too short: 2nd Purchase GCP truncated";$k[$j++]=false;return true}var _Zb=$k[--$j];var _Zc=$k[--$j];$k[$j++]=$G(_Zc,_Zb,$f(_Zc.length-_Zb))}}var _Ze=$k[$j-1];if(_Ze.length>=1){var _Zf=$k[$j-1];if($i($G(_Zf,0,1))==2){var _Zh=$k[--$j];var _Zi=$G(_Zh,1,_Zh.length-1);$k[$j++]=_Zi;if(_Zi.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseRequirementVLI#3561";$k[$j++]="Coupon too short: Missing 3rd Purchase Requirement VLI";$k[$j++]=false;return true}var _Zj=$k[$j-1];var _Zl=$i($G(_Zj,0,1));$k[$j++]=_Zl;if(_Zl<1||_Zl>5){$j-=3;$k[$j++]="bwipp.GS1couponBad3rdPurchaseRequirementVLI#3564";$k[$j++]="Coupon 3rd Purchase Requirement length indicator must be 1-5";$k[$j++]=false;return true}var _Zm=$k[--$j];var _Zn=$k[$j-1];$k[$j++]=_Zm+1;if(_Zm+1>_Zn.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseRequirement#3568";$k[$j++]="Coupon too short: 3rd Purchase Requirement truncated";$k[$j++]=false;return true}var _Zo=$k[--$j];var _Zp=$k[--$j];var _Zq=$G(_Zp,_Zo,$f(_Zp.length-_Zo));$k[$j++]=_Zq;if(_Zq.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseRequirementCode#3574";$k[$j++]="Coupon too short: Missing 3rd Purchase Requirement Code";$k[$j++]=false;return true}var _Zr=$k[$j-1];var _Zt=$i($G(_Zr,0,1));if(_Zt>4&&_Zt!=9){$j-=2;$k[$j++]="bwipp.GS1couponBad3rdPurchaseRequirementCode#3577";$k[$j++]="Coupon 3rd Purchase Requirement Code must be 0-4 or 9";$k[$j++]=false;return true}var _Zu=$k[--$j];var _Zv=$G(_Zu,1,_Zu.length-1);$k[$j++]=_Zv;if(_Zv.length<3){$j-=2;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseFamilyCode#3583";$k[$j++]="Coupon too short: 3rd Purchase Family Code truncated";$k[$j++]=false;return true}var _Zw=$k[--$j];var _Zx=$G(_Zw,3,_Zw.length-3);$k[$j++]=_Zx;if(_Zx.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseGCPVLI#3589";$k[$j++]="Coupon too short: Missing 3rd Purchase GCP VLI";$k[$j++]=false;return true}var _Zy=$k[$j-1];var _a0=$i($G(_Zy,0,1));$k[$j++]=_a0;if(_a0>6&&_a0!=9){$j-=3;$k[$j++]="bwipp.GS1couponBad3rdPurchaseGCPVLI#3592";$k[$j++]="Coupon 3rd Purchase GCP length indicator must be 0-6 or 9";$k[$j++]=false;return true}var _a1=$k[$j-1];if(_a1!=9){$k[$j-1]+=6}else{$k[$j-1]=0}var _a3=$k[--$j];var _a4=$k[$j-1];$k[$j++]=_a3+1;if(_a3+1>_a4.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShort3rdPurchaseGCP#3596";$k[$j++]="Coupon too short: 3rd Purchase GCP truncated";$k[$j++]=false;return true}var _a5=$k[--$j];var _a6=$k[--$j];$k[$j++]=$G(_a6,_a5,$f(_a6.length-_a5))}}$_.couponexpire=-1;var _a8=$k[$j-1];if(_a8.length>=1){var _a9=$k[$j-1];if($i($G(_a9,0,1))==3){var _aB=$k[--$j];var _aC=$G(_aB,1,_aB.length-1);$k[$j++]=_aC;if(_aC.length<6){$j-=2;$k[$j++]="bwipp.GS1couponTooShortExpirationDate#3609";$k[$j++]="Coupon too short: Expiration date";$k[$j++]=false;return true}var _aD=$k[$j-1];var _aF=$i($G(_aD,2,2));$k[$j++]=_aF;if(_aF<1||_aF>12){$j-=3;$k[$j++]="bwipp.GS1couponExpirationDateBadMonth#3611";$k[$j++]="Invalid month in expiration date";$k[$j++]=false;return true}var _aG=$k[--$j];if(_aG==2){var _aH=$k[$j-1];var _aJ=$i($G(_aH,0,2));var _aK=_aJ-21;$k[$j++]=_aJ;$k[$j++]=_aK;if(_aK>=51){$j--;$k[$j-1]+=1900}else{var _aM=$k[--$j];if(_aM<=-50){$k[$j-1]+=2100}else{$k[$j-1]+=2e3}}var _aP=$k[--$j];$k[$j++]=_aP%400==0||_aP%4==0&&_aP%100!=0?29:28}else{var _aR=$k[$j-1];$k[$j++]=$g($_.gs1process_daysinmonth,$i($G(_aR,2,2))-1)}var _aU=$k[--$j];var _aV=$k[$j-1];var _aX=$i($G(_aV,4,2));if(_aU<_aX||_aX<1){$j-=2;$k[$j++]="bwipp.GS1couponExpirationDateBadDay#3620";$k[$j++]="Invalid day of month in expiration date";$k[$j++]=false;return true}var _aY=$k[--$j];$_.couponexpire=$i($G(_aY,0,6));$k[$j++]=$G(_aY,6,_aY.length-6)}}var _ab=$k[$j-1];if(_ab.length>=1){var _ac=$k[$j-1];if($i($G(_ac,0,1))==4){var _ae=$k[--$j];var _af=$G(_ae,1,_ae.length-1);$k[$j++]=_af;if(_af.length<6){$j-=2;$k[$j++]="bwipp.GS1couponTooShortStartDate#3632";$k[$j++]="Coupon too short: Start date";$k[$j++]=false;return true}var _ag=$k[$j-1];var _ai=$i($G(_ag,2,2));$k[$j++]=_ai;if(_ai<1||_ai>12){$j-=3;$k[$j++]="bwipp.GS1couponStartDateBadMonth#3634";$k[$j++]="Invalid month in start date";$k[$j++]=false;return true}var _aj=$k[--$j];if(_aj==2){var _ak=$k[$j-1];var _am=$i($G(_ak,0,2));var _an=_am-21;$k[$j++]=_am;$k[$j++]=_an;if(_an>=51){$j--;$k[$j-1]+=1900}else{var _ap=$k[--$j];if(_ap<=-50){$k[$j-1]+=2100}else{$k[$j-1]+=2e3}}var _as=$k[--$j];$k[$j++]=_as%400==0||_as%4==0&&_as%100!=0?29:28}else{var _au=$k[$j-1];$k[$j++]=$g($_.gs1process_daysinmonth,$i($G(_au,2,2))-1)}var _ax=$k[--$j];var _ay=$k[$j-1];var _b0=$i($G(_ay,4,2));if(_ax<_b0||_b0<1){$j-=2;$k[$j++]="bwipp.GS1couponStartDateBadDay#3643";$k[$j++]="Invalid day of month in start date";$k[$j++]=false;return true}var _b1=$k[--$j];$_.couponstart=$i($G(_b1,0,6));$k[$j++]=_b1;if($_.couponexpire!=-1&&$_.couponexpire<$_.couponstart){$j-=2;$k[$j++]="bwipp.GS1couponExpireDateBeforeStartDate#3646";$k[$j++]="Coupon expires before it starts";$k[$j++]=false;return true}var _b6=$k[--$j];$k[$j++]=$G(_b6,6,_b6.length-6)}}var _b8=$k[$j-1];if(_b8.length>=1){var _b9=$k[$j-1];if($i($G(_b9,0,1))==5){var _bB=$k[--$j];var _bC=$G(_bB,1,_bB.length-1);$k[$j++]=_bC;if(_bC.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortSerialNumberVLI#3658";$k[$j++]="Coupon too short: Missing Serial Number VLI";$k[$j++]=false;return true}var _bD=$k[$j-1];var _bE=$G(_bD,0,1);$k[$j++]=$i(_bE)+6+1;if($i(_bE)+6+1>_bD.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortSerialNumber#3662";$k[$j++]="Coupon too short: Serial Number truncated";$k[$j++]=false;return true}var _bF=$k[--$j];var _bG=$k[--$j];$k[$j++]=$G(_bG,_bF,$f(_bG.length-_bF))}}var _bI=$k[$j-1];if(_bI.length>=1){var _bJ=$k[$j-1];if($i($G(_bJ,0,1))==6){var _bL=$k[--$j];var _bM=$G(_bL,1,_bL.length-1);$k[$j++]=_bM;if(_bM.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortRetailerGCPGLNVLI#3674";$k[$j++]="Coupon too short: Missing Retailer GCP/GLN VLI";$k[$j++]=false;return true}var _bN=$k[$j-1];var _bP=$i($G(_bN,0,1));$k[$j++]=_bP;if(_bP<1||_bP>7){$j-=3;$k[$j++]="bwipp.GS1couponBadRetailerGCPGLNVLI#3677";$k[$j++]="Coupon Retailer GCP/GLN length indicator must be 1-7";$k[$j++]=false;return true}var _bQ=$k[--$j];var _bR=$k[$j-1];$k[$j++]=_bQ+6+1;if(_bQ+6+1>_bR.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortRetailerGCPGLN#3681";$k[$j++]="Coupon too short: Retailer GCP/GLN truncated";$k[$j++]=false;return true}var _bS=$k[--$j];var _bT=$k[--$j];$k[$j++]=$G(_bT,_bS,$f(_bT.length-_bS))}}var _bV=$k[$j-1];if(_bV.length>=1){var _bW=$k[$j-1];if($i($G(_bW,0,1))==9){var _bY=$k[--$j];var _bZ=$G(_bY,1,_bY.length-1);$k[$j++]=_bZ;if(_bZ.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortSaveValueCode#3693";$k[$j++]="Coupon too short: Missing Save Value Code";$k[$j++]=false;return true}var _ba=$k[$j-1];var _bc=$i($G(_ba,0,1));if(_bc>6||(_bc==3||_bc==4)){$j-=2;$k[$j++]="bwipp.GS1couponBadSaveValueCode#3696";$k[$j++]="Coupon Save Value Code must be 0,1,2,5 or 6";$k[$j++]=false;return true}var _bd=$k[--$j];var _be=$G(_bd,1,_bd.length-1);$k[$j++]=_be;if(_be.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortSaveValueAppliesToItem#3702";$k[$j++]="Coupon too short: Missing Save Value Applies to Item";$k[$j++]=false;return true}var _bf=$k[$j-1];if($i($G(_bf,0,1))>2){$j-=2;$k[$j++]="bwipp.GS1couponBadSaveValueAppliesToItem#3705";$k[$j++]="Coupon Save Value Applies to Item must be 0-2";$k[$j++]=false;return true}var _bh=$k[--$j];var _bi=$G(_bh,1,_bh.length-1);$k[$j++]=_bi;if(_bi.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortStoreCouponFlag#3711";$k[$j++]="Coupon too short: Missing Store Coupon Flag";$k[$j++]=false;return true}var _bj=$k[--$j];var _bk=$G(_bj,1,_bj.length-1);$k[$j++]=_bk;if(_bk.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortDontMultiplyFlag#3717";$k[$j++]="Coupon too short: Missing Don't Multiply Flag";$k[$j++]=false;return true}var _bl=$k[$j-1];if($i($G(_bl,0,1))>1){$j-=2;$k[$j++]="bwipp.GS1couponBadDontMultiplyFlag#3720";$k[$j++]="Don't Multiply Flag must be 0 or 1";$k[$j++]=false;return true}var _bn=$k[--$j];$k[$j++]=$G(_bn,1,_bn.length-1)}}var _bp=$k[$j-1];if(_bp.length!=0){$j-=2;$k[$j++]="bwipp.GS1couponUnrecognisedOptionalField#3727";$k[$j++]="Coupon fields must be 1,2,3,4,5,6 or 9, increasing order";$k[$j++]=false;return true}$j--};$_.lintcouponposoffer=function(){var _bq=$k[$j-1];$k[$j++]=true;$F(_bq,function(){var _br=$k[--$j];if(_br<48||_br>57){$k[$j-1]=false;return true}});var _bs=$k[--$j];if(!_bs){$j-=2;$k[$j++]="bwipp.GS1couponNotNumeric#3736";$k[$j++]="Coupon not numeric";$k[$j++]=false;return true}var _bt=$k[$j-1];if(_bt.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortFormatCode#3739";$k[$j++]="Coupon too short: Missing Format Code";$k[$j++]=false;return true}var _bu=$k[$j-1];var _bv=$G(_bu,0,1);if($ne(_bv,"0")&&$ne(_bv,"1")){$j-=2;$k[$j++]="bwipp.GS1couponBadFormatCode#3742";$k[$j++]="Coupon format must be 0 or 1";$k[$j++]=false;return true}var _bw=$k[--$j];var _bx=$G(_bw,1,_bw.length-1);$k[$j++]=_bx;if(_bx.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortFunderVLI#3747";$k[$j++]="Coupon too short: Missing Funder VLI";$k[$j++]=false;return true}var _by=$k[$j-1];var _c0=$i($G(_by,0,1));$k[$j++]=_c0;if(_c0>6){$j-=3;$k[$j++]="bwipp.GS1couponBadFunderVLI#3750";$k[$j++]="Coupon Funder length indicator must be 0-6";$k[$j++]=false;return true}var _c1=$k[--$j];var _c2=$k[$j-1];$k[$j++]=_c1+6+1;if(_c1+6+1>_c2.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortFunder#3754";$k[$j++]="Coupon too short: Truncated Funder ID";$k[$j++]=false;return true}var _c3=$k[--$j];var _c4=$k[--$j];var _c5=$G(_c4,_c3,$f(_c4.length-_c3));$k[$j++]=_c5;if(_c5.length<6){$j-=2;$k[$j++]="bwipp.GS1couponTooShortOfferCode#3759";$k[$j++]="Coupon too short: Truncated Offer Code";$k[$j++]=false;return true}var _c6=$k[--$j];var _c7=$G(_c6,6,_c6.length-6);$k[$j++]=_c7;if(_c7.length<1){$j-=2;$k[$j++]="bwipp.GS1couponTooShortSnVLI#3764";$k[$j++]="Coupon too short: Missing SN VLI";$k[$j++]=false;return true}var _c8=$k[$j-1];var _c9=$G(_c8,0,1);$k[$j++]=$i(_c9)+6+1;if($i(_c9)+6+1>_c8.length){$j-=3;$k[$j++]="bwipp.GS1couponTooShortSn#3769";$k[$j++]="Coupon too short: Truncated SN";$k[$j++]=false;return true}var _cA=$k[--$j];var _cB=$k[--$j];var _cC=$G(_cB,_cA,$f(_cB.length-_cA));$k[$j++]=_cC;if(_cC.length!=0){$j-=2;$k[$j++]="bwipp.GS1couponTooLong#3773";$k[$j++]="Coupon too long";$k[$j++]=false;return true}$j--};$_.lintlatitude=function(){var _cD=$k[$j-1];if(_cD.length!=10){$k[$j-1]="bwipp.GS1badLatitudeLength#3780";$k[$j++]="Invalid length for a latitude";$k[$j++]=false;return true}var _cE=$k[--$j];if($gt(_cE,"1800000000")){$k[$j-1]="bwipp.GS1badLatitude#3783";$k[$j++]="Invalid value for latitude";$k[$j++]=false;return true}};$_.lintlongitude=function(){var _cF=$k[$j-1];if(_cF.length!=10){$k[$j-1]="bwipp.GS1badLongitudeLength#3788";$k[$j++]="Invalid length for a longitude";$k[$j++]=false;return true}var _cG=$k[--$j];if($gt(_cG,"3600000000")){$k[$j-1]="bwipp.GS1badLongitude#3791";$k[$j++]="Invalid value for longitude";$k[$j++]=false;return true}};$_.lintmediatype=function(){var _cI=$k[--$j];if(!$has($_.aidcmediatype,_cI)){$k[$j-1]="bwipp.GS1UnknownMediaType#3795";$k[$j++]="Unknown AIDC media type";$k[$j++]=false;return true}};$_.lintpackagetype=function(){var _cL=$k[--$j];if(!$has($_.packagetype,_cL)){$k[$j-1]="bwipp.GS1unknownPackageType#3799";$k[$j++]="Unknown package type";$k[$j++]=false;return true}};if(!$_.dontlint){$k[$j++]=true;for(var _cQ=0,_cP=$_.vals.length-1;_cQ<=_cP;_cQ+=1){$_.ai=$g($_.ais,_cQ);$_.val=$g($_.vals,_cQ);if($has($_.gs1syntax,$_.ai)){var _cb=$g($g($_.gs1syntax,$_.ai),"parts");$k[$j++]=_cb;$k[$j++]=0;$F(_cb,function(){var _cc=$k[$j-1];if($g(_cc,"opt")){$k[$j-1]=0}else{var _ce=$k[--$j];$k[$j++]=$g(_ce,"min")}var _cg=$k[--$j];var _ch=$k[--$j];$k[$j++]=$f(_ch+_cg)});var _cj=$k[--$j];if(_cj>$_.val.length){$j-=2;$k[$j++]="bwipp.GS1valueTooShort#3813";$k[$j++]="Too short";$k[$j++]=false;break}var _ck=$k[$j-1];var _cp=0;$F(_ck,function(){var _cl=$k[--$j];_cp=$f(_cp+$g(_cl,"max"))});if(_cp<$_.val.length){$j-=2;$k[$j++]="bwipp.GS1valueTooLong#3816";$k[$j++]="Too long";$k[$j++]=false;break}var _cq=$k[--$j];$F(_cq,function(){var _cr=$k[--$j];$_.props=_cr;var _ct=$g($_.props,"max");var _cu=$_.val;var _cv=_cu.length;if(_ct>_cu.length){var _=_cv;_cv=_ct;_ct=_}$_.eval=$G($_.val,0,_ct);var _d0=$_.eval.length;$_.val=$G($_.val,_d0,$_.val.length-_d0);if($_.eval.length==0){if(!$g($_.props,"opt")){$k[$j-1]="bwipp.GS1valueTooShort#3825";$k[$j++]="Too short";$k[$j++]=false;return true}}else{if($_.eval.length<$g($_.props,"min")){$k[$j-1]="bwipp.GS1valueTooShort#3829";$k[$j++]="Too short";$k[$j++]=false;return true}var _d9=new Map([["N","lintnumeric"],["X","lintcset82"],["Y","lintcset39"],["Z","lintcset64"]]);var _dE=$_[$g(_d9,$g($_.props,"cset"))];$k[$j++]=$_.eval;if(_dE()===true){return true}$F($g($_.props,"linters"),function(){var _dI=$k[--$j];var _dJ=$_[_dI];$k[$j++]=$_.eval;if(_dJ()===true){return true}})}});var _dK=$k[$j-1];if(!_dK){break}if($_.val.length!=0){$k[$j-1]="bwipp.GS1valueTooLong#3838";$k[$j++]="Too long";$k[$j++]=false;break}}else{$k[$j-1]="bwipp.GS1unknownAI#3841";$k[$j++]="Unrecognised AI";$k[$j++]=false;break}}var _dM=$k[--$j];if(!_dM){var _dN=$k[--$j];var _dP=$s(_dN.length+$_.ai.length+5);$P(_dP,0,"AI ");$P(_dP,3,$_.ai);$P(_dP,3+$_.ai.length,": ");$P(_dP,5+$_.ai.length,_dN);$k[$j++]=_dP;bwipp_raiseerror()}$_.aiexists=function(){var _dT=$k[--$j];$_.this=_dT;var _dU=$k[--$j];$_.patt=_dU;for(var _dV=0;_dV<1;_dV++){if($has($_.aivals,$_.patt)){$k[$j++]=true;break}if($_.patt.length==4){if($eq($G($_.patt,3,1),"n")){var _de=$eq($G($_.patt,2,1),"n")?2:3;$_.pfxlen=_de;var _df=$_.ais;$k[$j++]=false;for(var _dg=0,_dh=_df.length;_dg<_dh;_dg++){var _di=$g(_df,_dg);$k[$j++]=_di;if($ne(_di,$_.this)&&_di.length==4){var _dl=$k[--$j];if($eq($G(_dl,0,$_.pfxlen),$G($_.patt,0,$_.pfxlen))){$k[$j-1]=true}}else{$j--}}break}$k[$j++]=false;break}$k[$j++]=false;break}};var _dq=$_.vals;$_.aivals=new Map;for(var _dt=0,_ds=$_.vals.length-1;_dt<=_ds;_dt+=1){$_.ai=$g($_.ais,_dt);$_.val=$g($_.vals,_dt);if($has($_.aivals,$_.ai)){if($ne($g($_.aivals,$_.ai),$_.val)){var _e6=$s($_.ai.length+40);$P(_e6,0,"Repeated AIs (");$P(_e6,14,$_.ai);$P(_e6,14+$_.ai.length,") must have the same value");$k[$j++]="bwipp.GS1repeatedDifferingAIs#3891";$k[$j++]=_e6;bwipp_raiseerror()}}else{$p($_.aivals,$_.ai,$_.val)}}for(var _eE=0,_eD=$_.vals.length-1;_eE<=_eD;_eE+=1){$_.ai=$g($_.ais,_eE);var _eJ=$g($_.gs1syntax,$_.ai);var _eK=$has(_eJ,"ex");$k[$j++]=_eJ;$k[$j++]="ex";if(_eK){var _eL=$k[--$j];var _eM=$k[--$j];$F($g(_eM,_eL),function(){var _eO=$k[--$j];$_.patt=_eO;$k[$j++]=$_.patt;$k[$j++]=$_.ai;$_.aiexists();var _eR=$k[--$j];if(_eR){var _eU=$s($_.ai.length+$_.patt.length+36);$P(_eU,0,"AIs (");$P(_eU,5,$_.ai);$P(_eU,5+$_.ai.length,") and (");$P(_eU,12+$_.ai.length,$_.patt);$P(_eU,12+$_.ai.length+$_.patt.length,") are mutually exclusive");$k[$j++]="bwipp.GS1exclusiveAIs#3911";$k[$j++]=_eU;bwipp_raiseerror()}})}else{$j-=2}if($_.lintreqs){var _ee=$g($_.gs1syntax,$_.ai);var _ef=$has(_ee,"req");$k[$j++]=_ee;$k[$j++]="req";if(_ef){var _eg=$k[--$j];var _eh=$k[--$j];$F($g(_eh,_eg),function(){var _ej=$k[--$j];$k[$j++]=false;$F(_ej,function(){var _ek=$k[--$j];$k[$j++]=true;$F(_ek,function(){$k[$j++]=$_.ai;$_.aiexists();var _em=$k[--$j];if(!_em){$k[$j-1]=false}});var _en=$k[--$j];if(_en){$k[$j-1]=true;return true}});var _eo=$k[--$j];if(!_eo){$k[$j++]=Infinity;$F($g($g($_.gs1syntax,$_.ai),"req"),function(){var _et=$k[--$j];$F(_et,function(){var _eu=$k[--$j];$F(_eu,function(){$k[$j++]="+"});$k[$j-1]=" OR "});$k[$j-1]=" WITH "});$j--;var _ev=$a();$k[$j++]=_ev;$k[$j++]=0;for(var _ew=0,_ex=_ev.length;_ew<_ex;_ew++){var _ez=$k[--$j];$k[$j++]=$f(_ez+$g(_ev,_ew).length)}var _f1=$_.ai.length+49;$k[$j++]=_f1;$k[$j++]=_f1;var _f2=$k[$j-3];var _f3=$k[$j-1];var _f4=$s($f(_f3+_f2));var _f5=$k[$j-2];$j-=3;$k[$j++]=_f4;$k[$j++]=_f5;$r(3,-1);var _f6=$k[--$j];$F(_f6,function(){var _f7=$k[--$j];var _f8=$k[--$j];var _f9=$k[$j-1];$P(_f9,_f8,_f7);$k[$j++]=$f(_f7.length+_f8)});$j--;var _fA=$k[--$j];$P(_fA,0,"One of more requisite AIs for AI (");$P(_fA,34,$_.ai);$P(_fA,34+$_.ai.length,") are missing: ");$k[$j++]="bwipp.GS1missingAIs#3938";$k[$j++]=_fA;bwipp_raiseerror()}})}else{$j-=2}}}}$k[$j++]=$_.ais;$k[$j++]=$_.vals;$k[$j++]=$_.fncs;$_=$__}function bwipp_rsecbinary(){if(!bwipp_rsecbinary.globals){var $__=$_;$_=bwipp_rsecbinary.globals={};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_rsecbinary.globals);var _0=$k[--$j];$_.rsprod=_0;var _1=$k[--$j];$_.lfsr=_1;var _2=$k[--$j];$_.nc=_2;var _3=$k[--$j];$_.coeffs=_3;var _4=$k[--$j];$_.nd=_4;var _5=$k[--$j];$_.getdata=_5;for(var _8=0,_7=$_.nc-1;_8<=_7;_8+=1){$p($_.lfsr,_8,0)}for(var _C=0,_B=$_.nd-1;_C<=_B;_C+=1){$k[$j++]=_C;if($_.getdata()===true){break}var _G=$k[--$j];$k[$j++]=$xo(_G,$g($_.lfsr,0));for(var _J=0,_I=$_.nc-2;_J<=_I;_J+=1){var _K=$_.lfsr;var _O=$g($_.coeffs,$f($_.nc-_J)-1);var _P=$k[$j-1];$k[$j++]=_K;$k[$j++]=_J;$k[$j++]=$g(_K,_J+1);$k[$j++]=_O;$k[$j++]=_P;if($_.rsprod()===true){break}var _R=$k[--$j];var _S=$k[--$j];var _T=$k[--$j];var _U=$k[--$j];$p(_U,_T,$xo(_S,_R))}var _Z=$k[$j-1];$k[$j++]=$_.lfsr;$k[$j++]=$_.nc-1;$k[$j++]=$g($_.coeffs,0);$k[$j++]=_Z;if($_.rsprod()===true){break}var _b=$k[--$j];var _c=$k[--$j];var _d=$k[--$j];$p(_d,_c,_b);$j--}$_=$__}function bwipp_rsecprime(){if(!bwipp_rsecprime.globals){var $__=$_;$_=bwipp_rsecprime.globals={};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_rsecprime.globals);var _0=$k[--$j];$_.p=_0;var _1=$k[--$j];$_.lfsr=_1;var _2=$k[--$j];$_.nc=_2;var _3=$k[--$j];$_.coeffs=_3;var _4=$k[--$j];$_.nd=_4;var _5=$k[--$j];$_.getdata=_5;for(var _8=0,_7=$_.nc-1;_8<=_7;_8+=1){$p($_.lfsr,_8,0)}for(var _C=0,_B=$_.nd-1;_C<=_B;_C+=1){$k[$j++]=_C;if($_.getdata()===true){break}var _G=$k[--$j];$k[$j++]=$f(_G-$g($_.lfsr,0)+$_.p)%$_.p;for(var _L=0,_K=$_.nc-2;_L<=_K;_L+=1){var _M=$_.lfsr;var _Q=$g($_.coeffs,$f($_.nc-_L)-1);var _R=$k[$j-1];$p(_M,_L,$f($g(_M,_L+1)+_Q*_R%$_.p)%$_.p)}var _Y=$k[--$j];$p($_.lfsr,$_.nc-1,$g($_.coeffs,0)*_Y%$_.p)}$_=$__}function bwipp_ean5(){if(!bwipp_ean5.globals){var $__=$_;$_=bwipp_ean5.globals={};$_.ean5_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","112","11"]);$_.ean5_barchars="0123456789";$_.ean5_mirrormaps=$a(["11000","10100","10010","10001","01100","00110","00011","01010","01001","00101"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_ean5.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=3.25;$_.text1yoffset=null;$_.height=-1;$_.addondescent=5;$_.width=0;$_.modunit=1;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=5){$k[$j++]="bwipp.ean5badLength#6471";$k[$j++]="EAN-5 add-on must be 5 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _8=$k[--$j];if(_8<48||_8>57){$k[$j++]="bwipp.ean5badCharacter#6475";$k[$j++]="EAN-5 add-on must contain only digits";bwipp_raiseerror()}});if($_.height==-1){$_.height=.7}$_.descent=$_.addondescent*$_.modunit/72;if($_.text1yoffset==null){$_.text1yoffset=$f($_.height*72+4.75)}$_.checksum=0;for(var _E=0;_E<=4;_E+=1){$_.i=_E;$_.barchar=$g($_.barcode,$_.i)-48;if($_.i%2==0){$_.checksum=$f($_.barchar*3+$_.checksum)}else{$_.checksum=$f($_.barchar*9+$_.checksum)}}$_.checksum=$_.checksum%10;$_.mirrormap=$g($_.ean5_mirrormaps,$_.checksum);$_.sbs=$s(31);$_.txt=$a(5);for(var _S=0;_S<=4;_S+=1){$_.i=_S;if($_.i==0){$P($_.sbs,0,$g($_.ean5_encs,10))}else{$P($_.sbs,($_.i-1)*6+7,$g($_.ean5_encs,11))}$X($_.ean5_barchars,$G($_.barcode,$_.i,1));$j--;var _c=$k[--$j];$_.indx=_c.length;$j-=2;$_.enc=$g($_.ean5_encs,$_.indx);if($g($_.mirrormap,$_.i)==49){$_.enclen=$_.enc.length;$_.revenc=$s($_.enclen);for(var _n=0,_m=$_.enclen-1;_n<=_m;_n+=1){$_.j=_n;$_.char=$g($_.enc,$_.j);$p($_.revenc,$_.enclen-$_.j-1,$_.char)}$_.enc=$_.revenc}$P($_.sbs,$_.i*6+3,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f(($_.i-1)*9+10+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$k[$j++]=Infinity;var _1E=[];var _1A=$_.sbs;for(var _1B=0,_1C=_1A.length;_1B<_1C;_1B++){_1E[_1B]=$g(_1A,_1B)-48}_1E=$a(_1E);var _1I=[];for(var _1F=0;_1F<16;_1F++){_1I[_1F]=$f($_.height+$_.descent)}_1I=$a(_1I);var _1L=[];for(var _1J=0;_1J<16;_1J++){_1L[_1J]=-$_.descent}_1L=$a(_1L);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1E;$k[$j++]="bhs";$k[$j++]=_1I;$k[$j++]="bbs";$k[$j++]=_1L;if($_.includetext){$k[$j++]="txt";$k[$j++]=$_.txt}$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardrightpos";$k[$j++]=5;$k[$j++]="guardrightypos";$k[$j++]=$_.text1yoffset;$k[$j++]="borderleft";$k[$j++]=12;$k[$j++]="borderright";$k[$j++]=5;$k[$j++]="bordertop";$k[$j++]=10;var _1Q=$d();$k[$j++]=_1Q;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_ean2(){if(!bwipp_ean2.globals){var $__=$_;$_=bwipp_ean2.globals={};$_.ean2_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","112","11"]);$_.ean2_barchars="0123456789";$_.ean2_mirrormaps=$a(["00","01","10","11"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_ean2.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=3.25;$_.text1yoffset=null;$_.height=-1;$_.addondescent=5;$_.width=0;$_.modunit=1;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=2){$k[$j++]="bwipp.ean2badLength#6649";$k[$j++]="EAN-2 add-on must be 2 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _8=$k[--$j];if(_8<48||_8>57){$k[$j++]="bwipp.ean2badCharacter#6653";$k[$j++]="EAN-2 add-on must contain only digits";bwipp_raiseerror()}});if($_.height==-1){$_.height=.7}$_.descent=$_.addondescent*$_.modunit/72;if($_.text1yoffset==null){$_.text1yoffset=$f($_.height*72+4.75)}$_.mirrormap=$g($_.ean2_mirrormaps,$i($G($_.barcode,0,2))%4);$_.sbs=$s(13);$_.txt=$a(2);for(var _J=0;_J<=1;_J+=1){$_.i=_J;if($_.i==0){$P($_.sbs,0,$g($_.ean2_encs,10))}else{$P($_.sbs,($_.i-1)*6+7,$g($_.ean2_encs,11))}$X($_.ean2_barchars,$G($_.barcode,$_.i,1));$j--;var _T=$k[--$j];$_.indx=_T.length;$j-=2;$_.enc=$g($_.ean2_encs,$_.indx);if($g($_.mirrormap,$_.i)==49){$_.enclen=$_.enc.length;$_.revenc=$s($_.enclen);for(var _e=0,_d=$_.enclen-1;_e<=_d;_e+=1){$_.j=_e;$_.char=$g($_.enc,$_.j);$p($_.revenc,$_.enclen-$_.j-1,$_.char)}$_.enc=$_.revenc}$P($_.sbs,$_.i*6+3,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f(($_.i-1)*9+10+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$k[$j++]=Infinity;var _15=[];var _11=$_.sbs;for(var _12=0,_13=_11.length;_12<_13;_12++){_15[_12]=$g(_11,_12)-48}_15=$a(_15);var _19=[];for(var _16=0;_16<12;_16++){_19[_16]=$f($_.height+$_.descent)}_19=$a(_19);var _1C=[];for(var _1A=0;_1A<12;_1A++){_1C[_1A]=-$_.descent}_1C=$a(_1C);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_15;$k[$j++]="bhs";$k[$j++]=_19;$k[$j++]="bbs";$k[$j++]=_1C;if($_.includetext){$k[$j++]="txt";$k[$j++]=$_.txt}$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardrightpos";$k[$j++]=5;$k[$j++]="guardrightypos";$k[$j++]=$_.text1yoffset;$k[$j++]="borderleft";$k[$j++]=12;$k[$j++]="borderright";$k[$j++]=5;$k[$j++]="bordertop";$k[$j++]=10;var _1H=$d();$k[$j++]=_1H;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_ean13(){if(!bwipp_ean13.globals){var $__=$_;$_=bwipp_ean13.globals={};$_.ean13_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","111","11111","111"]);$_.ean13_barchars="0123456789";$_.ean13_mirrormaps=$a(["000000","001011","001101","001110","010011","011001","011100","010101","010110","011010"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_ean13.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=-7.75;$_.text1yoffset=-5.25;$_.height=-1;$_.guarddescent=5;$_.addondescent=null;$_.width=0;$_.addongap=12;$_.addontextfont="unset";$_.addontextsize=null;$_.addontextxoffset=null;$_.addontextyoffset=null;$_.modunit=1;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _7=$k[--$j];if(_7){var _8=$k[--$j];$_.barcode=_8;$j--;var _9=$k[--$j];$_.addon=_9}else{$j--;$_.addon=""}if($_.barcode.length!=12&&$_.barcode.length!=13){$k[$j++]="bwipp.ean13badLength#6838";$k[$j++]="EAN-13 must be 12 or 13 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _D=$k[--$j];if(_D<48||_D>57){$k[$j++]="bwipp.ean13badCharacter#6842";$k[$j++]="EAN-13 must contain only digits";bwipp_raiseerror()}});if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.ean13badAddOnLength#6846";$k[$j++]="Add-on for EAN-13 must be 2 or 5 digits";bwipp_raiseerror()}$_.descent=$_.guarddescent*$_.modunit/72;if($_.addondescent==null){$_.addondescent=$_.guarddescent}$_.pad=$s(13);$_.checksum=0;for(var _M=0;_M<=11;_M+=1){$_.i=_M;$_.barchar=$g($_.barcode,$_.i)-48;if($_.i%2==0){$_.checksum=$f($_.barchar+$_.checksum)}else{$_.checksum=$f($_.barchar*3+$_.checksum)}}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==13){if($g($_.barcode,12)!=$_.checksum+48){$k[$j++]="bwipp.ean13badCheckDigit#6875";$k[$j++]="Incorrect EAN-13 check digit provided";bwipp_raiseerror()}}$P($_.pad,0,$_.barcode);$p($_.pad,12,$_.checksum+48);$_.barcode=$_.pad;$_.sbs=$s(59);$_.txt=$a(13);$P($_.sbs,0,$g($_.ean13_encs,10));$_.mirrormap=$g($_.ean13_mirrormaps,$g($_.barcode,0)-48);$p($_.txt,0,$a([$G($_.barcode,0,1),$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size]));for(var _u=1;_u<=6;_u+=1){$_.i=_u;$X($_.ean13_barchars,$G($_.barcode,$_.i,1));$j--;var _y=$k[--$j];$_.indx=_y.length;$j-=2;$_.enc=$g($_.ean13_encs,$_.indx);if($g($_.mirrormap,$_.i-1)==49){$_.enclen=$_.enc.length;$_.revenc=$s($_.enclen);for(var _19=0,_18=$_.enclen-1;_19<=_18;_19+=1){$_.j=_19;$_.char=$g($_.enc,$_.j);$p($_.revenc,$_.enclen-$_.j-1,$_.char)}$_.enc=$_.revenc}$P($_.sbs,($_.i-1)*4+3,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f(($_.i-1)*7+15+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$P($_.sbs,(7-1)*4+3,$g($_.ean13_encs,11));for(var _1Y=7;_1Y<=12;_1Y+=1){$_.i=_1Y;$X($_.ean13_barchars,$G($_.barcode,$_.i,1));$j--;var _1c=$k[--$j];$_.indx=_1c.length;$j-=2;$_.enc=$g($_.ean13_encs,$_.indx);$P($_.sbs,($_.i-1)*4+8,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f(($_.i-1)*7+19+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$P($_.sbs,56,$g($_.ean13_encs,12));$k[$j++]=Infinity;var _1v=$_.sbs;for(var _1w=0,_1x=_1v.length;_1w<_1x;_1w++){$k[$j++]=$g(_1v,_1w)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}if($_.includetext){$_.guardheight=$f($_.height+$_.descent);$k[$j++]=Infinity;$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _25=0;_25<12;_25++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _29=0;_29<12;_29++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;$_.bhs=$a();$k[$j++]=Infinity;$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _2F=0;_2F<12;_2F++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _2I=0;_2I<12;_2I++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;$_.bbs=$a()}else{$k[$j++]=Infinity;for(var _2L=0;_2L<30;_2L++){$k[$j++]=$_.height}$_.bhs=$a();$k[$j++]=Infinity;for(var _2N=0;_2N<30;_2N++){$k[$j++]=0}$_.bbs=$a();$_.txt=$a([])}$_.guardrightypos=-5;if($_.addon.length!=0){$k[$j++]=Infinity;$k[$j++]="includetext";$k[$j++]=true;$k[$j++]="height";$k[$j++]=$_.height;if($_.includetext){var _2R=$k[--$j];$k[$j++]=$f(_2R-.15)}$k[$j++]="addondescent";$k[$j++]=$_.addondescent;$k[$j++]="text1xoffset";if($_.addontextxoffset!=null){$k[$j++]=$_.addontextxoffset}else{$k[$j++]=$f(98.25+$_.addongap)}if($_.addontextyoffset!=null){$k[$j++]="text1yoffset";$k[$j++]=$_.addontextyoffset}$k[$j++]="text1size";if($_.addontextsize!=null){$k[$j++]=$_.addontextsize}else{$k[$j++]=$_.text1size}var _2c=$ne($_.addontextfont,"unset")?$_.addontextfont:$_.text1font;$k[$j++]="text1font";$k[$j++]=_2c;$_.addopts=$d();$_.bwipp_dontdraw=true;if($_.addon.length==2){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean2()}if($_.addon.length==5){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean5()}var _2j=$k[--$j];$_.addcode=_2j;$k[$j++]=Infinity;$q($_.sbs);$k[$j++]=$_.addongap;$q($g($_.addcode,"sbs"));$_.sbs=$a();$k[$j++]=Infinity;$q($_.bhs);$q($g($_.addcode,"bhs"));$_.bhs=$a();$k[$j++]=Infinity;$q($_.bbs);$q($g($_.addcode,"bbs"));$_.bbs=$a();$k[$j++]=Infinity;$q($_.txt);$q($g($_.addcode,"txt"));$_.txt=$a();$_.guardrightypos=$g($_.addcode,"guardrightypos")}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=$_.sbs;$k[$j++]="bhs";$k[$j++]=$_.bhs;$k[$j++]="bbs";$k[$j++]=$_.bbs;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardrightpos";if($_.addon.length==0){$k[$j++]=7}else{$k[$j++]=5}$k[$j++]="guardrightypos";$k[$j++]=$_.guardrightypos;$k[$j++]="borderleft";$k[$j++]=11;$k[$j++]="borderright";if($_.addon.length==0){$k[$j++]=7}else{$k[$j++]=5}$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=5+$_.guarddescent*$_.modunit;var _39=$d();$k[$j++]=_39;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_ean8(){if(!bwipp_ean8.globals){var $__=$_;$_=bwipp_ean8.globals={};$_.ean8_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","111","11111","111"]);$_.ean8_barchars="0123456789";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_ean8.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=7.25;$_.text1yoffset=-5.25;$_.height=-1;$_.guarddescent=5;$_.addondescent=null;$_.width=0;$_.modunit=1;$_.permitaddon=false;$_.addongap=12;$_.addontextfont="unset";$_.addontextsize=null;$_.addontextxoffset=null;$_.addontextyoffset=null;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _6=$k[--$j];if(_6){var _7=$k[--$j];$_.barcode=_7;$j--;var _8=$k[--$j];$_.addon=_8}else{$j--;$_.addon=""}if($_.barcode.length!=7&&$_.barcode.length!=8){$k[$j++]="bwipp.ean8badLength#7112";$k[$j++]="EAN-8 must be 7 or 8 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _C=$k[--$j];if(_C<48||_C>57){$k[$j++]="bwipp.ean8badCharacter#7116";$k[$j++]="EAN-8 must contain only digits";bwipp_raiseerror()}});if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.ean8badAddOnLength#7120";$k[$j++]="Add-on for EAN-8 must be 2 or 5 digits";bwipp_raiseerror()}if(!$_.permitaddon&&$_.addon.length!=0){$k[$j++]="bwipp.ean8badAddOnLength#7123";$k[$j++]='Non-standard use of add-on for EAN-8 requires "permitaddon" option';bwipp_raiseerror()}$_.descent=$_.guarddescent*$_.modunit/72;if($_.addondescent==null){$_.addondescent=$_.guarddescent}$_.pad=$s(8);$_.checksum=0;for(var _N=0;_N<=6;_N+=1){$_.i=_N;$_.barchar=$g($_.barcode,$_.i)-48;if($_.i%2!=0){$_.checksum=$f($_.barchar+$_.checksum)}else{$_.checksum=$f($_.barchar*3+$_.checksum)}}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==8){if($g($_.barcode,7)!=$_.checksum+48){$k[$j++]="bwipp.ean8badCheckDigit#7152";$k[$j++]="Incorrect EAN-8 check digit provided";bwipp_raiseerror()}}$P($_.pad,0,$_.barcode);$p($_.pad,7,$_.checksum+48);$_.barcode=$_.pad;$_.sbs=$s(43);$_.txt=$a(8);$P($_.sbs,0,$g($_.ean8_encs,10));for(var _k=0;_k<=3;_k+=1){$_.i=_k;$X($_.ean8_barchars,$G($_.barcode,$_.i,1));$j--;var _o=$k[--$j];$_.indx=_o.length;$j-=2;$_.enc=$g($_.ean8_encs,$_.indx);$P($_.sbs,$_.i*4+3,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f($_.i*7+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$P($_.sbs,4*4+3,$g($_.ean8_encs,11));for(var _17=4;_17<=7;_17+=1){$_.i=_17;$X($_.ean8_barchars,$G($_.barcode,$_.i,1));$j--;var _1B=$k[--$j];$_.indx=_1B.length;$j-=2;$_.enc=$g($_.ean8_encs,$_.indx);$P($_.sbs,$_.i*4+8,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f($_.i*7+$_.text1xoffset)+4,$_.text1yoffset,$_.text1font,$_.text1size]))}$P($_.sbs,40,$g($_.ean8_encs,12));$k[$j++]=Infinity;var _1U=$_.sbs;for(var _1V=0,_1W=_1U.length;_1V<_1W;_1V++){$k[$j++]=$g(_1U,_1V)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}if($_.includetext){$_.guardheight=$f($_.height+$_.descent);$k[$j++]=Infinity;$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _1e=0;_1e<8;_1e++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _1i=0;_1i<8;_1i++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;$_.bhs=$a();$k[$j++]=Infinity;$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _1o=0;_1o<8;_1o++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _1r=0;_1r<8;_1r++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;$_.bbs=$a()}else{$k[$j++]=Infinity;for(var _1u=0;_1u<22;_1u++){$k[$j++]=$_.height}$_.bhs=$a();$k[$j++]=Infinity;for(var _1w=0;_1w<22;_1w++){$k[$j++]=0}$_.bbs=$a();$_.txt=$a([])}$_.guardrightypos=-5;if($_.addon.length!=0){$k[$j++]=Infinity;$k[$j++]="includetext";$k[$j++]=true;$k[$j++]="height";$k[$j++]=$_.height;if($_.includetext){var _20=$k[--$j];$k[$j++]=$f(_20-.15)}$k[$j++]="addondescent";$k[$j++]=$_.addondescent;$k[$j++]="text1xoffset";if($_.addontextxoffset!=null){$k[$j++]=$_.addontextxoffset}else{$k[$j++]=$f(70.25+$_.addongap)}if($_.addontextyoffset!=null){$k[$j++]="text1yoffset";$k[$j++]=$_.addontextyoffset}$k[$j++]="text1size";if($_.addontextsize!=null){$k[$j++]=$_.addontextsize}else{$k[$j++]=$_.text1size}var _2B=$ne($_.addontextfont,"unset")?$_.addontextfont:$_.text1font;$k[$j++]="text1font";$k[$j++]=_2B;$_.addopts=$d();$_.bwipp_dontdraw=true;if($_.addon.length==2){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean2()}if($_.addon.length==5){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean5()}var _2I=$k[--$j];$_.addcode=_2I;$k[$j++]=Infinity;$q($_.sbs);$k[$j++]=$_.addongap;$q($g($_.addcode,"sbs"));$_.sbs=$a();$k[$j++]=Infinity;$q($_.bhs);$q($g($_.addcode,"bhs"));$_.bhs=$a();$k[$j++]=Infinity;$q($_.bbs);$q($g($_.addcode,"bbs"));$_.bbs=$a();$k[$j++]=Infinity;$q($_.txt);$q($g($_.addcode,"txt"));$_.txt=$a();$_.guardrightypos=$g($_.addcode,"guardrightypos")}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=$_.sbs;$k[$j++]="bhs";$k[$j++]=$_.bhs;$k[$j++]="bbs";$k[$j++]=$_.bbs;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardleftpos";$k[$j++]=7;$k[$j++]="guardleftypos";$k[$j++]=-5;$k[$j++]="guardrightpos";if($_.addon.length==0){$k[$j++]=7}else{$k[$j++]=5}$k[$j++]="guardrightypos";$k[$j++]=$_.guardrightypos;$k[$j++]="borderleft";$k[$j++]=7;$k[$j++]="borderright";if($_.addon.length==0){$k[$j++]=7}else{$k[$j++]=5}$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=5+$_.guarddescent*$_.modunit;var _2i=$d();$k[$j++]=_2i;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_upca(){if(!bwipp_upca.globals){var $__=$_;$_=bwipp_upca.globals={};$_.upca_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","111","11111","111"]);$_.upca_barchars="0123456789";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_upca.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=-5.75;$_.text1yoffset=-5.25;$_.height=-1;$_.guarddescent=5;$_.addondescent=null;$_.width=0;$_.modunit=1;$_.addongap=12;$_.addontextfont="unset";$_.addontextsize=null;$_.addontextxoffset=null;$_.addontextyoffset=null;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _6=$k[--$j];if(_6){var _7=$k[--$j];$_.barcode=_7;$j--;var _8=$k[--$j];$_.addon=_8}else{$j--;$_.addon=""}if($_.barcode.length==7||$_.barcode.length==8){$F($_.barcode,function(){var _C=$k[--$j];if(_C<48||_C>57){$k[$j++]="bwipp.upcAupcEbadCharacter#7377";$k[$j++]="UPC-E must contain only digits";bwipp_raiseerror()}});var _E=$g($_.barcode,0);if(_E!=48&&_E!=49){$k[$j++]="bwipp.upcAupcEbadNumberSystem#7381";$k[$j++]="UPC-E must have number system 0 or 1";bwipp_raiseerror()}for(var _F=0;_F<1;_F++){var _H=$_.barcode.length==8?12:11;$_.upcacode=$s(_H);if($g($_.barcode,6)-48<=2){$P($_.upcacode,0,$G($_.barcode,0,3));$P($_.upcacode,3,$G($_.barcode,6,1));$P($_.upcacode,4,"0000");$P($_.upcacode,8,$G($_.barcode,3,3));break}if($g($_.barcode,6)-48==3){$P($_.upcacode,0,$G($_.barcode,0,4));$P($_.upcacode,4,"00000");$P($_.upcacode,9,$G($_.barcode,4,2));break}if($g($_.barcode,6)-48==4){$P($_.upcacode,0,$G($_.barcode,0,5));$P($_.upcacode,5,"00000");$P($_.upcacode,10,$G($_.barcode,5,1));break}if($g($_.barcode,6)-48>=5){$P($_.upcacode,0,$G($_.barcode,0,6));$P($_.upcacode,6,"0000");$P($_.upcacode,10,$G($_.barcode,6,1));break}}if($_.barcode.length==8){$P($_.upcacode,11,$G($_.barcode,7,1))}$_.barcode=$_.upcacode}if($_.barcode.length!=11&&$_.barcode.length!=12){$k[$j++]="bwipp.upcAbadLength#7421";$k[$j++]="UPC-A must be 11 or 12 digits";bwipp_raiseerror()}var _13=$_.barcode;for(var _14=0,_15=_13.length;_14<_15;_14++){var _16=$g(_13,_14);if(_16<48||_16>57){$k[$j++]="bwipp.upcAbadCharacter#7425";$k[$j++]="UPC-A must contain only digits";bwipp_raiseerror()}}if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.upcAbadAddOnLength#7429";$k[$j++]="Add-on for UPC-A must be 2 or 5 digits";bwipp_raiseerror()}$_.descent=$_.guarddescent*$_.modunit/72;if($_.addondescent==null){$_.addondescent=$_.guarddescent}$_.pad=$s(12);$_.checksum=0;for(var _1F=0;_1F<=10;_1F+=1){$_.i=_1F;$_.barchar=$g($_.barcode,$_.i)-48;if($_.i%2!=0){$_.checksum=$_.checksum+$_.barchar}else{$_.checksum=$_.checksum+$_.barchar*3}}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==12){if($g($_.barcode,11)!=$_.checksum+48){$k[$j++]="bwipp.upcAbadCheckDigit#7458";$k[$j++]="Incorrect UPC check digit provided";bwipp_raiseerror()}}$P($_.pad,0,$_.barcode);$p($_.pad,11,$_.checksum+48);$_.barcode=$_.pad;$_.sbs=$s(59);$_.txt=$a(12);$P($_.sbs,0,$g($_.upca_encs,10));for(var _1c=0;_1c<=5;_1c+=1){$_.i=_1c;$X($_.upca_barchars,$G($_.barcode,$_.i,1));$j--;var _1g=$k[--$j];$_.indx=_1g.length;$j-=2;$_.enc=$g($_.upca_encs,$_.indx);$P($_.sbs,$_.i*4+3,$_.enc);if($_.i==0){$p($_.txt,0,$a([$G($_.barcode,0,1),$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size-2]))}else{$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f($_.i*7+13+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}}$P($_.sbs,6*4+3,$g($_.upca_encs,11));for(var _28=6;_28<=11;_28+=1){$_.i=_28;$X($_.upca_barchars,$G($_.barcode,$_.i,1));$j--;var _2C=$k[--$j];$_.indx=_2C.length;$j-=2;$_.enc=$g($_.upca_encs,$_.indx);$P($_.sbs,$_.i*4+8,$_.enc);if($_.i==11){$p($_.txt,11,$a([$G($_.barcode,11,1),$_.text1xoffset+107,$_.text1yoffset,$_.text1font,$_.text1size-2]))}else{$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f($_.i*7+$_.text1xoffset)+17,$_.text1yoffset,$_.text1font,$_.text1size]))}}$P($_.sbs,56,$g($_.upca_encs,12));$k[$j++]=Infinity;var _2e=$_.sbs;for(var _2f=0,_2g=_2e.length;_2f<_2g;_2f++){$k[$j++]=$g(_2e,_2f)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}if($_.includetext){$_.guardheight=$f($_.height+$_.descent);$k[$j++]=Infinity;for(var _2m=0;_2m<4;_2m++){$k[$j++]=$_.guardheight}for(var _2o=0;_2o<10;_2o++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _2s=0;_2s<10;_2s++){$k[$j++]=$_.height}for(var _2u=0;_2u<4;_2u++){$k[$j++]=$_.guardheight}$_.bhs=$a();$k[$j++]=Infinity;for(var _2w=0;_2w<4;_2w++){$k[$j++]=-$_.descent}for(var _2y=0;_2y<10;_2y++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _31=0;_31<10;_31++){$k[$j++]=0}for(var _32=0;_32<4;_32++){$k[$j++]=-$_.descent}$_.bbs=$a()}else{$k[$j++]=Infinity;for(var _34=0;_34<30;_34++){$k[$j++]=$_.height}$_.bhs=$a();$k[$j++]=Infinity;for(var _36=0;_36<30;_36++){$k[$j++]=0}$_.bbs=$a();$_.txt=$a([])}$_.guardrightypos=-5;if($_.addon.length!=0){$k[$j++]=Infinity;$k[$j++]="includetext";$k[$j++]=true;$k[$j++]="height";$k[$j++]=$_.height;if($_.includetext){var _3A=$k[--$j];$k[$j++]=$f(_3A-.15)}$k[$j++]="addondescent";$k[$j++]=$_.addondescent;$k[$j++]="text1xoffset";if($_.addontextxoffset!=null){$k[$j++]=$_.addontextxoffset}else{$k[$j++]=$f(98.25+$_.addongap)}if($_.addontextyoffset!=null){$k[$j++]="text1yoffset";$k[$j++]=$_.addontextyoffset}$k[$j++]="text1size";if($_.addontextsize!=null){$k[$j++]=$_.addontextsize}else{$k[$j++]=$_.text1size}var _3L=$ne($_.addontextfont,"unset")?$_.addontextfont:$_.text1font;$k[$j++]="text1font";$k[$j++]=_3L;$_.addopts=$d();$_.bwipp_dontdraw=true;if($_.addon.length==2){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean2()}if($_.addon.length==5){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean5()}var _3S=$k[--$j];$_.addcode=_3S;$k[$j++]=Infinity;$q($_.sbs);$k[$j++]=$_.addongap;$q($g($_.addcode,"sbs"));$_.sbs=$a();$k[$j++]=Infinity;$q($_.bhs);$q($g($_.addcode,"bhs"));$_.bhs=$a();$k[$j++]=Infinity;$q($_.bbs);$q($g($_.addcode,"bbs"));$_.bbs=$a();$k[$j++]=Infinity;$q($_.txt);$q($g($_.addcode,"txt"));$_.txt=$a();$_.guardrightypos=$g($_.addcode,"guardrightypos")}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=$_.sbs;$k[$j++]="bhs";$k[$j++]=$_.bhs;$k[$j++]="bbs";$k[$j++]=$_.bbs;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardrightpos";if($_.addon.length==0){$k[$j++]=9}else{$k[$j++]=5}$k[$j++]="guardrightypos";$k[$j++]=$_.guardrightypos;$k[$j++]="borderleft";$k[$j++]=9;$k[$j++]="borderright";if($_.addon.length==0){$k[$j++]=9}else{$k[$j++]=5}$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=5+$_.guarddescent*$_.modunit;var _3s=$d();$k[$j++]=_3s;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_upce(){if(!bwipp_upce.globals){var $__=$_;$_=bwipp_upce.globals={};$_.upce_encs=$a(["3211","2221","2122","1411","1132","1231","1114","1312","1213","3112","111","111111"]);$_.upce_barchars="0123456789";$_.upce_mirrormaps=$a(["000111","001011","001101","001110","010011","011001","011100","010101","010110","011010"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_upce.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=12;$_.text1xoffset=-5.75;$_.text1yoffset=-5.25;$_.height=-1;$_.guarddescent=5;$_.addondescent=null;$_.width=0;$_.modunit=1;$_.addongap=12;$_.addontextfont="unset";$_.addontextsize=null;$_.addontextxoffset=null;$_.addontextyoffset=null;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _7=$k[--$j];if(_7){var _8=$k[--$j];$_.barcode=_8;$j--;var _9=$k[--$j];$_.addon=_9}else{$j--;$_.addon=""}if($_.barcode.length==11||$_.barcode.length==12){$F($_.barcode,function(){var _D=$k[--$j];if(_D<48||_D>57){$k[$j++]="bwipp.upcEupcAbadCharacter#7694";$k[$j++]="UPC-A must contain only digits";bwipp_raiseerror()}});for(var _E=0;_E<1;_E++){var _G=$_.barcode.length==12?8:7;$_.upcecode=$s(_G);if($g($_.barcode,3)-48<=2&&$eq($G($_.barcode,4,4),"0000")){$P($_.upcecode,0,$G($_.barcode,0,3));$P($_.upcecode,3,$G($_.barcode,8,3));$P($_.upcecode,6,$G($_.barcode,3,1));break}if($eq($G($_.barcode,4,5),"00000")){$P($_.upcecode,0,$G($_.barcode,0,4));$P($_.upcecode,4,$G($_.barcode,9,2));$P($_.upcecode,6,"3");break}if($eq($G($_.barcode,5,5),"00000")){$P($_.upcecode,0,$G($_.barcode,0,5));$P($_.upcecode,5,$G($_.barcode,10,1));$P($_.upcecode,6,"4");break}if($g($_.barcode,10)-48>=5&&$eq($G($_.barcode,6,4),"0000")){$P($_.upcecode,0,$G($_.barcode,0,6));$P($_.upcecode,6,$G($_.barcode,10,1));break}$k[$j++]="bwipp.upcEupcAnotCompressible#7722";$k[$j++]="UPC-A cannot be converted to a UPC-E";bwipp_raiseerror()}if($_.barcode.length==12){$P($_.upcecode,7,$G($_.barcode,11,1))}$_.barcode=$_.upcecode}if($_.barcode.length!=7&&$_.barcode.length!=8){$k[$j++]="bwipp.upcEbadLength#7734";$k[$j++]="UPC-E must be 7 or 8 digits";bwipp_raiseerror()}var _14=$_.barcode;for(var _15=0,_16=_14.length;_15<_16;_15++){var _17=$g(_14,_15);if(_17<48||_17>57){$k[$j++]="bwipp.upcEbadCharacter#7738";$k[$j++]="UPC-E must contain only digits";bwipp_raiseerror()}}if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.upcEbadAddOnLength#7742";$k[$j++]="Add-on for UPC-E must be 2 or 5 digits";bwipp_raiseerror()}var _1C=$g($_.barcode,0);if(_1C!=48&&_1C!=49){$k[$j++]="bwipp.upcEbadNumberSystem#7749";$k[$j++]="UPC-E must have number system 0 or 1";bwipp_raiseerror()}$_.descent=$_.guarddescent*$_.modunit/72;if($_.addondescent==null){$_.addondescent=$_.guarddescent}for(var _1H=0;_1H<1;_1H++){$_.upcacode=$s(11);if($g($_.barcode,6)-48<=2){$P($_.upcacode,0,$G($_.barcode,0,3));$P($_.upcacode,3,$G($_.barcode,6,1));$P($_.upcacode,4,"0000");$P($_.upcacode,8,$G($_.barcode,3,3));break}if($g($_.barcode,6)-48==3){$P($_.upcacode,0,$G($_.barcode,0,4));$P($_.upcacode,4,"00000");$P($_.upcacode,9,$G($_.barcode,4,2));break}if($g($_.barcode,6)-48==4){$P($_.upcacode,0,$G($_.barcode,0,5));$P($_.upcacode,5,"00000");$P($_.upcacode,10,$G($_.barcode,5,1));break}if($g($_.barcode,6)-48>=5){$P($_.upcacode,0,$G($_.barcode,0,6));$P($_.upcacode,6,"0000");$P($_.upcacode,10,$G($_.barcode,6,1));break}}$_.checksum=0;for(var _1w=0;_1w<=10;_1w+=1){$_.i=_1w;$_.barchar=$g($_.upcacode,$_.i)-48;if($_.i%2!=0){$_.checksum=$_.checksum+$_.barchar}else{$_.checksum=$_.checksum+$_.barchar*3}}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==8){if($g($_.barcode,7)!=$_.checksum+48){$k[$j++]="bwipp.upcEbadCheckDigit#7805";$k[$j++]="Incorrect UPC check digit provided";bwipp_raiseerror()}}$_.pad=$s(8);$P($_.pad,0,$_.barcode);$p($_.pad,7,$_.checksum+48);$_.barcode=$_.pad;$_.txt=$a(8);$p($_.txt,0,$a([$G($_.barcode,0,1),$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size-2]));$_.mirrormap=$g($_.upce_mirrormaps,$_.checksum);if($g($_.barcode,0)==48){$_.invt=$s($_.mirrormap.length);for(var _2X=0,_2W=$_.mirrormap.length-1;_2X<=_2W;_2X+=1){$_.i=_2X;if($g($_.mirrormap,$_.i)==48){$p($_.invt,$_.i,49)}else{$p($_.invt,$_.i,48)}}$_.mirrormap=$_.invt}$_.sbs=$s(33);$P($_.sbs,0,$g($_.upce_encs,10));for(var _2j=1;_2j<=6;_2j+=1){$_.i=_2j;$X($_.upce_barchars,$G($_.barcode,$_.i,1));$j--;var _2n=$k[--$j];$_.indx=_2n.length;$j-=2;$_.enc=$g($_.upce_encs,$_.indx);if($g($_.mirrormap,$_.i-1)==49){$_.enclen=$_.enc.length;$_.revenc=$s($_.enclen);for(var _2y=0,_2x=$_.enclen-1;_2y<=_2x;_2y+=1){$_.j=_2y;$_.char=$g($_.enc,$_.j);$p($_.revenc,$_.enclen-$_.j-1,$_.char)}$_.enc=$_.revenc}$P($_.sbs,($_.i-1)*4+3,$_.enc);$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),$f(($_.i-1)*7+13+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size]))}$p($_.txt,7,$a([$G($_.barcode,7,1),$f(6*7+21+$_.text1xoffset),$_.text1yoffset,$_.text1font,$_.text1size-2]));$P($_.sbs,27,$g($_.upce_encs,11));$k[$j++]=Infinity;var _3V=$_.sbs;for(var _3W=0,_3X=_3V.length;_3W<_3X;_3W++){$k[$j++]=$g(_3V,_3W)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}if($_.includetext){$_.guardheight=$f($_.height+$_.descent);$k[$j++]=Infinity;$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;for(var _3f=0;_3f<12;_3f++){$k[$j++]=$_.height}$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;$k[$j++]=$_.guardheight;$_.bhs=$a();$k[$j++]=Infinity;$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;for(var _3m=0;_3m<12;_3m++){$k[$j++]=0}$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;$k[$j++]=-$_.descent;$_.bbs=$a()}else{$k[$j++]=Infinity;for(var _3q=0;_3q<17;_3q++){$k[$j++]=$_.height}$_.bhs=$a();$k[$j++]=Infinity;for(var _3s=0;_3s<17;_3s++){$k[$j++]=0}$_.bbs=$a();$_.txt=$a([])}$_.guardrightypos=-5;if($_.addon.length!=0){$k[$j++]=Infinity;$k[$j++]="includetext";$k[$j++]=true;$k[$j++]="height";$k[$j++]=$_.height;if($_.includetext){var _3w=$k[--$j];$k[$j++]=$f(_3w-.15)}$k[$j++]="addondescent";$k[$j++]=$_.addondescent;$k[$j++]="text1xoffset";if($_.addontextxoffset!=null){$k[$j++]=$_.addontextxoffset}else{$k[$j++]=$f(54.25+$_.addongap)}if($_.addontextyoffset!=null){$k[$j++]="text1yoffset";$k[$j++]=$_.addontextyoffset}$k[$j++]="text1size";if($_.addontextsize!=null){$k[$j++]=$_.addontextsize}else{$k[$j++]=$_.text1size}var _47=$ne($_.addontextfont,"unset")?$_.addontextfont:$_.text1font;$k[$j++]="text1font";$k[$j++]=_47;$_.addopts=$d();$_.bwipp_dontdraw=true;if($_.addon.length==2){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean2()}if($_.addon.length==5){$k[$j++]=$_.addon;$k[$j++]=$_.addopts;bwipp_ean5()}var _4E=$k[--$j];$_.addcode=_4E;$k[$j++]=Infinity;$q($_.sbs);$k[$j++]=$_.addongap;$q($g($_.addcode,"sbs"));$_.sbs=$a();$k[$j++]=Infinity;$q($_.bhs);$q($g($_.addcode,"bhs"));$_.bhs=$a();$k[$j++]=Infinity;$q($_.bbs);$q($g($_.addcode,"bbs"));$_.bbs=$a();$k[$j++]=Infinity;$q($_.txt);$q($g($_.addcode,"txt"));$_.txt=$a();$_.guardrightypos=$g($_.addcode,"guardrightypos")}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=$_.sbs;$k[$j++]="bhs";$k[$j++]=$_.bhs;$k[$j++]="bbs";$k[$j++]=$_.bbs;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="opt";$k[$j++]=$_.options;$k[$j++]="guardrightpos";if($_.addon.length==0){$k[$j++]=9}else{$k[$j++]=5}$k[$j++]="guardrightypos";$k[$j++]=$_.guardrightypos;$k[$j++]="borderleft";$k[$j++]=9;$k[$j++]="borderright";if($_.addon.length==0){$k[$j++]=9}else{$k[$j++]=5}$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=5+$_.guarddescent*$_.modunit;var _4e=$d();$k[$j++]=_4e;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_isbn(){var $__=$_;$_=Object.assign({},$_,bwipp_isbn.globals);$_.dontdraw=false;$_.includetext=false;$_.isbntextfont="OCR-A";$_.isbntextsize=8;$_.isbntextxoffset=null;$_.isbntextyoffset=null;$_.height=-1;$_.width=0;$_.addongap=12;$_.legacy=false;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.barcode=_6;$j--;var _7=$k[--$j];$_.addon=_7}else{$j--;$_.addon=""}if($_.barcode.length!=15&&$_.barcode.length!=17&&($_.barcode.length!=11&&$_.barcode.length!=13)){$k[$j++]="bwipp.isbnBadLength#8021";$k[$j++]="ISBN-13 must be 15 or 17 characters including dashes. ISBN-10 must be 11 or 13 characters including dashes";bwipp_raiseerror()}if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.isbnBadAddOnLength#8024";$k[$j++]="Add-on for ISBN must be 2 or 5 digits";bwipp_raiseerror()}if($_.barcode.length>=15){var _H=$G($_.barcode,0,4);if($ne(_H,"978-")&&$ne(_H,"979-")){$k[$j++]="bwipp.isbn13badPrefix#8028";$k[$j++]="ISBN-13 prefix must be 978- or 979-";bwipp_raiseerror()}$_.wasdash=false;$_.numdash=0;$_.numdigit=0;var _J=$G($_.barcode,5,9);for(var _K=0,_L=_J.length;_K<_L;_K++){var _M=$g(_J,_K);$k[$j++]=_M;if(_M==45){if($_.wasdash){$k[$j-1]="bwipp.isbn13adjacentDashes#8035";$k[$j++]="ISBN-13 does not permit adjacent dashes";bwipp_raiseerror()}$_.wasdash=true;$_.numdash=$_.numdash+1}var _P=$k[--$j];if(_P>=48&&_P<=57){$_.wasdash=false;$_.numdigit=$_.numdigit+1}}if($_.numdash!=2||$_.numdigit!=7){$k[$j++]="bwipp.isbn13numDashesDigits#8046";$k[$j++]="Incorrect number of dashes and digits for ISBN-13";bwipp_raiseerror()}var _U=$g($_.barcode,14);if(_U<48||_U>57){$k[$j++]="bwipp.isbn13character15#8049";$k[$j++]="ISBN-13 character 15 must be a digit";bwipp_raiseerror()}if($_.barcode.length==17){if($ne($G($_.barcode,15,1),"-")){$k[$j++]="bwipp.isbn13character16#8053";$k[$j++]="ISBN-13 penultimate character must be a dash";bwipp_raiseerror()}var _Z=$g($_.barcode,16);if(_Z<48||_Z>57){$k[$j++]="bwipp.isbn13character17#8056";$k[$j++]="ISBN-13 final character must be a digit";bwipp_raiseerror()}}}else{var _b=$g($_.barcode,0);if(_b<48||_b>57){$k[$j++]="bwipp.isbn10FirstDigit#8061";$k[$j++]="ISBN-10 first character must be a digit";bwipp_raiseerror()}$_.wasdash=false;$_.numdash=0;$_.numdigit=0;var _d=$G($_.barcode,1,9);for(var _e=0,_f=_d.length;_e<_f;_e++){var _g=$g(_d,_e);$k[$j++]=_g;if(_g==45){if($_.wasdash){$k[$j-1]="bwipp.isbn10adjacentDashes#8068";$k[$j++]="ISBN-10 does not permit adjacent dashes";bwipp_raiseerror()}$_.wasdash=true;$_.numdash=$_.numdash+1}var _j=$k[--$j];if(_j>=48&&_j<=57){$_.wasdash=false;$_.numdigit=$_.numdigit+1}}if($_.numdash!=2||$_.numdigit!=7){$k[$j++]="bwipp.isbn10numDashesDigits#8079";$k[$j++]="Incorrect number of dashes and digits for ISBN-10";bwipp_raiseerror()}var _o=$g($_.barcode,10);if(_o<48||_o>57){$k[$j++]="bwipp.isbn10character11#8082";$k[$j++]="ISBN-10 character 11 must be a digit";bwipp_raiseerror()}if($_.barcode.length==13){if($ne($G($_.barcode,11,1),"-")){$k[$j++]="bwipp.isbn10character12#8086";$k[$j++]="ISBN-10 penultimate character must be a dash";bwipp_raiseerror()}var _t=$g($_.barcode,12);if((_t<48||_t>57)&&_t!=88){$k[$j++]="bwipp.isbn10character13#8089";$k[$j++]="ISBN-10 final character must be a digit or X";bwipp_raiseerror()}}}$_.isbntxt=$_.barcode;if($_.isbntxt.length<=13){$_.isbn=$s(10);$_.checksum=0;$_.i=0;$_.n=0;for(;;){$_.isbnchar=$g($_.isbntxt,$_.i)-48;if($_.isbnchar!=-3){$p($_.isbn,$_.n,$_.isbnchar+48);if($_.n<9){$_.checksum=$f($_.checksum+(10-$_.n)*$_.isbnchar)}$_.n=$_.n+1}$_.i=$_.i+1;if($_.i==$_.isbntxt.length){break}}var _1D=(11-$_.checksum%11)%11;if(_1D==10){_1D=40}$_.checksum=_1D+48;$_.isbn=$G($_.isbn,0,9);if($_.isbntxt.length==13){if($g($_.isbntxt,12)!=$_.checksum){$k[$j++]="bwipp.isbn10badCheckDigit#8119";$k[$j++]="Incorrect ISBN-10 check digit provided";bwipp_raiseerror()}}}if(!$_.legacy||$_.isbntxt.length>=15){if($_.isbntxt.length<=13){$_.pad=$s(15);$P($_.pad,0,"978-");$P($_.pad,4,$G($_.isbntxt,0,11));$_.isbntxt=$_.pad}$_.isbn=$s(13);$_.checksum=0;$_.i=0;$_.n=0;for(;;){$_.isbnchar=$g($_.isbntxt,$_.i)-48;if($_.isbnchar!=-3){$p($_.isbn,$_.n,$_.isbnchar+48);if($_.n<12){var _1i=$_.isbnchar;if($_.n%2!=0){_1i=_1i*3}$_.checksum=$f(_1i+$_.checksum)}$_.n=$_.n+1}$_.i=$_.i+1;if($_.i==$_.isbntxt.length){break}}$_.checksum=(10-$_.checksum%10)%10+48;$_.isbn=$G($_.isbn,0,12);if($_.isbntxt.length==17){if($g($_.isbntxt,16)!=$_.checksum){$k[$j++]="bwipp.isbn13badCheckDigit#8158";$k[$j++]="Incorrect ISBN-13 check digit provided";bwipp_raiseerror()}}}var _1w=$_.isbn.length==12?22:18;$_.pad=$s(_1w);$P($_.pad,0,"ISBN ");$P($_.pad,5,$_.isbntxt);$p($_.pad,$_.pad.length-2,45);$p($_.pad,$_.pad.length-1,$_.checksum);$_.isbntxt=$_.pad;$_.barcode=$s(12);if($_.isbn.length==9){$P($_.barcode,0,"978");$P($_.barcode,3,$_.isbn)}else{$P($_.barcode,0,$_.isbn)}if($_.addon.length!=0){var _2G=$s(12+$_.addon.length+1);$P(_2G,0,$_.barcode);$P(_2G,12," ");$P(_2G,13,$_.addon);$_.barcode=_2G}$p($_.options,"addongap",$_.addongap);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_ean13();var _2N=$k[--$j];$_.args=_2N;if($_.includetext){if($_.isbntextxoffset==null){var _2R=$_.isbn.length==9?-1:-12;$_.isbntextxoffset=_2R}if($_.isbntextyoffset==null){$_.isbntextyoffset=$g($g($_.args,"bhs"),2)*72+3}if($has($_.args,"txt")){$_.txt=$g($_.args,"txt");$_.newtxt=$a($_.txt.length+1);$P($_.newtxt,0,$_.txt);$p($_.newtxt,$_.newtxt.length-1,$a([$_.isbntxt,$_.isbntextxoffset,$_.isbntextyoffset,$_.isbntextfont,$_.isbntextsize]));$p($_.args,"txt",$_.newtxt)}else{$p($_.args,"txt",$a([$a([$_.isbntxt,$_.isbntextxoffset,$_.isbntextyoffset,$_.isbntextfont,$_.isbntextsize])]))}}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_ismn(){var $__=$_;$_=Object.assign({},$_,bwipp_ismn.globals);$_.dontdraw=false;$_.includetext=false;$_.ismntextfont="OCR-A";$_.ismntextsize=8;$_.ismntextxoffset=null;$_.ismntextyoffset=null;$_.height=-1;$_.width=0;$_.addongap=12;$_.legacy=false;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.barcode=_6;$j--;var _7=$k[--$j];$_.addon=_7}else{$j--;$_.addon=""}if($_.barcode.length!=15&&$_.barcode.length!=17&&($_.barcode.length!=11&&$_.barcode.length!=13)){$k[$j++]="bwipp.ismnBadLength#8334";$k[$j++]="ISMN-13 must be 15 or 17 characters including dashes. ISMN-10 must be 11 or 13 characters including dashes";bwipp_raiseerror()}if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.ismnBadAddOnLength#8337";$k[$j++]="Add-on for ISMN must be 2 or 5 digits";bwipp_raiseerror()}if($_.barcode.length>=15){if($ne($G($_.barcode,0,4),"979-")){$k[$j++]="bwipp.ismn13badPrefix#8341";$k[$j++]="ISMN-13 prefix must be 979-";bwipp_raiseerror()}$_.wasdash=false;$_.numdash=0;$_.numdigit=0;var _J=$G($_.barcode,5,9);for(var _K=0,_L=_J.length;_K<_L;_K++){var _M=$g(_J,_K);$k[$j++]=_M;if(_M==45){if($_.wasdash){$k[$j-1]="bwipp.ismn13adjacentDashes#8348";$k[$j++]="ISMN-13 does not permit adjacent dashes";bwipp_raiseerror()}$_.wasdash=true;$_.numdash=$_.numdash+1}var _P=$k[--$j];if(_P>=48&&_P<=57){$_.wasdash=false;$_.numdigit=$_.numdigit+1}}if($_.numdash!=2||$_.numdigit!=7){$k[$j++]="bwipp.ismn13numDashesDigits#8359";$k[$j++]="Incorrect number of dashes and digits for ISMN-13";bwipp_raiseerror()}var _U=$g($_.barcode,14);if(_U<48||_U>57){$k[$j++]="bwipp.ismn13character15#8362";$k[$j++]="ISMN-13 character 15 must be a digit";bwipp_raiseerror()}if($_.barcode.length==17){if($ne($G($_.barcode,15,1),"-")){$k[$j++]="bwipp.ismn13character16#8366";$k[$j++]="ISMN-13 penultimate character must be a dash";bwipp_raiseerror()}var _Z=$g($_.barcode,16);if(_Z<48||_Z>57){$k[$j++]="bwipp.ismn13character17#8369";$k[$j++]="ISMN-13 final character must be a digit";bwipp_raiseerror()}}}else{if($ne($G($_.barcode,0,2),"M-")){$k[$j++]="bwipp.ismn10badPrefix#8374";$k[$j++]="ISMN-10 prefix must be M-";bwipp_raiseerror()}var _d=$g($_.barcode,2);if(_d<48||_d>57){$k[$j++]="bwipp.ismn10character3#8377";$k[$j++]="ISMN-10 character 3 must be a digit";bwipp_raiseerror()}$_.wasdash=false;$_.numdash=0;$_.numdigit=0;var _f=$G($_.barcode,3,7);for(var _g=0,_h=_f.length;_g<_h;_g++){var _i=$g(_f,_g);$k[$j++]=_i;if(_i==45){if($_.wasdash){$k[$j-1]="bwipp.ismn10adjacentDashes#8384";$k[$j++]="ISMN-10 does not permit adjacent dashes";bwipp_raiseerror()}$_.wasdash=true;$_.numdash=$_.numdash+1}var _l=$k[--$j];if(_l>=48&&_l<=57){$_.wasdash=false;$_.numdigit=$_.numdigit+1}}if($_.numdash!=1||$_.numdigit!=6){$k[$j++]="bwipp.ismn10numDashesDigits#8395";$k[$j++]="Incorrect number of dashes and digits for ISMN-10";bwipp_raiseerror()}var _q=$g($_.barcode,10);if(_q<48||_q>57){$k[$j++]="bwipp.ismn10character11#8398";$k[$j++]="ISMN-10 character 11 must be a digit";bwipp_raiseerror()}if($_.barcode.length==13){if($ne($G($_.barcode,11,1),"-")){$k[$j++]="bwipp.ismn10character12#8402";$k[$j++]="ISMN-10 penultimate character must be a dash";bwipp_raiseerror()}var _v=$g($_.barcode,12);if((_v<48||_v>57)&&_v!=88){$k[$j++]="bwipp.ismn10character13#8405";$k[$j++]="ISMN-10 final character must be a digit or X";bwipp_raiseerror()}}}$_.ismntxt=$_.barcode;$_.legacytxt="";if($_.ismntxt.length<=13){$_.legacytxt=$_.ismntxt;$_.pad=$s($_.ismntxt.length+4);$P($_.pad,0,"979-0-");$P($_.pad,6,$G($_.ismntxt,2,$_.ismntxt.length-2));$_.ismntxt=$_.pad}$_.ismn=$s(13);$_.checksum=0;$_.i=0;$_.n=0;for(;;){$_.ismnchar=$g($_.ismntxt,$_.i)-48;if($_.ismnchar!=-3){$p($_.ismn,$_.n,$_.ismnchar+48);if($_.n<12){if($_.n%2==0){$_.checksum=$_.ismnchar+$_.checksum}else{$_.checksum=$_.ismnchar*3+$_.checksum}}$_.n=$_.n+1}$_.i=$_.i+1;if($_.i==$_.ismntxt.length){break}}$_.checksum=(10-$_.checksum%10)%10+48;if($_.barcode.length==13||$_.barcode.length==17){var _1S=$_.barcode;if($g(_1S,_1S.length-1)!=$_.checksum){$k[$j++]="bwipp.ismnBadCheckDigit#8453";$k[$j++]="Incorrect ISMN check digit provided";bwipp_raiseerror()}}if($_.legacy&&$_.legacytxt.length!=0){$_.ismntxt=$_.legacytxt;$_.pad=$s(18)}else{$_.pad=$s(22)}$P($_.pad,0,"ISMN ");$P($_.pad,5,$_.ismntxt);$p($_.pad,$_.pad.length-2,45);$p($_.pad,$_.pad.length-1,$_.checksum);$_.ismntxt=$_.pad;$_.barcode=$G($_.ismn,0,12);if($_.addon.length!=0){var _1n=$s(12+$_.addon.length+1);$P(_1n,0,$_.barcode);$P(_1n,12," ");$P(_1n,13,$_.addon);$_.barcode=_1n}$p($_.options,"addongap",$_.addongap);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_ean13();var _1u=$k[--$j];$_.args=_1u;if($_.includetext){if($_.ismntextxoffset==null){var _1y=$_.ismntxt.length==18?-1:-12;$_.ismntextxoffset=_1y}if($_.ismntextyoffset==null){$_.ismntextyoffset=$g($g($_.args,"bhs"),2)*72+3}if($has($_.args,"txt")){$_.txt=$g($_.args,"txt");$_.newtxt=$a($_.txt.length+1);$P($_.newtxt,0,$_.txt);$p($_.newtxt,$_.newtxt.length-1,$a([$_.ismntxt,$_.ismntextxoffset,$_.ismntextyoffset,$_.ismntextfont,$_.ismntextsize]));$p($_.args,"txt",$_.newtxt)}else{$p($_.args,"txt",$a([$a([$_.ismntxt,$_.ismntextxoffset,$_.ismntextyoffset,$_.ismntextfont,$_.ismntextsize])]))}}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_issn(){var $__=$_;$_=Object.assign({},$_,bwipp_issn.globals);$_.dontdraw=false;$_.includetext=false;$_.issntextfont="OCR-A";$_.issntextsize=8;$_.issntextxoffset=null;$_.issntextyoffset=null;$_.height=-1;$_.width=0;$_.addongap=12;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode," ");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.barcode=_6;$j--;var _7=$k[--$j];$_.seqvar=_7}else{$j--;$_.seqvar="00"}$X($_.seqvar," ");var _9=$k[--$j];if(_9){var _A=$k[--$j];$_.seqvar=_A;$j--;var _B=$k[--$j];$_.addon=_B}else{$j--;$_.addon=""}if($_.barcode.length!=8&&$_.barcode.length!=9){$k[$j++]="bwipp.issnBadLength#8636";$k[$j++]="ISSN must be 8 or 9 characters including dash, in the format XXXX-XXXX";bwipp_raiseerror()}var _F=$G($_.barcode,0,4);for(var _G=0,_H=_F.length;_G<_H;_G++){var _I=$g(_F,_G);if(_I<48||_I>57){$k[$j++]="bwipp.issnFirstThroughFourthNotNumeric#8640";$k[$j++]="ISSN first four characters must be numeral characters";bwipp_raiseerror()}}if($ne($G($_.barcode,4,1),"-")){$k[$j++]="bwipp.issnNeedsDash#8644";$k[$j++]="ISSN fifth character must be a dash";bwipp_raiseerror()}var _M=$G($_.barcode,5,3);for(var _N=0,_O=_M.length;_N<_O;_N++){var _P=$g(_M,_N);if(_P<48||_P>57){$k[$j++]="bwipp.issnSixthThroughEighthNotNumeric#8648";$k[$j++]="ISSN sixth through eighth characters must be numerals";bwipp_raiseerror()}}if($_.barcode.length==9){var _S=$g($_.barcode,8);if((_S<48||_S>57)&&_S!=88){$k[$j++]="bwipp.issnNinthCharacterBadFormat#8653";$k[$j++]="ISSN ninth character must be a number or the character X";bwipp_raiseerror()}}if($_.seqvar.length!=2){$k[$j++]="bwipp.issnBadSequenceVariantLength#8657";$k[$j++]="Sequence variant for ISSN must be 2 digits";bwipp_raiseerror()}$F($_.seqvar,function(){var _V=$k[--$j];if(_V<48||_V>57){$k[$j++]="bwipp.issnSequenceVariantBadCharacter#8661";$k[$j++]="Sequence variant for ISSN must contain only digits";bwipp_raiseerror()}});if($_.addon.length!=0&&$_.addon.length!=2&&$_.addon.length!=5){$k[$j++]="bwipp.issnBadAddOnLength#8665";$k[$j++]="Add-on for ISSN must be 2 or 5 digits";bwipp_raiseerror()}$_.issn=$s(8);$_.checksum=0;$_.i=0;$_.n=0;for(;;){$_.issnchar=$g($_.barcode,$_.i)-48;if($_.issnchar!=-3){$p($_.issn,$_.n,$_.issnchar+48);if($_.n<7){$_.checksum=$f($_.checksum+$_.issnchar*(8-$_.n))}$_.n=$_.n+1}$_.i=$_.i+1;if($_.i==$_.barcode.length){break}}$_.checksum=(11-$_.checksum%11)%11;var _r=$_.checksum+48;if(_r==58){_r=88}$_.checksum=_r;if($_.barcode.length==9){if($g($_.barcode,8)!=$_.checksum){$k[$j++]="bwipp.issnBadCheckDigit#8690";$k[$j++]="Incorrect ISSN check digit provided";bwipp_raiseerror()}}$_.pad=$s(14);$P($_.pad,0,"ISSN ");$P($_.pad,5,$_.barcode);$p($_.pad,13,$_.checksum);$_.issntxt=$_.pad;$_.barcode=$G($_.issn,0,7);$_.barcode=$s(12);$P($_.barcode,0,"977");$P($_.barcode,3,$_.issn);$P($_.barcode,10,$_.seqvar);if($_.addon.length!=0){var _1F=$s(12+$_.addon.length+1);$P(_1F,0,$_.barcode);$P(_1F,12," ");$P(_1F,13,$_.addon);$_.barcode=_1F}$p($_.options,"addongap",$_.addongap);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_ean13();var _1M=$k[--$j];$_.args=_1M;if($_.includetext){if($_.issntextxoffset==null){$_.issntextxoffset=10}if($_.issntextyoffset==null){$_.issntextyoffset=$g($g($_.args,"bhs"),2)*72+3}if($has($_.args,"txt")){$_.txt=$g($_.args,"txt");$_.newtxt=$a($_.txt.length+1);$P($_.newtxt,0,$_.txt);$p($_.newtxt,$_.newtxt.length-1,$a([$_.issntxt,$_.issntextxoffset,$_.issntextyoffset,$_.issntextfont,$_.issntextsize]));$p($_.args,"txt",$_.newtxt)}else{$p($_.args,"txt",$a([$a([$_.issntxt,$_.issntextxoffset,$_.issntextyoffset,$_.issntextfont,$_.issntextsize])]))}}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_mands(){var $__=$_;$_=Object.assign({},$_,bwipp_mands.globals);$_.dontdraw=false;$_.includetext=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.barlen=$_.barcode.length;if($_.barlen!=7&&$_.barlen!=8){$k[$j++]="bwipp.MandSbadLength#8828";$k[$j++]="M&S barcode must be 7 or 8 characters";bwipp_raiseerror()}if($_.barlen==7){var _9=$Z($s(8),"00000000");$P(_9,1,$_.barcode);$_.barcode=_9}$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_ean8();var _D=$k[--$j];$_.args=_D;var _F=$g($_.args,"bbs");$p(_F,10,$g(_F,2));$p(_F,11,$g(_F,2));var _J=$g($_.args,"bhs");$p(_J,10,$g(_J,2));$p(_J,11,$g(_J,2));if($_.includetext){$_.txt=$g($_.args,"txt");if($_.barlen==7){for(var _Q=0;_Q<=6;_Q+=1){var _R=$_.txt;$P($g($g(_R,_Q),0),0,$g($g(_R,_Q+1),0))}$P($g($g($_.txt,7),0),0," ")}var _Z=$a(10);$P(_Z,0,$_.txt);$_.txt=_Z;var _c=$g($_.txt,0);$p($_.txt,8,$A($a(_c.length),_c));var _h=$g($_.txt,0);$p($_.txt,9,$A($a(_h.length),_h));$p($g($_.txt,8),0,"M");$p($g($_.txt,8),1,-12);$p($g($_.txt,9),0,"S");$p($g($_.txt,9),1,69);$p($_.args,"txt",$_.txt)}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code128(){if(!bwipp_code128.globals){var $__=$_;$_=bwipp_code128.globals={};$_.code128_sta=-1;$_.code128_stb=-2;$_.code128_stc=-3;$_.code128_swa=-4;$_.code128_swb=-5;$_.code128_swc=-6;$_.code128_fn1=-7;$_.code128_fn2=-8;$_.code128_fn3=-9;$_.code128_fn4=-10;$_.code128_sft=-11;$_.code128_stp=-12;$_.code128_lka=-13;$_.code128_lkc=-14;$_.sta=$_.code128_sta;$_.stb=$_.code128_stb;$_.stc=$_.code128_stc;$_.swa=$_.code128_swa;$_.swb=$_.code128_swb;$_.swc=$_.code128_swc;$_.fn1=$_.code128_fn1;$_.fn2=$_.code128_fn2;$_.fn3=$_.code128_fn3;$_.fn4=$_.code128_fn4;$_.sft=$_.code128_sft;$_.stp=$_.code128_stp;$_.lka=$_.code128_lka;$_.lkc=$_.code128_lkc;$_.code128_charmaps=$a([$a([32,32,"00"]),$a(["!","!","01"]),$a(['"','"',"02"]),$a(["#","#","03"]),$a(["$","$","04"]),$a(["%","%","05"]),$a(["&","&","06"]),$a(["'","'","07"]),$a([40,40,"08"]),$a([41,41,"09"]),$a(["*","*","10"]),$a(["+","+","11"]),$a([",",",","12"]),$a(["-","-","13"]),$a([".",".","14"]),$a(["/","/","15"]),$a(["0","0","16"]),$a(["1","1","17"]),$a(["2","2","18"]),$a(["3","3","19"]),$a(["4","4","20"]),$a(["5","5","21"]),$a(["6","6","22"]),$a(["7","7","23"]),$a(["8","8","24"]),$a(["9","9","25"]),$a([":",":","26"]),$a([";",";","27"]),$a(["<","<","28"]),$a(["=","=","29"]),$a([">",">","30"]),$a(["?","?","31"]),$a(["@","@","32"]),$a(["A","A","33"]),$a(["B","B","34"]),$a(["C","C","35"]),$a(["D","D","36"]),$a(["E","E","37"]),$a(["F","F","38"]),$a(["G","G","39"]),$a(["H","H","40"]),$a(["I","I","41"]),$a(["J","J","42"]),$a(["K","K","43"]),$a(["L","L","44"]),$a(["M","M","45"]),$a(["N","N","46"]),$a(["O","O","47"]),$a(["P","P","48"]),$a(["Q","Q","49"]),$a(["R","R","50"]),$a(["S","S","51"]),$a(["T","T","52"]),$a(["U","U","53"]),$a(["V","V","54"]),$a(["W","W","55"]),$a(["X","X","56"]),$a(["Y","Y","57"]),$a(["Z","Z","58"]),$a(["[","[","59"]),$a([92,92,"60"]),$a(["]","]","61"]),$a(["^","^","62"]),$a(["_","_","63"]),$a([0,"`","64"]),$a([1,"a","65"]),$a([2,"b","66"]),$a([3,"c","67"]),$a([4,"d","68"]),$a([5,"e","69"]),$a([6,"f","70"]),$a([7,"g","71"]),$a([8,"h","72"]),$a([9,"i","73"]),$a([10,"j","74"]),$a([11,"k","75"]),$a([12,"l","76"]),$a([13,"m","77"]),$a([14,"n","78"]),$a([15,"o","79"]),$a([16,"p","80"]),$a([17,"q","81"]),$a([18,"r","82"]),$a([19,"s","83"]),$a([20,"t","84"]),$a([21,"u","85"]),$a([22,"v","86"]),$a([23,"w","87"]),$a([24,"x","88"]),$a([25,"y","89"]),$a([26,"z","90"]),$a([27,"{","91"]),$a([28,"|","92"]),$a([29,"}","93"]),$a([30,"~","94"]),$a([31,127,"95"]),$a([$_.fn3,$_.fn3,"96"]),$a([$_.fn2,$_.fn2,"97"]),$a([$_.sft,$_.sft,"98"]),$a([$_.swc,$_.swc,"99"]),$a([$_.swb,$_.fn4,$_.swb]),$a([$_.fn4,$_.swa,$_.swa]),$a([$_.fn1,$_.fn1,$_.fn1]),$a([$_.sta,$_.sta,$_.sta]),$a([$_.stb,$_.stb,$_.stb]),$a([$_.stc,$_.stc,$_.stc]),$a([$_.stp,$_.stp,$_.stp])]);$_.code128_latch_a0=$a(["","e","e","ee","eee","eee"]);$_.code128_latch_b0=$a(["d","","d","ddd","dd","ddd"]);$_.code128_latch_c0=$a(["c","c","","eec","ddc","dddc"]);$_.code128_latch_a1=$a(["ee","eee","eee","","e","e"]);$_.code128_latch_b1=$a(["ddd","dd","ddd","d","","d"]);$_.code128_latch_c1=$a(["eec","ddc","dddc","c","c",""]);var _2N=[];var _2J=$_.code128_latch_a0;for(var _2K=0,_2L=_2J.length;_2K<_2L;_2K++){_2N[_2K]=$g(_2J,_2K).length}_2N=$a(_2N);$_.code128_latch_length_a0=_2N;var _2S=[];var _2O=$_.code128_latch_b0;for(var _2P=0,_2Q=_2O.length;_2P<_2Q;_2P++){_2S[_2P]=$g(_2O,_2P).length}_2S=$a(_2S);$_.code128_latch_length_b0=_2S;var _2X=[];var _2T=$_.code128_latch_c0;for(var _2U=0,_2V=_2T.length;_2U<_2V;_2U++){_2X[_2U]=$g(_2T,_2U).length}_2X=$a(_2X);$_.code128_latch_length_c0=_2X;var _2c=[];var _2Y=$_.code128_latch_a1;for(var _2Z=0,_2a=_2Y.length;_2Z<_2a;_2Z++){_2c[_2Z]=$g(_2Y,_2Z).length}_2c=$a(_2c);$_.code128_latch_length_a1=_2c;var _2h=[];var _2d=$_.code128_latch_b1;for(var _2e=0,_2f=_2d.length;_2e<_2f;_2e++){_2h[_2e]=$g(_2d,_2e).length}_2h=$a(_2h);$_.code128_latch_length_b1=_2h;var _2m=[];var _2i=$_.code128_latch_c1;for(var _2j=0,_2k=_2i.length;_2j<_2k;_2j++){_2m[_2j]=$g(_2i,_2j).length}_2m=$a(_2m);$_.code128_latch_length_c1=_2m;$_.code128_latch_sequence=$a([$_.code128_latch_a0,$_.code128_latch_b0,$_.code128_latch_c0,$_.code128_latch_a1,$_.code128_latch_b1,$_.code128_latch_c1]);$_.code128_start_code=$a([103,104,105]);$_.code128_state_priority=$a([1,0,2,4,3,5]);$_.code128_start_state=$a([0,1,2,0,1,2]);$_.code128_start_length=$a([1,1,1,1,1,1]);var _34=[];var _2y=$a([5,4,3,2,1,0]);for(var _2z=0,_30=_2y.length;_2z<_30;_2z++){_34[_2z]=$g($_.code128_state_priority,$g(_2y,_2z))}_34=$a(_34);$_.code128_reverse_priority=_34;$k[$j++]=Infinity;var _35=$_.code128_reverse_priority;for(var _36=0,_37=_35.length;_36<_37;_36++){var _38=$g(_35,_36);$k[$j++]=_38;$k[$j++]=$g($_.code128_latch_length_a0,_38);$k[$j++]=_38}var _3B=$a();$_.code128_prioritized_latch_length_a0=_3B;$k[$j++]=Infinity;var _3C=$_.code128_reverse_priority;for(var _3D=0,_3E=_3C.length;_3D<_3E;_3D++){var _3F=$g(_3C,_3D);$k[$j++]=_3F;$k[$j++]=$g($_.code128_latch_length_a1,_3F);$k[$j++]=_3F}var _3I=$a();$_.code128_prioritized_latch_length_a1=_3I;$k[$j++]=Infinity;var _3J=$_.code128_reverse_priority;for(var _3K=0,_3L=_3J.length;_3K<_3L;_3K++){var _3M=$g(_3J,_3K);$k[$j++]=_3M;$k[$j++]=$g($_.code128_latch_length_b0,_3M);$k[$j++]=_3M}var _3P=$a();$_.code128_prioritized_latch_length_b0=_3P;$k[$j++]=Infinity;var _3Q=$_.code128_reverse_priority;for(var _3R=0,_3S=_3Q.length;_3R<_3S;_3R++){var _3T=$g(_3Q,_3R);$k[$j++]=_3T;$k[$j++]=$g($_.code128_latch_length_b1,_3T);$k[$j++]=_3T}var _3W=$a();$_.code128_prioritized_latch_length_b1=_3W;$k[$j++]=Infinity;var _3X=$_.code128_reverse_priority;for(var _3Y=0,_3Z=_3X.length;_3Y<_3Z;_3Y++){var _3a=$g(_3X,_3Y);$k[$j++]=_3a;$k[$j++]=$g($_.code128_latch_length_c0,_3a);$k[$j++]=_3a}var _3d=$a();$_.code128_prioritized_latch_length_c0=_3d;$k[$j++]=Infinity;var _3e=$_.code128_reverse_priority;for(var _3f=0,_3g=_3e.length;_3f<_3g;_3f++){var _3h=$g(_3e,_3f);$k[$j++]=_3h;$k[$j++]=$g($_.code128_latch_length_c1,_3h);$k[$j++]=_3h}var _3k=$a();$_.code128_prioritized_latch_length_c1=_3k;$k[$j++]=Infinity;$k[$j++]=$_.fn3;$k[$j++]=96;$k[$j++]=$_.fn2;$k[$j++]=97;$k[$j++]=$_.fn1;$k[$j++]=102;$k[$j++]=$_.stp;$k[$j++]=106;$k[$j++]=$_.lka;$k[$j++]=100;$k[$j++]=$_.lkc;$k[$j++]=99;var _3r=$d();$_.code128_seta_new=_3r;$k[$j++]=Infinity;$k[$j++]=$_.fn3;$k[$j++]=96;$k[$j++]=$_.fn2;$k[$j++]=97;$k[$j++]=$_.fn1;$k[$j++]=102;$k[$j++]=$_.stp;$k[$j++]=106;$k[$j++]=$_.lka;$k[$j++]=99;$k[$j++]=$_.lkc;$k[$j++]=101;var _3y=$d();$_.code128_setb_new=_3y;$k[$j++]=Infinity;$k[$j++]=$_.fn1;$k[$j++]=102;$k[$j++]=$_.stp;$k[$j++]=106;$k[$j++]=$_.lka;$k[$j++]=101;$k[$j++]=$_.lkc;$k[$j++]=100;var _43=$d();$_.code128_setc_new=_43;$_.code128_encs=$a(["212222","222122","222221","121223","121322","131222","122213","122312","132212","221213","221312","231212","112232","122132","122231","113222","123122","123221","223211","221132","221231","213212","223112","312131","311222","321122","321221","312212","322112","322211","212123","212321","232121","111323","131123","131321","112313","132113","132311","211313","231113","231311","112133","112331","132131","113123","113321","133121","313121","211331","231131","213113","213311","213131","311123","311321","331121","312113","312311","332111","314111","221411","431111","111224","111422","121124","121421","141122","141221","112214","112412","122114","122411","142112","142211","241211","221114","413111","241112","134111","111242","121142","121241","114212","124112","124211","411212","421112","421211","212141","214121","412121","111143","111341","131141","114113","114311","411113","411311","113141","114131","311141","411131","211412","211214","211232","2331112"]);$_.code128_max_int=2147483647;$_.charvals_legacy=$a([new Map,new Map,new Map]);for(var _46=0,_45=$_.code128_charmaps.length-1;_46<=_45;_46+=1){$_.i=_46;$_.encs=$g($_.code128_charmaps,$_.i);for(var _49=0;_49<=2;_49+=1){$_.j=_49;var _4C=$g($_.encs,$_.j);var _4D=$t(_4C);if($eq(_4D,"stringtype")){_4C=$g(_4C,0)}$p($g($_.charvals_legacy,$_.j),_4C,$_.i)}}$_.charvals_legacy=$_.charvals_legacy;var _4N=$g($_.charvals_legacy,0);$p(_4N,$_.code128_lka,$g(_4N,$_.code128_swb));$p(_4N,$_.code128_lkc,$g(_4N,$_.code128_swc));$_.seta_legacy=_4N;var _4R=$g($_.charvals_legacy,1);$p(_4R,$_.code128_lka,$g(_4R,$_.code128_swc));$p(_4R,$_.code128_lkc,$g(_4R,$_.code128_swa));$_.setb_legacy=_4R;var _4V=$g($_.charvals_legacy,2);$p(_4V,$_.code128_lka,$g(_4V,$_.code128_swa));$p(_4V,$_.code128_lkc,$g(_4V,$_.code128_swb));$_.setc_legacy=_4V;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code128.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.raw=false;$_.newencoder=false;$_.parse=false;$_.parsefnc=false;$_.suppressc=false;$_.unlatchextbeforec=false;$_.modunit=1;bwipp_processoptions();var _4Y=$k[--$j];$_.options=_4Y;var _4Z=$k[--$j];$_.barcode=_4Z;if($_.barcode.length>500){$k[$j++]="bwipp.code128inputTooLong#9131";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.code128_fn1],["FNC2",$_.code128_fn2],["FNC3",$_.code128_fn3],["LNKA",$_.code128_lka],["LNKC",$_.code128_lkc]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _4h=$k[--$j];$_.msg=_4h;$_.msglen=$_.msg.length;$_.encoding="legacy";if($_.newencoder){$_.encoding="new"}if($_.raw){$_.encoding="raw"}if($eq($_.encoding,"raw")){$_.cws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _4v=$G($_.barcode,$_.i+1,3);$k[$j++]=_4v;$k[$j++]=false;for(var _4w=0,_4x=_4v.length;_4w<_4x;_4w++){var _4y=$g(_4v,_4w);if(_4y<48||_4y>57){$k[$j-1]=true}}var _4z=$k[--$j];if(_4z){$j--;break}var _50=$k[--$j];$_.cw=$i(_50);if($_.cw>106){$k[$j++]="bwipp.code128BadRawCodeword#9178";$k[$j++]="Raw codewords must be 0 to 106";bwipp_raiseerror()}$p($_.cws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.code128BadRawFormat#9185";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.cws=$G($_.cws,0,$_.j);$_.text=""}else{$_.text=$s($_.msglen);for(var _5G=0,_5F=$_.msglen-1;_5G<=_5F;_5G+=1){$_.i=_5G;var _5L=$g($_.msg,$_.i);var _5O=$_.text;var _5N=$_.i;if(_5L<0){_5L=32}$p(_5O,_5N,_5L)}}if($eq($_.encoding,"legacy")){$_.seta=$_.seta_legacy;$_.setb=$_.setb_legacy;$_.setc=$_.setc_legacy;$k[$j++]=Infinity;for(var _5U=0,_5V=$_.msglen;_5U<_5V;_5U++){$k[$j++]=0}$k[$j++]=0;$_.numSA=$a();$k[$j++]=Infinity;for(var _5X=0,_5Y=$_.msglen;_5X<_5Y;_5X++){$k[$j++]=0}$k[$j++]=0;$_.numEA=$a();for(var _5a=$_.msglen-1;_5a>=0;_5a-=1){$_.i=_5a;if($g($_.msg,$_.i)>=0){if($g($_.msg,$_.i)>=128){$p($_.numEA,$_.i,$g($_.numEA,$_.i+1)+1)}else{$p($_.numSA,$_.i,$g($_.numSA,$_.i+1)+1)}}}$_.ea=false;$k[$j++]=Infinity;for(var _5t=0,_5s=$_.msglen-1;_5t<=_5s;_5t+=1){$_.i=_5t;$_.c=$g($_.msg,$_.i);if(!($_.ea!=$_.c<128)&&$_.c>=0){var _64=$_.ea?$_.numSA:$_.numEA;var _65=$g(_64,$_.i);var _68=$f(_65+$_.i)==$_.msglen?3:5;if(_65<_68){$k[$j++]=$_.code128_fn4}else{$_.ea=!$_.ea;$k[$j++]=$_.code128_fn4;$k[$j++]=$_.code128_fn4}}if($_.c>=0){$k[$j++]=$_.c&127}else{$k[$j++]=$_.c}}$as($a($m()));var _6F=$k[--$j];$_.msg=_6F;$j--;$_.msglen=$_.msg.length;$_.numsscr=function(){$_.s=0;var _6H=$k[--$j];$_.p=_6H;for(;;){if($_.p>=$_.msglen){break}var _6M=$g($_.msg,$_.p);var _6O=$has($_.setc,_6M);$k[$j++]=_6M;if(!_6O){$j--;break}var _6P=$k[$j-1];if(_6P<=-1){var _6Q=$k[--$j];if(_6Q==$_.code128_fn1&&$_.s%2==0){$_.s=$_.s+1}else{break}}else{$j--}$_.s=$_.s+1;$_.p=$_.p+1}$k[$j++]=$_.s};$_.enca=function(){var _6X=$k[--$j];$p($_.cws,$_.j,$g($_.seta,_6X));$_.j=$_.j+1};$_.encb=function(){var _6d=$k[--$j];$p($_.cws,$_.j,$g($_.setb,_6d));$_.j=$_.j+1};$_.encc=function(){var _6i=$k[$j-1];var _6j=$t(_6i);if($ne(_6j,"arraytype")){var _6l=$k[--$j];$k[$j++]=$g($_.setc,_6l)}else{var _6n=$k[--$j];$q(_6n);var _6o=$k[--$j];var _6p=$k[--$j];$k[$j++]=$f(_6o-48+(_6p-48)*10)}var _6r=$k[--$j];$p($_.cws,$_.j,_6r);$_.j=$_.j+1};$_.anotb=function(){var _6u=$k[--$j];$k[$j++]=$has($_.seta,_6u)&&!$has($_.setb,_6u)};$_.bnota=function(){var _6z=$k[--$j];$k[$j++]=$has($_.setb,_6z)&&!$has($_.seta,_6z)};$k[$j++]=Infinity;for(var _75=0,_76=$_.msg.length;_75<_76;_75++){$k[$j++]=0}$k[$j++]=9999;$_.nextanotb=$a();$k[$j++]=Infinity;for(var _78=0,_79=$_.msg.length;_78<_79;_78++){$k[$j++]=0}$k[$j++]=9999;$_.nextbnota=$a();for(var _7B=$_.msg.length-1;_7B>=0;_7B-=1){$_.i=_7B;$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _7F=$k[--$j];if(_7F){$p($_.nextanotb,$_.i,0)}else{$p($_.nextanotb,$_.i,$g($_.nextanotb,$_.i+1)+1)}$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _7Q=$k[--$j];if(_7Q){$p($_.nextbnota,$_.i,0)}else{$p($_.nextbnota,$_.i,$g($_.nextbnota,$_.i+1)+1)}}$_.abeforeb=function(){var _7Y=$k[--$j];$k[$j++]=$lt($g($_.nextanotb,_7Y),$g($_.nextbnota,_7Y))};$_.bbeforea=function(){var _7d=$k[--$j];$k[$j++]=$lt($g($_.nextbnota,_7d),$g($_.nextanotb,_7d))};$_.cws=$a($_.barcode.length*2+3);$_.j=0;if($_.msglen>0){$k[$j++]=0;$_.numsscr()}else{$k[$j++]=-1}var _7l=$k[--$j];$_.nums=_7l;for(;;){if($_.msglen==0){$k[$j++]=$_.code128_stb;$_.enca();$_.cset="setb";break}if($_.msglen==2&&$_.nums==2){$k[$j++]=$_.code128_stc;$_.enca();$_.cset="setc";break}if($_.nums>=4){$k[$j++]=$_.code128_stc;$_.enca();$_.cset="setc";break}$k[$j++]=0;$_.abeforeb();var _7q=$k[--$j];if(_7q){$k[$j++]=$_.code128_sta;$_.enca();$_.cset="seta";break}$k[$j++]=$_.code128_stb;$_.enca();$_.cset="setb";break}$_.i=0;for(;;){if($_.i==$_.msglen){break}$k[$j++]=$_.i;$_.numsscr();var _7u=$k[--$j];$_.nums=_7u;for(;;){if(($eq($_.cset,"seta")||$eq($_.cset,"setb"))&&$_.nums>=4&&$g($_.msg,$_.i)!=$_.code128_fn1){if($_.nums%2==0){$k[$j++]=$_.code128_swc;if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.cset="setc";break}else{$k[$j++]=$g($_.msg,$_.i);if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.i=$_.i+1;$k[$j++]=$_.i;$_.numsscr();var _89=$k[--$j];if(_89>=4){$k[$j++]=$_.code128_swc;if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.cset="setc";break}}}$k[$j++]=$eq($_.cset,"setb");$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _8F=$k[--$j];var _8G=$k[--$j];if(_8G&&_8F){if($_.i<$_.msglen-1){$k[$j++]=$_.i+1;$_.bbeforea();var _8K=$k[--$j];if(_8K){$k[$j++]=$_.code128_sft;$_.encb();$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}}$k[$j++]=$_.code128_swa;$_.encb();$_.cset="seta";break}$k[$j++]=$eq($_.cset,"seta");$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _8T=$k[--$j];var _8U=$k[--$j];if(_8U&&_8T){if($_.i<$_.msglen-1){$k[$j++]=$_.i+1;$_.abeforeb();var _8Y=$k[--$j];if(_8Y){$k[$j++]=$_.code128_sft;$_.enca();$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}}$k[$j++]=$_.code128_swb;$_.enca();$_.cset="setb";break}if($eq($_.cset,"setc")&&$_.nums<2&&($g($_.msg,$_.i)>-1||$g($_.msg,$_.i)==$_.code128_fn4)){$k[$j++]=$_.i;$_.abeforeb();var _8m=$k[--$j];if(_8m){$k[$j++]=$_.code128_swa;$_.encc();$_.cset="seta";break}$k[$j++]=$_.code128_swb;$_.encc();$_.cset="setb";break}if($eq($_.cset,"seta")){$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}if($eq($_.cset,"setb")){$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}if($eq($_.cset,"setc")){if($g($_.msg,$_.i)<=-1){$k[$j++]=$g($_.msg,$_.i);$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}break}break}}$_.cws=$G($_.cws,0,$_.j)}if($eq($_.encoding,"new")){$_.seta=$_.code128_seta_new;$_.setb=$_.code128_setb_new;$_.setc=$_.code128_setc_new;$_.encode=$a([function(){$_.enc_a0()},function(){$_.enc_b0()},function(){$_.enc_c()},function(){$_.enc_a1()},function(){$_.enc_b1()},function(){$_.enc_c()}]);$_.can_a=function(){if($_.c>=0){$k[$j++]=true}else{$k[$j++]=$has($_.seta,$_.c)}};$_.can_b=function(){if($_.c>=0){$k[$j++]=true}else{$k[$j++]=$has($_.setb,$_.c)}};$_.can_c0=function(){if($_.num_digits>=2){$k[$j++]=true}else{$k[$j++]=$has($_.setc,$_.c)}};$_.can_c1=function(){if($_.num_digits>=2){$k[$j++]=true}else{$k[$j++]=$has($_.setc,$_.c)}};if($_.suppressc){$_.can_c0=function(){$k[$j++]=false}}if($_.suppressc||$_.unlatchextbeforec){$_.can_c1=function(){$k[$j++]=false}}$_.out_a0=function(){$k[$j++]=1;if($_.c>=0){if($_.c>=128){$k[$j-1]+=1}if(($_.c&127)>=96){$k[$j-1]+=1}}};$_.out_a1=function(){$k[$j++]=1;if($_.c>=0){if($_.c<128){$k[$j-1]+=1}if(($_.c&127)>=96){$k[$j-1]+=1}}};$_.out_b0=function(){$k[$j++]=1;if($_.c>=0){if($_.c>=128){$k[$j-1]+=1}if(($_.c&127)<32){$k[$j-1]+=1}}};$_.out_b1=function(){$k[$j++]=1;if($_.c>=0){if($_.c<128){$k[$j-1]+=1}if(($_.c&127)<32){$k[$j-1]+=1}}};$_.map_ab=function(){var _9q=$k[$j-1];if(_9q<32){$k[$j-1]+=64}else{$k[$j-1]-=32}};$_.enc_a0=function(){$k[$j++]=Infinity;if($_.c<0){$k[$j++]=$g($_.seta,$_.c)}else{if($_.c>=128){$k[$j++]=101}var _9z=$_.c&127;$k[$j++]=_9z;if(_9z>=96){var _A0=$k[--$j];$k[$j++]=98;$k[$j++]=_A0}$_.map_ab()}var _A1=$a();$k[$j++]=_A1};$_.enc_a1=function(){$k[$j++]=Infinity;if($_.c<0){$k[$j++]=$g($_.seta,$_.c)}else{if($_.c<128){$k[$j++]=101}var _A8=$_.c&127;$k[$j++]=_A8;if(_A8>=96){var _A9=$k[--$j];$k[$j++]=98;$k[$j++]=_A9}$_.map_ab()}var _AA=$a();$k[$j++]=_AA};$_.enc_b0=function(){$k[$j++]=Infinity;if($_.c<0){$k[$j++]=$g($_.setb,$_.c)}else{if($_.c>=128){$k[$j++]=100}var _AH=$_.c&127;$k[$j++]=_AH;if(_AH<32){var _AI=$k[--$j];$k[$j++]=98;$k[$j++]=_AI}$_.map_ab()}var _AJ=$a();$k[$j++]=_AJ};$_.enc_b1=function(){$k[$j++]=Infinity;if($_.c<0){$k[$j++]=$g($_.setb,$_.c)}else{if($_.c<128){$k[$j++]=100}var _AQ=$_.c&127;$k[$j++]=_AQ;if(_AQ<32){var _AR=$k[--$j];$k[$j++]=98;$k[$j++]=_AR}$_.map_ab()}var _AS=$a();$k[$j++]=_AS};$_.enc_c=function(){$k[$j++]=Infinity;if($_.c<0){$k[$j++]=$g($_.setc,$_.c)}else{$k[$j++]=$f(($g($_.msg,$_.n)-48)*10+($g($_.msg,$_.n+1)-48))}var _Ad=$a();$k[$j++]=_Ad};$_.get_best_prior_state=function(){var _Af=$k[--$j];var _Ah=$k[--$j];$_.len=$f(_Ah+$g($_.bln_0,_Af));var _Ai=$k[--$j];$_.o=_Ai;var _Ak=$k[--$j];var _Am=$k[--$j];var _An=$f(_Am+$g($_.bln_0,_Ak));$k[$j++]=_An;if(_An<$_.len){var _Ap=$k[--$j];$_.len=_Ap;var _Aq=$k[--$j];$_.o=_Aq}else{$j-=2}var _As=$k[--$j];var _Au=$k[--$j];var _Av=$f(_Au+$g($_.bln_0,_As));$k[$j++]=_Av;if(_Av<$_.len){var _Ax=$k[--$j];$_.len=_Ax;var _Ay=$k[--$j];$_.o=_Ay}else{$j-=2}var _B0=$k[--$j];var _B2=$k[--$j];var _B3=$f(_B2+$g($_.bln_0,_B0));$k[$j++]=_B3;if(_B3<$_.len){var _B5=$k[--$j];$_.len=_B5;var _B6=$k[--$j];$_.o=_B6}else{$j-=2}var _B8=$k[--$j];var _BA=$k[--$j];var _BB=$f(_BA+$g($_.bln_0,_B8));$k[$j++]=_BB;if(_BB<$_.len){var _BD=$k[--$j];$_.len=_BD;var _BE=$k[--$j];$_.o=_BE}else{$j-=2}var _BG=$k[--$j];var _BI=$k[--$j];if($f(_BI+$g($_.bln_0,_BG))<$_.len){var _BK=$k[--$j];$_.o=_BK}else{$j--}$k[$j++]=$_.o};$_.bln_0=$_.code128_start_length;$_.bln_1=$_.code128_start_length;$k[$j++]=Infinity;for(var _BM=0;_BM<4;_BM++){$k[$j++]=$a([0,0,0,0,0,0])}$_.bln=$a();$_.bps_0=$_.code128_start_state;$_.bps_1=$_.code128_start_state;$k[$j++]=Infinity;for(var _BO=0;_BO<4;_BO++){$k[$j++]=$a([0,0,0,0,0,0])}$_.bps=$a();$k[$j++]=Infinity;for(var _BR=0,_BS=$_.msg.length;_BR<_BS;_BR++){$k[$j++]=$a([0,0,0,0,0,0])}$_.path=$a();$_.make_tables=function(){$_.num_digits=0;for(var _BW=0,_BV=$_.msg.length-1;_BW<=_BV;_BW+=1){$_.n=_BW;$_.c=$g($_.msg,$_.n);var _Bd=$_.c>=48&&$_.c<58?$_.num_digits+1:0;$_.num_digits=_Bd;$_.bln_2=$_.bln_1;$_.bln_1=$_.bln_0;$_.bln_0=$g($_.bln,$_.n&3);$_.bps_2=$_.bps_1;$_.bps_1=$_.bps_0;$_.bps_0=$g($_.bps,$_.n&3);var _Bs=$_.num_digits>=2?$_.bps_2:$_.bps_1;$_.bps_c=_Bs;var _Bx=$_.num_digits>=2?$_.bln_2:$_.bln_1;$_.bln_c=_Bx;$k[$j++]=$_.bln_0;$k[$j++]=0;$_.can_a();var _C0=$k[--$j];if(_C0){$_.p=$g($_.bps_1,0);$p($g($_.path,$_.n),0,$_.p);$k[$j++]=$f($g($_.bln_1,$_.p)+$g($_.code128_latch_length_a0,$_.p));$_.out_a0();var _CC=$k[--$j];var _CD=$k[--$j];$k[$j++]=$f(_CD+_CC)}else{$k[$j++]=$_.code128_max_int}var _CE=$k[--$j];var _CF=$k[--$j];var _CG=$k[--$j];$p(_CG,_CF,_CE);$k[$j++]=$_.bln_0;$k[$j++]=3;$_.can_a();var _CI=$k[--$j];if(_CI){$_.p=$g($_.bps_1,3);$p($g($_.path,$_.n),3,$_.p);$k[$j++]=$f($g($_.bln_1,$_.p)+$g($_.code128_latch_length_a1,$_.p));$_.out_a1();var _CU=$k[--$j];var _CV=$k[--$j];$k[$j++]=$f(_CV+_CU)}else{$k[$j++]=$_.code128_max_int}var _CW=$k[--$j];var _CX=$k[--$j];var _CY=$k[--$j];$p(_CY,_CX,_CW);$k[$j++]=$_.bln_0;$k[$j++]=1;$_.can_b();var _Ca=$k[--$j];if(_Ca){$_.p=$g($_.bps_1,1);$p($g($_.path,$_.n),1,$_.p);$k[$j++]=$f($g($_.bln_1,$_.p)+$g($_.code128_latch_length_b0,$_.p));$_.out_b0();var _Cm=$k[--$j];var _Cn=$k[--$j];$k[$j++]=$f(_Cn+_Cm)}else{$k[$j++]=$_.code128_max_int}var _Co=$k[--$j];var _Cp=$k[--$j];var _Cq=$k[--$j];$p(_Cq,_Cp,_Co);$k[$j++]=$_.bln_0;$k[$j++]=4;$_.can_b();var _Cs=$k[--$j];if(_Cs){$_.p=$g($_.bps_1,4);$p($g($_.path,$_.n),4,$_.p);$k[$j++]=$f($g($_.bln_1,$_.p)+$g($_.code128_latch_length_b1,$_.p));$_.out_b1();var _D4=$k[--$j];var _D5=$k[--$j];$k[$j++]=$f(_D5+_D4)}else{$k[$j++]=$_.code128_max_int}var _D6=$k[--$j];var _D7=$k[--$j];var _D8=$k[--$j];$p(_D8,_D7,_D6);$k[$j++]=$_.bln_0;$k[$j++]=2;$_.can_c0();var _DA=$k[--$j];if(_DA){$_.p=$g($_.bps_c,2);$p($g($_.path,$_.n),2,$_.p);$k[$j++]=$f($g($_.bln_c,$_.p)+$g($_.code128_latch_length_c0,$_.p))+1}else{$k[$j++]=$_.code128_max_int}var _DM=$k[--$j];var _DN=$k[--$j];var _DO=$k[--$j];$p(_DO,_DN,_DM);$k[$j++]=$_.bln_0;$k[$j++]=5;$_.can_c1();var _DQ=$k[--$j];if(_DQ){$_.p=$g($_.bps_c,5);$p($g($_.path,$_.n),5,$_.p);$k[$j++]=$f($g($_.bln_c,$_.p)+$g($_.code128_latch_length_c1,$_.p))+1}else{$k[$j++]=$_.code128_max_int}var _Dc=$k[--$j];var _Dd=$k[--$j];var _De=$k[--$j];$p(_De,_Dd,_Dc);$k[$j++]=$_.bps_0;$k[$j++]=0;$q($_.code128_prioritized_latch_length_a0);$_.get_best_prior_state();var _Dg=$k[--$j];var _Dh=$k[--$j];var _Di=$k[--$j];$p(_Di,_Dh,_Dg);$k[$j++]=$_.bps_0;$k[$j++]=3;$q($_.code128_prioritized_latch_length_a1);$_.get_best_prior_state();var _Dk=$k[--$j];var _Dl=$k[--$j];var _Dm=$k[--$j];$p(_Dm,_Dl,_Dk);$k[$j++]=$_.bps_0;$k[$j++]=1;$q($_.code128_prioritized_latch_length_b0);$_.get_best_prior_state();var _Do=$k[--$j];var _Dp=$k[--$j];var _Dq=$k[--$j];$p(_Dq,_Dp,_Do);$k[$j++]=$_.bps_0;$k[$j++]=4;$q($_.code128_prioritized_latch_length_b1);$_.get_best_prior_state();var _Ds=$k[--$j];var _Dt=$k[--$j];var _Du=$k[--$j];$p(_Du,_Dt,_Ds);$k[$j++]=$_.bps_0;$k[$j++]=2;$q($_.code128_prioritized_latch_length_c0);$_.get_best_prior_state();var _Dw=$k[--$j];var _Dx=$k[--$j];var _Dy=$k[--$j];$p(_Dy,_Dx,_Dw);$k[$j++]=$_.bps_0;$k[$j++]=5;$q($_.code128_prioritized_latch_length_c1);$_.get_best_prior_state();var _E0=$k[--$j];var _E1=$k[--$j];var _E2=$k[--$j];$p(_E2,_E1,_E0)}};$_.backtrack=function(){$_.n=$_.msg.length;for(var _E4=0,_E5=$_.code128_reverse_priority.length;_E4<_E5;_E4++){var _E6=$g($_.code128_reverse_priority,_E4);var _E8=$g($_.bln_0,_E6);$k[$j++]=_E6;$k[$j++]=_E8;$k[$j++]=_E8}$j--;var _E9=$k[--$j];$_.len=_E9;var _EA=$k[--$j];$_.state=_EA;for(var _EB=0;_EB<5;_EB++){var _ED=$k[--$j];if($lt(_ED,$_.len)){var _EE=$k[--$j];$_.len=_EE;var _EF=$k[--$j];$_.state=_EF}else{$j-=2}}$k[$j++]=$a($_.len);for(;;){if($_.n<=0){break}$_.prior_state=$g($g($_.path,$_.n-1),$_.state);$k[$j++]=Infinity;$F($g($g($_.code128_latch_sequence,$_.state),$_.prior_state));$_.latch=$a();var _EY=($_.state==2||$_.state==5)&&$g($_.msg,$_.n-1)>=48?2:1;$_.n=$_.n-_EY;$_.c=$g($_.msg,$_.n);$k[$j++]="enc";if($g($_.encode,$_.state)()===true){break}var _Ef=$k[--$j];var _Eg=$k[--$j];$_[_Eg]=_Ef;$_.len=$f($_.len-$_.latch.length-$_.enc.length);var _Ek=$k[--$j];var _El=$_.len;var _Em=$_.latch;$P(_Ek,_El,_Em);$P(_Ek,$f(_El+_Em.length),$_.enc);$_.state=$_.prior_state;$k[$j++]=_Ek}var _Ep=$k[$j-1];$p(_Ep,0,$g($_.code128_start_code,$_.state))};$_.make_tables();$_.backtrack();var _Es=$k[--$j];$_.cws=_Es}$_.j=$_.cws.length;var _Ev=$a($_.j+2);$P(_Ev,0,$_.cws);$_.cws=_Ev;$_.csum=$g($_.cws,0);for(var _F1=1,_F0=$_.j-1;_F1<=_F0;_F1+=1){$_.i=_F1;$_.csum=$f($_.csum+$g($_.cws,$_.i)*$_.i)}$_.csum=$_.csum%103;$p($_.cws,$_.j,$_.csum);$p($_.cws,$_.j+1,106);if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#9609";$k[$j++]=$_.cws;bwipp_raiseerror()}$_.sbs=$s($_.cws.length*6+1);for(var _FK=0,_FJ=$_.cws.length-1;_FK<=_FJ;_FK+=1){$_.i=_FK;$P($_.sbs,$_.i*6,$g($_.code128_encs,$g($_.cws,$_.i)))}$k[$j++]=Infinity;var _FR=$_.sbs;for(var _FS=0,_FT=_FR.length;_FS<_FT;_FS++){$k[$j++]=$g(_FR,_FS)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _FW=$_.sbs;var _Fb=[];for(var _FY=0,_FZ=~~(($_.sbs.length+1)/2);_FY<_FZ;_FY++){_Fb[_FY]=$_.height}_Fb=$a(_Fb);var _Ff=[];for(var _Fd=0,_Fe=~~(($_.sbs.length+1)/2);_Fd<_Fe;_Fd++){_Ff[_Fd]=0}_Ff=$a(_Ff);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_FW;$k[$j++]="bhs";$k[$j++]=_Fb;$k[$j++]="bbs";$k[$j++]=_Ff;$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="opt";$k[$j++]=$_.options;var _Fo=$d();$k[$j++]=_Fo;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_gs1_128(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1_128.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.linkagea=false;$_.linkagec=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=false;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;if($_.barcode.length>500){$k[$j++]="bwipp.gs1128inputTooLong#9714";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.linkagea&&$_.linkagec){$k[$j++]="bwipp.gs1128badLinkage#9723";$k[$j++]="linkagea and linkagec cannot be used together";bwipp_raiseerror()}$_.text=$_.barcode;$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _9=$k[--$j];$_.fncs=_9;var _A=$k[--$j];$_.vals=_A;var _B=$k[--$j];$_.ais=_B;$_.fnc1=-1;$k[$j++]=Infinity;$k[$j++]=$_.fnc1;for(var _F=0,_E=$_.ais.length-1;_F<=_E;_F+=1){$_.i=_F;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){$k[$j++]=$_.fnc1}}$as($a($m()));var _U=$k[--$j];$_.c128=_U;$j--;$_.barcode=$s(($_.c128.length+1)*5);$_.j=0;$F($_.c128,function(){var _Y=$k[$j-1];if(_Y==$_.fnc1){$j--;$P($_.barcode,$_.j,"^FNC1");$_.j=$_.j+5}else{var _e=$k[--$j];$p($_.barcode,$_.j,_e);$_.j=$_.j+1}});if($_.linkagea||$_.linkagec){var _o=$_.barcode;var _n=$_.j;var _m=$_.linkagea?"^LNKA":"^LNKC";$P(_o,_n,_m);$_.j=$_.j+5}$_.barcode=$G($_.barcode,0,$_.j);if($_.height==-1){if(!($_.propspec&&$_.hnom!=-1)){$_.height=.5}}$del($_.options,"parse");$p($_.options,"height",$_.height);$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code128();var _12=$k[--$j];$_.args=_12;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_ean14(){var $__=$_;$_=Object.assign({},$_,bwipp_ean14.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.text=$_.barcode;var _5=$_.barcode;$k[$j++]=$s(_5.length);$k[$j++]=0;$F(_5,function(){var _7=$k[$j-1];if(_7!=32){var _8=$k[--$j];var _9=$k[--$j];var _A=$k[$j-1];$p(_A,_9,_8);$k[$j++]=_9+1}else{$j--}});var _B=$k[--$j];var _C=$k[--$j];$_.barcode=$G(_C,0,_B);$_.hasspace=$_.text.length!=$_.barcode.length;if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.ean14badLength#9869";$k[$j++]="EAN-14 must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.ean14badAI#9872";$k[$j++]="EAN-14 must begin with (01) application identifier";bwipp_raiseerror()}var _M=$G($_.barcode,4,$_.barcode.length-4);for(var _N=0,_O=_M.length;_N<_O;_N++){var _P=$g(_M,_N);if(_P<48||_P>57){$k[$j++]="bwipp.ean14badCharacter#9876";$k[$j++]="EAN-14 must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _Q=0;_Q<=12;_Q+=1){$_.i=_Q;var _Y=$_.checksum;var _X=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_X=_X*3}$_.checksum=$f(_Y+_X)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.ean14badCheckDigit#9891";$k[$j++]="Incorrect EAN-14 check digit provided";bwipp_raiseerror()}}else{var _f=$s(18);$P(_f,0,$_.barcode);$p(_f,17,$_.checksum+48);$_.barcode=_f;var _k=$_.hasspace?2:1;var _l=$s($_.text.length+_k);$P(_l,_l.length-2," ");$p(_l,_l.length-1,$_.checksum+48);$P(_l,0,$_.text);$_.text=_l}$_.gtin=$G($_.barcode,4,14);$_.barcode=$s(21);$P($_.barcode,0,"^FNC101");$P($_.barcode,7,$_.gtin);$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code128();var _x=$k[--$j];$_.args=_x;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_sscc18(){var $__=$_;$_=Object.assign({},$_,bwipp_sscc18.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.text=$_.barcode;var _5=$_.barcode;$k[$j++]=$s(_5.length);$k[$j++]=0;$F(_5,function(){var _7=$k[$j-1];if(_7!=32){var _8=$k[--$j];var _9=$k[--$j];var _A=$k[$j-1];$p(_A,_9,_8);$k[$j++]=_9+1}else{$j--}});var _B=$k[--$j];var _C=$k[--$j];$_.barcode=$G(_C,0,_B);$_.hasspace=$_.text.length!=$_.barcode.length;if($_.barcode.length!=21&&$_.barcode.length!=22){$k[$j++]="bwipp.sscc18badLength#9994";$k[$j++]="SSCC-18 must be 17 or 18 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(00)")){$k[$j++]="bwipp.sscc18badAI#9997";$k[$j++]="SSCC-18 must begin with (00) application identifier";bwipp_raiseerror()}var _M=$G($_.barcode,4,$_.barcode.length-4);for(var _N=0,_O=_M.length;_N<_O;_N++){var _P=$g(_M,_N);if(_P<48||_P>57){$k[$j++]="bwipp.sscc18badCharacter#10001";$k[$j++]="SSCC-18 must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _Q=0;_Q<=16;_Q+=1){$_.i=_Q;var _Y=$_.checksum;var _X=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_X=_X*3}$_.checksum=$f(_Y+_X)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==22){if($g($_.barcode,21)!=$_.checksum+48){$k[$j++]="bwipp.sscc18badCheckDigit#10016";$k[$j++]="Incorrect SSCC-18 check digit provided";bwipp_raiseerror()}}else{var _f=$s(22);$P(_f,0,$_.barcode);$p(_f,21,$_.checksum+48);$_.barcode=_f;var _k=$_.hasspace?2:1;var _l=$s($_.text.length+_k);$P(_l,_l.length-2," ");$p(_l,_l.length-1,$_.checksum+48);$P(_l,0,$_.text);$_.text=_l}$_.sscc=$G($_.barcode,4,18);$_.barcode=$s(25);$P($_.barcode,0,"^FNC100");$P($_.barcode,7,$_.sscc);$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code128();var _x=$k[--$j];$_.args=_x;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code39(){if(!bwipp_code39.globals){var $__=$_;$_=bwipp_code39.globals={};$_.code39_encs=$a(["1113313111","3113111131","1133111131","3133111111","1113311131","3113311111","1133311111","1113113131","3113113111","1133113111","3111131131","1131131131","3131131111","1111331131","3111331111","1131331111","1111133131","3111133111","1131133111","1111333111","3111111331","1131111331","3131111311","1111311331","3111311311","1131311311","1111113331","3111113311","1131113311","1111313311","3311111131","1331111131","3331111111","1311311131","3311311111","1331311111","1311113131","3311113111","1331113111","1313131111","1313111311","1311131311","1113131311","1311313111"]);$_.code39_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _1=0;_1<=42;_1+=1){$p($_.charvals,$G($_.code39_barchars,_1,1),_1)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code39.globals);$_.dontdraw=false;$_.includecheck=false;$_.validatecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.hidestars=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _5=$k[--$j];$_.options=_5;var _6=$k[--$j];$_.barcode=_6;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.code39emptyData#10168";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.code39inputTooLong#10172";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _D=0,_C=$_.barcode.length-1;_D<=_C;_D+=1){if(!$has($_.charvals,$G($_.barcode,_D,1))){$k[$j++]="bwipp.code39badCharacter#10180";$k[$j++]="Code 39 must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _L=$_.barcode.length;if($_.validatecheck){_L=_L-1}$_.barlen=_L;$_.checksum=0;for(var _P=0,_O=$_.barlen-1;_P<=_O;_P+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_P,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.code39_barchars,$_.checksum)){$k[$j++]="bwipp.code39badCheckDigit#10200";$k[$j++]="Incorrect Code 39 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen);$_.includecheck=true}var _h=$_.includecheck?3:2;$_.sbs=$s($f($_.barlen+_h)*10);$P($_.sbs,0,$g($_.code39_encs,43));for(var _n=0,_m=$_.barlen-1;_n<=_m;_n+=1){$_.i=_n;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.sbs,$_.i*10+10,$g($_.code39_encs,$_.indx))}if($_.includecheck){$P($_.sbs,$_.barlen*10+10,$g($_.code39_encs,$_.checksum));$P($_.sbs,$_.barlen*10+20,$g($_.code39_encs,43))}else{$P($_.sbs,$_.barlen*10+10,$g($_.code39_encs,43))}var _19=!$_.hidestars?2:0;var _1E=$f(_19+$_.barlen);if($_.includecheck&&$_.includecheckintext){_1E=_1E+1}$_.slen=_1E;$_.text=$s($_.slen);$_.tpos=0;if(!$_.hidestars){$P($_.text,$_.tpos,"*");$_.tpos=$_.tpos+1}$P($_.text,$_.tpos,$_.barcode);$_.tpos=$f($_.tpos+$_.barlen);if($_.includecheck&&$_.includecheckintext){$P($_.text,$_.tpos,$G($_.code39_barchars,$_.checksum,1));$_.tpos=$_.tpos+1}if(!$_.hidestars){$P($_.text,$_.tpos,"*")}$k[$j++]=Infinity;var _1b=$_.sbs;for(var _1c=0,_1d=_1b.length;_1c<_1d;_1c++){$k[$j++]=$g(_1b,_1c)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _1g=$_.sbs;var _1l=[];for(var _1i=0,_1j=~~(($_.sbs.length+1)/2);_1i<_1j;_1i++){_1l[_1i]=$_.height}_1l=$a(_1l);var _1p=[];for(var _1n=0,_1o=~~(($_.sbs.length+1)/2);_1n<_1o;_1n++){_1p[_1n]=0}_1p=$a(_1p);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1g;$k[$j++]="bhs";$k[$j++]=_1l;$k[$j++]="bbs";$k[$j++]=_1p;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _1x=$d();$k[$j++]=_1x;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code39ext(){if(!bwipp_code39ext.globals){var $__=$_;$_=bwipp_code39ext.globals={};$_.code39ext_extencs=$a(["%U","$A","$B","$C","$D","$E","$F","$G","$H","$I","$J","$K","$L","$M","$N","$O","$P","$Q","$R","$S","$T","$U","$V","$W","$X","$Y","$Z","%A","%B","%C","%D","%E"," ","/A","/B","/C","/D","/E","/F","/G","/H","/I","/J","/K","/L","-",".","/O","0","1","2","3","4","5","6","7","8","9","/Z","%F","%G","%H","%I","%J","%V","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","%K","%L","%M","%N","%O","%W","+A","+B","+C","+D","+E","+F","+G","+H","+I","+J","+K","+L","+M","+N","+O","+P","+Q","+R","+S","+T","+U","+V","+W","+X","+Y","+Z","%P","%Q","%R","%S","%T"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code39ext.globals);$_.dontdraw=false;$_.includetext=false;$_.hidestars=false;$_.parse=false;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.code39extinputTooLong#10327";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _9=$k[--$j];$_.barcode=_9;$_.barlen=$_.barcode.length;$del($_.options,"parse");$F($_.barcode,function(){var _D=$k[--$j];if(_D>=128){$k[$j++]="bwipp.code39extBadCharacter#10354";$k[$j++]="Code 39 Extended must contain only ASCII characters";bwipp_raiseerror()}});$_.newcode=$s($_.barlen*2);$_.newtext=$s($_.barlen*2);$_.j=0;for(var _K=0,_J=$_.barlen-1;_K<=_J;_K+=1){$_.i=_K;$_.extchar=$g($_.code39ext_extencs,$g($_.barcode,$_.i));$P($_.newcode,$_.j,$_.extchar);var _W=$g($_.barcode,$_.i);var _Z=$_.newtext;var _Y=$_.j;if(_W<32||_W==127){_W=32}$p(_Z,_Y,_W);if($_.extchar.length!=1){$p($_.newtext,$_.j+1,32)}$_.j=$_.j+$_.extchar.length}$_.newcode=$G($_.newcode,0,$_.j);$_.newtext=$G($_.newtext,0,$_.j);$_.bwipp_dontdraw=true;$k[$j++]=$_.newcode;$k[$j++]=$_.options;bwipp_code39();var _n=$k[--$j];$_.args=_n;if($_.includetext){$_.txt=$g($_.args,"txt");$_.txtstr=$g($g($_.txt,0),0);var _w=$_.hidestars?0:1;$P($_.txtstr,_w,$_.newtext);$p($_.args,"txt",$_.txt)}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code32(){var $__=$_;$_=Object.assign({},$_,bwipp_code32.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.text1xoffset=0;$_.height=-1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=8&&$_.barcode.length!=9){$k[$j++]="bwipp.code32badLength#10449";$k[$j++]="Italian Pharmacode must be 8 or 9 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.code32badCharacter#10453";$k[$j++]="Italian Pharmacode must contain only digits";bwipp_raiseerror()}});$_.checksum=0;for(var _8=0;_8<=7;_8+=1){$_.i=_8;$k[$j++]=$g($_.barcode,$_.i)-48;if($_.i%2!=0){var _D=$k[--$j];$k[$j++]=_D*2}var _E=$k[$j-1];if(_E>9){$k[$j-1]-=9}var _H=$k[--$j];$_.checksum=$f(_H+$_.checksum)}$_.checksum=$_.checksum%10;if($_.barcode.length==9){if($g($_.barcode,8)!=$_.checksum+48){$k[$j++]="bwipp.code32badCheckDigit#10469";$k[$j++]="Incorrect Italian Pharmacode check digit provided";bwipp_raiseerror()}}var _N=$s(10);$P(_N,0,$_.barcode);$p(_N,8,$_.checksum+48);$_.text=_N;$_.val=$R($s(6),$i($_.text),32);$_.barcode=$s(6);for(var _U=0;_U<=5;_U+=1){$p($_.barcode,_U,48)}$P($_.barcode,6-$_.val.length,$_.val);for(var _Z=0;_Z<=5;_Z+=1){var _b=$g($_.barcode,_Z);$k[$j++]=_Z;$k[$j++]=_b;$k[$j++]=_b;for(var _c=0,_d="AEIO".length;_c<_d;_c++){var _f=$k[--$j];if(_f>=$g("AEIO",_c)){$k[$j-1]+=1}var _h=$k[$j-1];$k[$j++]=_h}$k[$j-1]=$_.barcode;var _j=$k[$j-2];var _k=$k[$j-3];var _l=$k[$j-1];$j-=3;$p(_l,_k,_j)}$P($_.text,1,$G($_.text,0,9));$p($_.text,0,65);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code39();var _s=$k[--$j];$_.args=_s;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_pzn(){var $__=$_;$_=Object.assign({},$_,bwipp_pzn.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.text1xoffset=0;$_.height=-1;$_.pzn8=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.pzn8){if($_.barcode.length!=7&&$_.barcode.length!=8){$k[$j++]="bwipp.pzn8badLength#10571";$k[$j++]="PZN8 must be 7 or 8 digits";bwipp_raiseerror()}}else{if($_.barcode.length!=6&&$_.barcode.length!=7){$k[$j++]="bwipp.pzn7badLength#10575";$k[$j++]="PZN7 must be 6 or 7 digits";bwipp_raiseerror()}}$F($_.barcode,function(){var _A=$k[--$j];if(_A<48||_A>57){$k[$j++]="bwipp.pznBadCharacter#10580";$k[$j++]="PZN must contain only digits";bwipp_raiseerror()}});var _C=$_.pzn8?9:8;$_.msglen=_C;$_.checksum=0;for(var _F=0,_E=$_.msglen-3;_F<=_E;_F+=1){$_.i=_F;var _L=$_.pzn8?1:2;$_.checksum=$f(($g($_.barcode,$_.i)-48)*($_.i+_L)+$_.checksum)}$_.checksum=$_.checksum%11;if($_.checksum==10){$k[$j++]="bwipp.pznBadInputSequence#10596";$k[$j++]="Incorrect PZN input sequence provided";bwipp_raiseerror()}if($_.barcode.length==$_.msglen-1){if($g($_.barcode,$_.msglen-2)!=$_.checksum+48){$k[$j++]="bwipp.pznBadCheckDigit#10600";$k[$j++]="Incorrect PZN check digit provided";bwipp_raiseerror()}}var _W=$s($_.msglen);$p(_W,0,45);$P(_W,1,$_.barcode);$p(_W,$_.msglen-1,$_.checksum+48);$_.msg=_W;$_.bwipp_dontdraw=true;$k[$j++]=$_.msg;$k[$j++]=$_.options;bwipp_code39();var _c=$k[--$j];$_.args=_c;$_.text=$s($_.msglen+5);$P($_.text,0,"PZN - ");$P($_.text,6,$G($_.msg,1,$_.msglen-1));$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code93(){if(!bwipp_code93.globals){var $__=$_;$_=bwipp_code93.globals={};$_.code93_encs=$a(["131112","111213","111312","111411","121113","121212","121311","111114","131211","141111","211113","211212","211311","221112","221211","231111","112113","112212","112311","122112","132111","111123","111222","111321","121122","131121","212112","212211","211122","211221","221121","222111","112122","112221","122121","123111","121131","311112","311211","321111","112131","113121","211131","121221","312111","311121","122211","111141","1111411"]);$_.code93_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.code93_sft1=-1;$_.code93_sft2=-2;$_.code93_sft3=-3;$_.code93_sft4=-4;$_.charvals=new Map;for(var _1=0;_1<=42;_1+=1){$p($_.charvals,$g($_.code93_barchars,_1),_1)}$p($_.charvals,$_.code93_sft1,43);$p($_.charvals,$_.code93_sft2,44);$p($_.charvals,$_.code93_sft3,45);$p($_.charvals,$_.code93_sft4,46);$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code93.globals);$_.dontdraw=false;$_.includecheck=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _9=$k[--$j];$_.options=_9;var _A=$k[--$j];$_.barcode=_A;if($_.barcode.length>500){$k[$j++]="bwipp.code93inputTooLong#10744";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["SFT$",$_.code93_sft1],["SFT%",$_.code93_sft2],["SFT/",$_.code93_sft3],["SFT+",$_.code93_sft4]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _I=$k[--$j];$_.msg=_I;$_.msglen=$_.msg.length;$F($_.msg,function(){var _M=$k[--$j];if(!$has($_.charvals,_M)){$k[$j++]="bwipp.code93BadCharacter#10773";$k[$j++]="Code 93 must only contain digits, capital letters, spaces, the symbols -.$/+ and shift non-data characters";bwipp_raiseerror()}});if($_.includecheck){$_.sbs=$s($_.msglen*6+25)}else{$_.sbs=$s($_.msglen*6+13)}$P($_.sbs,0,$g($_.code93_encs,47));$_.checksum1=0;$_.checksum2=0;$_.text=$s($_.msglen);for(var _Z=0,_Y=$_.msglen-1;_Z<=_Y;_Z+=1){$_.i=_Z;$_.indx=$g($_.charvals,$g($_.msg,$_.i));$P($_.sbs,$_.i*6+6,$g($_.code93_encs,$_.indx));var _n=$g($_.msg,$_.i);var _q=$_.text;var _p=$_.i;if(_n<0){_n=32}$p(_q,_p,_n);$_.checksum1=$f($_.checksum1+(($_.msglen-$_.i-1)%20+1)*$_.indx);$_.checksum2=$f($_.checksum2+(($_.msglen-$_.i)%15+1)*$_.indx)}if($_.includecheck){$_.checksum1=$_.checksum1%47;$_.checksum2=$f($_.checksum2+$_.checksum1)%47;$P($_.sbs,$_.msglen*6+6,$g($_.code93_encs,$_.checksum1));$P($_.sbs,$_.msglen*6+12,$g($_.code93_encs,$_.checksum2));$P($_.sbs,$_.msglen*6+18,$g($_.code93_encs,48))}else{$P($_.sbs,$_.msglen*6+6,$g($_.code93_encs,48))}$k[$j++]=Infinity;var _1H=$_.sbs;for(var _1I=0,_1J=_1H.length;_1I<_1J;_1I++){$k[$j++]=$g(_1H,_1I)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _1M=$_.sbs;var _1R=[];for(var _1O=0,_1P=~~(($_.sbs.length+1)/2);_1O<_1P;_1O++){_1R[_1O]=$_.height}_1R=$a(_1R);var _1V=[];for(var _1T=0,_1U=~~(($_.sbs.length+1)/2);_1T<_1U;_1T++){_1V[_1T]=0}_1V=$a(_1V);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1M;$k[$j++]="bhs";$k[$j++]=_1R;$k[$j++]="bbs";$k[$j++]=_1V;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _1d=$d();$k[$j++]=_1d;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code93ext(){if(!bwipp_code93ext.globals){var $__=$_;$_=bwipp_code93ext.globals={};$_.code93ext_extencs=$a(["^SFT%U","^SFT$A","^SFT$B","^SFT$C","^SFT$D","^SFT$E","^SFT$F","^SFT$G","^SFT$H","^SFT$I","^SFT$J","^SFT$K","^SFT$L","^SFT$M","^SFT$N","^SFT$O","^SFT$P","^SFT$Q","^SFT$R","^SFT$S","^SFT$T","^SFT$U","^SFT$V","^SFT$W","^SFT$X","^SFT$Y","^SFT$Z","^SFT%A","^SFT%B","^SFT%C","^SFT%D","^SFT%E"," ","^SFT/A","^SFT/B","^SFT/C","$","%","^SFT/F","^SFT/G","^SFT/H","^SFT/I","^SFT/J","+","^SFT/L","-",".","/","0","1","2","3","4","5","6","7","8","9","^SFT/Z","^SFT%F","^SFT%G","^SFT%H","^SFT%I","^SFT%J","^SFT%V","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","^SFT%K","^SFT%L","^SFT%M","^SFT%N","^SFT%O","^SFT%W","^SFT+A","^SFT+B","^SFT+C","^SFT+D","^SFT+E","^SFT+F","^SFT+G","^SFT+H","^SFT+I","^SFT+J","^SFT+K","^SFT+L","^SFT+M","^SFT+N","^SFT+O","^SFT+P","^SFT+Q","^SFT+R","^SFT+S","^SFT+T","^SFT+U","^SFT+V","^SFT+W","^SFT+X","^SFT+Y","^SFT+Z","^SFT%P","^SFT%Q","^SFT%R","^SFT%S","^SFT%T"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code93ext.globals);$_.dontdraw=false;$_.includetext=false;$_.parse=false;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.code93extinputTooLong#10911";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _9=$k[--$j];$_.barcode=_9;$_.barlen=$_.barcode.length;$del($_.options,"parse");$_.newcode=$s($_.barlen*6);$_.newtext=$s($_.barlen*6);$_.j=0;$_.k=0;for(var _I=0,_H=$_.barlen-1;_I<=_H;_I+=1){$_.i=_I;var _L=$g($_.barcode,$_.i);$k[$j++]=_L;if(_L>127){$k[$j-1]="bwipp.code93extbadCharacter#10939";$k[$j++]="Code 93 Extended only support ASCII characters with values 0 to 127";bwipp_raiseerror()}var _M=$k[--$j];$_.extchar=$g($_.code93ext_extencs,_M);$_.extlen=$_.extchar.length;$P($_.newcode,$_.j,$_.extchar);var _W=$g($_.barcode,$_.i);var _Z=$_.newtext;var _Y=$_.k;if(_W<32||_W==127){_W=32}$p(_Z,_Y,_W);if($_.extlen!=1){$p($_.newtext,$_.k+1,32)}$_.j=$_.j+$_.extlen;var _h=$_.extlen==1?1:2;$_.k=$_.k+_h}$_.newcode=$G($_.newcode,0,$_.j);$_.newtext=$G($_.newtext,0,$_.k);$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.newcode;$k[$j++]=$_.options;bwipp_code93();var _r=$k[--$j];$_.args=_r;if($_.includetext){$_.txt=$g($_.args,"txt");$p($g($_.txt,0),0,$_.newtext);$p($_.args,"txt",$_.txt)}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_interleaved2of5(){if(!bwipp_interleaved2of5.globals){var $__=$_;$_=bwipp_interleaved2of5.globals={};$_.interleaved2of5_encs=$a(["11221","21112","12112","22111","11212","21211","12211","11122","21121","12121","1111","2111"]);$_.interleaved2of5_barchars="0123456789";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_interleaved2of5.globals);$_.dontdraw=false;$_.includecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.interleaved2of5inputTooLong#11046";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.interleaved2of5badCharacter#11059";$k[$j++]="Interleaved 2 of 5 must contain only digits";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;if($_.barlen%2==0&&$_.includecheck||$_.barlen%2!=0&&!$_.includecheck){$_.pad=$s($_.barlen+1);$p($_.pad,0,48);$P($_.pad,1,$_.barcode);$_.barcode=$_.pad;$_.barlen=$_.barlen+1}if($_.includecheck){$_.checksum=0;for(var _N=0,_M=$_.barlen-1;_N<=_M;_N+=1){$_.i=_N;if($_.i%2==0){$_.checksum=$_.checksum+($g($_.barcode,$_.i)-48)*3}else{$_.checksum=$_.checksum+($g($_.barcode,$_.i)-48)}}$_.checksum=(10-$_.checksum%10)%10;$_.pad=$s($_.barlen+1);$P($_.pad,0,$_.barcode);$p($_.pad,$_.barlen,$_.checksum+48);$_.barcode=$_.pad;$_.barlen=$_.barlen+1}$_.sbs=$s($_.barlen*5+8);$P($_.sbs,0,$g($_.interleaved2of5_encs,10));for(var _n=0,_m=$_.barlen-1;_n<=_m;_n+=2){$_.i=_n;$X($_.interleaved2of5_barchars,$G($_.barcode,$_.i,1));$j--;var _r=$k[--$j];$_.indx=_r.length;$j-=2;$_.enca=$g($_.interleaved2of5_encs,$_.indx);$X($_.interleaved2of5_barchars,$G($_.barcode,$_.i+1,1));$j--;var _x=$k[--$j];$_.indx=_x.length;$j-=2;$_.encb=$g($_.interleaved2of5_encs,$_.indx);$_.intl=$s($_.enca.length*2);for(var _14=0,_13=$_.enca.length-1;_14<=_13;_14+=1){$_.j=_14;$_.achar=$g($_.enca,$_.j);$_.bchar=$g($_.encb,$_.j);$p($_.intl,$_.j*2,$_.achar);$p($_.intl,$_.j*2+1,$_.bchar)}$P($_.sbs,$_.i*5+4,$_.intl)}$P($_.sbs,$_.barlen*5+4,$g($_.interleaved2of5_encs,11));var _1U=$_.barcode;var _1T=0;var _1S=$_.includecheck&&!$_.includecheckintext?$_.barlen-1:$_.barlen;$_.text=$G(_1U,_1T,_1S);$k[$j++]=Infinity;var _1X=$_.sbs;for(var _1Y=0,_1Z=_1X.length;_1Y<_1Z;_1Y++){$k[$j++]=$g(_1X,_1Y)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _1c=$_.sbs;var _1h=[];for(var _1e=0,_1f=~~(($_.sbs.length+1)/2);_1e<_1f;_1e++){_1h[_1e]=$_.height}_1h=$a(_1h);var _1l=[];for(var _1j=0,_1k=~~(($_.sbs.length+1)/2);_1j<_1k;_1j++){_1l[_1j]=0}_1l=$a(_1l);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1c;$k[$j++]="bhs";$k[$j++]=_1h;$k[$j++]="bbs";$k[$j++]=_1l;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="barratio";$k[$j++]=2;$k[$j++]="spaceratio";$k[$j++]=2;$k[$j++]="opt";$k[$j++]=$_.options;var _1t=$d();$k[$j++]=_1t;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_itf14(){var $__=$_;$_=Object.assign({},$_,bwipp_itf14.globals);$_.dontdraw=false;$_.includetext=false;$_.includecheckintext=true;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.text1yoffset=-3.5;$_.height=-1;$_.width=0;$_.modunit=1;$_.showborder=true;$_.borderwidth=4;$_.borderleft=10;$_.borderright=10;$_.bordertop=-.55;$_.borderbottom=-.55;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.text=$_.barcode;var _5=$_.barcode;$k[$j++]=$s(_5.length);$k[$j++]=0;$F(_5,function(){var _7=$k[$j-1];if(_7!=32){var _8=$k[--$j];var _9=$k[--$j];var _A=$k[$j-1];$p(_A,_9,_8);$k[$j++]=_9+1}else{$j--}});var _B=$k[--$j];var _C=$k[--$j];$_.barcode=$G(_C,0,_B);$_.hasspace=$_.text.length!=$_.barcode.length;if($_.barcode.length!=13&&$_.barcode.length!=14){$k[$j++]="bwipp.itf14badLength#11265";$k[$j++]="ITF-14 must be 13 or 14 digits";bwipp_raiseerror()}var _I=$_.barcode;for(var _J=0,_K=_I.length;_J<_K;_J++){var _L=$g(_I,_J);if(_L<48||_L>57){$k[$j++]="bwipp.itf14badCharacter#11269";$k[$j++]="ITF-14 must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _M=0;_M<=12;_M+=1){$_.i=_M;var _U=$_.checksum;var _T=$g($_.barcode,$_.i)-48;if($_.i%2==0){_T=_T*3}$_.checksum=$f(_U+_T)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==14){if($g($_.barcode,13)!=$_.checksum+48){$k[$j++]="bwipp.itf14badCheckDigit#11284";$k[$j++]="Incorrect ITF-14 check digit provided";bwipp_raiseerror()}}else{var _b=$s(14);$P(_b,0,$_.barcode);$p(_b,13,$_.checksum+48);$_.barcode=_b;var _g=$_.hasspace?2:1;var _h=$s($_.text.length+_g);$P(_h,_h.length-2," ");$p(_h,_h.length-1,$_.checksum+48);$P(_h,0,$_.text);$_.text=_h}if($_.height==-1){if(!($_.propspec&&$_.hnom!=-1)){$_.height=.5}}$p($_.options,"showborder",$_.showborder);$p($_.options,"borderwidth",$_.borderwidth);$p($_.options,"borderleft",$_.borderleft);$p($_.options,"borderright",$_.borderright);$p($_.options,"bordertop",$_.bordertop);$p($_.options,"borderbottom",$_.borderbottom);$p($_.options,"height",$_.height);$p($_.options,"text1yoffset",$_.text1yoffset);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_interleaved2of5();var _15=$k[--$j];$_.args=_15;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_identcode(){var $__=$_;$_=Object.assign({},$_,bwipp_identcode.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=11&&$_.barcode.length!=12){$k[$j++]="bwipp.identcodeBadLength#11395";$k[$j++]="Deutsche Post Identcode must be 11 or 12 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.identcodeBadCharacter#11399";$k[$j++]="Deutsche Post Identcode must contain only digits";bwipp_raiseerror()}});$_.checksum=0;for(var _8=0;_8<=10;_8+=1){$_.i=_8;var _H=$_.checksum;var _G=$g($_.barcode,$_.i)-48;if($_.i%2==0){_G=_G*4}else{_G=_G*9}$_.checksum=$f(_H+_G)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==12){if($g($_.barcode,11)!=$_.checksum+48){$k[$j++]="bwipp.identcodeBadCheckDigit#11414";$k[$j++]="Incorrect Deutsche Post Identcode check digit provided";bwipp_raiseerror()}}var _O=$s(12);$P(_O,0,$_.barcode);$p(_O,11,$_.checksum+48);$_.barcode=_O;$_.text=$Z($s(16)," . . ");$P($_.text,0,$G($_.barcode,0,2));$P($_.text,3,$G($_.barcode,2,3));$P($_.text,7,$G($_.barcode,5,3));$P($_.text,11,$G($_.barcode,8,3));$P($_.text,15,$G($_.barcode,11,1));$p($_.options,"includecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_interleaved2of5();var _l=$k[--$j];$_.args=_l;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_leitcode(){var $__=$_;$_=Object.assign({},$_,bwipp_leitcode.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=13&&$_.barcode.length!=14){$k[$j++]="bwipp.leitcodeBadLength#11504";$k[$j++]="Deutsche Post Leitcode must be 13 or 14 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.leitcodeBadCharacter#11508";$k[$j++]="Deutsche Post Leitcode must contain only digits";bwipp_raiseerror()}});$_.checksum=0;for(var _8=0;_8<=12;_8+=1){$_.i=_8;var _H=$_.checksum;var _G=$g($_.barcode,$_.i)-48;if($_.i%2==0){_G=_G*4}else{_G=_G*9}$_.checksum=$f(_H+_G)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==14){if($g($_.barcode,13)!=$_.checksum+48){$k[$j++]="bwipp.leitcodeBadCheckDigit#11523";$k[$j++]="Incorrect Deutsche Post Leitcode check digit provided";bwipp_raiseerror()}}var _O=$s(14);$P(_O,0,$_.barcode);$p(_O,13,$_.checksum+48);$_.barcode=_O;$_.text=$Z($s(18)," . . . ");$P($_.text,0,$G($_.barcode,0,5));$P($_.text,6,$G($_.barcode,5,3));$P($_.text,10,$G($_.barcode,8,3));$P($_.text,14,$G($_.barcode,11,2));$P($_.text,17,$G($_.barcode,13,1));$p($_.options,"includecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_interleaved2of5();var _l=$k[--$j];$_.args=_l;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_databaromni(){if(!bwipp_databaromni.globals){var $__=$_;$_=bwipp_databaromni.globals={};$_.databaromni_tab164=$a([160,0,12,4,8,1,161,1,960,161,10,6,6,3,80,10,2014,961,8,8,4,5,31,34,2714,2015,6,10,3,6,10,70,2840,2715,4,12,1,8,1,126]);$_.databaromni_tab154=$a([335,0,5,10,2,7,4,84,1035,336,7,8,4,5,20,35,1515,1036,9,6,6,3,48,10,1596,1516,11,4,8,1,81,1]);$_.databaromni_checkweights=$a([1,3,9,27,2,6,18,54,58,72,24,8,29,36,12,4,74,51,17,32,37,65,48,16,64,34,23,69,49,68,46,59]);$_.databaromni_checkwidths=$a([3,8,2,1,1,3,5,5,1,1,3,3,7,1,1,3,1,9,1,1,2,7,4,1,1,2,5,6,1,1,2,3,8,1,1,1,5,7,1,1,1,3,9,1,1]);$_.databaromni_seppad=$a([0,0,0,0]);$_.databaromni_findersep=$a([0,0,0,0,0,0,0,0,0,0,1,0,0]);$_.databaromni_f3pat=$a([1,1,1,1,1,1,1,1,1,0,1,1,1]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databaromni.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.linkage=false;$_.format="omni";$_.barxmult=33;$_.modunit=1;bwipp_processoptions();var _7=$k[--$j];$_.options=_7;var _8=$k[--$j];$_.barcode=_8;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.databaromniBadLength#11656";$k[$j++]="GS1 DataBar Omnidirectional must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.databaromniBadAI#11659";$k[$j++]="GS1 DataBar Omnidirectional must begin with (01) application identifier";bwipp_raiseerror()}var _H=$G($_.barcode,4,$_.barcode.length-4);for(var _I=0,_J=_H.length;_I<_J;_I++){var _K=$g(_H,_I);if(_K<48||_K>57){$k[$j++]="bwipp.databaromniBadCharacter#11663";$k[$j++]="GS1 DataBar Omnidirectional must contain only digits";bwipp_raiseerror()}}if($_.barxmult<33){$k[$j++]="bwipp.databarStackedOmniBarXmult#11668";$k[$j++]="GS1 DataBar Stacked Omnidirectional must have a barxmult of at least 33";bwipp_raiseerror()}if($ne($_.format,"omni")&&$ne($_.format,"stacked")&&$ne($_.format,"stackedomni")&&$ne($_.format,"truncated")){$k[$j++]="bwipp.databaromniBadFormat#11672";$k[$j++]="Valid formats are omni, stacked, stackedomni and truncated";bwipp_raiseerror()}if($eq($_.format,"truncated")&&$_.height==-1){$_.height=13/72}$_.checksum=0;for(var _S=0;_S<=12;_S+=1){$_.i=_S;var _a=$_.checksum;var _Z=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_Z=_Z*3}$_.checksum=$f(_a+_Z)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.databaromniBadCheckDigit#11694";$k[$j++]="Incorrect GS1 DataBar Omnidirectional check digit provided";bwipp_raiseerror()}}var _h=$s(18);$P(_h,0,$_.barcode);$p(_h,17,$_.checksum+48);$_.barcode=_h;$_.txt=$a($_.barcode.length);for(var _o=0,_n=$_.barcode.length-1;_o<=_n;_o+=1){$_.i=_o;$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$_.ncr=function(){var _v=$k[--$j];var _w=$k[--$j];var _x=$f(_w-_v);if(_v<$f(_w-_v)){var _=_x;_x=_v;_v=_}$k[$j++]=_x;$k[$j++]=1;$k[$j++]=1;for(var _z=_w,_y=_v+1;_z>=_y;_z-=1){var _10=$k[--$j];var _11=$k[$j-1];var _12=$k[$j-2];$k[$j++]=_10*_z;if($le(_11,_12)){var _13=$k[--$j];var _14=$k[--$j];$k[$j++]=_14+1;$k[$j++]=~~(_13/_14)}}for(;;){var _16=$k[$j-2];var _17=$k[$j-3];if($gt(_16,_17)){break}var _18=$k[--$j];var _19=$k[--$j];$k[$j++]=_19+1;$k[$j++]=~~(_18/_19)}var _1A=$k[--$j];$j--;$k[$j-1]=_1A};$_.getRSSwidths=function(){var _1E=$k[--$j];$_.oe=_1E;var _1F=$k[--$j];$_.el=_1F;var _1G=$k[--$j];$_.mw=_1G;var _1H=$k[--$j];$_.nm=_1H;var _1I=$k[--$j];$_.val=_1I;$_.out=$a($_.el);$_.mask=0;for(var _1N=0,_1M=$_.el-2;_1N<=_1M;_1N+=1){$_.bar=_1N;$_.ew=1;$_.mask=$_.mask|$bs(1,$_.bar);for(;;){$k[$j++]="sval";$k[$j++]=$f($_.nm-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _1U=$k[--$j];var _1V=$k[--$j];$_[_1V]=_1U;if($_.oe&&$_.mask==0&&$f($_.nm-$_.ew-$_.el*2+$_.bar*2)>=-2){$k[$j++]="sval";$k[$j++]=$_.sval;$k[$j++]=$f($_.nm-$_.ew-$_.el+$_.bar);$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _1j=$k[--$j];var _1k=$k[--$j];var _1l=$k[--$j];$_[_1l]=$f(_1k-_1j)}if($f($_.el-$_.bar)>2){$_.lval=0;for(var _1u=$f($_.nm-$_.ew-$_.el+$_.bar)+2,_1t=$_.mw+1;_1u>=_1t;_1u-=1){$k[$j++]=$f($_.nm-_1u-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-3;$_.ncr();var _1z=$k[--$j];$_.lval=$f(_1z+$_.lval)}$_.sval=$f($_.sval-$_.lval*($_.el-$_.bar-1))}else{if($f($_.nm-$_.ew)>$_.mw){$_.sval=$_.sval-1}}$_.val=$f($_.val-$_.sval);if($_.val<0){break}$_.ew=$_.ew+1;$_.mask=$_.mask&~$bs(1,$_.bar)}$_.val=$f($_.val+$_.sval);$_.nm=$f($_.nm-$_.ew);$p($_.out,$_.bar,$_.ew)}$p($_.out,$_.el-1,$_.nm);$k[$j++]=$_.out};$k[$j++]=Infinity;var _2R=$_.linkage?1:0;var _2T=$G($_.barcode,4,13);$k[$j++]=_2R;for(var _2U=0,_2V=_2T.length;_2U<_2V;_2U++){$k[$j++]=$g(_2T,_2U)-48}$_.binval=$a();for(var _2X=0;_2X<=12;_2X+=1){$_.i=_2X;var _2Y=$_.binval;var _2Z=$_.i;$p(_2Y,_2Z+1,$f($g(_2Y,_2Z+1)+$g($_.binval,$_.i)%4537077*10));$p($_.binval,$_.i,~~($g($_.binval,$_.i)/4537077))}$_.right=$g($_.binval,13)%4537077;var _2l=$_.binval;$p(_2l,13,~~($g(_2l,13)/4537077));$_.left=0;$_.i=true;for(var _2n=0;_2n<=13;_2n+=1){$_.j=_2n;var _2q=$g($_.binval,$_.j);$k[$j++]=_2q;if(_2q==0&&$_.i){$j--}else{$_.i=false;$k[$j++]="left";$k[$j++]=$_.left;var _2u=$k[$j-3];var _2v=$k[$j-1];var _2w=$k[$j-2];$j-=3;$_[_2w]=$f(_2v+_2u*$pow(10,13-$_.j))}}$_.d1=~~($_.left/1597);$_.d2=$_.left%1597;$_.d3=~~($_.right/1597);$_.d4=$_.right%1597;$_.i=0;for(;;){if($_.d1<=$g($_.databaromni_tab164,$_.i)){$q($G($_.databaromni_tab164,$_.i+1,7));var _36=$k[--$j];$_.d1te=_36;var _37=$k[--$j];$_.d1to=_37;var _38=$k[--$j];$_.d1mwe=_38;var _39=$k[--$j];$_.d1mwo=_39;var _3A=$k[--$j];$_.d1ele=_3A;var _3B=$k[--$j];$_.d1elo=_3B;var _3C=$k[--$j];$_.d1gs=_3C;break}$_.i=$_.i+8}$_.i=0;for(;;){if($_.d2<=$g($_.databaromni_tab154,$_.i)){$q($G($_.databaromni_tab154,$_.i+1,7));var _3J=$k[--$j];$_.d2te=_3J;var _3K=$k[--$j];$_.d2to=_3K;var _3L=$k[--$j];$_.d2mwe=_3L;var _3M=$k[--$j];$_.d2mwo=_3M;var _3N=$k[--$j];$_.d2ele=_3N;var _3O=$k[--$j];$_.d2elo=_3O;var _3P=$k[--$j];$_.d2gs=_3P;break}$_.i=$_.i+8}$_.i=0;for(;;){if($_.d3<=$g($_.databaromni_tab164,$_.i)){$q($G($_.databaromni_tab164,$_.i+1,7));var _3W=$k[--$j];$_.d3te=_3W;var _3X=$k[--$j];$_.d3to=_3X;var _3Y=$k[--$j];$_.d3mwe=_3Y;var _3Z=$k[--$j];$_.d3mwo=_3Z;var _3a=$k[--$j];$_.d3ele=_3a;var _3b=$k[--$j];$_.d3elo=_3b;var _3c=$k[--$j];$_.d3gs=_3c;break}$_.i=$_.i+8}$_.i=0;for(;;){if($_.d4<=$g($_.databaromni_tab154,$_.i)){$q($G($_.databaromni_tab154,$_.i+1,7));var _3j=$k[--$j];$_.d4te=_3j;var _3k=$k[--$j];$_.d4to=_3k;var _3l=$k[--$j];$_.d4mwe=_3l;var _3m=$k[--$j];$_.d4mwo=_3m;var _3n=$k[--$j];$_.d4ele=_3n;var _3o=$k[--$j];$_.d4elo=_3o;var _3p=$k[--$j];$_.d4gs=_3p;break}$_.i=$_.i+8}$k[$j++]="d1wo";$k[$j++]=~~($f($_.d1-$_.d1gs)/$_.d1te);$k[$j++]=$_.d1elo;$k[$j++]=$_.d1mwo;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _3w=$k[--$j];var _3x=$k[--$j];$_[_3x]=_3w;$k[$j++]="d1we";$k[$j++]=$f($_.d1-$_.d1gs)%$_.d1te;$k[$j++]=$_.d1ele;$k[$j++]=$_.d1mwe;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _43=$k[--$j];var _44=$k[--$j];$_[_44]=_43;$k[$j++]="d2wo";$k[$j++]=$f($_.d2-$_.d2gs)%$_.d2to;$k[$j++]=$_.d2elo;$k[$j++]=$_.d2mwo;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _4A=$k[--$j];var _4B=$k[--$j];$_[_4B]=_4A;$k[$j++]="d2we";$k[$j++]=~~($f($_.d2-$_.d2gs)/$_.d2to);$k[$j++]=$_.d2ele;$k[$j++]=$_.d2mwe;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _4H=$k[--$j];var _4I=$k[--$j];$_[_4I]=_4H;$k[$j++]="d3wo";$k[$j++]=~~($f($_.d3-$_.d3gs)/$_.d3te);$k[$j++]=$_.d3elo;$k[$j++]=$_.d3mwo;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _4O=$k[--$j];var _4P=$k[--$j];$_[_4P]=_4O;$k[$j++]="d3we";$k[$j++]=$f($_.d3-$_.d3gs)%$_.d3te;$k[$j++]=$_.d3ele;$k[$j++]=$_.d3mwe;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _4V=$k[--$j];var _4W=$k[--$j];$_[_4W]=_4V;$k[$j++]="d4wo";$k[$j++]=$f($_.d4-$_.d4gs)%$_.d4to;$k[$j++]=$_.d4elo;$k[$j++]=$_.d4mwo;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _4c=$k[--$j];var _4d=$k[--$j];$_[_4d]=_4c;$k[$j++]="d4we";$k[$j++]=~~($f($_.d4-$_.d4gs)/$_.d4to);$k[$j++]=$_.d4ele;$k[$j++]=$_.d4mwe;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _4j=$k[--$j];var _4k=$k[--$j];$_[_4k]=_4j;$_.d1w=$a(8);for(var _4m=0;_4m<=3;_4m+=1){$_.i=_4m;$p($_.d1w,$_.i*2,$g($_.d1wo,$_.i));$p($_.d1w,$_.i*2+1,$g($_.d1we,$_.i))}$_.d2w=$a(8);for(var _4y=0;_4y<=3;_4y+=1){$_.i=_4y;$p($_.d2w,7-$_.i*2,$g($_.d2wo,$_.i));$p($_.d2w,6-$_.i*2,$g($_.d2we,$_.i))}$_.d3w=$a(8);for(var _5A=0;_5A<=3;_5A+=1){$_.i=_5A;$p($_.d3w,7-$_.i*2,$g($_.d3wo,$_.i));$p($_.d3w,6-$_.i*2,$g($_.d3we,$_.i))}$_.d4w=$a(8);for(var _5M=0;_5M<=3;_5M+=1){$_.i=_5M;$p($_.d4w,$_.i*2,$g($_.d4wo,$_.i));$p($_.d4w,$_.i*2+1,$g($_.d4we,$_.i))}$k[$j++]=Infinity;$q($_.d1w);$q($_.d2w);$q($_.d3w);$q($_.d4w);$_.widths=$a();$_.checksum=0;for(var _5b=0;_5b<=31;_5b+=1){$_.i=_5b;$_.checksum=$f($_.checksum+$g($_.widths,$_.i)*$g($_.databaromni_checkweights,$_.i))}$_.checksum=$_.checksum%79;if($_.checksum>=8){$_.checksum=$_.checksum+1}if($_.checksum>=72){$_.checksum=$_.checksum+1}$_.checklt=$G($_.databaromni_checkwidths,~~($_.checksum/9)*5,5);$_.checkrtrev=$G($_.databaromni_checkwidths,$_.checksum%9*5,5);$_.checkrt=$a(5);for(var _5s=0;_5s<=4;_5s+=1){$_.i=_5s;$p($_.checkrt,$_.i,$g($_.checkrtrev,4-$_.i))}if($eq($_.format,"omni")||$eq($_.format,"truncated")){$k[$j++]=Infinity;$k[$j++]=1;$q($_.d1w);$q($_.checklt);$q($_.d2w);$q($_.d4w);$q($_.checkrt);$q($_.d3w);$k[$j++]=1;$k[$j++]=1;$_.sbs=$a();if($_.height==-1){$_.height=33/72}$k[$j++]=Infinity;var _67=$_.sbs;var _6C=[];for(var _69=0,_6A=~~(($_.sbs.length+1)/2);_69<_6A;_69++){_6C[_69]=$_.height}_6C=$a(_6C);var _6G=[];for(var _6E=0,_6F=~~(($_.sbs.length+1)/2);_6E<_6F;_6E++){_6G[_6E]=0}_6G=$a(_6G);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_67;$k[$j++]="bhs";$k[$j++]=_6C;$k[$j++]="bbs";$k[$j++]=_6G;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="borderleft";$k[$j++]=0;$k[$j++]="borderright";$k[$j++]=0;$k[$j++]="opt";$k[$j++]=$_.options;var _6J=$d();$k[$j++]=_6J;if($_._render){bwipp_renlinear()}}else{$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=1;$q($_.d1w);$q($_.checklt);$q($_.d2w);$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$_.top=$a();$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=1;$q($_.d4w);$q($_.checkrt);$q($_.d3w);$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$_.bot=$a();for(var _6R=0;_6R<=24;_6R+=2){$_.i=_6R;for(var _6V=0,_6W=$g($_.top,$_.i);_6V<_6W;_6V++){$k[$j++]=0}for(var _6a=0,_6b=$g($_.top,$_.i+1);_6a<_6b;_6a++){$k[$j++]=1}}$as($a(50));var _6d=$k[--$j];$_.top=_6d;for(var _6e=0;_6e<=24;_6e+=2){$_.i=_6e;for(var _6i=0,_6j=$g($_.bot,$_.i);_6i<_6j;_6i++){$k[$j++]=1}for(var _6n=0,_6o=$g($_.bot,$_.i+1);_6n<_6o;_6n++){$k[$j++]=0}}$as($a(50));var _6q=$k[--$j];$_.bot=_6q;if($eq($_.format,"stacked")){$_.sep=$a(50);$p($_.sep,0,0);for(var _6u=1;_6u<=49;_6u+=1){$_.i=_6u;if($eq($g($_.top,$_.i),$g($_.bot,$_.i))){$p($_.sep,$_.i,1-$g($_.top,$_.i))}else{$p($_.sep,$_.i,1-$g($_.sep,$_.i-1))}}$P($_.sep,0,$_.databaromni_seppad);$P($_.sep,46,$_.databaromni_seppad);$k[$j++]=Infinity;$q($_.top);$q($_.sep);$q($_.bot);$_.pixs=$a();$_.rowmult=$a([5,1,7]);$_.pixy=13}if($eq($_.format,"stackedomni")){$k[$j++]=Infinity;$F($_.top,function(){var _7I=$k[--$j];$k[$j++]=1-_7I});$_.sep1=$a();$P($_.sep1,0,$_.databaromni_seppad);$P($_.sep1,46,$_.databaromni_seppad);for(var _7L=18;_7L<=30;_7L+=1){$_.i=_7L;if($g($_.top,$_.i)==0){if($g($_.top,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep1,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _7X=$k[--$j];$p($_.sep1,$_.i,_7X)}$k[$j++]=Infinity;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;for(var _7Z=0;_7Z<21;_7Z++){$k[$j++]=0;$k[$j++]=1}$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$_.sep2=$a();$k[$j++]=Infinity;$F($_.bot,function(){var _7b=$k[--$j];$k[$j++]=1-_7b});$_.sep3=$a();$P($_.sep3,0,$_.databaromni_seppad);$P($_.sep3,46,$_.databaromni_seppad);for(var _7e=19;_7e<=31;_7e+=1){$_.i=_7e;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep3,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _7q=$k[--$j];$p($_.sep3,$_.i,_7q)}var _7x=true;for(var _7s=0;_7s<=12;_7s+=1){_7x=_7x&&$eq($g($_.bot,_7s+19),$g($_.databaromni_f3pat,_7s))}if(_7x){$P($_.sep3,19,$_.databaromni_findersep)}$k[$j++]=Infinity;$q($_.top);$q($_.sep1);$q($_.sep2);$q($_.sep3);$q($_.bot);$_.pixs=$a();$_.rowmult=$a([$_.barxmult,1,1,1,$_.barxmult]);$_.pixy=$_.barxmult*2+3}$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",50],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",50/72],["borderleft",0],["borderright",0],["bordertop",0],["borderbottom",0],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}}$_=$__}function bwipp_databarstacked(){var $__=$_;$_=Object.assign({},$_,bwipp_databarstacked.globals);$_.dontdraw=false;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.databarstackedBadLength#12140";$k[$j++]="GS1 DataBar Stacked must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.databarstackedBadAI#12143";$k[$j++]="GS1 DataBar Stacked must begin with (01) application identifier";bwipp_raiseerror()}var _A=$G($_.barcode,4,$_.barcode.length-4);for(var _B=0,_C=_A.length;_B<_C;_B++){var _D=$g(_A,_B);if(_D<48||_D>57){$k[$j++]="bwipp.databarstackedBadCharacter#12147";$k[$j++]="GS1 DataBar Stacked must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _E=0;_E<=12;_E+=1){$_.i=_E;var _M=$_.checksum;var _L=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_L=_L*3}$_.checksum=$f(_M+_L)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.databarstackedBadCheckDigit#12162";$k[$j++]="Incorrect GS1 DataBar Stacked check digit provided";bwipp_raiseerror()}}var _T=$s(18);$P(_T,0,$_.barcode);$p(_T,17,$_.checksum+48);$_.barcode=_T;$p($_.options,"format","stacked");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_databaromni();var _Z=$k[--$j];$_.args=_Z;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarstackedomni(){var $__=$_;$_=Object.assign({},$_,bwipp_databarstackedomni.globals);$_.dontdraw=false;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.databarstackedomniBadLength#12266";$k[$j++]="GS1 DataBar Stacked Omnidirectional must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.databarstackedomniBadAI#12269";$k[$j++]="GS1 DataBar Stacked Omnidirectional must begin with (01) application identifier";bwipp_raiseerror()}var _A=$G($_.barcode,4,$_.barcode.length-4);for(var _B=0,_C=_A.length;_B<_C;_B++){var _D=$g(_A,_B);if(_D<48||_D>57){$k[$j++]="bwipp.databarstackedomniBadCharacter#12273";$k[$j++]="GS1 DataBar Stacked Omnidirectional must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _E=0;_E<=12;_E+=1){$_.i=_E;var _M=$_.checksum;var _L=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_L=_L*3}$_.checksum=$f(_M+_L)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.databarstackedomniBadCheckDigit#12288";$k[$j++]="Incorrect GS1 DataBar Stacked Omnidirectional check digit provided";bwipp_raiseerror()}}var _T=$s(18);$P(_T,0,$_.barcode);$p(_T,17,$_.checksum+48);$_.barcode=_T;$p($_.options,"format","stackedomni");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_databaromni();var _Z=$k[--$j];$_.args=_Z;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databartruncated(){var $__=$_;$_=Object.assign({},$_,bwipp_databartruncated.globals);$_.dontdraw=false;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.databartruncatedBadLength#12392";$k[$j++]="GS1 DataBar Truncated must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.databartruncatedBadAI#12395";$k[$j++]="GS1 DataBar Truncated must begin with (01) application identifier";bwipp_raiseerror()}var _A=$G($_.barcode,4,$_.barcode.length-4);for(var _B=0,_C=_A.length;_B<_C;_B++){var _D=$g(_A,_B);if(_D<48||_D>57){$k[$j++]="bwipp.databartruncatedBadCharacter#12399";$k[$j++]="GS1 DataBar Truncated must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _E=0;_E<=12;_E+=1){$_.i=_E;var _M=$_.checksum;var _L=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_L=_L*3}$_.checksum=$f(_M+_L)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.databartruncatedBadCheckDigit#12414";$k[$j++]="Incorrect GS1 DataBar Truncated check digit provided";bwipp_raiseerror()}}var _T=$s(18);$P(_T,0,$_.barcode);$p(_T,17,$_.checksum+48);$_.barcode=_T;$p($_.options,"format","truncated");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_databaromni();var _Z=$k[--$j];$_.args=_Z;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_databarlimited(){if(!bwipp_databarlimited.globals){var $__=$_;$_=bwipp_databarlimited.globals={};$_.databarlimited_linkval=$a([2,0,1,5,1,3,3,5,3,1,0,9,6]);$_.databarlimited_tab267=$a([183063,0,17,9,6,3,6538,28,820063,183064,13,13,5,4,875,728,1000775,820064,9,17,3,6,28,6454,1491020,1000776,15,11,5,4,2415,203,1979844,1491021,11,15,4,5,203,2408,1996938,1979845,19,7,8,1,17094,1,2013570,1996939,7,19,1,8,1,16632]);$_.databarlimited_checkweights=$a([1,3,9,27,81,65,17,51,64,14,42,37,22,66,20,60,2,6,18,54,73,41,34,13,39,28,84,74]);$k[$j++]=Infinity;for(var _3=0;_3<=43;_3+=1){$k[$j++]=_3}$k[$j++]=45;$k[$j++]=52;$k[$j++]=57;for(var _4=63;_4<=66;_4+=1){$k[$j++]=_4}for(var _5=73;_5<=79;_5+=1){$k[$j++]=_5}$k[$j++]=82;for(var _6=126;_6<=130;_6+=1){$k[$j++]=_6}$k[$j++]=132;for(var _7=141;_7<=146;_7+=1){$k[$j++]=_7}for(var _8=210;_8<=217;_8+=1){$k[$j++]=_8}$k[$j++]=220;for(var _9=316;_9<=320;_9+=1){$k[$j++]=_9}$k[$j++]=322;$k[$j++]=323;$k[$j++]=326;$k[$j++]=337;var _A=$a();$_.checkseq=_A;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarlimited.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.linkage=false;$_.modunit=1;bwipp_processoptions();var _B=$k[--$j];$_.options=_B;var _C=$k[--$j];$_.barcode=_C;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length!=17&&$_.barcode.length!=18){$k[$j++]="bwipp.databarlimitedBadLength#12576";$k[$j++]="GS1 DataBar Limited must be 13 or 14 digits";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"(01)")){$k[$j++]="bwipp.databarlimitedBadAI#12579";$k[$j++]="GS1 DataBar Limited must begin with (01) application identifier";bwipp_raiseerror()}var _K=$g($_.barcode,4);if(_K<48||_K>49){$k[$j++]="bwipp.databarlimitedBadStartDigit#12582";$k[$j++]="GS1 DataBar Limited must begin with 0 or 1";bwipp_raiseerror()}var _N=$G($_.barcode,5,$_.barcode.length-5);for(var _O=0,_P=_N.length;_O<_P;_O++){var _Q=$g(_N,_O);if(_Q<48||_Q>57){$k[$j++]="bwipp.databarlimitedBadCharacter#12586";$k[$j++]="GS1 DataBar Limited must contain only digits";bwipp_raiseerror()}}$_.checksum=0;for(var _R=0;_R<=12;_R+=1){$_.i=_R;var _Z=$_.checksum;var _Y=$g($_.barcode,$_.i+4)-48;if($_.i%2==0){_Y=_Y*3}$_.checksum=$f(_Z+_Y)}$_.checksum=(10-$_.checksum%10)%10;if($_.barcode.length==18){if($g($_.barcode,17)!=$_.checksum+48){$k[$j++]="bwipp.databarlimitedBadCheckDigit#12607";$k[$j++]="Incorrect GS1 DataBar Limited check digit provided";bwipp_raiseerror()}}var _g=$s(18);$P(_g,0,$_.barcode);$p(_g,17,$_.checksum+48);$_.barcode=_g;$k[$j++]=Infinity;var _k=$G($_.barcode,4,13);for(var _l=0,_m=_k.length;_l<_m;_l++){$k[$j++]=$g(_k,_l)-48}$_.binval=$a();if($_.linkage){for(var _r=0,_q=$_.binval.length-1;_r<=_q;_r+=1){$_.i=_r;$p($_.binval,$_.i,$f($g($_.binval,$_.i)+$g($_.databarlimited_linkval,$_.i)))}}$_.txt=$a($_.barcode.length);for(var _13=0,_12=$_.barcode.length-1;_13<=_12;_13+=1){$_.i=_13;$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$_.ncr=function(){var _1A=$k[--$j];var _1B=$k[--$j];var _1C=$f(_1B-_1A);if(_1A<$f(_1B-_1A)){var _=_1C;_1C=_1A;_1A=_}$k[$j++]=_1C;$k[$j++]=1;$k[$j++]=1;for(var _1E=_1B,_1D=_1A+1;_1E>=_1D;_1E-=1){var _1F=$k[--$j];var _1G=$k[$j-1];var _1H=$k[$j-2];$k[$j++]=_1F*_1E;if($le(_1G,_1H)){var _1I=$k[--$j];var _1J=$k[--$j];$k[$j++]=_1J+1;$k[$j++]=~~(_1I/_1J)}}for(;;){var _1L=$k[$j-2];var _1M=$k[$j-3];if($gt(_1L,_1M)){break}var _1N=$k[--$j];var _1O=$k[--$j];$k[$j++]=_1O+1;$k[$j++]=~~(_1N/_1O)}var _1P=$k[--$j];$j--;$k[$j-1]=_1P};$_.getRSSwidths=function(){var _1T=$k[--$j];$_.oe=_1T;var _1U=$k[--$j];$_.el=_1U;var _1V=$k[--$j];$_.mw=_1V;var _1W=$k[--$j];$_.nm=_1W;var _1X=$k[--$j];$_.val=_1X;$_.out=$a($_.el);$_.mask=0;for(var _1c=0,_1b=$_.el-2;_1c<=_1b;_1c+=1){$_.bar=_1c;$_.ew=1;$_.mask=$_.mask|$bs(1,$_.bar);for(;;){$k[$j++]="sval";$k[$j++]=$f($_.nm-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _1j=$k[--$j];var _1k=$k[--$j];$_[_1k]=_1j;if($_.oe&&$_.mask==0&&$f($_.nm-$_.ew-$_.el*2+$_.bar*2)>=-2){$k[$j++]="sval";$k[$j++]=$_.sval;$k[$j++]=$f($_.nm-$_.ew-$_.el+$_.bar);$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _1y=$k[--$j];var _1z=$k[--$j];var _20=$k[--$j];$_[_20]=$f(_1z-_1y)}if($f($_.el-$_.bar)>2){$_.lval=0;for(var _29=$f($_.nm-$_.ew-$_.el+$_.bar)+2,_28=$_.mw+1;_29>=_28;_29-=1){$k[$j++]=$f($_.nm-_29-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-3;$_.ncr();var _2E=$k[--$j];$_.lval=$f(_2E+$_.lval)}$_.sval=$f($_.sval-$_.lval*($_.el-$_.bar-1))}else{if($f($_.nm-$_.ew)>$_.mw){$_.sval=$_.sval-1}}$_.val=$f($_.val-$_.sval);if($_.val<0){break}$_.ew=$_.ew+1;$_.mask=$_.mask&~$bs(1,$_.bar)}$_.val=$f($_.val+$_.sval);$_.nm=$f($_.nm-$_.ew);$p($_.out,$_.bar,$_.ew)}$p($_.out,$_.el-1,$_.nm);$k[$j++]=$_.out};for(var _2f=0;_2f<=11;_2f+=1){$_.i=_2f;var _2g=$_.binval;var _2h=$_.i;$p(_2g,_2h+1,$f($g(_2g,_2h+1)+$g($_.binval,$_.i)%2013571*10));$p($_.binval,$_.i,~~($g($_.binval,$_.i)/2013571))}$_.d2=$g($_.binval,12)%2013571;var _2t=$_.binval;$p(_2t,12,~~($g(_2t,12)/2013571));$_.d1=0;$_.i=true;for(var _2v=0;_2v<=12;_2v+=1){$_.j=_2v;var _2y=$g($_.binval,$_.j);$k[$j++]=_2y;if(_2y==0&&$_.i){$j--}else{$_.i=false;$k[$j++]="d1";$k[$j++]=$_.d1;var _32=$k[$j-3];var _33=$k[$j-1];var _34=$k[$j-2];$j-=3;$_[_34]=$f(_33+_32*$pow(10,12-$_.j))}}$_.i=0;for(;;){if($_.d1<=$g($_.databarlimited_tab267,$_.i)){$q($G($_.databarlimited_tab267,$_.i+1,7));var _3A=$k[--$j];$_.d1te=_3A;var _3B=$k[--$j];$_.d1to=_3B;var _3C=$k[--$j];$_.d1mwe=_3C;var _3D=$k[--$j];$_.d1mwo=_3D;var _3E=$k[--$j];$_.d1ele=_3E;var _3F=$k[--$j];$_.d1elo=_3F;var _3G=$k[--$j];$_.d1gs=_3G;break}$_.i=$_.i+8}$_.i=0;for(;;){if($_.d2<=$g($_.databarlimited_tab267,$_.i)){$q($G($_.databarlimited_tab267,$_.i+1,7));var _3N=$k[--$j];$_.d2te=_3N;var _3O=$k[--$j];$_.d2to=_3O;var _3P=$k[--$j];$_.d2mwe=_3P;var _3Q=$k[--$j];$_.d2mwo=_3Q;var _3R=$k[--$j];$_.d2ele=_3R;var _3S=$k[--$j];$_.d2elo=_3S;var _3T=$k[--$j];$_.d2gs=_3T;break}$_.i=$_.i+8}$k[$j++]="d1wo";$k[$j++]=~~($f($_.d1-$_.d1gs)/$_.d1te);$k[$j++]=$_.d1elo;$k[$j++]=$_.d1mwo;$k[$j++]=7;$k[$j++]=false;$_.getRSSwidths();var _3a=$k[--$j];var _3b=$k[--$j];$_[_3b]=_3a;$k[$j++]="d1we";$k[$j++]=$f($_.d1-$_.d1gs)%$_.d1te;$k[$j++]=$_.d1ele;$k[$j++]=$_.d1mwe;$k[$j++]=7;$k[$j++]=true;$_.getRSSwidths();var _3h=$k[--$j];var _3i=$k[--$j];$_[_3i]=_3h;$k[$j++]="d2wo";$k[$j++]=~~($f($_.d2-$_.d2gs)/$_.d2te);$k[$j++]=$_.d2elo;$k[$j++]=$_.d2mwo;$k[$j++]=7;$k[$j++]=false;$_.getRSSwidths();var _3o=$k[--$j];var _3p=$k[--$j];$_[_3p]=_3o;$k[$j++]="d2we";$k[$j++]=$f($_.d2-$_.d2gs)%$_.d2te;$k[$j++]=$_.d2ele;$k[$j++]=$_.d2mwe;$k[$j++]=7;$k[$j++]=true;$_.getRSSwidths();var _3v=$k[--$j];var _3w=$k[--$j];$_[_3w]=_3v;$_.d1w=$a(14);for(var _3y=0;_3y<=6;_3y+=1){$_.i=_3y;$p($_.d1w,$_.i*2,$g($_.d1wo,$_.i));$p($_.d1w,$_.i*2+1,$g($_.d1we,$_.i))}$_.d2w=$a(14);for(var _4A=0;_4A<=6;_4A+=1){$_.i=_4A;$p($_.d2w,$_.i*2,$g($_.d2wo,$_.i));$p($_.d2w,$_.i*2+1,$g($_.d2we,$_.i))}$k[$j++]=Infinity;$q($_.d1w);$q($_.d2w);$_.widths=$a();$_.checksum=0;for(var _4N=0;_4N<=27;_4N+=1){$_.i=_4N;$_.checksum=$f($_.checksum+$g($_.widths,$_.i)*$g($_.databarlimited_checkweights,$_.i))}$_.checksum=$_.checksum%89;$_.seq=$g($_.checkseq,$_.checksum);$k[$j++]="swidths";$k[$j++]=~~($_.seq/21);$k[$j++]=8;$k[$j++]=3;$k[$j++]=6;$k[$j++]=false;$_.getRSSwidths();var _4Z=$k[--$j];var _4a=$k[--$j];$_[_4a]=_4Z;$k[$j++]="bwidths";$k[$j++]=$_.seq%21;$k[$j++]=8;$k[$j++]=3;$k[$j++]=6;$k[$j++]=false;$_.getRSSwidths();var _4c=$k[--$j];var _4d=$k[--$j];$_[_4d]=_4c;$_.checkwidths=$a([0,0,0,0,0,0,0,0,0,0,0,0,1,1]);for(var _4e=0;_4e<=5;_4e+=1){$_.i=_4e;$p($_.checkwidths,$_.i*2,$g($_.swidths,$_.i));$p($_.checkwidths,$_.i*2+1,$g($_.bwidths,$_.i))}$k[$j++]=Infinity;$k[$j++]=1;$q($_.d1w);$q($_.checkwidths);$q($_.d2w);$k[$j++]=1;$k[$j++]=1;$k[$j++]=5;$_.sbs=$a();if($_.height==-1){$_.height=10/72}$k[$j++]=Infinity;var _4t=$_.sbs;var _4y=[];for(var _4v=0,_4w=~~(($_.sbs.length+1)/2);_4v<_4w;_4v++){_4y[_4v]=$_.height}_4y=$a(_4y);var _52=[];for(var _50=0,_51=~~(($_.sbs.length+1)/2);_50<_51;_50++){_52[_50]=0}_52=$a(_52);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_4t;$k[$j++]="bhs";$k[$j++]=_4y;$k[$j++]="bbs";$k[$j++]=_52;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="borderleft";$k[$j++]=0;$k[$j++]="borderright";$k[$j++]=0;$k[$j++]="opt";$k[$j++]=$_.options;var _55=$d();$k[$j++]=_55;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_databarexpanded(){if(!bwipp_databarexpanded.globals){var $__=$_;$_=bwipp_databarexpanded.globals={};$_.databarexpanded_tab174=$a([347,0,12,5,7,2,87,4,1387,348,10,7,5,4,52,20,2947,1388,8,9,4,5,30,52,3987,2948,6,11,3,6,10,104,4191,3988,4,13,1,8,1,204]);$_.databarexpanded_finderwidths=$a([1,8,4,1,1,1,1,4,8,1,3,6,4,1,1,1,1,4,6,3,3,4,6,1,1,1,1,6,4,3,3,2,8,1,1,1,1,8,2,3,2,6,5,1,1,1,1,5,6,2,2,2,9,1,1,1,1,9,2,2]);$_.databarexpanded_finderseq=$a([$a([0,1]),$a([0,3,2]),$a([0,5,2,7]),$a([0,9,2,7,4]),$a([0,9,2,7,6,11]),$a([0,9,2,7,8,11,10]),$a([0,1,2,3,4,5,6,7]),$a([0,1,2,3,4,5,6,9,8]),$a([0,1,2,3,4,5,6,9,10,11]),$a([0,1,2,3,4,7,6,9,8,11,10])]);$_.databarexpanded_checkweights=$a([-1,-1,-1,-1,-1,-1,-1,-1,77,96,32,81,27,9,3,1,20,60,180,118,143,7,21,63,205,209,140,117,39,13,145,189,193,157,49,147,19,57,171,91,132,44,85,169,197,136,186,62,185,133,188,142,4,12,36,108,50,87,29,80,97,173,128,113,150,28,84,41,123,158,52,156,166,196,206,139,187,203,138,46,76,17,51,153,37,111,122,155,146,119,110,107,106,176,129,43,16,48,144,10,30,90,59,177,164,125,112,178,200,137,116,109,70,210,208,202,184,130,179,115,190,204,68,93,31,151,191,134,148,22,66,198,172,94,71,2,40,154,192,64,162,54,18,6,120,149,25,75,14,42,126,167,175,199,207,69,23,78,26,79,103,98,83,38,114,131,182,124,159,53,88,170,127,183,61,161,55,165,73,8,24,72,5,15,89,100,174,58,160,194,135,45]);$_.databarexpanded_fillpat=$a([0,0,1,0,0]);$_.databarexpanded_seppad=$a([0,0,0,0]);$_.databarexpanded_fnc1=-1;$_.databarexpanded_lnumeric=-2;$_.databarexpanded_lalphanumeric=-3;$_.databarexpanded_liso646=-4;$k[$j++]=Infinity;for(var _G=0;_G<=119;_G+=1){var _I=$Z($s(2),"00");var _K=$R($s(2),_G,11);$P(_I,2-_K.length,_K);$k[$j++]=_G;$k[$j++]=_I;if($g(_I,0)==65){var _M=$k[$j-1];$p(_M,0,94)}var _N=$k[$j-1];if($g(_N,1)==65){var _P=$k[$j-1];$p(_P,1,94)}var _Q=$k[--$j];var _R=$k[--$j];var _T=$Z($s(7),"0000000");var _V=$R($s(7),_R+8,2);$P(_T,7-_V.length,_V);$k[$j++]=_Q;$k[$j++]=_T}$k[$j++]=$_.databarexpanded_lalphanumeric;$k[$j++]="0000";var _W=$d();$_.numeric=_W;$k[$j++]=Infinity;for(var _X=48;_X<=57;_X+=1){var _Z=$Z($s(5),"00000");var _b=$R($s(5),_X-43,2);$P(_Z,5-_b.length,_b);$k[$j++]=_X;$k[$j++]=_Z}$k[$j++]=$_.databarexpanded_fnc1;$k[$j++]="01111";for(var _c=65;_c<=90;_c+=1){var _e=$Z($s(6),"000000");var _g=$R($s(6),_c-33,2);$P(_e,6-_g.length,_g);$k[$j++]=_c;$k[$j++]=_e}$k[$j++]=42;$k[$j++]="111010";for(var _h=44;_h<=47;_h+=1){var _j=$Z($s(6),"000000");var _l=$R($s(6),_h+15,2);$P(_j,6-_l.length,_l);$k[$j++]=_h;$k[$j++]=_j}$k[$j++]=$_.databarexpanded_lnumeric;$k[$j++]="000";$k[$j++]=$_.databarexpanded_liso646;$k[$j++]="00100";var _m=$d();$_.alphanumeric=_m;$k[$j++]=Infinity;for(var _n=48;_n<=57;_n+=1){var _p=$Z($s(5),"00000");var _r=$R($s(5),_n-43,2);$P(_p,5-_r.length,_r);$k[$j++]=_n;$k[$j++]=_p}$k[$j++]=$_.databarexpanded_fnc1;$k[$j++]="01111";for(var _s=65;_s<=90;_s+=1){var _u=$Z($s(7),"0000000");var _w=$R($s(7),_s-1,2);$P(_u,7-_w.length,_w);$k[$j++]=_s;$k[$j++]=_u}for(var _x=97;_x<=122;_x+=1){var _z=$Z($s(7),"0000000");var _11=$R($s(7),_x-7,2);$P(_z,7-_11.length,_11);$k[$j++]=_x;$k[$j++]=_z}$k[$j++]=33;$k[$j++]="11101000";$k[$j++]=34;$k[$j++]="11101001";for(var _12=37;_12<=47;_12+=1){var _14=$Z($s(8),"00000000");var _16=$R($s(8),_12+197,2);$P(_14,8-_16.length,_16);$k[$j++]=_12;$k[$j++]=_14}for(var _17=58;_17<=63;_17+=1){var _19=$Z($s(8),"00000000");var _1B=$R($s(8),_17+187,2);$P(_19,8-_1B.length,_1B);$k[$j++]=_17;$k[$j++]=_19}$k[$j++]=95;$k[$j++]="11111011";$k[$j++]=32;$k[$j++]="11111100";$k[$j++]=$_.databarexpanded_lnumeric;$k[$j++]="000";$k[$j++]=$_.databarexpanded_lalphanumeric;$k[$j++]="00100";var _1C=$d();$_.iso646=_1C;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarexpanded.globals);$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.dontdraw=false;$_.height=-1;$_.width=0;$_.format="expanded";$_.segments=-1;$_.linkage=false;$_.barxmult=34;$_.modunit=1;bwipp_processoptions();var _1D=$k[--$j];$_.options=_1D;var _1E=$k[--$j];$_.barcode=_1E;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fnc1=$_.databarexpanded_fnc1;if($_.barxmult<34){$k[$j++]="bwipp.databarStackedOmniBarXmult#13009";$k[$j++]="GS1 DataBar Expanded Stacked must have a barxmult of at least 34";bwipp_raiseerror()}if($ne($_.format,"expanded")&&$ne($_.format,"expandedstacked")){$k[$j++]="bwipp.databarexpandedBadFormat#13013";$k[$j++]="Valid formats are expanded and expandedstacked";bwipp_raiseerror()}if($_.segments==-1){var _1M=$eq($_.format,"expandedstacked")?4:22;$_.segments=_1M}else{if($_.segments<2||$_.segments>22||$_.segments%2!=0){$k[$j++]="bwipp.gs1databarexpandedBadSegments#13020";$k[$j++]="The number of segments must be even from 2 to 22";bwipp_raiseerror()}}$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _1R=$k[--$j];$_.fncs=_1R;var _1S=$k[--$j];$_.vals=_1S;var _1T=$k[--$j];$_.ais=_1T;$_.isNdigits=function(){var _1U=$k[--$j];var _1V=$k[$j-1];if(_1U!=_1V.length){$k[$j-1]=false}else{var _1W=$k[--$j];$k[$j++]=true;$F(_1W,function(){var _1X=$k[--$j];if(_1X<48||_1X>57){$k[$j-1]=false}})}};for(;;){if($_.ais.length==2){if($eq($g($_.ais,0),"01")&&$eq($g($_.ais,1),"3103")){$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();$k[$j++]=$g($_.vals,1);$k[$j++]=6;$_.isNdigits();var _1h=$k[--$j];var _1i=$k[--$j];if(_1i&&_1h){if($eq($G($g($_.vals,0),0,1),"9")&&$i($g($_.vals,1))<=32767){$k[$j++]="0100";$k[$j++]=false;break}}}}if($_.ais.length==2){if($eq($g($_.ais,0),"01")&&$eq($g($_.ais,1),"3202")){$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();$k[$j++]=$g($_.vals,1);$k[$j++]=6;$_.isNdigits();var _1x=$k[--$j];var _1y=$k[--$j];if(_1y&&_1x){if($eq($G($g($_.vals,0),0,1),"9")&&$i($g($_.vals,1))<=9999){$k[$j++]="0101";$k[$j++]=false;break}}}}if($_.ais.length==2){if($eq($g($_.ais,0),"01")&&$eq($g($_.ais,1),"3203")){$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();$k[$j++]=$g($_.vals,1);$k[$j++]=6;$_.isNdigits();var _2D=$k[--$j];var _2E=$k[--$j];if(_2E&&_2D){if($eq($G($g($_.vals,0),0,1),"9")&&$i($g($_.vals,1))<=22767){$k[$j++]="0101";$k[$j++]=false;break}}}}var _2L=$_.ais.length;if(_2L==2||_2L==3){var _2S=false;for(var _2M=3100;_2M<=3109;_2M+=1){var _2O=$R($s(4),_2M,10);_2S=_2S||$eq(_2O,$g($_.ais,1))}$_.ai310x=_2S;var _2a=false;for(var _2U=3200;_2U<=3209;_2U+=1){var _2W=$R($s(4),_2U,10);_2a=_2a||$eq(_2W,$g($_.ais,1))}$_.ai320x=_2a;if($_.ais.length==3){var _2d=$a(["11","13","15","17"]);var _2k=true;for(var _2e=0,_2f=_2d.length;_2e<_2f;_2e++){_2k=_2k&&$ne($g(_2d,_2e),$g($_.ais,2))}$_.aibad=_2k}else{$_.aibad=false}if($eq($g($_.ais,0),"01")&&($_.ai310x||$_.ai320x)&&!$_.aibad){if($_.ais.length==3){$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();$k[$j++]=$g($_.vals,1);$k[$j++]=6;$_.isNdigits();var _2w=$k[--$j];var _2x=$k[--$j];$k[$j++]=$an(_2x,_2w);$k[$j++]=$g($_.vals,2);$k[$j++]=6;$_.isNdigits();var _30=$k[--$j];var _31=$k[--$j];if(_31&&_30){var _34=$G($g($_.vals,0),0,1);var _3A=$i($G($g($_.vals,2),2,2));var _3E=$i($G($g($_.vals,2),4,2));$k[$j++]=$eq(_34,"9")&&$i($g($_.vals,1))<=99999&&(_3A>=1&&_3A<=12)&&(_3E>=0&&_3E<=31)}else{$k[$j++]=false}var _3F=$k[--$j];if(_3F){if($_.ai310x&&$eq($g($_.ais,2),"11")){$k[$j++]="0111000";$k[$j++]=false;break}if($_.ai320x&&$eq($g($_.ais,2),"11")){$k[$j++]="0111001";$k[$j++]=false;break}if($_.ai310x&&$eq($g($_.ais,2),"13")){$k[$j++]="0111010";$k[$j++]=false;break}if($_.ai320x&&$eq($g($_.ais,2),"13")){$k[$j++]="0111011";$k[$j++]=false;break}if($_.ai310x&&$eq($g($_.ais,2),"15")){$k[$j++]="0111100";$k[$j++]=false;break}if($_.ai320x&&$eq($g($_.ais,2),"15")){$k[$j++]="0111101";$k[$j++]=false;break}if($_.ai310x&&$eq($g($_.ais,2),"17")){$k[$j++]="0111110";$k[$j++]=false;break}if($_.ai320x&&$eq($g($_.ais,2),"17")){$k[$j++]="0111111";$k[$j++]=false;break}}}else{$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();$k[$j++]=$g($_.vals,1);$k[$j++]=6;$_.isNdigits();var _3i=$k[--$j];var _3j=$k[--$j];if(_3j&&_3i){if($eq($G($g($_.vals,0),0,1),"9")&&$i($g($_.vals,1))<=99999){if($_.ai310x){$k[$j++]="0111000";$k[$j++]=false;break}if($_.ai320x){$k[$j++]="0111001";$k[$j++]=false;break}}}}}}if($_.ais.length>=2){var _3y=false;for(var _3s=3920;_3s<=3923;_3s+=1){var _3u=$R($s(4),_3s,10);_3y=_3y||$eq(_3u,$g($_.ais,1))}$_.ai392x=_3y;$k[$j++]=$eq($g($_.ais,0),"01")&&$_.ai392x;$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();var _45=$k[--$j];var _46=$k[--$j];if(_46&&_45){if($eq($G($g($_.vals,0),0,1),"9")){$k[$j++]="01100";$k[$j++]=true;break}}}if($_.ais.length>=2){var _4H=false;for(var _4B=3930;_4B<=3933;_4B+=1){var _4D=$R($s(4),_4B,10);_4H=_4H||$eq(_4D,$g($_.ais,1))}$_.ai393x=_4H;$k[$j++]=$eq($g($_.ais,0),"01")&&$_.ai393x;$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();var _4O=$k[--$j];var _4P=$k[--$j];if(_4P&&_4O){$k[$j++]=$eq($G($g($_.vals,0),0,1),"9");if($g($_.vals,1).length>=3){$k[$j++]=$G($g($_.vals,1),0,3);$k[$j++]=3;$_.isNdigits()}else{$k[$j++]=false}var _4Y=$k[--$j];var _4Z=$k[--$j];if(_4Z&&_4Y){$k[$j++]="01101";$k[$j++]=true;break}}}$k[$j++]=$eq($g($_.ais,0),"01");$k[$j++]=$g($_.vals,0);$k[$j++]=14;$_.isNdigits();var _4e=$k[--$j];var _4f=$k[--$j];if(_4f&&_4e){$k[$j++]="1";$k[$j++]=true;break}$k[$j++]="00";$k[$j++]=true;break}var _4g=$k[--$j];$_.gpfallow=_4g;var _4h=$k[--$j];$_.method=_4h;$_.conv12to40=function(){var _4j=$Z($s(40),"0000000000000000000000000000000000000000");var _4k=$k[--$j];var _4o=$R($s(10),$i($G(_4k,0,3)),2);$P($G(_4j,0,10),10-_4o.length,_4o);var _4s=$R($s(10),$i($G(_4k,3,3)),2);$P($G(_4j,10,10),10-_4s.length,_4s);var _4w=$R($s(10),$i($G(_4k,6,3)),2);$P($G(_4j,20,10),10-_4w.length,_4w);var _50=$R($s(10),$i($G(_4k,9,3)),2);$P($G(_4j,30,10),10-_50.length,_50);$k[$j++]=_4j};$_.conv13to44=function(){var _52=$Z($s(44),"00000000000000000000000000000000000000000000");var _53=$k[--$j];var _57=$R($s(4),$i($G(_53,0,1)),2);$P($G(_52,0,4),4-_57.length,_57);$k[$j++]=_52;$k[$j++]=_52;$k[$j++]=$G(_53,1,12);$_.conv12to40();var _59=$k[--$j];var _5A=$k[--$j];$P(_5A,4,_59)};$_.tobin=function(){var _5B=$k[--$j];var _5C=$s(_5B);$k[$j++]=_5C;for(var _5E=0,_5D=_5C.length-1;_5E<=_5D;_5E+=1){var _5F=$k[$j-1];$p(_5F,_5E,48)}var _5G=$k[$j-1];$k[$j++]=_5G;var _5H=$k[$j-3];var _5I=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _5K=$R($s(_5I.length),_5H,2);$P(_5I,_5I.length-_5K.length,_5K)};if($eq($_.method,"00")){$_.cdf=$a([]);$_.gpf=$a([])}if($eq($_.method,"1")){var _5P=$G($g($_.vals,0),0,13);$k[$j++]="cdf";$k[$j++]=_5P;$_.conv13to44();var _5Q=$k[--$j];var _5R=$k[--$j];$_[_5R]=_5Q;$k[$j++]=Infinity;var _5S=$_.cdf;for(var _5T=0,_5U=_5S.length;_5T<_5U;_5T++){$k[$j++]=$g(_5S,_5T)-48}$_.cdf=$a();$_.gpf=$a([]);$_.ais=$G($_.ais,1,$_.ais.length-1);$_.vals=$G($_.vals,1,$_.vals.length-1);$_.fncs=$G($_.fncs,1,$_.fncs.length-1)}if($eq($_.method,"0100")){$_.cdf=$s(55);var _5k=$G($g($_.vals,0),1,12);$k[$j++]=$_.cdf;$k[$j++]=0;$k[$j++]=_5k;$_.conv12to40();var _5l=$k[--$j];var _5m=$k[--$j];var _5n=$k[--$j];$P(_5n,_5m,_5l);$k[$j++]=$_.cdf;$k[$j++]=40;$k[$j++]=$i($g($_.vals,1));$k[$j++]=15;$_.tobin();var _5r=$k[--$j];var _5s=$k[--$j];var _5t=$k[--$j];$P(_5t,_5s,_5r);$k[$j++]=Infinity;var _5u=$_.cdf;for(var _5v=0,_5w=_5u.length;_5v<_5w;_5v++){$k[$j++]=$g(_5u,_5v)-48}$_.cdf=$a();$_.gpf=$a([]);$_.ais=$a([]);$_.vals=$a([]);$_.fncs=$a([])}if($eq($_.method,"0101")){$_.cdf=$s(55);var _63=$G($g($_.vals,0),1,12);$k[$j++]=$_.cdf;$k[$j++]=0;$k[$j++]=_63;$_.conv12to40();var _64=$k[--$j];var _65=$k[--$j];var _66=$k[--$j];$P(_66,_65,_64);if($eq($g($_.ais,1),"3202")){$k[$j++]=$i($g($_.vals,1));$k[$j++]=15;$_.tobin()}else{$k[$j++]=$i($g($_.vals,1))+1e4;$k[$j++]=15;$_.tobin()}var _6E=$k[--$j];$P($_.cdf,40,_6E);$k[$j++]=Infinity;var _6F=$_.cdf;for(var _6G=0,_6H=_6F.length;_6G<_6H;_6G++){$k[$j++]=$g(_6F,_6G)-48}$_.cdf=$a();$_.gpf=$a([]);$_.ais=$a([]);$_.vals=$a([]);$_.fncs=$a([])}if($_.method.length==7){$_.cdf=$s(76);var _6O=$G($g($_.vals,0),1,12);$k[$j++]=$_.cdf;$k[$j++]=0;$k[$j++]=_6O;$_.conv12to40();var _6P=$k[--$j];var _6Q=$k[--$j];var _6R=$k[--$j];$P(_6R,_6Q,_6P);var _6S=$s(6);$P(_6S,0,$G($g($_.ais,1),3,1));$P(_6S,1,$G($g($_.vals,1),1,5));$k[$j++]=$i(_6S);$k[$j++]=20;$_.tobin();var _6a=$k[--$j];$P($_.cdf,40,_6a);if($_.ais.length==3){var _6d=$g($_.vals,2);$k[$j++]=$i($G(_6d,0,2))*384+(($i($G(_6d,2,2))-1)*32+$i($G(_6d,4,2)))}else{$k[$j++]=38400}$k[$j++]=16;$_.tobin();var _6i=$k[--$j];$P($_.cdf,60,_6i);$k[$j++]=Infinity;var _6j=$_.cdf;for(var _6k=0,_6l=_6j.length;_6k<_6l;_6k++){$k[$j++]=$g(_6j,_6k)-48}$_.cdf=$a();$_.gpf=$a([]);$_.ais=$a([]);$_.vals=$a([]);$_.fncs=$a([])}if($eq($_.method,"01100")){$_.cdf=$s(42);var _6s=$G($g($_.vals,0),1,12);$k[$j++]=$_.cdf;$k[$j++]=0;$k[$j++]=_6s;$_.conv12to40();var _6t=$k[--$j];var _6u=$k[--$j];var _6v=$k[--$j];$P(_6v,_6u,_6t);var _6z=$G($g($_.ais,1),3,1);$k[$j++]=$_.cdf;$k[$j++]=40;$k[$j++]=$i(_6z);$k[$j++]=2;$_.tobin();var _70=$k[--$j];var _71=$k[--$j];var _72=$k[--$j];$P(_72,_71,_70);$k[$j++]=Infinity;var _73=$_.cdf;for(var _74=0,_75=_73.length;_74<_75;_74++){$k[$j++]=$g(_73,_74)-48}$_.cdf=$a();$k[$j++]=Infinity;$F($g($_.vals,1));if($_.ais.length>2){$k[$j++]=$_.fnc1}$_.gpf=$a();$_.ais=$G($_.ais,2,$_.ais.length-2);$_.vals=$G($_.vals,2,$_.vals.length-2);$_.fncs=$G($_.fncs,2,$_.fncs.length-2)}if($eq($_.method,"01101")){$_.cdf=$s(52);var _7P=$G($g($_.vals,0),1,12);$k[$j++]=$_.cdf;$k[$j++]=0;$k[$j++]=_7P;$_.conv12to40();var _7Q=$k[--$j];var _7R=$k[--$j];var _7S=$k[--$j];$P(_7S,_7R,_7Q);var _7W=$G($g($_.ais,1),3,1);$k[$j++]=$_.cdf;$k[$j++]=40;$k[$j++]=$i(_7W);$k[$j++]=2;$_.tobin();var _7X=$k[--$j];var _7Y=$k[--$j];var _7Z=$k[--$j];$P(_7Z,_7Y,_7X);var _7d=$G($g($_.vals,1),0,3);$k[$j++]=$_.cdf;$k[$j++]=42;$k[$j++]=$i(_7d);$k[$j++]=10;$_.tobin();var _7e=$k[--$j];var _7f=$k[--$j];var _7g=$k[--$j];$P(_7g,_7f,_7e);$k[$j++]=Infinity;var _7h=$_.cdf;for(var _7i=0,_7j=_7h.length;_7i<_7j;_7i++){$k[$j++]=$g(_7h,_7i)-48}$_.cdf=$a();$k[$j++]=Infinity;var _7m=$g($_.vals,1);var _7n=$G(_7m,3,_7m.length-3);for(var _7o=0,_7p=_7n.length;_7o<_7p;_7o++){$k[$j++]=$g(_7n,_7o)}if($_.ais.length>2){$k[$j++]=$_.fnc1}$_.gpf=$a();$_.ais=$G($_.ais,2,$_.ais.length-2);$_.vals=$G($_.vals,2,$_.vals.length-2);$_.fncs=$G($_.fncs,2,$_.fncs.length-2)}if($_.gpfallow){$_.vlf=$a(2)}else{$_.vlf=$a([])}$k[$j++]=Infinity;$q($_.gpf);for(var _87=0,_86=$_.ais.length-1;_87<=_86;_87+=1){$_.i=_87;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){$k[$j++]=$_.fnc1}}$as($a($m()));var _8M=$k[--$j];$_.gpf=_8M;$j--;$_.rembits=function(){var _8N=$k[--$j];var _8O=48;var _8P=$ceil(_8N/12)*12;if($ceil(_8N/12)*12<48){var _=_8O;_8O=_8P;_8P=_}var _8Q=~~(_8P/12);$k[$j++]=_8N;$k[$j++]=_8P;$k[$j++]=_8Q;if(_8Q%$_.segments==1){var _8S=$k[--$j];$k[$j-1]=(_8S+1)*12}else{$j--}var _8U=$k[--$j];var _8V=$k[--$j];$k[$j++]=$f(_8U-_8V)};$_.encode=function(){var _8W=$k[$j-1];if($ne(_8W,"raw")){var _8X=$k[--$j];var _8Y=$k[--$j];$k[$j++]=$g(_8X,_8Y)}else{$j--}var _8a=$k[$j-1];if(_8a.length+$_.j>=252){$k[$j-1]="bwipp.gs1databarexpandedTooLong#13291";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}var _8d=$k[--$j];$k[$j++]=Infinity;$F(_8d,function(){$k[$j-1]-=48});var _8f=$a();$P($_.gpfenc,$_.j,_8f);$_.j=_8f.length+$_.j};$k[$j++]=Infinity;for(var _8k=0,_8l=$_.gpf.length;_8k<_8l;_8k++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=-1;$_.numericruns=$a();$k[$j++]=Infinity;for(var _8n=0,_8o=$_.gpf.length;_8n<_8o;_8n++){$k[$j++]=0}$k[$j++]=0;$_.alphanumericruns=$a();$k[$j++]=Infinity;for(var _8q=0,_8r=$_.gpf.length;_8q<_8r;_8q++){$k[$j++]=0}$k[$j++]=9999;$_.nextiso646only=$a();for(var _8t=$_.gpf.length-1;_8t>=0;_8t-=1){$_.i=_8t;var _8y=$Z($s(2),"00");var _91=$g($_.gpf,$_.i);$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=_8y;var _94=0;if(_91==$_.fnc1){_91=94}$p(_8y,_94,_91);if($_.i<$_.gpf.length-1){var _98=$k[$j-1];var _9B=$g($_.gpf,$_.i+1);var _9E=1;if(_9B==$_.fnc1){_9B=94}$p(_98,_9E,_9B)}var _9H=$k[--$j];if($has($_.numeric,_9H)){$p($_.numericruns,$_.i,$g($_.numericruns,$_.i+2)+2)}else{$p($_.numericruns,$_.i,0)}var _9Q=$k[$j-1];var _9S=$has($_.alphanumeric,_9Q);if(_9S){$p($_.alphanumericruns,$_.i,$g($_.alphanumericruns,$_.i+1)+1)}else{$p($_.alphanumericruns,$_.i,0)}var _9a=$k[--$j];if($has($_.iso646,_9a)&&!$has($_.alphanumeric,_9a)){$p($_.nextiso646only,$_.i,0)}else{$p($_.nextiso646only,$_.i,$g($_.nextiso646only,$_.i+1)+1)}}$_.gpfenc=$a(252);$_.i=0;$_.j=0;$_.mode="numeric";for(;;){if($_.i==$_.gpf.length){break}for(;;){if($eq($_.mode,"numeric")){if($_.i<=$_.gpf.length-2){var _9s=$s(2);var _9v=$g($_.gpf,$_.i);$k[$j++]=_9s;var _9y=0;if(_9v==$_.fnc1){_9v=94}$p(_9s,_9y,_9v);var _A0=$k[$j-1];var _A3=$g($_.gpf,$_.i+1);var _A6=1;if(_A3==$_.fnc1){_A3=94}$p(_A0,_A6,_A3);var _A8=$k[$j-1];var _AA=$has($_.numeric,_A8);if(_AA){$k[$j++]=$_.numeric;$_.encode();$_.i=$_.i+2;break}$k[$j-1]=$_.databarexpanded_lalphanumeric;$k[$j++]=$_.numeric;$_.encode();$_.mode="alphanumeric";break}else{var _AG=$g($_.gpf,$_.i);if(_AG<48||_AG>57){$k[$j++]=$_.databarexpanded_lalphanumeric;$k[$j++]=$_.numeric;$_.encode();$_.mode="alphanumeric";break}$k[$j++]="rem";$k[$j++]=12+1+$_.method.length+$_.vlf.length+$_.cdf.length+$_.j;$_.rembits();var _AM=$k[--$j];var _AN=$k[--$j];$_[_AN]=_AM;if($_.rem>=4&&$_.rem<=6){var _AT=$G($Z($s(6),"000000"),0,$_.rem);var _AY=$R($s(4),$g($_.gpf,$_.i)-47,2);$P(_AT,4-_AY.length,_AY);$k[$j++]=_AT;$k[$j++]="raw";$_.encode();$_.i=$_.i+1;break}else{var _Aa=$s(2);$p(_Aa,0,$g($_.gpf,$_.i));$p(_Aa,1,94);$k[$j++]=_Aa;$k[$j++]=$_.numeric;$_.encode();$_.i=$_.i+1;break}}}if($eq($_.mode,"alphanumeric")){if($g($_.gpf,$_.i)==$_.fnc1){$k[$j++]=$_.fnc1;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";$_.i=$_.i+1;break}var _Aq=$g($_.gpf,$_.i);if($has($_.iso646,_Aq)&&!$has($_.alphanumeric,_Aq)){$k[$j++]=$_.databarexpanded_liso646;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="iso646";break}if($g($_.numericruns,$_.i)>=6){$k[$j++]=$_.databarexpanded_lnumeric;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";break}var _B2=$g($_.numericruns,$_.i);if(_B2>=4&&$f(_B2+$_.i)==$_.gpf.length){$k[$j++]=$_.databarexpanded_lnumeric;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";break}$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=$_.alphanumeric;$_.encode();$_.i=$_.i+1;break}if($eq($_.mode,"iso646")){if($g($_.gpf,$_.i)==$_.fnc1){$k[$j++]=$_.fnc1;$k[$j++]=$_.iso646;$_.encode();$_.mode="numeric";$_.i=$_.i+1;break}if($g($_.numericruns,$_.i)>=4&&$g($_.nextiso646only,$_.i)>=10){$k[$j++]=$_.databarexpanded_lnumeric;$k[$j++]=$_.iso646;$_.encode();$_.mode="numeric";break}if($g($_.alphanumericruns,$_.i)>=5&&$g($_.nextiso646only,$_.i)>=10){$k[$j++]=$_.databarexpanded_lalphanumeric;$k[$j++]=$_.iso646;$_.encode();$_.mode="alphanumeric";break}$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=$_.iso646;$_.encode();$_.i=$_.i+1;break}}}$_.gpf=$G($_.gpfenc,0,$_.j);var _Bj=1+12+$_.method.length+$_.vlf.length+$_.cdf.length+$_.gpf.length;$k[$j++]=_Bj;$k[$j++]=_Bj;$_.rembits();var _Bk=$k[--$j];$_.pad=$a(_Bk);$k[$j++]=_Bk;if($_.vlf.length!=0){var _Bn=$k[--$j];var _Bo=$k[--$j];var _Bp=~~($f(_Bo+_Bn)/12);$p($_.vlf,0,_Bp%2);var _Br=_Bp<=14?0:1;$p($_.vlf,1,_Br)}else{$j-=2}if($_.pad.length>0){for(var _Bw=0,_Bv=$_.pad.length-1;_Bw<=_Bv;_Bw+=5){$_.i=_Bw;var _Bx=$_.pad;var _By=$_.i;var _Bz=$_.pad;var _C0=$_.i;var _C1=5;var _C2=_Bz.length-_C0;if(_Bz.length-_C0>5){var _=_C1;_C1=_C2;_C2=_}$P(_Bx,_By,$G($_.databarexpanded_fillpat,0,_C2))}if($eq($_.mode,"numeric")){$k[$j++]=Infinity;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.pad);var _C6=$a();$_.pad=$G(_C6,0,$_.pad.length)}}$k[$j++]=Infinity;$k[$j++]=$_.linkage?1:0;$F($_.method,function(){$k[$j-1]-=48});$q($_.vlf);$q($_.cdf);$q($_.gpf);$q($_.pad);$_.binval=$a();if($has($_.options,"debugbits")){$k[$j++]="bwipp.debugbits#13461";$k[$j++]=$_.binval;bwipp_raiseerror()}$_.datalen=~~($_.binval.length/12);$_.ncr=function(){var _CL=$k[--$j];var _CM=$k[--$j];var _CN=$f(_CM-_CL);if(_CL<$f(_CM-_CL)){var _=_CN;_CN=_CL;_CL=_}$k[$j++]=_CN;$k[$j++]=1;$k[$j++]=1;for(var _CP=_CM,_CO=_CL+1;_CP>=_CO;_CP-=1){var _CQ=$k[--$j];var _CR=$k[$j-1];var _CS=$k[$j-2];$k[$j++]=_CQ*_CP;if($le(_CR,_CS)){var _CT=$k[--$j];var _CU=$k[--$j];$k[$j++]=_CU+1;$k[$j++]=~~(_CT/_CU)}}for(;;){var _CW=$k[$j-2];var _CX=$k[$j-3];if($gt(_CW,_CX)){break}var _CY=$k[--$j];var _CZ=$k[--$j];$k[$j++]=_CZ+1;$k[$j++]=~~(_CY/_CZ)}var _Ca=$k[--$j];$j--;$k[$j-1]=_Ca};$_.getRSSwidths=function(){var _Ce=$k[--$j];$_.oe=_Ce;var _Cf=$k[--$j];$_.el=_Cf;var _Cg=$k[--$j];$_.mw=_Cg;var _Ch=$k[--$j];$_.nm=_Ch;var _Ci=$k[--$j];$_.val=_Ci;$_.out=$a($_.el);$_.mask=0;for(var _Cn=0,_Cm=$_.el-2;_Cn<=_Cm;_Cn+=1){$_.bar=_Cn;$_.ew=1;$_.mask=$_.mask|$bs(1,$_.bar);for(;;){$k[$j++]="sval";$k[$j++]=$f($_.nm-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _Cu=$k[--$j];var _Cv=$k[--$j];$_[_Cv]=_Cu;if($_.oe&&$_.mask==0&&$f($_.nm-$_.ew-$_.el*2+$_.bar*2)>=-2){$k[$j++]="sval";$k[$j++]=$_.sval;$k[$j++]=$f($_.nm-$_.ew-$_.el+$_.bar);$k[$j++]=$f($_.el-$_.bar)-2;$_.ncr();var _D9=$k[--$j];var _DA=$k[--$j];var _DB=$k[--$j];$_[_DB]=$f(_DA-_D9)}if($f($_.el-$_.bar)>2){$_.lval=0;for(var _DK=$f($_.nm-$_.ew-$_.el+$_.bar)+2,_DJ=$_.mw+1;_DK>=_DJ;_DK-=1){$k[$j++]=$f($_.nm-_DK-$_.ew)-1;$k[$j++]=$f($_.el-$_.bar)-3;$_.ncr();var _DP=$k[--$j];$_.lval=$f(_DP+$_.lval)}$_.sval=$f($_.sval-$_.lval*($_.el-$_.bar-1))}else{if($f($_.nm-$_.ew)>$_.mw){$_.sval=$_.sval-1}}$_.val=$f($_.val-$_.sval);if($_.val<0){break}$_.ew=$_.ew+1;$_.mask=$_.mask&~$bs(1,$_.bar)}$_.val=$f($_.val+$_.sval);$_.nm=$f($_.nm-$_.ew);$p($_.out,$_.bar,$_.ew)}$p($_.out,$_.el-1,$_.nm);$k[$j++]=$_.out};$_.dxw=$a($_.datalen);for(var _Du=0,_Dt=$_.datalen-1;_Du<=_Dt;_Du+=1){$_.x=_Du;$_.d=$G($_.binval,$_.x*12,12);var _E4=0;for(var _Dy=0;_Dy<=11;_Dy+=1){$_.j=_Dy;_E4=$f(_E4+$pow(2,11-$_.j)*$g($_.d,$_.j))}$_.d=_E4;$_.j=0;for(;;){if($le($_.d,$g($_.databarexpanded_tab174,$_.j))){$q($G($_.databarexpanded_tab174,$_.j+1,7));var _EB=$k[--$j];$_.dte=_EB;var _EC=$k[--$j];$_.dto=_EC;var _ED=$k[--$j];$_.dmwe=_ED;var _EE=$k[--$j];$_.dmwo=_EE;var _EF=$k[--$j];$_.dele=_EF;var _EG=$k[--$j];$_.delo=_EG;var _EH=$k[--$j];$_.dgs=_EH;break}$_.j=$_.j+8}$k[$j++]="dwo";$k[$j++]=~~($f($_.d-$_.dgs)/$_.dte);$k[$j++]=$_.delo;$k[$j++]=$_.dmwo;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _EO=$k[--$j];var _EP=$k[--$j];$_[_EP]=_EO;$k[$j++]="dwe";$k[$j++]=$f($_.d-$_.dgs)%$_.dte;$k[$j++]=$_.dele;$k[$j++]=$_.dmwe;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _EV=$k[--$j];var _EW=$k[--$j];$_[_EW]=_EV;$_.dw=$a(8);if($_.x%2==0){for(var _EZ=0;_EZ<=3;_EZ+=1){$_.j=_EZ;$p($_.dw,7-$_.j*2,$g($_.dwo,$_.j));$p($_.dw,6-$_.j*2,$g($_.dwe,$_.j))}}else{for(var _Ek=0;_Ek<=3;_Ek+=1){$_.j=_Ek;$p($_.dw,$_.j*2,$g($_.dwo,$_.j));$p($_.dw,$_.j*2+1,$g($_.dwe,$_.j))}}$p($_.dxw,$_.x,$_.dw)}$_.seq=$g($_.databarexpanded_finderseq,~~(($_.datalen-2)/2));$_.fxw=$a($_.seq.length);for(var _F4=0,_F3=$_.seq.length-1;_F4<=_F3;_F4+=1){$_.x=_F4;$p($_.fxw,$_.x,$G($_.databarexpanded_finderwidths,$g($_.seq,$_.x)*5,5))}$k[$j++]=Infinity;$F($_.seq,function(){var _FC=$k[--$j];$q($G($_.databarexpanded_checkweights,_FC*16,16))});var _FE=$a();$_.checkweightseq=$G(_FE,8,_FE.length-8);$k[$j++]=Infinity;var _FG=$_.dxw;for(var _FH=0,_FI=_FG.length;_FH<_FI;_FH++){$q($g(_FG,_FH))}$_.widths=$a();$_.checksum=0;for(var _FM=0,_FL=$_.widths.length-1;_FM<=_FL;_FM+=1){$_.i=_FM;$_.checksum=$f($_.checksum+$g($_.widths,$_.i)*$g($_.checkweightseq,$_.i))}$_.checksum=$f($_.checksum%211+($_.datalen-3)*211);$_.i=0;for(;;){if($_.checksum<=$g($_.databarexpanded_tab174,$_.i)){$q($G($_.databarexpanded_tab174,$_.i+1,7));var _Fb=$k[--$j];$_.cte=_Fb;var _Fc=$k[--$j];$_.cto=_Fc;var _Fd=$k[--$j];$_.cmwe=_Fd;var _Fe=$k[--$j];$_.cmwo=_Fe;var _Ff=$k[--$j];$_.cele=_Ff;var _Fg=$k[--$j];$_.celo=_Fg;var _Fh=$k[--$j];$_.cgs=_Fh;break}$_.i=$_.i+8}$k[$j++]="cwo";$k[$j++]=~~($f($_.checksum-$_.cgs)/$_.cte);$k[$j++]=$_.celo;$k[$j++]=$_.cmwo;$k[$j++]=4;$k[$j++]=true;$_.getRSSwidths();var _Fo=$k[--$j];var _Fp=$k[--$j];$_[_Fp]=_Fo;$k[$j++]="cwe";$k[$j++]=$f($_.checksum-$_.cgs)%$_.cte;$k[$j++]=$_.cele;$k[$j++]=$_.cmwe;$k[$j++]=4;$k[$j++]=false;$_.getRSSwidths();var _Fv=$k[--$j];var _Fw=$k[--$j];$_[_Fw]=_Fv;$_.cw=$a(8);for(var _Fy=0;_Fy<=3;_Fy+=1){$_.i=_Fy;$p($_.cw,$_.i*2,$g($_.cwo,$_.i));$p($_.cw,$_.i*2+1,$g($_.cwe,$_.i))}var _G9=$a(22);$p(_G9,0,$_.cw);$P(_G9,1,$_.dxw);$_.dxw=$G(_G9,0,$_.datalen+1);$_.datalen=$_.dxw.length;$_.rows=$a($ceil($_.datalen/$_.segments));$_.numrows=$_.rows.length;for(var _GL=0,_GK=$_.numrows-1;_GL<=_GK;_GL+=1){$_.r=_GL;$k[$j++]=Infinity;if($_.segments%4!=0&&$_.r%2==1){$k[$j++]=0}$k[$j++]=1;$k[$j++]=1;for(var _GQ=0,_GP=$_.segments-1;_GQ<=_GP;_GQ+=1){$_.pos=_GQ+$_.r*$_.segments;if($_.pos<$_.datalen){$q($g($_.dxw,$_.pos));if($_.pos%2==0){$q($g($_.fxw,~~($_.pos/2)))}}}var _Gc=$m()+2;var _Gd=$a(_Gc);$k[$j++]=1;$k[$j++]=1;$as(_Gd);var _Gf=$k[--$j];$p($_.rows,$_.r,_Gf);$j--}if($ne($_.format,"expandedstacked")){var _Gj=$g($_.rows,0);$_.sbs=$G(_Gj,1,_Gj.length-1);$k[$j++]=Infinity;$k[$j++]=1;for(var _Gn=0,_Gm=$_.datalen-1;_Gn<=_Gm;_Gn+=1){$_.i=_Gn;$q($g($_.dxw,$_.i));if($_.i%2==0){$q($g($_.fxw,~~($_.i/2)))}}$k[$j++]=1;$k[$j++]=1;$_.sbs=$a();if($_.height==-1){$_.height=34/72}$k[$j++]=Infinity;var _Gw=$_.sbs;var _H1=[];for(var _Gy=0,_Gz=~~(($_.sbs.length+1)/2);_Gy<_Gz;_Gy++){_H1[_Gy]=$_.height}_H1=$a(_H1);var _H5=[];for(var _H3=0,_H4=~~(($_.sbs.length+1)/2);_H3<_H4;_H3++){_H5[_H3]=0}_H5=$a(_H5);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_Gw;$k[$j++]="bhs";$k[$j++]=_H1;$k[$j++]="bbs";$k[$j++]=_H5;$k[$j++]="borderleft";$k[$j++]=0;$k[$j++]="borderright";$k[$j++]=0;$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=0;$k[$j++]="opt";$k[$j++]=$_.options;var _H7=$d();$k[$j++]=_H7;if($_._render){bwipp_renlinear()}}else{$_.seps=$a($_.numrows);for(var _HD=0,_HC=$_.numrows-1;_HD<=_HC;_HD+=1){$_.r=_HD;$_.row=$g($_.rows,$_.r);$k[$j++]=Infinity;for(var _HJ=0,_HI=$_.row.length-1;_HJ<=_HI;_HJ+=2){$_.i=_HJ;for(var _HN=0,_HO=$g($_.row,$_.i);_HN<_HO;_HN++){$k[$j++]=0}if($_.i<$_.row.length-1){for(var _HU=0,_HV=$g($_.row,$_.i+1);_HU<_HV;_HU++){$k[$j++]=1}}}$as($a($m()));var _HY=$k[--$j];$_.row=_HY;$k[$j-1]=Infinity;$F($_.row,function(){var _Ha=$k[--$j];$k[$j++]=1-_Ha});$_.sep=$a();$k[$j++]=Infinity;for(var _Hd=19,_Hc=$_.row.length-13;_Hd<=_Hc;_Hd+=98){$k[$j++]=_Hd}for(var _Hg=68,_Hf=$_.row.length-13;_Hg<=_Hf;_Hg+=98){$k[$j++]=_Hg}$_.finderpos=$a();var _Hh=$_.finderpos;for(var _Hi=0,_Hj=_Hh.length;_Hi<_Hj;_Hi++){var _Hk=$g(_Hh,_Hi);for(var _Hm=_Hk,_Hl=_Hk+14;_Hm<=_Hl;_Hm+=1){$_.i=_Hm;if($g($_.row,$_.i)==0){if($g($_.row,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _Hy=$k[--$j];$p($_.sep,$_.i,_Hy)}}$P($_.sep,0,$_.databarexpanded_seppad);$P($_.sep,$_.row.length-4,$_.databarexpanded_seppad);if($_.segments%4==0&&$_.r%2==1){if($g($_.rows,$_.r).length!=$g($_.rows,0).length&&$_.finderpos.length%2==1){$k[$j++]=Infinity;$k[$j++]=0;$q($_.row);$_.row=$a();$k[$j++]=Infinity;$k[$j++]=0;$q($_.sep);$_.sep=$a()}else{for(var _IE=$_.row.length-1;_IE>=0;_IE-=1){$k[$j++]=$g($_.row,_IE)}$as($_.row);$j--;for(var _IJ=$_.sep.length-1;_IJ>=0;_IJ-=1){$k[$j++]=$g($_.sep,_IJ)}$as($_.sep);$j--}}$p($_.rows,$_.r,$_.row);$p($_.seps,$_.r,$_.sep)}$_.pixx=$g($_.rows,0).length;var _IY=[];for(var _IW=0,_IX=$_.pixx;_IW<_IX;_IW++){_IY[_IW]=0}_IY=$a(_IY);$P(_IY,0,$g($_.rows,$_.numrows-1));$p($_.rows,$_.numrows-1,_IY);var _Ih=[];for(var _If=0,_Ig=$_.pixx;_If<_Ig;_If++){_Ih[_If]=0}_Ih=$a(_Ih);$P(_Ih,0,$g($_.seps,$_.numrows-1));$p($_.seps,$_.numrows-1,_Ih);$k[$j++]=Infinity;for(var _Io=0,_Ip=~~($_.pixx/2)+1;_Io<_Ip;_Io++){$k[$j++]=0;$k[$j++]=1}var _Iq=$a();$_.sep=$G(_Iq,0,$_.pixx);$P($_.sep,0,$_.databarexpanded_seppad);$P($_.sep,$_.pixx-4,$_.databarexpanded_seppad);$k[$j++]=Infinity;for(var _Iy=0,_Ix=$_.numrows-1;_Iy<=_Ix;_Iy+=1){$_.r=_Iy;if($_.r!=0){$q($g($_.seps,$_.r))}$q($g($_.rows,$_.r));if($_.r!=$_.numrows-1){$q($g($_.seps,$_.r));$q($_.sep)}}$_.pixs=$a();$k[$j++]=Infinity;for(var _JE=0,_JD=$_.numrows-1;_JE<=_JD;_JE+=1){$_.r=_JE;if($_.r!=0){$k[$j++]=1}$k[$j++]=$_.barxmult;if($_.r!=$_.numrows-1){$k[$j++]=1;$k[$j++]=1}}$_.rowmult=$a();var _JJ=$_.rowmult;var _JO=0;for(var _JK=0,_JL=_JJ.length;_JK<_JL;_JK++){_JO=$f(_JO+$g(_JJ,_JK))}$_.pixy=_JO;$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",0],["borderright",0],["bordertop",0],["borderbottom",0],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}}$_=$__}function bwipp_databarexpandedstacked(){var $__=$_;$_=Object.assign({},$_,bwipp_databarexpandedstacked.globals);$_.dontdraw=false;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","expandedstacked");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_databarexpanded();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1northamericancoupon(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1northamericancoupon.globals);$_.dontdraw=false;$_.includetext=false;$_.coupontextfont="OCR-B";$_.coupontextsize=9;$_.coupontextxoffset=null;$_.coupontextyoffset=null;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();$j--;var _5=$k[--$j];$_.vals=_5;var _6=$k[--$j];$_.ais=_6;if($_.ais.length!=1){$k[$j++]="bwipp.gs1northamericancouponBadAIStructure#13974";$k[$j++]="A GS1 North American Coupon should consist of a single AI (8110)";bwipp_raiseerror()}if($ne($g($_.ais,0),"8110")){$k[$j++]="bwipp.gs1northamericancouponBadAIStructure#13977";$k[$j++]="A GS1 North American Coupon should consist of a single AI (8110)";bwipp_raiseerror()}$_.val=$g($_.vals,0);$_.vli=$g($_.val,0)-48;if($_.vli<0||$_.vli>6){$k[$j++]="bwipp.gs1northamericancouponBadVLI#13984";$k[$j++]="The AI (8110) data should start with a Company Prefix length indicator in the range 0 to 6";bwipp_raiseerror()}if($_.val.length<$_.vli+13){$k[$j++]="bwipp.gs1northamericancouponTooShort#13987";$k[$j++]="The AI (8110) data is too short";bwipp_raiseerror()}$_.gcp=$G($_.val,1,$_.vli+6);$_.cod=$G($_.val,$_.vli+7,6);$_.coupontext=$s($_.gcp.length+7);$P($_.coupontext,0,$_.gcp);$P($_.coupontext,$_.gcp.length,"-");$P($_.coupontext,$_.gcp.length+1,$_.cod);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_databarexpandedstacked();var _Z=$k[--$j];$_.args=_Z;if($_.includetext){if($_.coupontextxoffset==null){$_.coupontextxoffset=0}if($_.coupontextyoffset==null){$_.coupontextyoffset=$g($_.args,"height")*72+3}if($has($_.args,"txt")){$_.txt=$g($_.args,"txt");$_.newtxt=$a($_.txt.length+1);$P($_.newtxt,0,$_.txt);$p($_.newtxt,$_.newtxt.length-1,$a([$_.coupontext,$_.coupontextxoffset,$_.coupontextyoffset,$_.coupontextfont,$_.coupontextsize]));$p($_.args,"txt",$_.newtxt)}else{$p($_.args,"txt",$a([$a([$_.coupontext,$_.coupontextxoffset,$_.coupontextyoffset,$_.coupontextfont,$_.coupontextsize])]))}}$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_pharmacode(){var $__=$_;$_=Object.assign({},$_,bwipp_pharmacode.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.nwidth=1;$_.wwidth=3;$_.swidth=2;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length<1||$_.barcode.length>6){$k[$j++]="bwipp.pharmacodeBadLength#14109";$k[$j++]="Pharmacode must be 1 to 6 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.pharmacodeBadCharacter#14113";$k[$j++]="Pharmacode must contain only digits";bwipp_raiseerror()}});var _9=$i($_.barcode);if(_9<3||_9>131070){$k[$j++]="bwipp.pharmacodeBadValue#14117";$k[$j++]="Pharmacode value must be between 3 and 131070";bwipp_raiseerror()}$_.txt=$a($_.barcode.length);for(var _E=0,_D=$_.barcode.length-1;_E<=_D;_E+=1){$_.i=_E;$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$_.barcode=$R($s(17),$i($_.barcode)+1,2);$_.barcode=$G($_.barcode,1,$_.barcode.length-1);$_.barlen=$_.barcode.length;$_.sbs=$a($_.barlen*2);for(var _W=0,_V=$_.barlen-1;_W<=_V;_W+=1){$_.i=_W;$_.enc=$G($_.barcode,$_.i,1);if($eq($_.enc,"0")){$p($_.sbs,$_.i*2,$_.nwidth)}else{$p($_.sbs,$_.i*2,$_.wwidth)}$p($_.sbs,$_.i*2+1,$_.swidth)}if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _l=$_.sbs;var _q=[];for(var _n=0,_o=~~(($_.sbs.length+1)/2);_n<_o;_n++){_q[_n]=$_.height}_q=$a(_q);var _u=[];for(var _s=0,_t=~~(($_.sbs.length+1)/2);_s<_t;_s++){_u[_s]=0}_u=$a(_u);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_l;$k[$j++]="bhs";$k[$j++]=_q;$k[$j++]="bbs";$k[$j++]=_u;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="opt";$k[$j++]=$_.options;var _x=$d();$k[$j++]=_x;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_pharmacode2(){if(!bwipp_pharmacode2.globals){var $__=$_;$_=bwipp_pharmacode2.globals={};$_.pharmacode2_base3sub=$a([3,1,2]);$_.pharmacode2_base3map=$a([2,0,1]);$_.pharmacode2_htmult=$a([1,1,2]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_pharmacode2.globals);$_.dontdraw=false;$_.includetext=false;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _3=$k[--$j];$_.options=_3;var _4=$k[--$j];$_.barcode=_4;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length<1||$_.barcode.length>8){$k[$j++]="bwipp.pharmacode2BadLength#14247";$k[$j++]="Two-track Pharmacode must be 1 to 6 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _A=$k[--$j];if(_A<48||_A>57){$k[$j++]="bwipp.pharmacode2badCharacter#14251";$k[$j++]="Two-track Pharmacode must contain only digits";bwipp_raiseerror()}});var _C=$i($_.barcode);if(_C<4||_C>64570080){$k[$j++]="bwipp.pharmacode2badValue#14255";$k[$j++]="Two-track Pharmacode value must be between 4 and 64570080";bwipp_raiseerror()}if($_.height==-1){$_.height=4}$_.txt=$a($_.barcode.length);for(var _I=0,_H=$_.barcode.length-1;_I<=_H;_I+=1){$_.i=_I;$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$_.encstr=$s(16);$_.sbs=$a(32);$_.bar=1/25.4*$_.height;$_.spc=1/25.4*72;$_.i=15;$_.val=$i($_.barcode);for(;;){if($_.val==0){break}var _V=$_.val%3;$_.val=~~($f($_.val-$g($_.pharmacode2_base3sub,_V))/3);$p($_.encstr,$_.i,$g($_.pharmacode2_base3map,_V));$_.i=$_.i-1}$_.encstr=$G($_.encstr,$_.i+1,15-$_.i);$_.bhs=$a($_.encstr.length);$_.bbs=$a($_.encstr.length);for(var _m=0,_l=$_.encstr.length-1;_m<=_l;_m+=1){$_.i=_m;var _p=$g($_.encstr,$_.i);$p($_.bhs,$_.i,$_.bar*$g($_.pharmacode2_htmult,_p));$p($_.bbs,$_.i,$g($a([0,$_.bar,0]),_p))}$k[$j++]=Infinity;var _z=$_.bhs;var _10=$_.bbs;var _15=[];for(var _12=0,_13=$_.encstr.length*2;_12<_13;_12++){_15[_12]=$_.spc}_15=$a(_15);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bhs";$k[$j++]=_z;$k[$j++]="bbs";$k[$j++]=_10;$k[$j++]="sbs";$k[$j++]=_15;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="text1yoffset";$k[$j++]=-4;$k[$j++]="opt";$k[$j++]=$_.options;var _18=$d();$k[$j++]=_18;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code2of5(){if(!bwipp_code2of5.globals){var $__=$_;$_=bwipp_code2of5.globals={};var _5=new Map([["industrial",$a(["1111313111","3111111131","1131111131","3131111111","1111311131","3111311111","1131311111","1111113131","3111113111","1131113111","313111","31113"])],["iata",$a(["1111313111","3111111131","1131111131","3131111111","1111311131","3111311111","1131311111","1111113131","3111113111","1131113111","1111","311"])],["matrix",$a(["113311","311131","131131","331111","113131","313111","133111","111331","311311","131311","311111","31111"])],["coop",$a(["331111","111331","113131","113311","131131","131311","133111","311131","311311","313111","3131","133"])],["datalogic",$a(["113311","311131","131131","331111","113131","313111","133111","111331","311311","131311","1111","311"])]]);$_.code2of5_versions=_5;$_.code2of5_barchars="0123456789";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code2of5.globals);$_.dontdraw=false;$_.includecheck=false;$_.validatecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.version="industrial";$_.modunit=1;bwipp_processoptions();var _6=$k[--$j];$_.options=_6;var _7=$k[--$j];$_.barcode=_7;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.code2of5emptyData#14423";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.code2of5inputTooLong#14427";$k[$j++]="The input data is too long";bwipp_raiseerror()}$F($_.barcode,function(){var _D=$k[--$j];if(_D<48||_D>57){$k[$j++]="bwipp.code2of5badCharacter#14435";$k[$j++]="Code 25 must contain only digits";bwipp_raiseerror()}});var _H=$_.barcode.length;if($_.validatecheck){_H=_H-1}$_.barlen=_H;$_.checksum=0;for(var _L=0,_K=$_.barlen-1;_L<=_K;_L+=1){$_.i=_L;var _U=$_.checksum;var _T=$g($_.barcode,$_.i)-48;if($f($_.barlen-$_.i)%2!=0){_T=_T*3}$_.checksum=$f(_U+_T)}$_.checksum=(10-$_.checksum%10)%10;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$_.checksum+48){$k[$j++]="bwipp.code2of5badCheckDigit#14455";$k[$j++]="Incorrect Code 25 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen);$_.includecheck=true}if(!$has($_.code2of5_versions,$_.version)){$k[$j++]="bwipp.code2of5badVersion#14462";$k[$j++]="Unrecognised Code 25 version";bwipp_raiseerror()}$_.encs=$g($_.code2of5_versions,$_.version);$_.cs=$g($_.encs,0).length;$k[$j++]="cw";var _p=0;$F($g($_.encs,0),function(){var _n=$k[--$j];_p=$f(_p+(_n-48))});var _q=$k[--$j];$_[_q]=_p;$_.ss=$g($_.encs,10).length;$k[$j++]="sw";var _x=0;$F($g($_.encs,10),function(){var _v=$k[--$j];_x=$f(_x+(_v-48))});var _y=$k[--$j];$_[_y]=_x;$_.es=$g($_.encs,11).length;var _15=$_.barlen;if($_.includecheck){_15=_15+1}var _18=$s($f(_15*$_.cs+$_.ss+$_.es));$_.sbs=_18;$P($_.sbs,0,$g($_.encs,10));for(var _1F=0,_1E=$_.barlen-1;_1F<=_1E;_1F+=1){$_.i=_1F;$X($_.code2of5_barchars,$G($_.barcode,$_.i,1));$j--;var _1J=$k[--$j];$_.indx=_1J.length;$j-=2;$_.enc=$g($_.encs,$_.indx);$P($_.sbs,$_.i*$_.cs+$_.ss,$_.enc)}if($_.includecheck){$P($_.sbs,$f($_.barlen*$_.cs+$_.ss),$g($_.encs,$_.checksum));$P($_.sbs,$f($_.barlen*$_.cs+$_.cs+$_.ss),$g($_.encs,11))}else{$P($_.sbs,$f($_.barlen*$_.cs+$_.ss),$g($_.encs,11))}$k[$j++]="text";if($_.includecheck&&$_.includecheckintext){var _1q=$s($_.barlen+1);$P(_1q,0,$_.barcode);$P(_1q,$_.barlen,$G($_.code2of5_barchars,$_.checksum,1));$k[$j++]=_1q}else{$k[$j++]=$_.barcode}var _1w=$k[--$j];var _1x=$k[--$j];$_[_1x]=_1w;$k[$j++]=Infinity;var _1y=$_.sbs;for(var _1z=0,_20=_1y.length;_1z<_20;_1z++){$k[$j++]=$g(_1y,_1z)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _23=$_.sbs;var _28=[];for(var _25=0,_26=~~(($_.sbs.length+1)/2);_25<_26;_25++){_28[_25]=$_.height}_28=$a(_28);var _2C=[];for(var _2A=0,_2B=~~(($_.sbs.length+1)/2);_2A<_2B;_2A++){_2C[_2A]=0}_2C=$a(_2C);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_23;$k[$j++]="bhs";$k[$j++]=_28;$k[$j++]="bbs";$k[$j++]=_2C;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2K=$d();$k[$j++]=_2K;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_industrial2of5(){var $__=$_;$_=Object.assign({},$_,bwipp_industrial2of5.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"version","industrial");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code2of5();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_iata2of5(){var $__=$_;$_=Object.assign({},$_,bwipp_iata2of5.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"version","iata");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code2of5();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_matrix2of5(){var $__=$_;$_=Object.assign({},$_,bwipp_matrix2of5.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"version","matrix");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code2of5();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_coop2of5(){var $__=$_;$_=Object.assign({},$_,bwipp_coop2of5.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"version","coop");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code2of5();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_datalogic2of5(){var $__=$_;$_=Object.assign({},$_,bwipp_datalogic2of5.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"version","datalogic");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code2of5();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_code11(){if(!bwipp_code11.globals){var $__=$_;$_=bwipp_code11.globals={};$_.code11_encs=$a(["111131","311131","131131","331111","113131","313111","133111","111331","311311","311111","113111","113311"]);$_.code11_barchars="0123456789-";$_.charvals=new Map;for(var _1=0;_1<=10;_1+=1){$p($_.charvals,$G($_.code11_barchars,_1,1),_1)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code11.globals);$_.dontdraw=false;$_.includecheck=false;$_.validatecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _5=$k[--$j];$_.options=_5;var _6=$k[--$j];$_.barcode=_6;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.code11emptyData#14935";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.code11inputTooLong#14939";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _D=0,_C=$_.barcode.length-1;_D<=_C;_D+=1){if(!$has($_.charvals,$G($_.barcode,_D,1))){$k[$j++]="bwipp.code11badCharacter#14947";$k[$j++]="Code 11 must contain only digits and dashes";bwipp_raiseerror()}}$_.barlen=$_.barcode.length;if($_.validatecheck){if($_.barlen==11){$k[$j++]="bwipp.code11badLength#14960";$k[$j++]="Code 11 cannot be 11 characters using check digits";bwipp_raiseerror()}var _N=$_.barlen<=10?1:2;$_.barlen=$_.barlen-_N}var _S=$_.includecheck||$_.validatecheck?$_.barlen>=10?2:1:0;$_.numchecks=_S;$_.checksum1=0;$_.checksum2=0;for(var _W=0,_V=$_.barlen-1;_W<=_V;_W+=1){$_.i=_W;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$_.checksum1=$f($_.checksum1+(($_.barlen-$_.i-1)%10+1)*$_.indx);$_.checksum2=$f($_.checksum2+(($_.barlen-$_.i)%9+1)*$_.indx)}$_.checksum1=$_.checksum1%11;$_.checksum2=$f($_.checksum2+$_.checksum1)%11;if($_.validatecheck){if($_.numchecks==1){if($g($_.barcode,$_.barlen)!=$g($_.code11_barchars,$_.checksum1)){$k[$j++]="bwipp.code11badCheckDigit#14978";$k[$j++]="Incorrect Code 11 check digit provided";bwipp_raiseerror()}}else{if($g($_.barcode,$_.barlen)!=$g($_.code11_barchars,$_.checksum1)||$g($_.barcode,$_.barlen+1)!=$g($_.code11_barchars,$_.checksum2)){$k[$j++]="bwipp.code11badCheckDigits#14983";$k[$j++]="Incorrect Code 11 check digits provided";bwipp_raiseerror()}}$_.barcode=$G($_.barcode,0,$_.barlen);$_.includecheck=true}$_.sbs=$s($f($_.barlen+$_.numchecks)*6+12);$P($_.sbs,0,$g($_.code11_encs,11));for(var _1E=0,_1D=$_.barlen-1;_1E<=_1D;_1E+=1){$_.i=_1E;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$_.enc=$g($_.code11_encs,$_.indx);$P($_.sbs,$_.i*6+6,$_.enc)}if($_.includecheck){if($_.barlen>=10){$P($_.sbs,$_.barlen*6+6,$g($_.code11_encs,$_.checksum1));$P($_.sbs,$_.barlen*6+12,$g($_.code11_encs,$_.checksum2));$P($_.sbs,$_.barlen*6+18,$g($_.code11_encs,11))}else{$P($_.sbs,$_.barlen*6+6,$g($_.code11_encs,$_.checksum1));$P($_.sbs,$_.barlen*6+12,$g($_.code11_encs,11))}}else{$P($_.sbs,$_.barlen*6+6,$g($_.code11_encs,11))}$k[$j++]="text";if($_.includecheck&&$_.includecheckintext){if($_.barlen>=10){var _1q=$s($_.barlen+2);$P(_1q,0,$_.barcode);$P(_1q,$_.barlen,$G($_.code11_barchars,$_.checksum1,1));$P(_1q,$_.barlen+1,$G($_.code11_barchars,$_.checksum2,1));$k[$j++]=_1q}else{var _1z=$s($_.barlen+1);$P(_1z,0,$_.barcode);$P(_1z,$_.barlen,$G($_.code11_barchars,$_.checksum1,1));$k[$j++]=_1z}}else{$k[$j++]=$_.barcode}var _25=$k[--$j];var _26=$k[--$j];$_[_26]=_25;$k[$j++]=Infinity;var _27=$_.sbs;for(var _28=0,_29=_27.length;_28<_29;_28++){$k[$j++]=$g(_27,_28)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _2C=$_.sbs;var _2H=[];for(var _2E=0,_2F=~~(($_.sbs.length+1)/2);_2E<_2F;_2E++){_2H[_2E]=$_.height}_2H=$a(_2H);var _2L=[];for(var _2J=0,_2K=~~(($_.sbs.length+1)/2);_2J<_2K;_2J++){_2L[_2J]=0}_2L=$a(_2L);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_2C;$k[$j++]="bhs";$k[$j++]=_2H;$k[$j++]="bbs";$k[$j++]=_2L;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2T=$d();$k[$j++]=_2T;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_bc412(){if(!bwipp_bc412.globals){var $__=$_;$_=bwipp_bc412.globals={};$_.bc412_barchars="0R9GLVHA8EZ4NTS1J2Q6C7DYKBUIX3FWP5M";$_.bc412_encs=$a(["11111115","13111212","11131113","12111213","12121311","13131111","12111312","11131212","11121411","11151111","15111111","11111511","12131211","13121112","13111311","11111214","12121113","11111313","13111113","11121213","11141112","11121312","11141211","14121111","12121212","11131311","13121211","12111411","14111211","11111412","12111114","14111112","12141111","11121114","12131112","12","111"]);$_.charvals=new Map;for(var _1=0;_1<=34;_1+=1){$p($_.charvals,$G($_.bc412_barchars,_1,1),_1)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_bc412.globals);$_.dontdraw=false;$_.includecheck=false;$_.validatecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.includestartstop=false;$_.semi=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _5=$k[--$j];$_.options=_5;var _6=$k[--$j];$_.barcode=_6;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.bc412emptyData#15170";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.bc412inputTooLong#15174";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.semi){$_.includestartstop=true}for(var _E=0,_D=$_.barcode.length-1;_E<=_D;_E+=1){if(!$has($_.charvals,$G($_.barcode,_E,1))){$k[$j++]="bwipp.bc412badCharacter#15187";$k[$j++]="BC412 must contain only digits and capital letters except O";bwipp_raiseerror()}}if($_.semi){if($_.validatecheck){if($_.barcode.length<8||$_.barcode.length>19){$k[$j++]="bwipp.bc412semivalidateBadLength#15197";$k[$j++]="BC412 semi with check digit must be 8 to 19 characters long";bwipp_raiseerror()}}else{if($_.barcode.length<7||$_.barcode.length>18){$k[$j++]="bwipp.bc412semiBadLength#15201";$k[$j++]="BC412 semi must be 7 to 18 characters long";bwipp_raiseerror()}}$_.barlen=$_.barcode.length;if(!$_.validatecheck){$_.barlen=$_.barlen+1;$_.sbarcode=$s($_.barlen);$p($_.sbarcode,0,$g($_.barcode,0));$p($_.sbarcode,1,48);$P($_.sbarcode,2,$G($_.barcode,1,$_.barlen-2));$_.barcode=$_.sbarcode}$_.sumodd=0;$_.sumeven=0;for(var _f=0,_e=$_.barlen-1;_f<=_e;_f+=1){$_.i=_f;$k[$j++]=$g($_.charvals,$G($_.barcode,$_.i,1));if($_.i%2==0){var _n=$k[--$j];$_.sumodd=$f(_n+$_.sumodd)}else{var _p=$k[--$j];$_.sumeven=$f(_p+$_.sumeven)}}$_.checksum=$f($_.sumodd%35+$_.sumeven%35*2)%35;if($_.validatecheck){if($_.checksum!=0){$k[$j++]="bwipp.bc412semiBadCheckDigit#15227";$k[$j++]="Incorrect BC412 semi check digit provided";bwipp_raiseerror()}}else{$_.checksum=$_.checksum*17%35;$p($_.barcode,1,$g($_.bc412_barchars,$_.checksum))}}else{var _11=$_.barcode.length;if($_.validatecheck){_11=_11-1}$_.barlen=_11;$_.checksum=0;for(var _15=0,_14=$_.barlen-1;_15<=_14;_15+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_15,1))+$_.checksum)}$_.checksum=$_.checksum%35;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.bc412_barchars,$_.checksum)){$k[$j++]="bwipp.bc412badCheckDigit#15244";$k[$j++]="Incorrect BC412 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen);$_.includecheck=true}}$_.sbs=$s(($_.barlen+1)*8+5);if($_.includestartstop){$P($_.sbs,0,$g($_.bc412_encs,35));$_.pos=2}else{$_.pos=0}for(var _1S=0,_1R=$_.barlen-1;_1S<=_1R;_1S+=1){$_.i=_1S;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.sbs,$_.pos,$g($_.bc412_encs,$_.indx));$_.pos=$_.pos+8}if($_.includecheck){$P($_.sbs,$_.pos,$g($_.bc412_encs,$_.checksum));$_.pos=$_.pos+8}if($_.includestartstop){$P($_.sbs,$_.pos,$g($_.bc412_encs,36));$_.pos=$_.pos+3}$k[$j++]="text";if($_.includecheck&&$_.includecheckintext){var _1r=$s($_.barlen+1);$P(_1r,0,$_.barcode);$P(_1r,$_.barlen,$G($_.bc412_barchars,$_.checksum,1));$k[$j++]=_1r}else{$k[$j++]=$_.barcode}var _1x=$k[--$j];var _1y=$k[--$j];$_[_1y]=_1x;$_.sbs=$G($_.sbs,0,$_.pos);if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _27=[];var _23=$_.sbs;for(var _24=0,_25=_23.length;_24<_25;_24++){_27[_24]=$g(_23,_24)-48}_27=$a(_27);var _2C=[];for(var _29=0,_2A=~~(($_.sbs.length+1)/2);_29<_2A;_29++){_2C[_29]=$_.height}_2C=$a(_2C);var _2G=[];for(var _2E=0,_2F=~~(($_.sbs.length+1)/2);_2E<_2F;_2E++){_2G[_2E]=0}_2G=$a(_2G);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_27;$k[$j++]="bhs";$k[$j++]=_2C;$k[$j++]="bbs";$k[$j++]=_2G;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2O=$d();$k[$j++]=_2O;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_rationalizedCodabar(){if(!bwipp_rationalizedCodabar.globals){var $__=$_;$_=bwipp_rationalizedCodabar.globals={};$_.rationalizedCodabar_encs=$a(["11111331","11113311","11131131","33111111","11311311","31111311","13111131","13113111","13311111","31131111","11133111","11331111","31113131","31311131","31313111","11313131","11331311","13131131","11131331","11133311"]);$_.rationalizedCodabar_barchars="0123456789-$:/.+ABCD";$_.rationalizedCodabar_barcharsalt="0123456789-$:/.+TN*E";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_rationalizedCodabar.globals);$_.dontdraw=false;$_.altstartstop=false;$_.includecheck=false;$_.validatecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.rationalizedCodabarinputTooLong#15397";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length<2||$_.barcode.length<3&&$_.validatecheck){$k[$j++]="bwipp.rationalizedCodabarBadLength#15406";$k[$j++]="Codabar must be at least 2 characters in length excluding any check digit";bwipp_raiseerror()}var _A=$_.altstartstop?$_.rationalizedCodabar_barcharsalt:$_.rationalizedCodabar_barchars;$_.barchars=_A;$_.charvals=new Map;for(var _C=0;_C<=19;_C+=1){$p($_.charvals,$G($_.barchars,_C,1),_C)}$_.bodyvals=new Map;for(var _G=0;_G<=15;_G+=1){$p($_.bodyvals,$G($_.barchars,_G,1),_G)}$_.ssvals=new Map;for(var _K=16;_K<=19;_K+=1){$p($_.ssvals,$G($_.barchars,_K,1),_K)}if(!$has($_.ssvals,$G($_.barcode,0,1))||!$has($_.ssvals,$G($_.barcode,$_.barcode.length-1,1))){if($_.altstartstop){$k[$j++]="bwipp.rationalizedCodabarBadAltStartStop#15424";$k[$j++]="Codabar start and stop characters must be one of E N T or *";bwipp_raiseerror()}else{$k[$j++]="bwipp.rationalizedCodabarBadStartStop#15426";$k[$j++]="Codabar start and stop characters must be one of A B C or D";bwipp_raiseerror()}}for(var _a=1,_Z=$_.barcode.length-2;_a<=_Z;_a+=1){if(!$has($_.bodyvals,$G($_.barcode,_a,1))){$k[$j++]="bwipp.rationalizedCodabarBadCharacter#15431";$k[$j++]="Codabar body must contain only digits and symbols - $ : / . +";bwipp_raiseerror()}}var _i=$_.barcode.length;if($_.validatecheck){_i=_i-1}$_.barlen=_i;$_.checksum=0;for(var _m=0,_l=$_.barlen-2;_m<=_l;_m+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_m,1))+$_.checksum)}$_.checksum=$f($g($_.charvals,$G($_.barcode,$_.barcode.length-1,1))+$_.checksum);$_.checksum=(16-$_.checksum%16)%16;if($_.validatecheck){if($ne($g($_.barcode,$_.barlen-1),$g($_.barchars,$_.checksum))){$k[$j++]="bwipp.rationalizedCodabarBadCheckDigit#15453";$k[$j++]="Incorrect Codabar check digit provided";bwipp_raiseerror()}var _17=$s($_.barlen);$P(_17,0,$G($_.barcode,0,$_.barlen-1));$P(_17,$_.barlen-1,$G($_.barcode,$_.barlen,1));$_.barcode=_17;$_.includecheck=true}var _1I=$_.barlen;if($_.includecheck){_1I=_1I+1}var _1J=$s(_1I*8);$_.sbs=_1J;for(var _1N=0,_1M=$_.barlen-2;_1N<=_1M;_1N+=1){$_.i=_1N;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$_.enc=$g($_.rationalizedCodabar_encs,$_.indx);$P($_.sbs,$_.i*8,$_.enc)}if($_.includecheck){$P($_.sbs,$_.barlen*8-8,$g($_.rationalizedCodabar_encs,$_.checksum));$_.indx=$g($_.charvals,$G($_.barcode,$_.barlen-1,1));$_.enc=$g($_.rationalizedCodabar_encs,$_.indx);$P($_.sbs,$_.barlen*8,$_.enc)}else{$_.indx=$g($_.charvals,$G($_.barcode,$_.barlen-1,1));$_.enc=$g($_.rationalizedCodabar_encs,$_.indx);$P($_.sbs,$_.barlen*8-8,$_.enc)}$k[$j++]="text";if($_.includecheck&&$_.includecheckintext){var _20=$s($_.barlen+1);$P(_20,0,$G($_.barcode,0,$_.barlen-1));$P(_20,$_.barlen-1,$G($_.barchars,$_.checksum,1));$P(_20,$_.barlen,$G($_.barcode,$_.barlen-1,1));$k[$j++]=_20}else{$k[$j++]=$_.barcode}var _2D=$k[--$j];var _2E=$k[--$j];$_[_2E]=_2D;if($_.height==-1){$_.height=1}$k[$j++]=Infinity;$k[$j++]=Infinity;$F($_.sbs,function(){$k[$j-1]-=48});var _2I=$a();var _2N=[];for(var _2K=0,_2L=~~(($_.sbs.length+1)/2);_2K<_2L;_2K++){_2N[_2K]=$_.height}_2N=$a(_2N);var _2R=[];for(var _2P=0,_2Q=~~(($_.sbs.length+1)/2);_2P<_2Q;_2P++){_2R[_2P]=0}_2R=$a(_2R);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_2I;$k[$j++]="bhs";$k[$j++]=_2N;$k[$j++]="bbs";$k[$j++]=_2R;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2Z=$d();$k[$j++]=_2Z;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_onecode(){if(!bwipp_onecode.globals){var $__=$_;$_=bwipp_onecode.globals={};var _4=new Map([[20,$a([0])],[25,$a([1])],[29,$a([1,0,0,0,0,1])],[31,$a([1,0,0,0,1,0,0,0,0,1])]]);$_.onecode_startvals=_4;$_.onecode_tab513=$a([31,7936,47,7808,55,7552,59,7040,61,6016,62,3968,79,7744,87,7488,91,6976,93,5952,94,3904,103,7360,107,6848,109,5824,110,3776,115,6592,117,5568,118,3520,121,5056,122,3008,124,1984,143,7712,151,7456,155,6944,157,5920,158,3872,167,7328,171,6816,173,5792,174,3744,179,6560,181,5536,182,3488,185,5024,186,2976,188,1952,199,7264,203,6752,205,5728,206,3680,211,6496,213,5472,214,3424,217,4960,218,2912,220,1888,227,6368,229,5344,230,3296,233,4832,234,2784,236,1760,241,4576,242,2528,244,1504,248,992,271,7696,279,7440,283,6928,285,5904,286,3856,295,7312,299,6800,301,5776,302,3728,307,6544,309,5520,310,3472,313,5008,314,2960,316,1936,327,7248,331,6736,333,5712,334,3664,339,6480,341,5456,342,3408,345,4944,346,2896,348,1872,355,6352,357,5328,358,3280,361,4816,362,2768,364,1744,369,4560,370,2512,372,1488,376,976,391,7216,395,6704,397,5680,398,3632,403,6448,405,5424,406,3376,409,4912,410,2864,412,1840,419,6320,421,5296,422,3248,425,4784,426,2736,428,1712,433,4528,434,2480,436,1456,440,944,451,6256,453,5232,454,3184,457,4720,458,2672,460,1648,465,4464,466,2416,468,1392,472,880,481,4336,482,2288,484,1264,488,752,527,7688,535,7432,539,6920,541,5896,542,3848,551,7304,555,6792,557,5768,558,3720,563,6536,565,5512,566,3464,569,5e3,570,2952,572,1928,583,7240,587,6728,589,5704,590,3656,595,6472,597,5448,598,3400,601,4936,602,2888,604,1864,611,6344,613,5320,614,3272,617,4808,618,2760,620,1736,625,4552,626,2504,628,1480,632,968,647,7208,651,6696,653,5672,654,3624,659,6440,661,5416,662,3368,665,4904,666,2856,668,1832,675,6312,677,5288,678,3240,681,4776,682,2728,684,1704,689,4520,690,2472,692,1448,696,936,707,6248,709,5224,710,3176,713,4712,714,2664,716,1640,721,4456,722,2408,724,1384,728,872,737,4328,738,2280,740,1256,775,7192,779,6680,781,5656,782,3608,787,6424,789,5400,790,3352,793,4888,794,2840,796,1816,803,6296,805,5272,806,3224,809,4760,810,2712,812,1688,817,4504,818,2456,820,1432,824,920,835,6232,837,5208,838,3160,841,4696,842,2648,844,1624,849,4440,850,2392,852,1368,865,4312,866,2264,868,1240,899,6200,901,5176,902,3128,905,4664,906,2616,908,1592,913,4408,914,2360,916,1336,929,4280,930,2232,932,1208,961,4216,962,2168,964,1144,1039,7684,1047,7428,1051,6916,1053,5892,1054,3844,1063,7300,1067,6788,1069,5764,1070,3716,1075,6532,1077,5508,1078,3460,1081,4996,1082,2948,1084,1924,1095,7236,1099,6724,1101,5700,1102,3652,1107,6468,1109,5444,1110,3396,1113,4932,1114,2884,1116,1860,1123,6340,1125,5316,1126,3268,1129,4804,1130,2756,1132,1732,1137,4548,1138,2500,1140,1476,1159,7204,1163,6692,1165,5668,1166,3620,1171,6436,1173,5412,1174,3364,1177,4900,1178,2852,1180,1828,1187,6308,1189,5284,1190,3236,1193,4772,1194,2724,1196,1700,1201,4516,1202,2468,1204,1444,1219,6244,1221,5220,1222,3172,1225,4708,1226,2660,1228,1636,1233,4452,1234,2404,1236,1380,1249,4324,1250,2276,1287,7188,1291,6676,1293,5652,1294,3604,1299,6420,1301,5396,1302,3348,1305,4884,1306,2836,1308,1812,1315,6292,1317,5268,1318,3220,1321,4756,1322,2708,1324,1684,1329,4500,1330,2452,1332,1428,1347,6228,1349,5204,1350,3156,1353,4692,1354,2644,1356,1620,1361,4436,1362,2388,1377,4308,1378,2260,1411,6196,1413,5172,1414,3124,1417,4660,1418,2612,1420,1588,1425,4404,1426,2356,1441,4276,1442,2228,1473,4212,1474,2164,1543,7180,1547,6668,1549,5644,1550,3596,1555,6412,1557,5388,1558,3340,1561,4876,1562,2828,1564,1804,1571,6284,1573,5260,1574,3212,1577,4748,1578,2700,1580,1676,1585,4492,1586,2444,1603,6220,1605,5196,1606,3148,1609,4684,1610,2636,1617,4428,1618,2380,1633,4300,1634,2252,1667,6188,1669,5164,1670,3116,1673,4652,1674,2604,1681,4396,1682,2348,1697,4268,1698,2220,1729,4204,1730,2156,1795,6172,1797,5148,1798,3100,1801,4636,1802,2588,1809,4380,1810,2332,1825,4252,1826,2204,1857,4188,1858,2140,1921,4156,1922,2108,2063,7682,2071,7426,2075,6914,2077,5890,2078,3842,2087,7298,2091,6786,2093,5762,2094,3714,2099,6530,2101,5506,2102,3458,2105,4994,2106,2946,2119,7234,2123,6722,2125,5698,2126,3650,2131,6466,2133,5442,2134,3394,2137,4930,2138,2882,2147,6338,2149,5314,2150,3266,2153,4802,2154,2754,2161,4546,2162,2498,2183,7202,2187,6690,2189,5666,2190,3618,2195,6434,2197,5410,2198,3362,2201,4898,2202,2850,2211,6306,2213,5282,2214,3234,2217,4770,2218,2722,2225,4514,2226,2466,2243,6242,2245,5218,2246,3170,2249,4706,2250,2658,2257,4450,2258,2402,2273,4322,2311,7186,2315,6674,2317,5650,2318,3602,2323,6418,2325,5394,2326,3346,2329,4882,2330,2834,2339,6290,2341,5266,2342,3218,2345,4754,2346,2706,2353,4498,2354,2450,2371,6226,2373,5202,2374,3154,2377,4690,2378,2642,2385,4434,2401,4306,2435,6194,2437,5170,2438,3122,2441,4658,2442,2610,2449,4402,2465,4274,2497,4210,2567,7178,2571,6666,2573,5642,2574,3594,2579,6410,2581,5386,2582,3338,2585,4874,2586,2826,2595,6282,2597,5258,2598,3210,2601,4746,2602,2698,2609,4490,2627,6218,2629,5194,2630,3146,2633,4682,2641,4426,2657,4298,2691,6186,2693,5162,2694,3114,2697,4650,2705,4394,2721,4266,2753,4202,2819,6170,2821,5146,2822,3098,2825,4634,2833,4378,2849,4250,2881,4186,2945,4154,3079,7174,3083,6662,3085,5638,3086,3590,3091,6406,3093,5382,3094,3334,3097,4870,3107,6278,3109,5254,3110,3206,3113,4742,3121,4486,3139,6214,3141,5190,3145,4678,3153,4422,3169,4294,3203,6182,3205,5158,3209,4646,3217,4390,3233,4262,3265,4198,3331,6166,3333,5142,3337,4630,3345,4374,3361,4246,3393,4182,3457,4150,3587,6158,3589,5134,3593,4622,3601,4366,3617,4238,3649,4174,3713,4142,3841,4126,4111,7681,4119,7425,4123,6913,4125,5889,4135,7297,4139,6785,4141,5761,4147,6529,4149,5505,4153,4993,4167,7233,4171,6721,4173,5697,4179,6465,4181,5441,4185,4929,4195,6337,4197,5313,4201,4801,4209,4545,4231,7201,4235,6689,4237,5665,4243,6433,4245,5409,4249,4897,4259,6305,4261,5281,4265,4769,4273,4513,4291,6241,4293,5217,4297,4705,4305,4449,4359,7185,4363,6673,4365,5649,4371,6417,4373,5393,4377,4881,4387,6289,4389,5265,4393,4753,4401,4497,4419,6225,4421,5201,4425,4689,4483,6193,4485,5169,4489,4657,4615,7177,4619,6665,4621,5641,4627,6409,4629,5385,4633,4873,4643,6281,4645,5257,4649,4745,4675,6217,4677,5193,4739,6185,4741,5161,4867,6169,4869,5145,5127,7173,5131,6661,5133,5637,5139,6405,5141,5381,5155,6277,5157,5253,5187,6213,5251,6181,5379,6165,5635,6157,6151,7171,6155,6659,6163,6403,6179,6275,6211,5189,4681,4433,4321,3142,2634,2386,2274,1612,1364,1252,856,744,496]);$_.onecode_tab213=$a([3,6144,5,5120,6,3072,9,4608,10,2560,12,1536,17,4352,18,2304,20,1280,24,768,33,4224,34,2176,36,1152,40,640,48,384,65,4160,66,2112,68,1088,72,576,80,320,96,192,129,4128,130,2080,132,1056,136,544,144,288,257,4112,258,2064,260,1040,264,528,513,4104,514,2056,516,1032,1025,4100,1026,2052,2049,4098,4097,2050,1028,520,272,160]);$_.onecode_barmap=$a([7,2,4,3,1,10,0,0,9,12,2,8,5,5,6,11,8,9,3,1,0,1,5,12,2,5,1,8,4,4,9,11,6,3,8,10,3,9,7,6,5,11,1,4,8,5,2,12,9,10,0,2,7,1,6,7,3,6,4,9,0,3,8,6,6,4,2,7,1,1,9,9,7,10,5,2,4,0,3,8,6,2,0,4,8,11,1,0,9,8,3,12,2,6,7,7,5,1,4,10,1,12,6,9,7,3,8,0,5,8,9,7,4,6,2,10,3,4,0,5,8,4,5,7,7,11,1,9,6,0,9,6,0,6,4,8,2,1,3,2,5,9,8,12,4,11,6,1,9,5,7,4,3,3,1,2,0,7,2,0,1,3,4,1,6,10,3,5,8,7,9,4,2,11,5,6,0,8,7,12,4,2,8,1,5,10,3,0,9,3,0,9,6,5,2,4,7,8,1,7,5,0,4,5,2,3,0,10,6,12,9,2,3,11,1,6,8,8,7,9,5,4,0,11,1,5,2,2,9,1,4,12,8,3,6,6,7,0,3,7,4,7,7,5,0,12,1,11,2,9,9,0,6,8,5,3,3,10,8,2]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_onecode.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _8=$k[--$j];$_.options=_8;var _9=$k[--$j];$_.barcode=_9;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.barlen=$_.barcode.length;$F($_.barcode,function(){var _E=$k[--$j];if(_E<48||_E>57){$k[$j++]="bwipp.onecodeBadCharacter#15703";$k[$j++]="The data must contain only digits";bwipp_raiseerror()}});if($_.barlen!=20&&$_.barlen!=25&&$_.barlen!=29&&$_.barlen!=31){$k[$j++]="bwipp.onecodeInvalidLength#15708";$k[$j++]="The data must be 20, 25, 29 or 31 digits";bwipp_raiseerror()}$k[$j++]=Infinity;var _L=$eq($G($_.barcode,5,1),"9")?14:11;$k[$j++]=2;$k[$j++]=2;$k[$j++]=5;$k[$j++]=5;$k[$j++]=_L;$k[$j++]=_L;$k[$j++]=20;$k[$j++]=20;$k[$j++]=25;$k[$j++]=25;$k[$j++]=29;$k[$j++]=29;$_.txtdict=$d();$_.txt=$a($_.barlen+6);$_.spacecnt=0;for(var _Q=0,_P=$_.barlen-1;_Q<=_P;_Q+=1){$_.i=_Q;if($has($_.txtdict,$_.i)){$p($_.txt,$_.i+$_.spacecnt,$a([" ",0,0,"",0]));$_.spacecnt=$_.spacecnt+1}$p($_.txt,$_.i+$_.spacecnt,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$_.txt=$G($_.txt,0,$_.barcode.length+$_.spacecnt);$_.normalize=function(){var _k=$k[--$j];$_.base=_k;var _l=$k[--$j];$_.num=_l;for(var _n=$_.num.length-1;_n>=1;_n-=1){$_.i=_n;var _o=$_.num;var _p=$_.i;$p(_o,_p-1,$f($g(_o,_p-1)+~~($g($_.num,$_.i)/$_.base)));$p($_.num,$_.i,$g($_.num,$_.i)%$_.base)}if($ge($g($_.num,0),$_.base)){$k[$j++]=Infinity;$k[$j++]=$g($_.num,0);for(;;){var _16=$k[$j-1];if($lt(_16,$_.base)){break}var _18=$k[--$j];$k[$j++]=_18%$_.base;$k[$j++]=~~(_18/$_.base)}$_.extcnt=$m()-1;$as($a($m()));var _1E=$k[--$j];$_.extdigits=_1E;$k[$j-1]=Infinity;for(var _1G=$_.extcnt;_1G>=0;_1G-=1){$k[$j++]=$g($_.extdigits,_1G)}$q($G($_.num,1,$_.num.length-1));$_.num=$a()}$k[$j++]=0;for(;;){var _1M=$k[$j-1];if(_1M>=$_.num.length){break}var _1P=$k[$j-1];if($g($_.num,_1P)!=0){break}$k[$j-1]+=1}var _1S=$k[$j-1];if(_1S>=$_.num.length){$k[$j-1]=$a([0])}else{var _1W=$k[--$j];$k[$j++]=$G($_.num,_1W,$f($_.num.length-_1W))}};$_.bigadd=function(){var _1Z=$k[--$j];var _1a=$k[--$j];$_.offset=$abs(_1Z.length-_1a.length);if(_1Z.length<_1a.length){var _=_1Z;_1Z=_1a;_1a=_}$_.a=_1Z;$_.b=_1a;for(var _1d=0,_1c=$_.b.length-1;_1d<=_1c;_1d+=1){var _1e=$_.a;var _1f=$_.offset;$p(_1e,_1d+_1f,$f($g(_1e,_1d+_1f)+$g($_.b,_1d)))}$k[$j++]=$_.a};$k[$j++]="binval";$k[$j++]=$g($_.onecode_startvals,$_.barlen);var _1s=[];var _1o=$G($_.barcode,20,$_.barlen-20);for(var _1p=0,_1q=_1o.length;_1p<_1q;_1p++){_1s[_1p]=$g(_1o,_1p)-48}_1s=$a(_1s);$k[$j++]=_1s;$_.bigadd();var _1t=$k[--$j];var _1u=$k[--$j];$_[_1u]=_1t;$k[$j++]=Infinity;$q($_.binval);$k[$j++]=$g($_.barcode,0)-48;$_.binval=$a();var _22=[];var _1y=$_.binval;for(var _1z=0,_20=_1y.length;_1z<_20;_1z++){_22[_1z]=$g(_1y,_1z)*5}_22=$a(_22);$k[$j++]="binval";$k[$j++]=_22;$k[$j++]=$a([$g($_.barcode,1)-48]);$_.bigadd();$k[$j++]=10;$_.normalize();var _26=$k[--$j];var _27=$k[--$j];$_[_27]=_26;$k[$j++]=Infinity;$q($_.binval);var _2A=$G($_.barcode,2,18);for(var _2B=0,_2C=_2A.length;_2B<_2C;_2B++){$k[$j++]=$g(_2A,_2B)-48}$_.binval=$a();$_.bytes=$a(13);var _2F=$_.binval;$_.bintmp=$A($a(_2F.length),_2F);for(var _2I=12;_2I>=0;_2I-=1){$_.i=_2I;for(var _2L=0,_2K=$_.bintmp.length-2;_2L<=_2K;_2L+=1){$_.j=_2L;var _2M=$_.bintmp;var _2N=$_.j;$p(_2M,_2N+1,$f($g(_2M,_2N+1)+$g($_.bintmp,$_.j)%256*10));$p($_.bintmp,$_.j,~~($g($_.bintmp,$_.j)/256))}$p($_.bytes,$_.i,$g($_.bintmp,$_.bintmp.length-1)%256);var _2c=$_.bintmp;var _2d=$_.bintmp;$p(_2c,_2d.length-1,~~($g(_2c,_2d.length-1)/256))}$_.fcs=2047;$_.dat=$g($_.bytes,0)*32;for(var _2h=0;_2h<6;_2h++){var _2m=$_.fcs*2;if((($_.fcs^$_.dat)&1024)!=0){_2m=_2m^3893}$_.fcs=_2m&2047;$_.dat=$_.dat*2}for(var _2p=1;_2p<=12;_2p+=1){$_.dat=$g($_.bytes,_2p)*8;for(var _2s=0;_2s<8;_2s++){var _2x=$_.fcs*2;if((($_.fcs^$_.dat)&1024)!=0){_2x=_2x^3893}$_.fcs=_2x&2047;$_.dat=$_.dat*2}}$_.codewords=$a(10);for(var _31=9;_31>=0;_31-=1){$_.i=_31;var _33=$_.i==9?636:1365;$_.b=_33;for(var _36=0,_35=$_.binval.length-2;_36<=_35;_36+=1){$_.j=_36;var _37=$_.binval;var _38=$_.j;$p(_37,_38+1,$f($g(_37,_38+1)+$g($_.binval,$_.j)%$_.b*10));$p($_.binval,$_.j,~~($g($_.binval,$_.j)/$_.b))}$p($_.codewords,$_.i,$g($_.binval,$_.binval.length-1)%$_.b);var _3Q=$_.binval;var _3R=$_.binval;$p(_3Q,_3R.length-1,~~($g(_3Q,_3R.length-1)/$_.b))}$p($_.codewords,9,$g($_.codewords,9)*2);if(($_.fcs&1024)!=0){$p($_.codewords,0,$g($_.codewords,0)+659)}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#15856";$k[$j++]=$_.codewords;bwipp_raiseerror()}$_.chars=$a(10);for(var _3f=0;_3f<=9;_3f+=1){$_.i=_3f;var _3i=$g($_.codewords,$_.i);$k[$j++]=_3i;if(_3i<=1286){var _3j=$k[--$j];$k[$j++]=$g($_.onecode_tab513,_3j)}else{var _3l=$k[--$j];$k[$j++]=$g($_.onecode_tab213,_3l-1287)}$k[$j++]=$_.chars;$k[$j++]=$_.i;var _3p=$k[$j-3];var _3q=$k[$j-1];var _3r=$k[$j-2];$j-=3;$p(_3r,_3q,_3p)}for(var _3s=9;_3s>=0;_3s-=1){$_.i=_3s;if(($pow(2,$_.i)&$_.fcs)!=0){$p($_.chars,$_.i,$g($_.chars,$_.i)^8191)}}if($_.height==-1){$_.height=.15}$_.bbs=$a(65);$_.bhs=$a(65);for(var _43=0;_43<=64;_43+=1){$_.i=_43;$_.dec=($g($_.chars,$g($_.onecode_barmap,$_.i*4))&$pow(2,$g($_.onecode_barmap,$_.i*4+1)))!=0;$_.asc=($g($_.chars,$g($_.onecode_barmap,$_.i*4+2))&$pow(2,$g($_.onecode_barmap,$_.i*4+3)))!=0;if(!$_.dec&&!$_.asc){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,2*$_.height/8)}if(!$_.dec&&$_.asc){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($_.dec&&!$_.asc){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($_.dec&&$_.asc){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,8*$_.height/8)}}$k[$j++]=Infinity;var _4m=$_.bbs;var _4n=$_.bhs;$k[$j++]=Infinity;for(var _4p=0,_4q=$_.bhs.length-1;_4p<_4q;_4p++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _4r=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_4m;$k[$j++]="bhs";$k[$j++]=_4n;$k[$j++]="sbs";$k[$j++]=_4r;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="left";$k[$j++]="text1font";$k[$j++]="OCR-B";$k[$j++]="text1yoffset";$k[$j++]=-1;$k[$j++]="text1xoffset";$k[$j++]=-.3;$k[$j++]="opt";$k[$j++]=$_.options;var _4u=$d();$k[$j++]=_4u;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_postnet(){if(!bwipp_postnet.globals){var $__=$_;$_=bwipp_postnet.globals={};$_.postnet_barchars="0123456789";$_.postnet_encs=$a(["55222","22255","22525","22552","25225","25252","25522","52225","52252","52522","5","5"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_postnet.globals);$_.dontdraw=false;$_.includetext=false;$_.validatecheck=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));var _8=$_.barcode.length;if($_.validatecheck){_8=_8-1}$_.barlen=_8;if($_.barlen!=5&&$_.barlen!=9&&$_.barlen!=11){$k[$j++]="bwipp.postnetBadLength#16011";$k[$j++]="USPS POSTNET must be 5, 9 or 11 digits excluding check digit";bwipp_raiseerror()}$F($_.barcode,function(){var _E=$k[--$j];if(_E<48||_E>57){$k[$j++]="bwipp.postnetBadCharacter#16015";$k[$j++]="USPS POSTNET must contain only digits";bwipp_raiseerror()}});$_.checksum=0;for(var _H=0,_G=$_.barlen-1;_H<=_G;_H+=1){$_.i=_H;$_.checksum=$f($_.checksum+($g($_.barcode,$_.i)-48))}$_.checksum=(10-$_.checksum%10)%10;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.postnet_barchars,$_.checksum)){$k[$j++]="bwipp.postnetBadCheckDigit#16033";$k[$j++]="Incorrect USPS POSTNET check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}if($_.height==-1){$_.height=.125}$_.bhs=$a($_.barlen*5+7);$_.enc=$g($_.postnet_encs,10);$_.heights=$a($_.enc.length);for(var _e=0,_d=$_.enc.length-1;_e<=_d;_e+=1){$_.j=_e;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,0,$_.heights);for(var _p=0,_o=$_.barlen-1;_p<=_o;_p+=1){$_.i=_p;$_.enc=$g($_.postnet_encs,$g($_.barcode,$_.i)-48);$_.heights=$a($_.enc.length);for(var _y=0,_x=$_.enc.length-1;_y<=_x;_y+=1){$_.j=_y;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.i*5+1,$_.heights)}$_.enc=$g($_.postnet_encs,$_.checksum);$_.heights=$a($_.enc.length);for(var _1E=0,_1D=$_.enc.length-1;_1E<=_1D;_1E+=1){$_.j=_1E;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.barlen*5+1,$_.heights);$k[$j++]="text";if($_.includecheckintext){var _1Q=$s($_.barlen+1);$P(_1Q,0,$_.barcode);$P(_1Q,$_.barlen,$G($_.postnet_barchars,$_.checksum,1));$k[$j++]=_1Q}else{$k[$j++]=$_.barcode}var _1W=$k[--$j];var _1X=$k[--$j];$_[_1X]=_1W;$_.enc=$g($_.postnet_encs,11);$_.heights=$a($_.enc.length);for(var _1d=0,_1c=$_.enc.length-1;_1d<=_1c;_1d+=1){$_.j=_1d;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.barlen*5+6,$_.heights);$k[$j++]=Infinity;var _1n=$_.bhs;var _1r=[];for(var _1p=0,_1q=$_.bhs.length;_1p<_1q;_1p++){_1r[_1p]=0}_1r=$a(_1r);$k[$j++]=Infinity;for(var _1t=0,_1u=$_.bhs.length-1;_1t<_1u;_1t++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _1v=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bhs";$k[$j++]=_1n;$k[$j++]="bbs";$k[$j++]=_1r;$k[$j++]="sbs";$k[$j++]=_1v;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _23=$d();$k[$j++]=_23;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_planet(){if(!bwipp_planet.globals){var $__=$_;$_=bwipp_planet.globals={};$_.planet_barchars="0123456789";$_.planet_encs=$a(["22555","55522","55252","55225","52552","52525","52255","25552","25525","25255","5","5"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_planet.globals);$_.dontdraw=false;$_.includetext=false;$_.validatecheck=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));var _8=$_.barcode.length;if($_.validatecheck){_8=_8-1}$_.barlen=_8;if($_.barlen!=11&&$_.barlen!=13){$k[$j++]="bwipp.planetBadLength#16193";$k[$j++]="USPS PLANET must be 11 or 13 digits excluding check digit";bwipp_raiseerror()}$F($_.barcode,function(){var _D=$k[--$j];if(_D<48||_D>57){$k[$j++]="bwipp.planetBadCharacter#16197";$k[$j++]="USPS PLANET must contain only digits";bwipp_raiseerror()}});$_.checksum=0;for(var _G=0,_F=$_.barlen-1;_G<=_F;_G+=1){$_.i=_G;$_.checksum=$f($_.checksum+($g($_.barcode,$_.i)-48))}$_.checksum=(10-$_.checksum%10)%10;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.planet_barchars,$_.checksum)){$k[$j++]="bwipp.planetBadCheckDigit#16218";$k[$j++]="Incorrect USPS PLANET check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}if($_.height==-1){$_.height=.125}$_.bhs=$a($_.barlen*5+7);$_.enc=$g($_.planet_encs,10);$_.heights=$a($_.enc.length);for(var _d=0,_c=$_.enc.length-1;_d<=_c;_d+=1){$_.j=_d;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,0,$_.heights);for(var _o=0,_n=$_.barlen-1;_o<=_n;_o+=1){$_.i=_o;$_.enc=$g($_.planet_encs,$g($_.barcode,$_.i)-48);$_.heights=$a($_.enc.length);for(var _x=0,_w=$_.enc.length-1;_x<=_w;_x+=1){$_.j=_x;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.i*5+1,$_.heights)}$_.enc=$g($_.planet_encs,$_.checksum);$_.heights=$a($_.enc.length);for(var _1D=0,_1C=$_.enc.length-1;_1D<=_1C;_1D+=1){$_.j=_1D;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.barlen*5+1,$_.heights);$k[$j++]="text";if($_.includecheckintext){var _1P=$s($_.barlen+1);$P(_1P,0,$_.barcode);$P(_1P,$_.barlen,$G($_.planet_barchars,$_.checksum,1));$k[$j++]=_1P}else{$k[$j++]=$_.barcode}var _1V=$k[--$j];var _1W=$k[--$j];$_[_1W]=_1V;$_.enc=$g($_.planet_encs,11);$_.heights=$a($_.enc.length);for(var _1c=0,_1b=$_.enc.length-1;_1c<=_1b;_1c+=1){$_.j=_1c;$p($_.heights,$_.j,$i($G($_.enc,$_.j,1))*$_.height/5)}$P($_.bhs,$_.barlen*5+6,$_.heights);$k[$j++]=Infinity;var _1m=$_.bhs;var _1q=[];for(var _1o=0,_1p=$_.bhs.length;_1o<_1p;_1o++){_1q[_1o]=0}_1q=$a(_1q);$k[$j++]=Infinity;for(var _1s=0,_1t=$_.bhs.length-1;_1s<_1t;_1s++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _1u=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bhs";$k[$j++]=_1m;$k[$j++]="bbs";$k[$j++]=_1q;$k[$j++]="sbs";$k[$j++]=_1u;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _22=$d();$k[$j++]=_22;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_royalmail(){if(!bwipp_royalmail.globals){var $__=$_;$_=bwipp_royalmail.globals={};$_.royalmail_barchars="ZUVWXY501234B6789AHCDEFGNIJKLMTOPQRS";$_.royalmail_encs=$a(["3300","2211","2301","2310","3201","3210","1122","0033","0123","0132","1023","1032","1302","0213","0303","0312","1203","1212","1320","0231","0321","0330","1221","1230","3102","2013","2103","2112","3003","3012","3120","2031","2121","2130","3021","3030","2","3"]);$_.charvals=new Map;for(var _1=0;_1<=35;_1+=1){$p($_.charvals,$G($_.royalmail_barchars,_1,1),_1)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_royalmail.globals);$_.dontdraw=false;$_.includetext=false;$_.validatecheck=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _5=$k[--$j];$_.options=_5;var _6=$k[--$j];$_.barcode=_6;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.royalmailEmptyData#16406";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.royalmailInputTooLong#16410";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _D=0,_C=$_.barcode.length-1;_D<=_C;_D+=1){if(!$has($_.charvals,$G($_.barcode,_D,1))){$k[$j++]="bwipp.royalmailBadCharacter#16424";$k[$j++]="RM4SCC must contain only capital letters and digits";bwipp_raiseerror()}}var _L=$_.barcode.length;if($_.validatecheck){_L=_L-1}$_.barlen=_L;$_.checksumrow=0;$_.checksumcol=0;for(var _P=0,_O=$_.barlen-1;_P<=_O;_P+=1){$_.i=_P;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$_.checksumrow=$_.checksumrow+~~($_.indx/6);$_.checksumcol=$f($_.checksumcol+$_.indx%6)}$_.checksum=$f($_.checksumrow%6*6+$_.checksumcol%6);if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.royalmail_barchars,$_.checksum)){$k[$j++]="bwipp.royalmailBadCheckDigit#16441";$k[$j++]="Incorrect RM4SCC check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}$_.encstr=$s($_.barlen*4+6);$P($_.encstr,0,$g($_.royalmail_encs,36));for(var _q=0,_p=$_.barlen-1;_q<=_p;_q+=1){$_.i=_q;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.encstr,$_.i*4+1,$g($_.royalmail_encs,$_.indx))}$P($_.encstr,$_.barlen*4+1,$g($_.royalmail_encs,$_.checksum));$k[$j++]="text";if($_.includecheckintext){var _16=$s($_.barlen+1);$P(_16,0,$_.barcode);$P(_16,$_.barlen,$G($_.royalmail_barchars,$_.checksum,1));$k[$j++]=_16}else{$k[$j++]=$_.barcode}var _1C=$k[--$j];var _1D=$k[--$j];$_[_1D]=_1C;$P($_.encstr,$_.barlen*4+5,$g($_.royalmail_encs,37));if($_.height==-1){$_.height=.175}$_.bbs=$a($_.encstr.length);$_.bhs=$a($_.encstr.length);for(var _1O=0,_1N=$_.encstr.length-1;_1O<=_1N;_1O+=1){$_.i=_1O;$_.enc=$G($_.encstr,$_.i,1);if($eq($_.enc,"0")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,2*$_.height/8)}if($eq($_.enc,"1")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"2")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"3")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,8*$_.height/8)}}$k[$j++]=Infinity;var _1u=$_.bbs;var _1v=$_.bhs;$k[$j++]=Infinity;for(var _1x=0,_1y=$_.bhs.length-1;_1x<_1y;_1x++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _1z=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_1u;$k[$j++]="bhs";$k[$j++]=_1v;$k[$j++]="sbs";$k[$j++]=_1z;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _27=$d();$k[$j++]=_27;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_auspost(){if(!bwipp_auspost.globals){var $__=$_;$_=bwipp_auspost.globals={};$_.auspost_encs=$a(["000","001","002","010","011","012","020","021","022","100","101","102","110","111","112","120","121","122","200","201","202","210","211","212","220","221","222","300","301","302","310","311","312","320","321","322","023","030","031","032","033","103","113","123","130","131","132","133","203","213","223","230","231","232","233","303","313","323","330","331","332","333","003","013","00","01","02","10","11","12","20","21","22","30","13","3"]);$_.auspost_barchars="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz #";var _1=new Map([["11",37],["45",37],["59",52],["62",67],["87",37],["92",37]]);$_.auspost_fcclen=_1;$_.auspost_rsprod=function(){var _2=$k[--$j];var _3=$k[--$j];$k[$j++]=$g($_.rstable,$f(_3+_2*64))};$_.rstable=$a(64*64);var _B=$_.rstable;var _A=0;var _9=[];for(var _8=0;_8<64;_8++){_9[_8]=0}_9=$a(_9);$P(_B,_A,_9);var _G=$_.rstable;var _F=64;var _E=[];for(var _D=0;_D<=63;_D+=1){_E[_D]=_D}_E=$a(_E);$P(_G,_F,_E);$k[$j++]=1;for(var _H=0;_H<64;_H++){var _I=$k[$j-1];var _J=_I*2;$k[$j++]=_J;if((_J&64)!=0){var _K=$k[--$j];$k[$j++]=_K^67}var _L=$k[$j-1];var _M=$k[$j-2];$k[$j++]=_M*64;$k[$j++]=_L*64;for(var _N=0;_N<=63;_N+=1){var _P=$k[$j-1];var _R=$k[$j-2];var _T=$g($_.rstable,$f(_R+_N))*2;$k[$j++]=_N;var _X=$_.rstable;var _W=$f(_P+_N);if((_T&64)!=0){_T=_T^67}$p(_X,_W,_T);$j--}$j-=2;var _Y=$k[--$j];$k[$j-1]=_Y}$j--;$_.rstable=$_.rstable;$_.rspoly=$a([1,0,0,0,0]);for(var _b=1;_b<=4;_b+=1){$k[$j++]=$bs(1,_b);for(var _c=_b;_c>=1;_c-=1){var _d=$_.rspoly;var _h=$k[$j-1];$k[$j++]=_d;$k[$j++]=_c;$k[$j++]=$g(_d,_c-1);$k[$j++]=$g($_.rspoly,_c);$k[$j++]=_h;$_.auspost_rsprod();var _i=$k[--$j];var _j=$k[--$j];var _k=$k[--$j];var _l=$k[--$j];$p(_l,_k,$xo(_j,_i))}var _m=$_.rspoly;var _o=$k[$j-1];$k[$j++]=_m;$k[$j++]=0;$k[$j++]=$g(_m,0);$k[$j++]=_o;$_.auspost_rsprod();var _p=$k[--$j];var _q=$k[--$j];var _r=$k[--$j];$p(_r,_q,_p);$j--}$_.rspoly=$_.rspoly;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_auspost.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.custinfoenc="character";$_.modunit=1;bwipp_processoptions();var _t=$k[--$j];$_.options=_t;var _u=$k[--$j];$_.barcode=_u;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($ne($_.custinfoenc,"character")&&$ne($_.custinfoenc,"numeric")){$k[$j++]="bwipp.auspostBadCustinfoEncoding#16675";$k[$j++]="Customer information encoding must be either character or numeric";bwipp_raiseerror()}$_.barlen=$_.barcode.length;if($_.barlen<10){$k[$j++]="bwipp.auspostTooShort#16680";$k[$j++]="The data length must be at least 10";bwipp_raiseerror()}$k[$j++]=$_.auspost_fcclen;if($_.barlen>=2){$k[$j++]=$G($_.barcode,0,2)}else{$k[$j++]=""}var _14=$k[$j-1];var _15=$k[$j-2];var _16=$has(_15,_14);if(!_16){$j-=2;$k[$j++]="bwipp.auspostBadFCC#16686";$k[$j++]="Must begin with an FCC, either 11, 45, 59, 62, 87 or 92";bwipp_raiseerror()}var _17=$k[--$j];var _18=$k[--$j];$_.encstr=$s($g(_18,_17));$k[$j++]=true;for(var _1B=0;_1B<1;_1B++){if($_.barlen<10){$k[$j-1]=false;break}var _1E=$G($_.barcode,2,8);for(var _1F=0,_1G=_1E.length;_1F<_1G;_1F++){var _1H=$g(_1E,_1F);if(_1H<48||_1H>57){$k[$j-1]=false;break}}}var _1I=$k[--$j];if(!_1I){$k[$j++]="bwipp.auspostIncompleteDPID#16699";$k[$j++]="The DPID must be 8 digits";bwipp_raiseerror()}var _1L=$eq($_.custinfoenc,"numeric")?2:3;if(($_.barlen-10)*_1L>$_.encstr.length-22-14){$k[$j++]="bwipp.auspostTooLong#16707";$k[$j++]="The message is too long";bwipp_raiseerror()}$P($_.encstr,0,$g($_.auspost_encs,74));for(var _1P=0;_1P<=1;_1P+=1){$_.i=_1P;$P($_.encstr,$_.i*2+2,$g($_.auspost_encs,$i($G($_.barcode,$_.i,1))+64))}for(var _1W=2;_1W<=9;_1W+=1){$_.i=_1W;$P($_.encstr,$_.i*2+2,$g($_.auspost_encs,$i($G($_.barcode,$_.i,1))+64))}if($eq($_.custinfoenc,"numeric")){for(var _1g=0,_1f=$_.barlen-11;_1g<=_1f;_1g+=1){$_.i=_1g;var _1j=$g($_.barcode,$_.i+10);$k[$j++]=$_.auspost_encs;$k[$j++]=_1j;if(_1j<48||_1j>57){$j-=2;$k[$j++]="bwipp.auspostInvalidCustinfoDigit#16747";$k[$j++]="The customer information data contains a non-digit character";bwipp_raiseerror()}var _1k=$k[--$j];var _1l=$k[--$j];$P($_.encstr,$_.i*2+22,$g(_1l,_1k-48+64))}$_.ciflen=($_.barlen-10)*2}else{for(var _1s=0,_1r=$_.barlen-11;_1s<=_1r;_1s+=1){$_.i=_1s;$X($_.auspost_barchars,$G($_.barcode,$_.i+10,1));var _1w=$k[--$j];if(!_1w){$k[$j-1]="bwipp.auspostInvalidCustinfoCharacter#16758";$k[$j++]="The customer information contains an invalid character";bwipp_raiseerror()}var _1x=$k[--$j];$_.indx=_1x.length;$j-=2;$_.enc=$g($_.auspost_encs,$_.indx);$P($_.encstr,$_.i*3+22,$_.enc)}$_.ciflen=($_.barlen-10)*3}for(var _27=22+$_.ciflen,_26=$_.encstr.length-14;_27<=_26;_27+=1){$P($_.encstr,_27,$g($_.auspost_encs,75))}$_.rscodes=$a(~~(($_.encstr.length-16)/3)+4);var _2G=$_.rscodes;var _2F=0;var _2E=[];for(var _2D=0;_2D<4;_2D++){_2E[_2D]=0}_2E=$a(_2E);$P(_2G,_2F,_2E);for(var _2J=2,_2I=$_.encstr.length-16;_2J<=_2I;_2J+=3){$_.i=_2J;$p($_.rscodes,$_.rscodes.length-~~(($_.i-2)/3)-1,$i($G($_.encstr,$_.i,1))*16+$i($G($_.encstr,$_.i+1,1))*4+$i($G($_.encstr,$_.i+2,1)))}for(var _2X=$_.rscodes.length-5;_2X>=0;_2X-=1){$k[$j++]=_2X;for(var _2Y=0;_2Y<=4;_2Y+=1){var _2Z=$_.rscodes;var _2a=$k[$j-1];var _2b=$g(_2Z,$f(_2a+_2Y));$k[$j++]=_2Z;$k[$j++]=$f(_2a+_2Y);$k[$j++]=_2b;$k[$j++]=$g($_.rspoly,_2Y);$k[$j++]=$g($_.rscodes,_2a+4);$_.auspost_rsprod();var _2g=$k[--$j];var _2h=$k[--$j];var _2i=$k[--$j];var _2j=$k[--$j];$p(_2j,_2i,$xo(_2h,_2g))}$j--}$_.checkcode=$Z($s(12),"000000000000");for(var _2m=0;_2m<=3;_2m+=1){$_.i=_2m;$_.enc=$R($s(3),$g($_.rscodes,3-$_.i),4);$P($_.checkcode,$_.i*3+(3-$_.enc.length),$_.enc)}$P($_.encstr,$_.encstr.length-14,$_.checkcode);$P($_.encstr,$_.encstr.length-2,$g($_.auspost_encs,74));if($_.height==-1){$_.height=.175}$_.bbs=$a($_.encstr.length);$_.bhs=$a($_.encstr.length);for(var _39=0,_38=$_.encstr.length-1;_39<=_38;_39+=1){$_.i=_39;$_.enc=$G($_.encstr,$_.i,1);if($eq($_.enc,"0")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,8*$_.height/8)}if($eq($_.enc,"1")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"2")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"3")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,2*$_.height/8)}}$k[$j++]=Infinity;var _3f=$_.bbs;var _3g=$_.bhs;$k[$j++]=Infinity;for(var _3i=0,_3j=$_.bhs.length-1;_3i<_3j;_3i++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _3k=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_3f;$k[$j++]="bhs";$k[$j++]=_3g;$k[$j++]="sbs";$k[$j++]=_3k;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$G($_.barcode,2,$_.barlen-2),0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _3u=$d();$k[$j++]=_3u;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_kix(){if(!bwipp_kix.globals){var $__=$_;$_=bwipp_kix.globals={};$_.kix_encs=$a(["0033","0123","0132","1023","1032","1122","0213","0303","0312","1203","1212","1302","0231","0321","0330","1221","1230","1320","2013","2103","2112","3003","3012","3102","2031","2121","2130","3021","3030","3120","2211","2301","2310","3201","3210","3300"]);$_.kix_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";$_.charvals=new Map;for(var _1=0;_1<=35;_1+=1){$p($_.charvals,$G($_.kix_barchars,_1,1),_1)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_kix.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _5=$k[--$j];$_.options=_5;var _6=$k[--$j];$_.barcode=_6;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.kixEmptyData#16967";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.kixInputTooLong#16971";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _D=0,_C=$_.barcode.length-1;_D<=_C;_D+=1){if(!$has($_.charvals,$G($_.barcode,_D,1))){$k[$j++]="bwipp.kixBadCharacter#16979";$k[$j++]="KIX must contain only capital letters and digits";bwipp_raiseerror()}}$_.barlen=$_.barcode.length;$_.encstr=$s($_.barlen*4);for(var _N=0,_M=$_.barlen-1;_N<=_M;_N+=1){$_.i=_N;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.encstr,$_.i*4,$g($_.kix_encs,$_.indx))}if($_.height==-1){$_.height=.175}$_.bbs=$a($_.encstr.length);$_.bhs=$a($_.encstr.length);for(var _e=0,_d=$_.encstr.length-1;_e<=_d;_e+=1){$_.i=_e;$_.enc=$G($_.encstr,$_.i,1);if($eq($_.enc,"0")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,2*$_.height/8)}if($eq($_.enc,"1")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"2")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"3")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,8*$_.height/8)}}$k[$j++]=Infinity;var _1A=$_.bbs;var _1B=$_.bhs;$k[$j++]=Infinity;for(var _1D=0,_1E=$_.bhs.length-1;_1D<_1E;_1D++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _1F=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_1A;$k[$j++]="bhs";$k[$j++]=_1B;$k[$j++]="sbs";$k[$j++]=_1F;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.barcode,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _1N=$d();$k[$j++]=_1N;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_japanpost(){if(!bwipp_japanpost.globals){var $__=$_;$_=bwipp_japanpost.globals={};$_.japanpost_encs=$a(["300","330","312","132","321","303","123","231","213","033","030","120","102","210","012","201","021","003","333","31","13"]);$_.japanpost_barchars="0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_japanpost.globals);$_.dontdraw=false;$_.includetext=false;$_.includecheckintext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.japanpostEmptyData#17121";$k[$j++]="The data must not be empty";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(!(_7>=48&&_7<=57||(_7>=65&&_7<=90||_7==45))){$k[$j++]="bwipp.japanpostBadCharacter#17131";$k[$j++]="Japan Post must contain only digits, capital letters and the dash symbol";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;$_.encstr=$s((20+1)*3+4);$_.digits=$a(20);$P($_.encstr,0,$g($_.japanpost_encs,19));$_.checksum=0;$_.j=0;$_.i=0;$k[$j++]=true;for(var _F=0,_E=$_.barlen-1;_F<=_E;_F+=1){$_.i=_F;$X($_.japanpost_barchars,$G($_.barcode,$_.i,1));$j--;var _J=$k[--$j];$_.indx=_J.length;$j-=2;if($_.indx>=11&&$_.indx<37){if($_.j>18){$k[$j-1]=false;break}$_.digit=~~(($_.indx-1)/10)+10;$P($_.encstr,$_.j*3+2,$g($_.japanpost_encs,$_.digit));$_.checksum=$_.checksum+$_.digit;$p($_.digits,$_.j,$_.digit);$_.j=$_.j+1}if($_.j>19){$k[$j-1]=false;break}$_.digit=0;if($_.indx==37){$_.digit=14}if($_.indx>=11&&$_.indx<37){$_.digit=($_.indx-1)%10}if($_.indx<11){$_.digit=$_.indx}$P($_.encstr,$_.j*3+2,$g($_.japanpost_encs,$_.digit));$_.checksum=$_.checksum+$_.digit;$p($_.digits,$_.j,$_.digit);$_.j=$_.j+1}var _p=$k[--$j];if(!_p){$k[$j++]="bwipp.japanpostTooLong#17189";$k[$j++]="The input is too long";bwipp_raiseerror()}for(var _s=$_.j,_r=20-1;_s<=_r;_s+=1){$_.k=_s;$P($_.encstr,$_.k*3+2,$g($_.japanpost_encs,14));$_.checksum=$_.checksum+14;$p($_.digits,$_.k,14)}$_.checksum=19-$_.checksum%19;$P($_.encstr,2+20*3,$g($_.japanpost_encs,$_.checksum));$k[$j++]="text";if($_.includecheckintext){var _15=$s($_.barlen+1);$P(_15,0,$_.barcode);$P(_15,$_.barlen,$G($_.japanpost_barchars,$_.checksum,1));$k[$j++]=_15}else{$k[$j++]=$_.barcode}var _1B=$k[--$j];var _1C=$k[--$j];$_[_1C]=_1B;$P($_.encstr,(20+1)*3+2,$g($_.japanpost_encs,20));if($_.height==-1){$_.height=.175}$_.bbs=$a(21*3+4);$_.bhs=$a($_.bbs.length);for(var _1L=0,_1K=$_.bbs.length-1;_1L<=_1K;_1L+=1){$_.i=_1L;$_.enc=$G($_.encstr,$_.i,1);$_.bunit=0;$_.hunit=0;if($eq($_.enc,"0")){$_.bunit=3;$_.hunit=2}if($eq($_.enc,"1")){$_.bunit=0;$_.hunit=5}if($eq($_.enc,"2")){$_.bunit=3;$_.hunit=5}if($eq($_.enc,"3")){$_.bunit=0;$_.hunit=8}$p($_.bbs,$_.i,$_.bunit*$_.height/8);$p($_.bhs,$_.i,$_.hunit*$_.height/8)}$k[$j++]=Infinity;var _1b=$_.bbs;var _1c=$_.bhs;$k[$j++]=Infinity;for(var _1e=0,_1f=$_.bhs.length-1;_1e<_1f;_1e++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _1g=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_1b;$k[$j++]="bhs";$k[$j++]=_1c;$k[$j++]="sbs";$k[$j++]=_1g;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _1o=$d();$k[$j++]=_1o;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_msi(){if(!bwipp_msi.globals){var $__=$_;$_=bwipp_msi.globals={};$_.msi_encs=$a(["12121212","12121221","12122112","12122121","12211212","12211221","12212112","12212121","21121212","21121221","21","121"]);$_.msi_barchars="0123456789";var _1=new Map([["mod10",function(){$_.mod10()}],["mod1010",function(){$_.mod10();$_.mod10()}],["mod11",function(){$_.mod11()}],["ncrmod11",function(){$_.ncrmod11()}],["mod1110",function(){$_.mod11();$_.mod10()}],["ncrmod1110",function(){$_.ncrmod11();$_.mod10()}]]);$_.msi_checkfunc=_1;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_msi.globals);$_.dontdraw=false;$_.includecheck=false;$_.includetext=false;$_.includecheckintext=false;$_.checktype="unset";$_.badmod11=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;if($_.barcode.length>500){$k[$j++]="bwipp.msiinputTooLong#17353";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($ne($_.checktype,"unset")&&!$_.includecheck){$k[$j++]="bwipp.msiCheckTypeWithoutCheck#17362";$k[$j++]="checktype requires includecheck";bwipp_raiseerror()}if($_.badmod11&&($ne($_.checktype,"mod11")&&$ne($_.checktype,"ncrmod11")&&$ne($_.checktype,"mod1110")&&$ne($_.checktype,"ncrmod1110"))){$k[$j++]="bwipp.msiBadMod11Mismatch#17366";$k[$j++]="badmod11 requires checktype with mod11";bwipp_raiseerror()}if($eq($_.checktype,"unset")){$_.checktype="mod10"}$F($_.barcode,function(){var _G=$k[--$j];if(_G<48||_G>57){$k[$j++]="bwipp.msiBadCharacter#17376";$k[$j++]="MSI must contain only digits";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;$_.txtlen=$_.barlen;$_.mod10=function(){var _J=$k[--$j];$_.code=_J;$k[$j++]=0;$k[$j++]=0;$F($_.code,function(){var _L=$k[--$j];var _M=$k[--$j];var _N=$k[--$j];$k[$j++]=$f(_L-48+_M*10);$k[$j++]=_N});$j--;var _O=$k[--$j];$k[$j++]=_O*2;$k[$j++]=0;for(;;){var _P=$k[--$j];var _Q=$k[--$j];var _R=~~(_Q/10);$k[$j++]=$f(_P+_Q%10);$k[$j++]=_R;if(_R==0){$j--;break}var _S=$k[--$j];var _T=$k[--$j];$k[$j++]=_S;$k[$j++]=_T}$k[$j++]=0;$k[$j++]=0;$F($_.code,function(){var _V=$k[--$j];var _W=$k[--$j];var _X=$k[--$j];$k[$j++]=$f(_W+(_V-48));$k[$j++]=_X});var _Y=$k[--$j];$j--;var _b=$k[--$j];var _d=$s($_.code.length+1);$P(_d,0,$_.code);$p(_d,$_.code.length,(10-$f(_b+_Y)%10)%10+48);$k[$j++]=_d};$_.mod11=function(){var _g=$k[--$j];$_.code=_g;$k[$j++]=$_.code.length-1;$F($_.code,function(){var _j=$k[--$j];var _k=$k[--$j];$k[$j++]=_j-48;$k[$j++]=_k%6+2;$k[$j++]=_k-1});$k[$j-1]=0;for(var _m=0,_n=$_.code.length;_m<_n;_m++){var _o=$k[$j-2];var _p=$k[$j-3];var _q=$k[$j-1];$j-=3;$k[$j++]=$f(_q+_p*_o)}var _r=$k[--$j];var _s=(11-_r%11)%11;$k[$j++]=_s;if(_s==10){if($_.badmod11){$j--;var _v=$s($_.code.length+2);$P(_v,0,$_.code);$P(_v,$_.code.length,"10");$k[$j++]=_v}else{$k[$j-1]="bwipp.msiBadMod11NotSpecified#17407";$k[$j++]="mod11 check digit is 10 but badmod11 not specified";bwipp_raiseerror()}}else{var _z=$s($_.code.length+1);$P(_z,0,$_.code);$k[$j++]=_z;$k[$j++]=_z;$k[$j++]=$_.code.length;$r(4,-1);var _12=$k[--$j];var _13=$k[--$j];var _14=$k[--$j];$p(_14,_13,_12+48)}};$_.ncrmod11=function(){var _15=$k[--$j];$_.code=_15;$k[$j++]=$_.code.length-1;$F($_.code,function(){var _18=$k[--$j];var _19=$k[--$j];$k[$j++]=_18-48;$k[$j++]=_19%8+2;$k[$j++]=_19-1});$k[$j-1]=0;for(var _1B=0,_1C=$_.code.length;_1B<_1C;_1B++){var _1D=$k[$j-2];var _1E=$k[$j-3];var _1F=$k[$j-1];$j-=3;$k[$j++]=$f(_1F+_1E*_1D)}var _1G=$k[--$j];var _1H=(11-_1G%11)%11;$k[$j++]=_1H;if(_1H==10){if($_.badmod11){$j--;var _1K=$s($_.code.length+2);$P(_1K,0,$_.code);$P(_1K,$_.code.length,"10");$k[$j++]=_1K}else{$k[$j-1]="bwipp.msiBadMod11NotSpecified#17423";$k[$j++]="mod11 check digit is 10 but badmod11 not specified";bwipp_raiseerror()}}else{var _1O=$s($_.code.length+1);$P(_1O,0,$_.code);$k[$j++]=_1O;$k[$j++]=_1O;$k[$j++]=$_.code.length;$r(4,-1);var _1R=$k[--$j];var _1S=$k[--$j];var _1T=$k[--$j];$p(_1T,_1S,_1R+48)}};if($_.includecheck){var _1V=$_.checktype;var _1W=$has($_.msi_checkfunc,_1V);$k[$j++]=$_.msi_checkfunc;$k[$j++]=_1V;if(!_1W){$j-=2;$k[$j++]="bwipp.msiBadCharacter#17435";$k[$j++]="MSI checktype must be mod10, mod1010, mod11, ncrmod11, mod1110 or ncrmod1110";bwipp_raiseerror()}var _1X=$k[--$j];var _1Y=$k[--$j];$k[$j++]=$_.barcode;if($g(_1Y,_1X)()===true){return true}var _1b=$k[--$j];$_.barcode=_1b;$_.barlen=$_.barcode.length;if($_.includecheckintext){$_.txtlen=$_.barlen}}$_.sbs=$s($_.barlen*8+5);$P($_.sbs,0,$g($_.msi_encs,10));for(var _1l=0,_1k=$_.barlen-1;_1l<=_1k;_1l+=1){$_.i=_1l;$X($_.msi_barchars,$G($_.barcode,$_.i,1));$j--;var _1p=$k[--$j];$_.indx=_1p.length;$j-=2;$_.enc=$g($_.msi_encs,$_.indx);$P($_.sbs,$_.i*8+2,$_.enc)}$P($_.sbs,$_.barlen*8+2,$g($_.msi_encs,11));if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _23=[];var _1z=$_.sbs;for(var _20=0,_21=_1z.length;_20<_21;_20++){_23[_20]=$g(_1z,_20)-48}_23=$a(_23);var _28=[];for(var _25=0,_26=~~(($_.sbs.length+1)/2);_25<_26;_25++){_28[_25]=$_.height}_28=$a(_28);var _2C=[];for(var _2A=0,_2B=~~(($_.sbs.length+1)/2);_2A<_2B;_2A++){_2C[_2A]=0}_2C=$a(_2C);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_23;$k[$j++]="bhs";$k[$j++]=_28;$k[$j++]="bbs";$k[$j++]=_2C;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$G($_.barcode,0,$_.txtlen),0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2M=$d();$k[$j++]=_2M;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_plessey(){if(!bwipp_plessey.globals){var $__=$_;$_=bwipp_plessey.globals={};$_.plessey_barchars="0123456789ABCDEF";$_.plessey_encs=$a(["14141414","32141414","14321414","32321414","14143214","32143214","14323214","32323214","14141432","32141432","14321432","32321432","14143232","32143232","14323232","32323232","32321432","541412323","323"]);$_.plessey_checksalt=$a([1,1,1,1,0,1,0,0,1]);$_.plessey_checkinit=$a([0,0,0,0,0,0,0,0]);$_.charvals=new Map;for(var _3=0;_3<=15;_3+=1){$p($_.charvals,$G($_.plessey_barchars,_3,1),_3)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_plessey.globals);$_.dontdraw=false;$_.includetext=false;$_.validatecheck=false;$_.includecheckintext=false;$_.unidirectional=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _7=$k[--$j];$_.options=_7;var _8=$k[--$j];$_.barcode=_8;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.plesseyEmptyData#17600";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.plesseyInputTooLong#17604";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _F=0,_E=$_.barcode.length-1;_F<=_E;_F+=1){if(!$has($_.charvals,$G($_.barcode,_F,1))){$k[$j++]="bwipp.plesseyBadCharacter#17612";$k[$j++]="Plessey must contain only digits and letters A B C D E F";bwipp_raiseerror()}}if($_.validatecheck&&$_.barcode.length<2){$k[$j++]="bwipp.plesseyBadLength#17617";$k[$j++]="Plessey with check digits must be at least 2 characters";bwipp_raiseerror()}var _P=$_.barcode.length;if($_.validatecheck){_P=_P-2}$_.barlen=_P;$_.checkbits=$a($_.barlen*4+8);$P($_.checkbits,$_.barlen*4,$_.plessey_checkinit);for(var _X=0,_W=$_.barlen-1;_X<=_W;_X+=1){$_.i=_X;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.checkbits,$_.i*4,$a([$_.indx&1,$flr($_.indx/2)&1,$flr($_.indx/4)&1,$flr($_.indx/8)]))}for(var _m=0,_l=$_.barlen*4-1;_m<=_l;_m+=1){$_.i=_m;if($g($_.checkbits,$_.i)==1){for(var _q=0;_q<=8;_q+=1){$_.j=_q;$p($_.checkbits,$_.i+$_.j,$xo($g($_.checkbits,$_.i+$_.j),$g($_.plessey_checksalt,$_.j)))}}}$_.checkval=0;for(var _10=0;_10<=7;_10+=1){$_.i=_10;$_.checkval=$f($_.checkval+$pow(2,$_.i)*$g($_.checkbits,$f($_.barlen*4+$_.i)))}$_.checksum1=$_.checkval&15;$_.checksum2=$flr($_.checkval/16);if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.plessey_barchars,$_.checksum1)||$g($_.barcode,$_.barlen+1)!=$g($_.plessey_barchars,$_.checksum2)){$k[$j++]="bwipp.plesseyBadCheckDigits#17662";$k[$j++]="Incorrect Plessey check digits provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _1P=$_.unidirectional?27:33;$_.sbs=$s($f($_.barlen*8+_1P));$P($_.sbs,0,$g($_.plessey_encs,16));for(var _1V=0,_1U=$_.barlen-1;_1V<=_1U;_1V+=1){$_.i=_1V;$_.indx=$g($_.charvals,$G($_.barcode,$_.i,1));$P($_.sbs,$_.i*8+8,$g($_.plessey_encs,$_.indx))}$P($_.sbs,$_.barlen*8+8,$g($_.plessey_encs,$_.checksum1));$P($_.sbs,$_.barlen*8+16,$g($_.plessey_encs,$_.checksum2));$k[$j++]="text";if($_.includecheckintext){var _1p=$s($_.barlen+2);$P(_1p,0,$_.barcode);$P(_1p,$_.barlen,$G($_.plessey_barchars,$_.checksum1,1));$P(_1p,$_.barlen+1,$G($_.plessey_barchars,$_.checksum2,1));$k[$j++]=_1p}else{$k[$j++]=$_.barcode}var _1y=$k[--$j];var _1z=$k[--$j];$_[_1z]=_1y;var _23=$_.unidirectional?18:17;$P($_.sbs,$_.barlen*8+24,$g($_.plessey_encs,_23));if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _2A=[];var _26=$_.sbs;for(var _27=0,_28=_26.length;_27<_28;_27++){_2A[_27]=$g(_26,_27)-48}_2A=$a(_2A);var _2F=[];for(var _2C=0,_2D=~~(($_.sbs.length+1)/2);_2C<_2D;_2C++){_2F[_2C]=$_.height}_2F=$a(_2F);var _2J=[];for(var _2H=0,_2I=~~(($_.sbs.length+1)/2);_2H<_2I;_2H++){_2J[_2H]=0}_2J=$a(_2J);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_2A;$k[$j++]="bhs";$k[$j++]=_2F;$k[$j++]="bbs";$k[$j++]=_2J;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _2R=$d();$k[$j++]=_2R;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_telepen(){if(!bwipp_telepen.globals){var $__=$_;$_=bwipp_telepen.globals={};$_.telepen_encs=$a(["31313131","1131313111","33313111","1111313131","3111313111","11333131","13133131","111111313111","31333111","1131113131","33113131","1111333111","3111113131","1113133111","1311133111","111111113131","3131113111","11313331","333331","111131113111","31113331","1133113111","1313113111","1111113331","31131331","113111113111","3311113111","1111131331","311111113111","1113111331","1311111331","11111111113111","31313311","1131311131","33311131","1111313311","3111311131","11333311","13133311","111111311131","31331131","1131113311","33113311","1111331131","3111113311","1113131131","1311131131","111111113311","3131111131","1131131311","33131311","111131111131","3111131311","1133111131","1313111131","111111131311","3113111311","113111111131","3311111131","111113111311","311111111131","111311111311","131111111311","11111111111131","3131311111","11313133","333133","111131311111","31113133","1133311111","1313311111","1111113133","313333","113111311111","3311311111","11113333","311111311111","11131333","13111333","11111111311111","31311133","1131331111","33331111","1111311133","3111331111","11331133","13131133","111111331111","3113131111","1131111133","33111133","111113131111","3111111133","111311131111","131111131111","111111111133","31311313","113131111111","3331111111","1111311313","311131111111","11331313","13131313","11111131111111","3133111111","1131111313","33111313","111133111111","3111111313","111313111111","131113111111","111111111313","313111111111","1131131113","33131113","11113111111111","3111131113","113311111111","131311111111","111111131113","3113111113","11311111111111","331111111111","111113111113","31111111111111","111311111113","131111111113","1111111111111111"]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_telepen.globals);$_.numeric=false;$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.parse=false;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.telepeninputTooLong#17819";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _9=$k[--$j];$_.barcode=_9;$_.barlen=$_.barcode.length;$del($_.options,"parse");if($_.numeric&&$_.barlen%2!=0){$k[$j++]="bwipp.telepenNumericOddLength#17840";$k[$j++]="Telepen Numeric must have an even length";bwipp_raiseerror()}$_.sbs=$s($_.barlen*16+48);$_.enc=$g($_.telepen_encs,95);$P($_.sbs,0,$_.enc);$_.l=$_.enc.length;$_.checksum=0;$_.i=0;$_.j=0;for(;;){if($_.i==$_.barlen){break}if($_.numeric){if($g($_.barcode,$_.i)>16){$_.np=$G($_.barcode,$_.i,2);var _U=$g($_.np,0);var _W=$g($_.np,1);if(_U<48||_U>57||(_W<48||_W>57)&&!(_W==88)){$k[$j++]=-1}else{var _b=$g($_.np,1)-48;$k[$j++]=$g($_.np,0)-48;$k[$j++]=_b;if(_b!=40){var _c=$k[--$j];var _d=$k[--$j];$k[$j++]=$f(_c+_d*10)+10}else{$j--}$k[$j-1]+=17}var _f=$k[$j-1];if(_f==-1){$k[$j-1]="bwipp.telepenInvalidNumericCharacter#17875";$k[$j++]="Telepen Numeric may contain only digits, or X in even positions";bwipp_raiseerror()}var _g=$k[--$j];$_.indx=_g;$_.i=$_.i+2}else{$_.indx=$g($_.barcode,$_.i);$_.i=$_.i+1}}else{$_.indx=$g($_.barcode,$_.i);if($_.indx>127){$k[$j++]="bwipp.telepenInvalidAlphaCharacter#17887";$k[$j++]="Telepen Alpha characters must have ordinal values 0 to 127";bwipp_raiseerror()}$_.i=$_.i+1}$_.checksum=$f($_.checksum+$_.indx);$_.enc=$g($_.telepen_encs,$_.indx);$P($_.sbs,$_.l,$_.enc);$_.l=$_.l+$_.enc.length;$_.j=$_.j+1}$_.checksum=(127-$_.checksum%127)%127;$_.enc=$g($_.telepen_encs,$_.checksum);$P($_.sbs,$_.l,$_.enc);$_.l=$_.l+$_.enc.length;$_.enc=$g($_.telepen_encs,122);$P($_.sbs,$_.l,$_.enc);$_.l=$_.l+$_.enc.length;$_.sbs=$G($_.sbs,0,$_.l);$_.text=$s($_.barcode.length);for(var _1M=0,_1L=$_.barcode.length-1;_1M<=_1L;_1M+=1){$_.i=_1M;$_.c=$g($_.barcode,$_.i);var _1X=$_.text;var _1W=$_.i;var _1V=$_.c>=32&&$_.c<=126?$_.c:32;$p(_1X,_1W,_1V)}$k[$j++]=Infinity;var _1Y=$_.sbs;for(var _1Z=0,_1a=_1Y.length;_1Z<_1a;_1Z++){$k[$j++]=$g(_1Y,_1Z)-48}$_.sbs=$a();if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _1d=$_.sbs;var _1i=[];for(var _1f=0,_1g=~~(($_.sbs.length+1)/2);_1f<_1g;_1f++){_1i[_1f]=$_.height}_1i=$a(_1i);var _1m=[];for(var _1k=0,_1l=~~(($_.sbs.length+1)/2);_1k<_1l;_1k++){_1m[_1k]=0}_1m=$a(_1m);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1d;$k[$j++]="bhs";$k[$j++]=_1i;$k[$j++]="bbs";$k[$j++]=_1m;if($_.includetext){$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center"}$k[$j++]="opt";$k[$j++]=$_.options;var _1u=$d();$k[$j++]=_1u;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_telepennumeric(){var $__=$_;$_=Object.assign({},$_,bwipp_telepennumeric.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"numeric",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_telepen();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_posicode(){if(!bwipp_posicode.globals){var $__=$_;$_=bwipp_posicode.globals={};$_.posicode_la0=-1;$_.posicode_la1=-2;$_.posicode_la2=-3;$_.posicode_sf0=-4;$_.posicode_sf1=-5;$_.posicode_sf2=-6;$_.posicode_fn1=-7;$_.posicode_fn2=-8;$_.posicode_fn3=-9;$_.posicode_fn4=-10;$_.la0=$_.posicode_la0;$_.la1=$_.posicode_la1;$_.la2=$_.posicode_la2;$_.sf0=$_.posicode_sf0;$_.sf1=$_.posicode_sf1;$_.sf2=$_.posicode_sf2;$_.fn1=$_.posicode_fn1;$_.fn2=$_.posicode_fn2;$_.fn3=$_.posicode_fn3;$_.fn4=$_.posicode_fn4;$_.posicode_charmapsnormal=$a([$a(["0","^","'"]),$a(["1",";",27]),$a(["2","<",28]),$a(["3","=",29]),$a(["4",">",30]),$a(["5","?",31]),$a(["6","@","!"]),$a(["7","[",'"']),$a(["8",92,"#"]),$a(["9","]","&"]),$a(["A","a",1]),$a(["B","b",2]),$a(["C","c",3]),$a(["D","d",4]),$a(["E","e",5]),$a(["F","f",6]),$a(["G","g",7]),$a(["H","h",8]),$a(["I","i",9]),$a(["J","j",10]),$a(["K","k",11]),$a(["L","l",12]),$a(["M","m",13]),$a(["N","n",14]),$a(["O","o",15]),$a(["P","p",16]),$a(["Q","q",17]),$a(["R","r",18]),$a(["S","s",19]),$a(["T","t",20]),$a(["U","u",21]),$a(["V","v",22]),$a(["W","w",23]),$a(["X","x",24]),$a(["Y","y",25]),$a(["Z","z",26]),$a(["-","_",40]),$a([".","`",41]),$a([" ",127,0]),$a(["$","{","*"]),$a(["/","|",","]),$a(["+","}",":"]),$a(["%","~",$_.fn1]),$a([$_.la1,$_.la0,$_.fn2]),$a([$_.sf1,$_.sf0,$_.fn3]),$a([$_.sf2,$_.sf2,$_.fn4])]);$_.posicode_charmapslimited=$a([$a(["0",-98,-98]),$a(["1",-98,-98]),$a(["2",-98,-98]),$a(["3",-98,-98]),$a(["4",-98,-98]),$a(["5",-98,-98]),$a(["6",-98,-98]),$a(["7",-98,-98]),$a(["8",-98,-98]),$a(["9",-98,-98]),$a(["A",-98,-98]),$a(["B",-98,-98]),$a(["C",-98,-98]),$a(["D",-98,-98]),$a(["E",-98,-98]),$a(["F",-98,-98]),$a(["G",-98,-98]),$a(["H",-98,-98]),$a(["I",-98,-98]),$a(["J",-98,-98]),$a(["K",-98,-98]),$a(["L",-98,-98]),$a(["M",-98,-98]),$a(["N",-98,-98]),$a(["O",-98,-98]),$a(["P",-98,-98]),$a(["Q",-98,-98]),$a(["R",-98,-98]),$a(["S",-98,-98]),$a(["T",-98,-98]),$a(["U",-98,-98]),$a(["V",-98,-98]),$a(["W",-98,-98]),$a(["X",-98,-98]),$a(["Y",-98,-98]),$a(["Z",-98,-98]),$a(["-",-98,-98]),$a([".",-98,-98])]);var _1c=new Map([["a",$a(["141112","131212","121312","111412","131113","121213","111313","121114","111214","111115","181111","171211","161311","151411","141511","131611","121711","111811","171112","161212","151312","141412","131512","121612","111712","161113","151213","141313","131413","121513","111613","151114","141214","131314","121414","111514","141115","131215","121315","111415","131116","121216","111316","121117","111217","111118","1<111112","111111111;1"])],["b",$a(["151213","141313","131413","121513","141214","131314","121414","131215","121315","121216","191212","181312","171412","161512","151612","141712","131812","121912","181213","171313","161413","151513","141613","131713","121813","171214","161314","151414","141514","131614","121714","161215","151315","141415","131515","121615","151216","141316","131416","121516","141217","131317","121417","131218","121318","121219","1<121312","121212121<1"])],["limiteda",$a(["111411","111312","111213","111114","121311","121212","121113","141111","131211","131112","171111","161211","151311","141411","131511","121611","111711","161112","151212","141312","131412","121512","111612","151113","141213","131313","121413","111513","141114","131214","121314","111414","131115","121215","111315","121116","111216","111117","151111","1"])],["limitedb",$a(["121512","121413","121314","121215","131412","131313","131214","151212","141312","141213","181212","171312","161412","151512","141612","131712","121812","171213","161313","151413","141513","131613","121713","161214","151314","141414","131514","121614","151215","141315","131415","121515","141216","131316","121416","131217","121317","121218","141212","1"])]]);$_.posicode_encmaps=_1c;$_.posicode_c2w=$a([$a([495,330,210,126,70,35,15,5]),$a([165,120,84,56,35,20,10,4]),$a([45,36,28,21,15,10,6,3]),$a([9,8,7,6,5,4,3,2]),$a([1,1,1,1,1,1,1,1])]);$_.charvals_normal=$a([new Map,new Map,new Map]);for(var _1k=0,_1j=$_.posicode_charmapsnormal.length-1;_1k<=_1j;_1k+=1){$_.i=_1k;$_.encs=$g($_.posicode_charmapsnormal,$_.i);for(var _1n=0;_1n<=2;_1n+=1){$_.j=_1n;var _1q=$g($_.encs,$_.j);var _1r=$t(_1q);if($eq(_1r,"stringtype")){_1q=$g(_1q,0)}$p($g($_.charvals_normal,$_.j),_1q,$_.i)}}$_.charvals_normal=$_.charvals_normal;$_.charvals_limited=$a([new Map,new Map,new Map]);for(var _21=0,_20=$_.posicode_charmapslimited.length-1;_21<=_20;_21+=1){$_.i=_21;$_.encs=$g($_.posicode_charmapslimited,$_.i);for(var _24=0;_24<=2;_24+=1){$_.j=_24;var _27=$g($_.encs,$_.j);var _28=$t(_27);if($eq(_28,"stringtype")){_27=$g(_27,0)}$p($g($_.charvals_limited,$_.j),_27,$_.i)}}$_.charvals_limited=$_.charvals_limited;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_posicode.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.text1xoffset=0;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.encoding="auto";$_.version="a";$_.checkoffset=0;$_.raw=false;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _2H=$k[--$j];$_.options=_2H;var _2I=$k[--$j];$_.barcode=_2I;if($_.barcode.length>500){$k[$j++]="bwipp.posicodeinputTooLong#18245";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($ne($_.version,"a")&&$ne($_.version,"b")&&$ne($_.version,"limiteda")&&$ne($_.version,"limitedb")){$k[$j++]="bwipp.posicodeInvalidVersion#18262";$k[$j++]="The version must be either a, b, limiteda or limitedb";bwipp_raiseerror()}var _2S=$eq($_.version,"a")||$eq($_.version,"b")?$_.posicode_charmapsnormal:$_.posicode_charmapslimited;$_.charmaps=_2S;var _2Y=$eq($_.version,"a")||$eq($_.version,"b")?$_.charvals_normal:$_.charvals_limited;$_.charvals=_2Y;$_.set0=$g($_.charvals,0);$_.set1=$g($_.charvals,1);$_.set2=$g($_.charvals,2);if($eq($_.version,"limiteda")||$eq($_.version,"limitedb")){for(var _2k=0,_2j=$_.barcode.length-1;_2k<=_2j;_2k+=1){if(!$has($_.set0,$g($G($_.barcode,_2k,1),0))){$k[$j++]="bwipp.posicodeBadCharacter#18281";$k[$j++]="Posicode limited must contain only digits, capital letters, and the symbols - and .";bwipp_raiseerror()}}}if($_.raw){$_.encoding="raw"}if($eq($_.encoding,"raw")){$_.cws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _31=$G($_.barcode,$_.i+1,3);$k[$j++]=_31;$k[$j++]=false;for(var _32=0,_33=_31.length;_32<_33;_32++){var _34=$g(_31,_32);if(_34<48||_34>57){$k[$j-1]=true}}var _35=$k[--$j];if(_35){$j--;break}var _36=$k[--$j];$_.cw=$i(_36);if($_.cw>45){$k[$j++]="bwipp.posicodeBadRawCodeword#18299";$k[$j++]="Raw codewords must be 0 to 45";bwipp_raiseerror()}$p($_.cws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.posicodeBadRawFormat#18306";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.cws=$G($_.cws,0,$_.j);$_.text=""}if($eq($_.encoding,"auto")){$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.posicode_fn1],["FNC2",$_.posicode_fn2],["FNC3",$_.posicode_fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _3N=$k[--$j];$_.msg=_3N;$_.msglen=$_.msg.length;$_.text=$s($_.msglen);for(var _3T=0,_3S=$_.msglen-1;_3T<=_3S;_3T+=1){$_.i=_3T;var _3Y=$g($_.msg,$_.i);var _3b=$_.text;var _3a=$_.i;if(_3Y<0){_3Y=32}$p(_3b,_3a,_3Y)}$k[$j++]=Infinity;for(var _3d=0,_3e=$_.msglen;_3d<_3e;_3d++){$k[$j++]=0}$k[$j++]=0;$_.numSA=$a();$k[$j++]=Infinity;for(var _3g=0,_3h=$_.msglen;_3g<_3h;_3g++){$k[$j++]=0}$k[$j++]=0;$_.numEA=$a();for(var _3j=$_.msglen-1;_3j>=0;_3j-=1){$_.i=_3j;if($g($_.msg,$_.i)>=0){if($g($_.msg,$_.i)>=128){$p($_.numEA,$_.i,$g($_.numEA,$_.i+1)+1)}else{$p($_.numSA,$_.i,$g($_.numSA,$_.i+1)+1)}}}$_.ea=false;$k[$j++]=Infinity;for(var _42=0,_41=$_.msglen-1;_42<=_41;_42+=1){$_.i=_42;$_.c=$g($_.msg,$_.i);if(!($_.ea!=$_.c<128)&&$_.c>=0){var _4D=$_.ea?$_.numSA:$_.numEA;var _4E=$g(_4D,$_.i);var _4H=$f(_4E+$_.i)==$_.msglen?3:5;if(_4E<_4H){$k[$j++]=$_.posicode_fn4}else{$_.ea=!$_.ea;$k[$j++]=$_.posicode_fn4;$k[$j++]=$_.posicode_fn4}}if($_.c>=0){$k[$j++]=$_.c&127}else{$k[$j++]=$_.c}}$as($a($m()));var _4O=$k[--$j];$_.msg=_4O;$j--;$_.msglen=$_.msg.length;$_.enc=function(){var _4Q=$k[--$j];var _4R=$k[--$j];$p($_.cws,$_.j,$g(_4Q,_4R));$_.j=$_.j+1};$_.cws=$a($_.msglen*2);$_.i=0;$_.j=0;$_.cset="set0";for(;;){if($_.i==$_.msglen){break}for(;;){$_.char1=$g($_.msg,$_.i);var _4i=$_.i+1<$_.msglen?$g($_.msg,$_.i+1):-99;$_.char2=_4i;var _4l=$_[$_.cset];if($has(_4l,$_.char1)){var _4q=$_[$_.cset];$k[$j++]=$_.char1;$k[$j++]=_4q;$_.enc();$_.i=$_.i+1;break}if($has($_.set2,$_.char1)){var _4w=$_[$_.cset];$k[$j++]=$_.posicode_sf2;$k[$j++]=_4w;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.set2;$_.enc();$_.i=$_.i+1;break}var _51=$_[$_.cset];if(!$has(_51,$_.char2)){if($eq($_.cset,"set0")){var _56=$_[$_.cset];$k[$j++]=$_.posicode_la1;$k[$j++]=_56;$_.enc();$_.cset="set1"}else{var _58=$_[$_.cset];$k[$j++]=$_.posicode_la0;$k[$j++]=_58;$_.enc();$_.cset="set0"}break}else{if($eq($_.cset,"set0")){var _5B=$_[$_.cset];$k[$j++]=$_.posicode_sf1;$k[$j++]=_5B;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.set1;$_.enc()}else{var _5F=$_[$_.cset];$k[$j++]=$_.posicode_sf0;$k[$j++]=_5F;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.set0;$_.enc()}$_.i=$_.i+1;break}break}}$_.cws=$G($_.cws,0,$_.j)}$_.encs=$g($_.posicode_encmaps,$_.version);$_.v=0;var _5O=$_.cws;for(var _5P=0,_5Q=_5O.length;_5P<_5Q;_5P++){$_.cw=$g(_5O,_5P);for(var _5S=0;_5S<6;_5S++){if((($_.cw^$_.v)&1)!=0){$_.v=$_.v^7682}$_.v=$flr($_.v/2);$_.cw=$flr($_.cw/2)}}$_.v=$_.v+$_.checkoffset;if($eq($_.version,"limiteda")||$eq($_.version,"limitedb")){$_.v=$_.v&1023;if($_.v>824&&$_.v<853){$_.v=$_.v+292}}else{$_.v=($_.v&1023)+45}$_.d=$a([2,2,2,2,2,2]);$_.r=0;$_.c=0;$_.w=0;$_.sum=0;for(;;){if($_.sum==$_.v){break}$_.t=$f($_.sum+$g($g($_.posicode_c2w,$_.r),$_.c));if($_.t==$_.v){$_.w=$_.w+1;$p($_.d,$_.r,$_.w+2);$_.sum=$_.t}if($_.t>$_.v){$p($_.d,$_.r,$_.w+2);$_.r=$_.r+1;$_.w=0}if($_.t<$_.v){$_.c=$_.c+1;$_.w=$_.w+1;$_.sum=$_.t}}var _6B=20;for(var _66=0;_66<=4;_66+=1){_6B=$f(_6B-$g($_.d,_66))}$p($_.d,5,_6B);if($eq($_.version,"b")||$eq($_.version,"limitedb")){$k[$j++]=Infinity;var _6E=$_.d;for(var _6F=0,_6G=_6E.length;_6F<_6G;_6F++){$k[$j++]=$g(_6E,_6F)+1}$_.d=$a()}$_.cbs=$Z($s(12),"111111111111");for(var _6K=5;_6K>=0;_6K-=1){$_.i=_6K;$p($_.cbs,(5-$_.i)*2+1,$g($_.d,$_.i)+47)}$_.sbs=$s($_.cws.length*6+31);var _6U=$g($_.encs,$_.encs.length-2);$P($_.sbs,0,_6U);$_.j=_6U.length;for(var _6Y=0,_6X=$_.cws.length-1;_6Y<=_6X;_6Y+=1){$_.i=_6Y;$P($_.sbs,$_.j,$g($_.encs,$g($_.cws,$_.i)));$_.j=$_.j+6}$P($_.sbs,$_.j,$_.cbs);$_.j=$_.j+12;var _6n=$g($_.encs,$_.encs.length-1);$P($_.sbs,$_.j,_6n);$_.j=_6n.length+$_.j;$_.sbs=$G($_.sbs,0,$_.j);if($_.height==-1){$_.height=1}$k[$j++]=Infinity;var _6z=[];var _6v=$_.sbs;for(var _6w=0,_6x=_6v.length;_6w<_6x;_6w++){_6z[_6w]=$g(_6v,_6w)-48}_6z=$a(_6z);var _74=[];for(var _71=0,_72=~~(($_.sbs.length+1)/2);_71<_72;_71++){_74[_71]=$_.height}_74=$a(_74);var _78=[];for(var _76=0,_77=~~(($_.sbs.length+1)/2);_76<_77;_76++){_78[_76]=0}_78=$a(_78);var _7G=new Map([["a",0],["b",0],["limiteda",12],["limitedb",13]]);var _7J=new Map([["a",0],["b",0],["limiteda",12],["limitedb",13]]);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_6z;$k[$j++]="bhs";$k[$j++]=_74;$k[$j++]="bbs";$k[$j++]=_78;$k[$j++]="txt";$k[$j++]=$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="borderleft";$k[$j++]=$g(_7G,$_.version);$k[$j++]="borderright";$k[$j++]=$g(_7J,$_.version);$k[$j++]="opt";$k[$j++]=$_.options;var _7N=$d();$k[$j++]=_7N;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_codablockf(){if(!bwipp_codablockf.globals){var $__=$_;$_=bwipp_codablockf.globals={};$_.codablockf_swa=-1;$_.codablockf_swb=-2;$_.codablockf_swc=-3;$_.codablockf_sft=-4;$_.codablockf_fn1=-5;$_.codablockf_fn2=-6;$_.codablockf_fn3=-7;$_.codablockf_fn4=-8;$_.codablockf_sta=-9;$_.codablockf_stp=-10;$_.swa=$_.codablockf_swa;$_.swb=$_.codablockf_swb;$_.swc=$_.codablockf_swc;$_.sft=$_.codablockf_sft;$_.fn1=$_.codablockf_fn1;$_.fn2=$_.codablockf_fn2;$_.fn3=$_.codablockf_fn3;$_.fn4=$_.codablockf_fn4;$_.sta=$_.codablockf_sta;$_.stp=$_.codablockf_stp;$_.codablockf_charmaps=$a([$a([32,32,"00"]),$a(["!","!","01"]),$a(['"','"',"02"]),$a(["#","#","03"]),$a(["$","$","04"]),$a(["%","%","05"]),$a(["&","&","06"]),$a(["'","'","07"]),$a([40,40,"08"]),$a([41,41,"09"]),$a(["*","*","10"]),$a(["+","+","11"]),$a([",",",","12"]),$a(["-","-","13"]),$a([".",".","14"]),$a(["/","/","15"]),$a(["0","0","16"]),$a(["1","1","17"]),$a(["2","2","18"]),$a(["3","3","19"]),$a(["4","4","20"]),$a(["5","5","21"]),$a(["6","6","22"]),$a(["7","7","23"]),$a(["8","8","24"]),$a(["9","9","25"]),$a([":",":","26"]),$a([";",";","27"]),$a(["<","<","28"]),$a(["=","=","29"]),$a([">",">","30"]),$a(["?","?","31"]),$a(["@","@","32"]),$a(["A","A","33"]),$a(["B","B","34"]),$a(["C","C","35"]),$a(["D","D","36"]),$a(["E","E","37"]),$a(["F","F","38"]),$a(["G","G","39"]),$a(["H","H","40"]),$a(["I","I","41"]),$a(["J","J","42"]),$a(["K","K","43"]),$a(["L","L","44"]),$a(["M","M","45"]),$a(["N","N","46"]),$a(["O","O","47"]),$a(["P","P","48"]),$a(["Q","Q","49"]),$a(["R","R","50"]),$a(["S","S","51"]),$a(["T","T","52"]),$a(["U","U","53"]),$a(["V","V","54"]),$a(["W","W","55"]),$a(["X","X","56"]),$a(["Y","Y","57"]),$a(["Z","Z","58"]),$a(["[","[","59"]),$a([92,92,"60"]),$a(["]","]","61"]),$a(["^","^","62"]),$a(["_","_","63"]),$a([0,"`","64"]),$a([1,"a","65"]),$a([2,"b","66"]),$a([3,"c","67"]),$a([4,"d","68"]),$a([5,"e","69"]),$a([6,"f","70"]),$a([7,"g","71"]),$a([8,"h","72"]),$a([9,"i","73"]),$a([10,"j","74"]),$a([11,"k","75"]),$a([12,"l","76"]),$a([13,"m","77"]),$a([14,"n","78"]),$a([15,"o","79"]),$a([16,"p","80"]),$a([17,"q","81"]),$a([18,"r","82"]),$a([19,"s","83"]),$a([20,"t","84"]),$a([21,"u","85"]),$a([22,"v","86"]),$a([23,"w","87"]),$a([24,"x","88"]),$a([25,"y","89"]),$a([26,"z","90"]),$a([27,"{","91"]),$a([28,"|","92"]),$a([29,"}","93"]),$a([30,"~","94"]),$a([31,127,"95"]),$a([$_.fn3,$_.fn3,"96"]),$a([$_.fn2,$_.fn2,"97"]),$a([$_.sft,$_.sft,"98"]),$a([$_.swc,$_.swc,"99"]),$a([$_.swb,$_.fn4,$_.swb]),$a([$_.fn4,$_.swa,$_.swa]),$a([$_.fn1,$_.fn1,$_.fn1]),$a([$_.sta,$_.sta,$_.sta]),$a([$_.stp,$_.stp,$_.stp])]);$_.codablockf_encs=$a(["212222","222122","222221","121223","121322","131222","122213","122312","132212","221213","221312","231212","112232","122132","122231","113222","123122","123221","223211","221132","221231","213212","223112","312131","311222","321122","321221","312212","322112","322211","212123","212321","232121","111323","131123","131321","112313","132113","132311","211313","231113","231311","112133","112331","132131","113123","113321","133121","313121","211331","231131","213113","213311","213131","311123","311321","331121","312113","312311","332111","314111","221411","431111","111224","111422","121124","121421","141122","141221","112214","112412","122114","122411","142112","142211","241211","221114","413111","241112","134111","111242","121142","121241","114212","124112","124211","411212","421112","421211","212141","214121","412121","111143","111341","131141","114113","114311","411113","411311","113141","114131","311141","411131","211412","2331112"]);$_.charvals=$a([new Map,new Map,new Map]);for(var _27=0,_26=$_.codablockf_charmaps.length-1;_27<=_26;_27+=1){$_.i=_27;$_.encs=$g($_.codablockf_charmaps,$_.i);for(var _2A=0;_2A<=2;_2A+=1){$_.j=_2A;var _2D=$g($_.encs,$_.j);var _2E=$t(_2D);if($eq(_2E,"stringtype")){_2D=$g(_2D,0)}$p($g($_.charvals,$_.j),_2D,$_.i)}}$_.seta=$g($_.charvals,0);$_.setb=$g($_.charvals,1);$_.setc=$g($_.charvals,2);$_.charvals=$_.charvals;$k[$j++]=Infinity;for(var _2T=64;_2T<=95;_2T+=1){$k[$j++]=_2T}for(var _2U=0;_2U<=15;_2U+=1){$k[$j++]=_2U}for(var _2V=26;_2V<=63;_2V+=1){$k[$j++]=_2V}var _2W=$a();$_.abmap=_2W;var _2Y=[];for(var _2X=0;_2X<=85;_2X+=1){_2Y[_2X]=_2X}_2Y=$a(_2Y);$_.cmap=_2Y;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_codablockf.globals);$_.dontdraw=false;$_.rows=-1;$_.columns=8;$_.rowheight=10;$_.sepheight=1;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _2Z=$k[--$j];$_.options=_2Z;var _2a=$k[--$j];$_.barcode=_2a;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length>25e3){$k[$j++]="bwipp.codablockfinputTooLong#18743";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.columns<4||$_.columns>62){$k[$j++]="bwipp.codablockfBadColumns#18747";$k[$j++]="Codablock F must have 4 to 62 columns";bwipp_raiseerror()}if($_.rows!=-1&&($_.rows<2||$_.rows>44)){$k[$j++]="bwipp.codablockfBadRows#18751";$k[$j++]="Codablock F must have 2 to 44 rows";bwipp_raiseerror()}if($_.rowheight<8||$_.rowheight>50){$k[$j++]="bwipp.codablockfBadRowHeight#18755";$k[$j++]="Codablock F must have rowheight from 8 to 50";bwipp_raiseerror()}if($_.sepheight<1||$_.sepheight>5){$k[$j++]="bwipp.codablockfBadSepHeight#18759";$k[$j++]="Codablock F must have sepheight from 1 to 5";bwipp_raiseerror()}var _2q=$_.columns>=4&&$_.columns<=62?$_.columns:8;$_.c=_2q;var _2v=$_.rows>=2&&$_.rows<=44?$_.rows:-1;$_.rows=_2v;$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.codablockf_fn1],["FNC3",$_.codablockf_fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _31=$k[--$j];$_.msg=_31;$_.msglen=$_.msg.length;$_.kmsg=$_.msg;$k[$j++]=Infinity;$F($_.msg,function(){var _35=$k[$j-1];if(_35>=128){var _36=$k[--$j];$k[$j++]=$_.codablockf_fn4;$k[$j++]=_36&127}});$as($a($m()));var _39=$k[--$j];$_.msg=_39;$j--;$_.msglen=$_.msg.length;$_.numsscr=function(){$_.n=0;$_.s=0;var _3B=$k[--$j];$_.p=_3B;for(;;){if($_.p>=$_.msglen){break}if($_.p!=0){if($g($_.msg,$_.p-1)==$_.codablockf_fn4){break}}var _3K=$g($_.msg,$_.p);var _3M=$has($_.setc,_3K);$k[$j++]=_3K;if(!_3M){$j--;break}var _3N=$k[--$j];if(_3N==$_.codablockf_fn1){if($_.s%2==0){$_.s=$_.s+1}else{break}}$_.n=$_.n+1;$_.s=$_.s+1;$_.p=$_.p+1}$k[$j++]=$_.n;$k[$j++]=$_.s};$_.enca=function(){var _3W=$k[--$j];$p($_.cws,$_.j,$g($_.seta,_3W));$_.j=$_.j+1};$_.encb=function(){var _3c=$k[--$j];$p($_.cws,$_.j,$g($_.setb,_3c));$_.j=$_.j+1};$_.encc=function(){var _3h=$k[$j-1];var _3i=$t(_3h);if($ne(_3i,"arraytype")){var _3k=$k[--$j];$k[$j++]=$g($_.setc,_3k)}else{var _3m=$k[--$j];$q(_3m);var _3n=$k[--$j];var _3o=$k[--$j];$k[$j++]=$f(_3n-48+(_3o-48)*10)}var _3q=$k[--$j];$p($_.cws,$_.j,_3q);$_.j=$_.j+1};$_.anotb=function(){var _3t=$k[--$j];$k[$j++]=$has($_.seta,_3t)&&!$has($_.setb,_3t)};$_.bnota=function(){var _3y=$k[--$j];$k[$j++]=$has($_.setb,_3y)&&!$has($_.seta,_3y)};$k[$j++]=Infinity;for(var _44=0,_45=$_.msg.length;_44<_45;_44++){$k[$j++]=0}$k[$j++]=9999;$_.nextanotb=$a();$k[$j++]=Infinity;for(var _47=0,_48=$_.msg.length;_47<_48;_47++){$k[$j++]=0}$k[$j++]=9999;$_.nextbnota=$a();for(var _4A=$_.msg.length-1;_4A>=0;_4A-=1){$_.i=_4A;$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _4E=$k[--$j];if(_4E){$p($_.nextanotb,$_.i,0)}else{$p($_.nextanotb,$_.i,$g($_.nextanotb,$_.i+1)+1)}$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _4P=$k[--$j];if(_4P){$p($_.nextbnota,$_.i,0)}else{$p($_.nextbnota,$_.i,$g($_.nextbnota,$_.i+1)+1)}}$_.abeforeb=function(){var _4X=$k[--$j];$k[$j++]=$lt($g($_.nextanotb,_4X),$g($_.nextbnota,_4X))};$_.bbeforea=function(){var _4c=$k[--$j];$k[$j++]=$lt($g($_.nextbnota,_4c),$g($_.nextanotb,_4c))};$_.padrow=function(){var _4h=$k[--$j];for(var _4i=0,_4j=_4h;_4i<_4j;_4i++){for(;;){if($eq($_.cset,"seta")){$k[$j++]=$_.codablockf_swc;$_.enca();$_.cset="setc";break}if($eq($_.cset,"setb")){$k[$j++]=$_.codablockf_swc;$_.encb();$_.cset="setc";break}if($eq($_.cset,"setc")){$k[$j++]=$_.codablockf_swb;$_.encc();$_.cset="setb";break}}}};$_.encafitsrow=function(){if($_.rem<=2&&$g($_.msg,$_.i)==$_.codablockf_fn4){var _4v=$_.rem==2&&$g($_.msg,$_.i+1)<=95;$k[$j++]=_4v;if(_4v){$k[$j++]=$_.codablockf_fn4;$_.enca();$k[$j++]=$g($_.msg,$_.i+1);$_.enca();$_.i=$_.i+2}}else{$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;$k[$j++]=true}};$_.encbfitsrow=function(){if($_.rem<=2&&$g($_.msg,$_.i)==$_.codablockf_fn4){var _5C=$_.rem==2&&$g($_.msg,$_.i+1)>=32;$k[$j++]=_5C;if(_5C){$k[$j++]=$_.codablockf_fn4;$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$_.i=$_.i+2}}else{$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;$k[$j++]=true}};$_.cws=$a(($_.c+5)*44);$_.i=0;$_.j=0;$_.r=1;$_.lastrow=false;for(;;){if($_.lastrow){break}if($_.r>44){$k[$j++]="bwipp.codablockfTooBig#18923";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$k[$j++]=$_.codablockf_sta;$_.enca();if($_.i<$_.msglen){$k[$j++]=$_.i;$_.numsscr()}else{$k[$j++]=-1;$k[$j++]=-1}var _5S=$k[--$j];$_.nums=_5S;var _5T=$k[--$j];$_.nchars=_5T;for(;;){if($_.msglen==0){$k[$j++]=$_.codablockf_swb;$_.enca();$_.cset="setb";break}if($_.nums>=2){$k[$j++]=$_.codablockf_swc;$_.enca();$_.cset="setc";break}$k[$j++]=$_.i;$_.abeforeb();var _5X=$k[--$j];if(_5X){$k[$j++]=$_.codablockf_sft;$_.enca();$_.cset="seta";break}$k[$j++]=$_.codablockf_swb;$_.enca();$_.cset="setb";break}$_.j=$_.j+1;$_.endofrow=false;for(;;){$_.rem=$f($_.c+3-$_.j%($_.c+5));if($_.i==$_.msglen||$_.endofrow){break}$k[$j++]=$_.i;$_.numsscr();var _5g=$k[--$j];$_.nums=_5g;var _5h=$k[--$j];$_.nchars=_5h;var _5m=$_.nums>$_.rem*2?$_.rem*2:$_.nums;$_.remnums=_5m;for(;;){if(($eq($_.cset,"seta")||$eq($_.cset,"setb"))&&$_.remnums>=4&&$g($_.msg,$_.i)!=$_.codablockf_fn1){if($_.remnums%2==0&&$_.rem>=3){$k[$j++]=$_.codablockf_swc;if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.cset="setc";for(var _5x=0;_5x<2;_5x++){if($g($_.msg,$_.i)==$_.codablockf_fn1){$k[$j++]=$_.codablockf_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}if($_.remnums%2!=0&&$_.rem>=4){$k[$j++]=$g($_.msg,$_.i);if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.i=$_.i+1;$k[$j++]=$_.codablockf_swc;if($eq($_.cset,"seta")){$_.enca()}else{$_.encb()}$_.cset="setc";for(var _6E=0;_6E<2;_6E++){if($g($_.msg,$_.i)==$_.codablockf_fn1){$k[$j++]=$_.codablockf_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}}$k[$j++]=$eq($_.cset,"setb");$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _6R=$k[--$j];var _6S=$k[--$j];if(_6S&&_6R&&$_.rem>=2){if($_.i<$_.msglen-1){$k[$j++]=$_.i+1;$_.bbeforea();var _6X=$k[--$j];if(_6X){$k[$j++]=$_.codablockf_sft;$_.encb();$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}}$k[$j++]=$_.codablockf_swa;$_.encb();$_.cset="seta";$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}$k[$j++]=$eq($_.cset,"seta");$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _6k=$k[--$j];var _6l=$k[--$j];if(_6l&&_6k&&$_.rem>=2){if($_.i<$_.msglen-1){$k[$j++]=$_.i+1;$_.abeforeb();var _6q=$k[--$j];if(_6q){$k[$j++]=$_.codablockf_sft;$_.enca();$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}}$k[$j++]=$_.codablockf_swb;$_.enca();$_.cset="setb";$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}if($eq($_.cset,"setc")&&$_.remnums<2&&$_.rem>=2){$_.rem=$_.rem-1;$k[$j++]=$_.i;$_.abeforeb();var _74=$k[--$j];if(_74){$k[$j++]=$_.codablockf_swa;$_.encc();$_.cset="seta";$_.encafitsrow();var _75=$k[--$j];if(_75){break}}else{$k[$j++]=$_.codablockf_swb;$_.encc();$_.cset="setb";$_.encbfitsrow();var _76=$k[--$j];if(_76){break}}}if($eq($_.cset,"seta")&&$has($_.seta,$g($_.msg,$_.i))&&$_.rem>=1){$_.encafitsrow();var _7E=$k[--$j];if(_7E){break}}if($eq($_.cset,"setb")&&$has($_.setb,$g($_.msg,$_.i))&&$_.rem>=1){$_.encbfitsrow();var _7M=$k[--$j];if(_7M){break}}if($eq($_.cset,"setc")&&$_.remnums>=2&&$_.rem>=1){if($g($_.msg,$_.i)==$_.codablockf_fn1){$k[$j++]=$_.codablockf_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}break}$_.endofrow=true;break}}if(($_.r>=$_.rows||$_.rows==-1)&&$_.r>1&&$_.i==$_.msglen&&$_.rem>=2){$k[$j++]=$_.rem-2;$_.padrow();$_.j=$_.j+3;$k[$j++]=$_.codablockf_stp;$_.enca();$_.lastrow=true}else{$k[$j++]=$_.rem;$_.padrow();$_.j=$_.j+1;$k[$j++]=$_.codablockf_stp;$_.enca();$_.r=$_.r+1}}$_.cws=$G($_.cws,0,$_.j);$_.chkmsg=$a($_.kmsg.length);$_.j=0;for(var _7r=0,_7q=$_.kmsg.length-1;_7r<=_7q;_7r+=1){$_.i=_7r;$_.char=$g($_.kmsg,$_.i);if($_.char>=0){$p($_.chkmsg,$_.j,$_.char);$_.j=$_.j+1}if($_.char==$_.codablockf_fn1&&$_.i!=0){$p($_.chkmsg,$_.j,29);$_.j=$_.j+1}}$_.t1=0;$_.t2=0;$_.k1=0;$_.k2=0;for(var _87=0,_86=$_.j-1;_87<=_86;_87+=1){$_.i=_87;$_.t1=$g($_.chkmsg,$_.i)*$_.i%86;$_.t2=$f($_.t1+$g($_.chkmsg,$_.i))%86;$_.k1=$f($_.k1+$_.t2)%86;$_.k2=$f($_.k2+$_.t1)%86}var _8T=$_.cws;var _8S=$_.cws.length-4;var _8Q=$ne($_.cset,"setc")?$_.abmap:$_.cmap;$p(_8T,_8S,$g(_8Q,$_.k1));var _8d=$_.cws;var _8c=$_.cws.length-3;var _8a=$ne($_.cset,"setc")?$_.abmap:$_.cmap;$p(_8d,_8c,$g(_8a,$_.k2));var _8e=$_.cws;var _8l=2;var _8j=$g(_8e,2-1)!=99?$_.abmap:$_.cmap;$p(_8e,_8l,$g(_8j,$_.r-2));for(var _8p=1,_8o=$_.r-1;_8p<=_8o;_8p+=1){$_.i=_8p;var _8q=$_.cws;var _8r=$_.i;var _8s=$_.c;var _8t=$g(_8q,_8r*(_8s+5)+2-1);var _8z=_8r*(_8s+5)+2;var _8x=_8t!=99?$_.abmap:$_.cmap;$p(_8q,_8z,$g(_8x,$_.i+42))}for(var _93=0,_92=$_.r-1;_93<=_92;_93+=1){$_.rcws=$G($_.cws,_93*($_.c+5),$_.c+4);$_.csum=$g($_.rcws,0);for(var _9C=1,_9B=$_.rcws.length-2;_9C<=_9B;_9C+=1){$_.i=_9C;$_.csum=$f($_.csum+$g($_.rcws,$_.i)*$_.i)}$p($_.rcws,$_.rcws.length-1,$_.csum%103)}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#19142";$k[$j++]=$_.cws;bwipp_raiseerror()}$_.rowbits=$a($_.r);for(var _9S=0,_9R=$_.r-1;_9S<=_9R;_9S+=1){$_.i=_9S;$k[$j++]=Infinity;var _9X=$G($_.cws,$_.i*($_.c+5),$_.c+5);for(var _9Y=0,_9Z=_9X.length;_9Y<_9Z;_9Y++){$F($g($_.codablockf_encs,$g(_9X,_9Y)),function(){$k[$j-1]-=48})}$_.sbs=$a();$k[$j++]=Infinity;var _9d=$_.sbs;$k[$j++]=0;for(var _9e=0,_9f=_9d.length;_9e<_9f;_9e++){var _9h=$k[$j-1];var _9i=_9h==1?0:1;for(var _9j=0,_9k=$g(_9d,_9e);_9j<_9k;_9j++){$k[$j++]=_9i}}$as($a($m()-1));var _9n=$k[--$j];$j--;$k[$j-1]=_9n;$k[$j++]=$_.rowbits;$k[$j++]=$_.i;var _9t=$k[$j-3];var _9u=$k[$j-1];var _9v=$k[$j-2];$j-=3;$p(_9v,_9u,_9t)}$_.symwid=$_.c*11+57;$_.symhgt=$_.sepheight*($_.r+1)+$_.r*$_.rowheight;$_.numcomprows=$_.r*2+1;$k[$j++]=$_.symwid*$_.numcomprows;try{var _A4=$k[--$j];$k[$j++]=$a(_A4);var _A6=false}catch(e){$k[$j++]=true}if(_A6){$k[$j-1]="bwipp.codablockfSymbolTooLarge#19168";$k[$j++]="The symbol size exceeds the implementation limits";bwipp_raiseerror()}var _A7=$k[--$j];$_.pixs=_A7;$k[$j++]=Infinity;for(var _A9=0,_AA=$_.symwid;_A9<_AA;_A9++){$k[$j++]=1}$_.allone=$a();$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;for(var _AC=0,_AD=$_.symwid-24;_AC<_AD;_AC++){$k[$j++]=1}$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=1;$_.seprow=$a();$_.rowmult=$a($_.numcomprows);$_.pos=0;$_.ri=0;$P($_.pixs,$_.pos,$_.allone);$_.pos=$f($_.pos+$_.symwid);$p($_.rowmult,$_.ri,$_.sepheight);$_.ri=$_.ri+1;for(var _AR=0,_AQ=$_.r-2;_AR<=_AQ;_AR+=1){$_.i=_AR;$P($_.pixs,$_.pos,$g($_.rowbits,$_.i));$_.pos=$f($_.pos+$_.symwid);$p($_.rowmult,$_.ri,$_.rowheight);$_.ri=$_.ri+1;$P($_.pixs,$_.pos,$_.seprow);$_.pos=$f($_.pos+$_.symwid);$p($_.rowmult,$_.ri,$_.sepheight);$_.ri=$_.ri+1}$P($_.pixs,$_.pos,$g($_.rowbits,$_.r-1));$_.pos=$f($_.pos+$_.symwid);$p($_.rowmult,$_.ri,$_.rowheight);$_.ri=$_.ri+1;$P($_.pixs,$_.pos,$_.allone);$p($_.rowmult,$_.ri,$_.sepheight);$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.symwid],["pixy",$_.symhgt],["rowmult",$_.rowmult],["height",$_.symhgt/72],["width",$_.symwid/72],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_code16k(){if(!bwipp_code16k.globals){var $__=$_;$_=bwipp_code16k.globals={};$_.code16k_swa=-1;$_.code16k_swb=-2;$_.code16k_swc=-3;$_.code16k_sa1=-4;$_.code16k_sb1=-5;$_.code16k_sc1=-6;$_.code16k_sa2=-7;$_.code16k_sb2=-8;$_.code16k_sc2=-9;$_.code16k_pad=-10;$_.code16k_sb3=-11;$_.code16k_sc3=-12;$_.code16k_fn1=-13;$_.code16k_fn2=-14;$_.code16k_fn3=-15;$_.code16k_fn4=-16;$_.swa=$_.code16k_swa;$_.swb=$_.code16k_swb;$_.swc=$_.code16k_swc;$_.sa1=$_.code16k_sa1;$_.sb1=$_.code16k_sb1;$_.sc1=$_.code16k_sc1;$_.sa2=$_.code16k_sa2;$_.sb2=$_.code16k_sb2;$_.sc2=$_.code16k_sc2;$_.pad=$_.code16k_pad;$_.sb3=$_.code16k_sb3;$_.sc3=$_.code16k_sc3;$_.fn1=$_.code16k_fn1;$_.fn2=$_.code16k_fn2;$_.fn3=$_.code16k_fn3;$_.fn4=$_.code16k_fn4;$_.code16k_charmaps=$a([$a([32,32,"00"]),$a(["!","!","01"]),$a(['"','"',"02"]),$a(["#","#","03"]),$a(["$","$","04"]),$a(["%","%","05"]),$a(["&","&","06"]),$a(["'","'","07"]),$a([40,40,"08"]),$a([41,41,"09"]),$a(["*","*","10"]),$a(["+","+","11"]),$a([",",",","12"]),$a(["-","-","13"]),$a([".",".","14"]),$a(["/","/","15"]),$a(["0","0","16"]),$a(["1","1","17"]),$a(["2","2","18"]),$a(["3","3","19"]),$a(["4","4","20"]),$a(["5","5","21"]),$a(["6","6","22"]),$a(["7","7","23"]),$a(["8","8","24"]),$a(["9","9","25"]),$a([":",":","26"]),$a([";",";","27"]),$a(["<","<","28"]),$a(["=","=","29"]),$a([">",">","30"]),$a(["?","?","31"]),$a(["@","@","32"]),$a(["A","A","33"]),$a(["B","B","34"]),$a(["C","C","35"]),$a(["D","D","36"]),$a(["E","E","37"]),$a(["F","F","38"]),$a(["G","G","39"]),$a(["H","H","40"]),$a(["I","I","41"]),$a(["J","J","42"]),$a(["K","K","43"]),$a(["L","L","44"]),$a(["M","M","45"]),$a(["N","N","46"]),$a(["O","O","47"]),$a(["P","P","48"]),$a(["Q","Q","49"]),$a(["R","R","50"]),$a(["S","S","51"]),$a(["T","T","52"]),$a(["U","U","53"]),$a(["V","V","54"]),$a(["W","W","55"]),$a(["X","X","56"]),$a(["Y","Y","57"]),$a(["Z","Z","58"]),$a(["[","[","59"]),$a([92,92,"60"]),$a(["]","]","61"]),$a(["^","^","62"]),$a(["_","_","63"]),$a([0,"`","64"]),$a([1,"a","65"]),$a([2,"b","66"]),$a([3,"c","67"]),$a([4,"d","68"]),$a([5,"e","69"]),$a([6,"f","70"]),$a([7,"g","71"]),$a([8,"h","72"]),$a([9,"i","73"]),$a([10,"j","74"]),$a([11,"k","75"]),$a([12,"l","76"]),$a([13,"m","77"]),$a([14,"n","78"]),$a([15,"o","79"]),$a([16,"p","80"]),$a([17,"q","81"]),$a([18,"r","82"]),$a([19,"s","83"]),$a([20,"t","84"]),$a([21,"u","85"]),$a([22,"v","86"]),$a([23,"w","87"]),$a([24,"x","88"]),$a([25,"y","89"]),$a([26,"z","90"]),$a([27,"{","91"]),$a([28,"|","92"]),$a([29,"}","93"]),$a([30,"~","94"]),$a([31,127,"95"]),$a([$_.fn3,$_.fn3,"96"]),$a([$_.fn2,$_.fn2,"97"]),$a([$_.sb1,$_.sa1,"98"]),$a([$_.swc,$_.swc,"99"]),$a([$_.swb,$_.fn4,$_.swb]),$a([$_.fn4,$_.swa,$_.swa]),$a([$_.fn1,$_.fn1,$_.fn1]),$a([$_.pad,$_.pad,$_.pad]),$a([$_.sb2,$_.sa2,$_.sb1]),$a([$_.sc2,$_.sc2,$_.sb2]),$a([$_.sc3,$_.sc3,$_.sb3])]);$_.code16k_metrics=$a([$a([2,7]),$a([3,12]),$a([4,17]),$a([5,22]),$a([6,27]),$a([7,32]),$a([8,37]),$a([9,42]),$a([10,47]),$a([11,52]),$a([12,57]),$a([13,62]),$a([14,67]),$a([15,72]),$a([16,77])]);$_.code16k_encs=$a(["212222","222122","222221","121223","121322","131222","122213","122312","132212","221213","221312","231212","112232","122132","122231","113222","123122","123221","223211","221132","221231","213212","223112","312131","311222","321122","321221","312212","322112","322211","212123","212321","232121","111323","131123","131321","112313","132113","132311","211313","231113","231311","112133","112331","132131","113123","113321","133121","313121","211331","231131","213113","213311","213131","311123","311321","331121","312113","312311","332111","314111","221411","431111","111224","111422","121124","121421","141122","141221","112214","112412","122114","122411","142112","142211","241211","221114","413111","241112","134111","111242","121142","121241","114212","124112","124211","411212","421112","421211","212141","214121","412121","111143","111341","131141","114113","114311","411113","411311","113141","114131","311141","411131","211412","211214","211232","211133"]);$_.code16k_startencs=$a(["3211","2221","2122","1411","1132","1231","1114","3112","3211","2221","2122","1411","1132","1231","1114","3112"]);$_.code16k_stopencsodd=$a(["3211","2221","2122","1411","1132","1231","1114","3112","1132","1231","1114","3112","3211","2221","2122","1411"]);$_.code16k_stopencseven=$a(["2122","1411","1132","1231","1114","3112","1132","1231","1114","3112","3211","2221","2122","1411","3211","2221"]);$_.charvals=$a([new Map,new Map,new Map]);for(var _2Y=0,_2X=$_.code16k_charmaps.length-1;_2Y<=_2X;_2Y+=1){$_.i=_2Y;$_.encs=$g($_.code16k_charmaps,$_.i);for(var _2b=0;_2b<=2;_2b+=1){$_.j=_2b;var _2e=$g($_.encs,$_.j);var _2f=$t(_2e);if($eq(_2f,"stringtype")){_2e=$g(_2e,0)}$p($g($_.charvals,$_.j),_2e,$_.i)}}$_.charvals=$_.charvals;$_.seta=$g($_.charvals,0);$_.setb=$g($_.charvals,1);$_.setc=$g($_.charvals,2);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code16k.globals);$_.dontdraw=false;$_.sam=-1;$_.rows=0;$_.rowheight=8;$_.sepheight=1;$_.raw=false;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _2u=$k[--$j];$_.options=_2u;var _2v=$k[--$j];$_.barcode=_2v;if($_.barcode.length>500){$k[$j++]="bwipp.code16kinputTooLong#19446";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.rows!=0&&($_.rows<2||$_.rows>16)){$k[$j++]="bwipp.code16kBadRows#19463";$k[$j++]="Code 16K must have 2 to 16 rows";bwipp_raiseerror()}if($_.rowheight<8||$_.rowheight>50){$k[$j++]="bwipp.code16kBadRowHeight#19467";$k[$j++]="Code 16K must have rowheight from 8 to 50";bwipp_raiseerror()}if($_.sepheight<1||$_.sepheight>5){$k[$j++]="bwipp.code16kBadSepHeight#19471";$k[$j++]="Code 16K must have sepheight from 1 to 5";bwipp_raiseerror()}if($_.sam!=-1){$k[$j++]=true;for(var _37=0;_37<1;_37++){var _38=$_.sam;if(_38<12||_38>99){$k[$j-1]=false;break}if($_.sam%10<2){$k[$j-1]=false;break}if(~~($_.sam/10)>$_.sam%10){$k[$j-1]=false;break}}var _3C=$k[--$j];if(!_3C){$k[$j++]="bwipp.code16kBadSAM#19482";$k[$j++]='SAM must be formatted as "NM" for Nth of M symbols, from 2 to 9 symbols';bwipp_raiseerror()}}if($_.sam!=-1){$_.rows=16}if($_.raw){$_.mode=0;$_.cws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _3O=$G($_.barcode,$_.i+1,3);$k[$j++]=_3O;$k[$j++]=false;for(var _3P=0,_3Q=_3O.length;_3P<_3Q;_3P++){var _3R=$g(_3O,_3P);if(_3R<48||_3R>57){$k[$j-1]=true}}var _3S=$k[--$j];if(_3S){$j--;break}var _3T=$k[--$j];$_.cw=$i(_3T);if($_.cw>106){$k[$j++]="bwipp.code16kBadRawCodeword#19501";$k[$j++]="Raw codewords must be 0 to 106";bwipp_raiseerror()}$p($_.cws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.code16kBadRawFormat#19508";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.cws=$G($_.cws,0,$_.j)}else{$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.code16k_fn1],["FNC2",$_.code16k_fn2],["FNC3",$_.code16k_fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _3j=$k[--$j];$_.msg=_3j;$_.msglen=$_.msg.length;$k[$j++]=Infinity;for(var _3m=0,_3n=$_.msglen;_3m<_3n;_3m++){$k[$j++]=0}$k[$j++]=0;$_.numSA=$a();$k[$j++]=Infinity;for(var _3p=0,_3q=$_.msglen;_3p<_3q;_3p++){$k[$j++]=0}$k[$j++]=0;$_.numEA=$a();for(var _3s=$_.msglen-1;_3s>=0;_3s-=1){$_.i=_3s;if($g($_.msg,$_.i)>=0){if($g($_.msg,$_.i)>=128){$p($_.numEA,$_.i,$g($_.numEA,$_.i+1)+1)}else{$p($_.numSA,$_.i,$g($_.numSA,$_.i+1)+1)}}}$_.ea=false;$k[$j++]=Infinity;for(var _4B=0,_4A=$_.msglen-1;_4B<=_4A;_4B+=1){$_.i=_4B;$_.c=$g($_.msg,$_.i);if(!($_.ea!=$_.c<128)&&$_.c>=0){var _4M=$_.ea?$_.numSA:$_.numEA;var _4N=$g(_4M,$_.i);var _4Q=$f(_4N+$_.i)==$_.msglen?3:5;if(_4N<_4Q){$k[$j++]=$_.code16k_fn4}else{$_.ea=!$_.ea;$k[$j++]=$_.code16k_fn4;$k[$j++]=$_.code16k_fn4}}if($_.c>=0){$k[$j++]=$_.c&127}else{$k[$j++]=$_.c}}$as($a($m()));var _4X=$k[--$j];$_.msg=_4X;$j--;$_.msglen=$_.msg.length;$_.numsscr=function(){$_.n=0;$_.s=0;var _4Z=$k[--$j];$_.p=_4Z;for(;;){if($_.p>=$_.msglen){break}var _4e=$g($_.msg,$_.p);var _4g=$has($_.setc,_4e);$k[$j++]=_4e;if(!_4g){$j--;break}var _4h=$k[--$j];if(_4h==$_.code16k_fn1){if($_.s%2==0){$_.s=$_.s+1}else{break}}$_.n=$_.n+1;$_.s=$_.s+1;$_.p=$_.p+1}$k[$j++]=$_.n;$k[$j++]=$_.s};$_.enca=function(){var _4q=$k[--$j];$p($_.cws,$_.j,$g($_.seta,_4q));$_.j=$_.j+1};$_.encb=function(){var _4w=$k[--$j];$p($_.cws,$_.j,$g($_.setb,_4w));$_.j=$_.j+1};$_.encc=function(){var _51=$k[$j-1];var _52=$t(_51);if($ne(_52,"arraytype")){var _54=$k[--$j];$k[$j++]=$g($_.setc,_54)}else{var _56=$k[--$j];$q(_56);var _57=$k[--$j];var _58=$k[--$j];$k[$j++]=$f(_57-48+(_58-48)*10)}var _5A=$k[--$j];$p($_.cws,$_.j,_5A);$_.j=$_.j+1};$_.anotb=function(){var _5D=$k[--$j];$k[$j++]=$has($_.seta,_5D)&&!$has($_.setb,_5D)};$_.bnota=function(){var _5I=$k[--$j];$k[$j++]=$has($_.setb,_5I)&&!$has($_.seta,_5I)};$k[$j++]=Infinity;for(var _5O=0,_5P=$_.msg.length;_5O<_5P;_5O++){$k[$j++]=0}$k[$j++]=9999;$_.nextanotb=$a();$k[$j++]=Infinity;for(var _5R=0,_5S=$_.msg.length;_5R<_5S;_5R++){$k[$j++]=0}$k[$j++]=9999;$_.nextbnota=$a();for(var _5U=$_.msg.length-1;_5U>=0;_5U-=1){$_.i=_5U;$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _5Y=$k[--$j];if(_5Y){$p($_.nextanotb,$_.i,0)}else{$p($_.nextanotb,$_.i,$g($_.nextanotb,$_.i+1)+1)}$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _5j=$k[--$j];if(_5j){$p($_.nextbnota,$_.i,0)}else{$p($_.nextbnota,$_.i,$g($_.nextbnota,$_.i+1)+1)}}$_.abeforeb=function(){var _5r=$k[--$j];$k[$j++]=$lt($g($_.nextanotb,_5r),$g($_.nextbnota,_5r))};$_.bbeforea=function(){var _5w=$k[--$j];$k[$j++]=$lt($g($_.nextbnota,_5w),$g($_.nextanotb,_5w))};$_.cws=$a($_.barcode.length*2+3);$_.i=0;$_.j=0;for(;;){if($_.sam!=-1){$p($_.cws,0,~~($_.sam/10)-1);$p($_.cws,1,$_.sam%10-1);$_.j=2;$_.cset="setb";$_.mode=7;break}if($_.msglen==0){$_.cset="setb";$_.mode=1;break}if($_.msglen>=2){$k[$j++]=$g($_.msg,0)==$_.code16k_fn1;$k[$j++]=1;$_.numsscr();var _6C=$k[--$j];$j--;var _6F=$k[--$j];if(_6F&&_6C>=2){$_.cset="setc";$_.mode=4;$_.i=1;break}}if($g($_.msg,0)==$_.code16k_fn1){$_.cset="setb";$_.mode=3;$_.i=1;break}if($_.msglen>=2){$k[$j++]=0;$_.numsscr();var _6J=$k[--$j];$j--;if(_6J>=2&&_6J%2==0){$_.cset="setc";$_.mode=2;break}$k[$j++]=0;$_.numsscr();var _6M=$k[--$j];$j--;if(_6M>=3&&_6M%2==1){$k[$j++]=$g($_.msg,0);$_.encb();$_.cset="setc";$_.mode=5;$_.i=1;break}$k[$j++]=$has($_.setb,$g($_.msg,0));$k[$j++]=1;$_.numsscr();var _6V=$k[--$j];$j--;var _6Y=$k[--$j];if(_6Y&&(_6V>=2&&_6V%2==0)){$k[$j++]=$g($_.msg,0);$_.encb();$_.cset="setc";$_.mode=5;$_.i=1;break}$k[$j++]=$has($_.setb,$g($_.msg,0));$k[$j++]=1;$_.numsscr();var _6f=$k[--$j];$j--;var _6i=$k[--$j];if(_6i&&(_6f>=3&&_6f%2==1)){$k[$j++]=$g($_.msg,0);$_.encb();$k[$j++]=$g($_.msg,1);$_.encb();$_.cset="setc";$_.mode=6;$_.i=2;break}$k[$j++]=$has($_.setb,$g($_.msg,0))&&$has($_.setb,$g($_.msg,1));$k[$j++]=2;$_.numsscr();var _6v=$k[--$j];$j--;var _6y=$k[--$j];if(_6y&&(_6v>=2&&_6v%2==0)){$k[$j++]=$g($_.msg,0);$_.encb();$k[$j++]=$g($_.msg,1);$_.encb();$_.cset="setc";$_.mode=6;$_.i=2;break}}$k[$j++]=0;$_.abeforeb();var _73=$k[--$j];if(_73){$_.cset="seta";$_.mode=0;break}$_.cset="setb";$_.mode=1;break}for(;;){if($_.i==$_.msglen){break}$k[$j++]=$_.i;$_.numsscr();var _77=$k[--$j];$_.nums=_77;var _78=$k[--$j];$_.nchars=_78;for(;;){if($eq($_.cset,"seta")){if($_.i<$_.msglen-1){$k[$j++]=$g($_.msg,$_.i);$_.bnota();$k[$j++]=$_.i+1;$_.abeforeb();var _7G=$k[--$j];var _7H=$k[--$j];if(_7H&&_7G){$k[$j++]=$_.code16k_sb1;$_.enca();$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}}if($_.i<$_.msglen-2){$k[$j++]=$g($_.msg,$_.i);$_.bnota();$k[$j++]=$g($_.msg,$_.i+1);$_.bnota();var _7U=$k[--$j];var _7V=$k[--$j];$k[$j++]=$an(_7V,_7U);$k[$j++]=$_.i+2;$_.abeforeb();var _7X=$k[--$j];var _7Y=$k[--$j];if(_7Y&&_7X){$k[$j++]=$_.code16k_sb2;$_.enca();$k[$j++]=$g($_.msg,$_.i);$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$_.i=$_.i+2;break}}$k[$j++]=$g($_.msg,$_.i);$_.bnota();var _7j=$k[--$j];if(_7j){$k[$j++]=$_.code16k_swb;$_.enca();$_.cset="setb";break}if($_.i<$_.msglen-4){if($_.nums==4&&$has($_.seta,$g($_.msg,$_.i+4))){$k[$j++]=$_.code16k_sc2;$_.enca();for(var _7s=0;_7s<2;_7s++){if($g($_.msg,$_.i)==$_.code16k_fn1){$k[$j++]=$_.code16k_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}}if($_.i<$_.msglen-6){if($_.nums==6&&$has($_.seta,$g($_.msg,$_.i+6))){$k[$j++]=$_.code16k_sc3;$_.enca();for(var _89=0;_89<3;_89++){if($g($_.msg,$_.i)==$_.code16k_fn1){$k[$j++]=$_.code16k_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}}if($_.nums>=4&&$_.nums%2==0){$k[$j++]=$_.code16k_swc;$_.enca();$_.cset="setc";break}$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}if($eq($_.cset,"setb")){if($_.i<$_.msglen-1){$k[$j++]=$g($_.msg,$_.i);$_.anotb();$k[$j++]=$_.i+1;$_.bbeforea();var _8V=$k[--$j];var _8W=$k[--$j];if(_8W&&_8V){$k[$j++]=$_.code16k_sa1;$_.encb();$k[$j++]=$g($_.msg,$_.i);$_.enca();$_.i=$_.i+1;break}}if($_.i<$_.msglen-2){$k[$j++]=$g($_.msg,$_.i);$_.anotb();$k[$j++]=$g($_.msg,$_.i+1);$_.anotb();var _8j=$k[--$j];var _8k=$k[--$j];$k[$j++]=$an(_8k,_8j);$k[$j++]=$_.i+2;$_.bbeforea();var _8m=$k[--$j];var _8n=$k[--$j];if(_8n&&_8m){$k[$j++]=$_.code16k_sa2;$_.encb();$k[$j++]=$g($_.msg,$_.i);$_.enca();$k[$j++]=$g($_.msg,$_.i+1);$_.enca();$_.i=$_.i+2;break}}$k[$j++]=$g($_.msg,$_.i);$_.anotb();var _8y=$k[--$j];if(_8y){$k[$j++]=$_.code16k_swa;$_.encb();$_.cset="seta";break}if($_.i<$_.msglen-4){if($_.nums==4&&$has($_.setb,$g($_.msg,$_.i+4))){$k[$j++]=$_.code16k_sc2;$_.encb();for(var _97=0;_97<2;_97++){if($g($_.msg,$_.i)==$_.code16k_fn1){$k[$j++]=$_.code16k_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}}if($_.i<$_.msglen-6){if($_.nums==6&&$has($_.setb,$g($_.msg,$_.i+6))){$k[$j++]=$_.code16k_sc3;$_.encb();for(var _9O=0;_9O<3;_9O++){if($g($_.msg,$_.i)==$_.code16k_fn1){$k[$j++]=$_.code16k_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}}break}}if($_.nums>=4&&$_.nums%2==0){$k[$j++]=$_.code16k_swc;$_.encb();$_.cset="setc";break}$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}if($eq($_.cset,"setc")){if($_.nums>=2){if($g($_.msg,$_.i)==$_.code16k_fn1){$k[$j++]=$_.code16k_fn1;$_.encc();$_.i=$_.i+1}else{$k[$j++]=$G($_.msg,$_.i,2);$_.encc();$_.i=$_.i+2}break}if($_.i<$_.msglen-1){$k[$j++]=$has($_.setb,$g($_.msg,$_.i));$k[$j++]=$_.i+1;$_.numsscr();var _9v=$k[--$j];$j--;var _9y=$k[--$j];if(_9y&&(_9v>=2&&_9v%2==0)){$k[$j++]=$_.code16k_sb1;$_.encc();$k[$j++]=$g($_.msg,$_.i);$_.encb();$_.i=$_.i+1;break}}if($_.i<$_.msglen-1){$k[$j++]=$has($_.setb,$g($_.msg,$_.i));$k[$j++]=$_.i+1;$_.numsscr();var _AB=$k[--$j];$j--;var _AE=$k[--$j];if(_AE&&(_AB>=3&&_AB%2==1)){$k[$j++]=$_.code16k_sb2;$_.encc();$k[$j++]=$g($_.msg,$_.i);$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$_.i=$_.i+2;break}}if($_.i<$_.msglen-2){$k[$j++]=$has($_.setb,$g($_.msg,$_.i))&&$has($_.setb,$g($_.msg,$_.i+1));$k[$j++]=$_.i+2;$_.numsscr();var _AZ=$k[--$j];$j--;var _Ac=$k[--$j];if(_Ac&&(_AZ>=2&&_AZ%2==0)){$k[$j++]=$_.code16k_sb2;$_.encc();$k[$j++]=$g($_.msg,$_.i);$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$_.i=$_.i+2;break}}if($_.i<$_.msglen-3){$k[$j++]=$has($_.setb,$g($_.msg,$_.i))&&$has($_.setb,$g($_.msg,$_.i+1));$k[$j++]=$_.i+2;$_.numsscr();var _Ax=$k[--$j];$j--;var _B0=$k[--$j];if(_B0&&(_Ax>=3&&_Ax%2==1)){$k[$j++]=$_.code16k_sb3;$_.encc();$k[$j++]=$g($_.msg,$_.i);$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$k[$j++]=$g($_.msg,$_.i+2);$_.encb();$_.i=$_.i+3;break}}if($_.i<$_.msglen-3){$k[$j++]=$has($_.setb,$g($_.msg,$_.i))&&$has($_.setb,$g($_.msg,$_.i+1))&&$has($_.setb,$g($_.msg,$_.i+2));$k[$j++]=$_.i+3;$_.numsscr();var _BT=$k[--$j];$j--;var _BW=$k[--$j];if(_BW&&(_BT>=2&&_BT%2==0)){$k[$j++]=$_.code16k_sb3;$_.encc();$k[$j++]=$g($_.msg,$_.i);$_.encb();$k[$j++]=$g($_.msg,$_.i+1);$_.encb();$k[$j++]=$g($_.msg,$_.i+2);$_.encb();$_.i=$_.i+3;break}}$k[$j++]=$_.i;$_.abeforeb();var _Bi=$k[--$j];if(_Bi){$k[$j++]=$_.code16k_swa;$_.encc();$_.cset="seta";break}$k[$j++]=$_.code16k_swb;$_.encc();$_.cset="setb";break}break}}$_.cws=$G($_.cws,0,$_.j)}$_.urows=$_.rows;for(var _Bn=0,_Bo=$_.code16k_metrics.length;_Bn<_Bo;_Bn++){$_.m=$g($_.code16k_metrics,_Bn);$_.r=$g($_.m,0);$_.dcws=$g($_.m,1);$_.okay=true;if($_.urows!=0&&$_.urows!=$_.r){$_.okay=false}if($_.cws.length>$_.dcws){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.code16kNoValidSymbol#19996";$k[$j++]="Maximum length exceeded or data too large for given options";bwipp_raiseerror()}$k[$j++]=Infinity;$q($_.cws);for(var _C4=0,_C5=$f($_.dcws-$_.cws.length);_C4<_C5;_C4++){$k[$j++]=103}$_.cws=$a();$k[$j++]=Infinity;$k[$j++]=$f(($_.r-2)*7+$_.mode);$q($_.cws);$_.cws=$a();var _CF=0;for(var _CB=0,_CA=$_.dcws;_CB<=_CA;_CB+=1){_CF=$f(_CF+(_CB+2)*$g($_.cws,_CB))}$_.c1=_CF%107;var _CO=0;for(var _CI=0,_CH=$_.dcws;_CI<=_CH;_CI+=1){_CO=$f(_CO+(_CI+1)*$g($_.cws,_CI))}$_.c2=$f(_CO+$_.c1*($_.dcws+2))%107;$k[$j++]=Infinity;$q($_.cws);$k[$j++]=$_.c1;$k[$j++]=$_.c2;$_.cws=$a();if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#20020";$k[$j++]=$_.cws;bwipp_raiseerror()}if($_.sam==-1||~~($_.sam/10)%2==1){$_.stopencs=$_.code16k_stopencsodd}else{$_.stopencs=$_.code16k_stopencseven}$_.rowbits=$a($_.r);for(var _Cb=0,_Ca=$_.r-1;_Cb<=_Ca;_Cb+=1){$_.i=_Cb;$k[$j++]=Infinity;$k[$j++]=10;$F($g($_.code16k_startencs,$_.i),function(){$k[$j-1]-=48});var _Ch=$G($_.cws,$_.i*5,5);$k[$j++]=1;for(var _Ci=0,_Cj=_Ch.length;_Ci<_Cj;_Ci++){$F($g($_.code16k_encs,$g(_Ch,_Ci)),function(){$k[$j-1]-=48})}$F($g($_.stopencs,$_.i),function(){$k[$j-1]-=48});$k[$j++]=1;$_.sbs=$a();$k[$j++]=Infinity;var _Cr=$_.sbs;$k[$j++]=1;for(var _Cs=0,_Ct=_Cr.length;_Cs<_Ct;_Cs++){var _Cv=$k[$j-1];var _Cw=_Cv==0?1:0;for(var _Cx=0,_Cy=$g(_Cr,_Cs);_Cx<_Cy;_Cx++){$k[$j++]=_Cw}}$as($a($m()-1));var _D1=$k[--$j];$j--;$k[$j-1]=_D1;$k[$j++]=$_.rowbits;$k[$j++]=$_.i;var _D7=$k[$j-3];var _D8=$k[$j-1];var _D9=$k[$j-2];$j-=3;$p(_D9,_D8,_D7)}$_.symhgt=$f($_.sepheight*($_.r+1)+$_.r*$_.rowheight);$_.numcomprows=$_.r*2+1;$k[$j++]=81*$_.numcomprows;try{var _DG=$k[--$j];$k[$j++]=$a(_DG);var _DI=false}catch(e){$k[$j++]=true}if(_DI){$k[$j-1]="bwipp.code16kSymbolTooLarge#20056";$k[$j++]="The symbol size exceeds the implementation limits";bwipp_raiseerror()}var _DJ=$k[--$j];$_.pixs=_DJ;$k[$j++]=Infinity;for(var _DK=0;_DK<81;_DK++){$k[$j++]=1}$_.allone=$a();$k[$j++]=Infinity;for(var _DL=0;_DL<10;_DL++){$k[$j++]=0}for(var _DM=0;_DM<70;_DM++){$k[$j++]=1}$k[$j++]=0;$_.seprow=$a();$_.rowmult=$a($_.numcomprows);$_.pos=0;$_.ri=0;$P($_.pixs,$_.pos,$_.allone);$_.pos=$_.pos+81;$p($_.rowmult,$_.ri,$_.sepheight);$_.ri=$_.ri+1;for(var _DZ=0,_DY=$_.r-2;_DZ<=_DY;_DZ+=1){$_.i=_DZ;$P($_.pixs,$_.pos,$g($_.rowbits,$_.i));$_.pos=$_.pos+81;$p($_.rowmult,$_.ri,$_.rowheight);$_.ri=$_.ri+1;$P($_.pixs,$_.pos,$_.seprow);$_.pos=$_.pos+81;$p($_.rowmult,$_.ri,$_.sepheight);$_.ri=$_.ri+1}$P($_.pixs,$_.pos,$g($_.rowbits,$_.r-1));$_.pos=$_.pos+81;$p($_.rowmult,$_.ri,$_.rowheight);$_.ri=$_.ri+1;$P($_.pixs,$_.pos,$_.allone);$p($_.rowmult,$_.ri,$_.sepheight);$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",81],["pixy",$_.symhgt],["rowmult",$_.rowmult],["height",$_.symhgt/72],["width",81/72],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_code49(){if(!bwipp_code49.globals){var $__=$_;$_=bwipp_code49.globals={};$_.code49_s1=-1;$_.code49_s2=-2;$_.code49_fn1=-3;$_.code49_fn2=-4;$_.code49_fn3=-5;$_.code49_ns=-6;$_.code49_charmap=$a(["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","-","."," ","$","/","+","%",$_.code49_s1,$_.code49_s2,$_.code49_fn1,$_.code49_fn2,$_.code49_fn3,$_.code49_ns]);$_.code49_combos=$a(["1 ","1A","1B","1C","1D","1E","1F","1G","1H","1I","1J","1K","1L","1M","1N","1O","1P","1Q","1R","1S","1T","1U","1V","1W","1X","1Y","1Z","11","12","13","14","15"," ","16","17","18"," $"," %","19","10","1-","1.","1$"," +","1/"," -"," ."," /"," 0"," 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9","1+","21","22","23","24","25","26"," A"," B"," C"," D"," E"," F"," G"," H"," I"," J"," K"," L"," M"," N"," O"," P"," Q"," R"," S"," T"," U"," V"," W"," X"," Y"," Z","27","28","29","20","2-","2.","2A","2B","2C","2D","2E","2F","2G","2H","2I","2J","2K","2L","2M","2N","2O","2P","2Q","2R","2S","2T","2U","2V","2W","2X","2Y","2Z","2$","2/","2+","2%","2 "]);$_.code49_samval=$a([12,22,13,23,33,14,24,34,44,15,25,35,45,55,16,26,36,46,56,66,17,27,37,47,57,67,77,18,28,38,48,58,68,78,88,19,29,39,49,59,69,79,89,99]);$_.code49_metrics=$a([$a([2,9]),$a([3,16]),$a([4,23]),$a([5,30]),$a([6,37]),$a([7,42]),$a([8,49])]);var _B=$a([1,9,31,26,2,12,17,23,37,18,22,6,27,44,15,43,39,11,13,5,41,33,36,8,4,32,3,19,40,25,29,10,24,30]);$k[$j++]=_B;$k[$j++]=Infinity;$k[$j++]=20;$q($G(_B,0,32));var _F=$a();$_.code49_weightx=_F;var _G=$k[$j-1];$k[$j++]=Infinity;$k[$j++]=16;$q($G(_G,1,32));var _K=$a();$_.code49_weighty=_K;var _M=$k[--$j];$k[$j++]=Infinity;$k[$j++]=38;$q($G(_M,2,32));var _O=$a();$_.code49_weightz=_O;$_.code49_patterns=$a([$a(["11521132","25112131","14212132","25121221","14221222","12412132","23321221","12421222","21521221","15112222","15121312","13312222","24221311","13321312","11512222","22421311","11521312","25112311","14212312","23312311","12412312","21512311","16121131","14321131","12521131","15212131","15221221","13412131","13421221","11612131","16112221","16121311","14312221","14321311","12512221","12521311","15212311","13412311","11612311","11131135","31131133","51131131","21122134","41122132","21131224","41131222","11113135","31113133","51113131","11122225","31122223","51122221","11131315","31131313","51131311","21113224","41113222","21122314","41122312","11113315","31113313","51113311","12131134","32131132","21231133","41231131","22122133","42122131","11222134","22131223","42131221","11231224","31231222","12113134","32113132","12122224","32122222","12131314","32131312","21231313","41231311","22113223","42113221","11213224","22122313","42122311","11222314","31222312","12113314","32113312","21213313","41213311","13131133","33131131","22231132","11331133","31331131","23122132","12222133","23131222","12231223","32231221","21331222","13113133","33113131","13122223","33122221","11313133","13131313","33131311","11322223","22231312","11331313","31331311","23113222","12213223","23122312","12222313","32222311","21322312","13113313","33113311","22213312","11313313","31313311","14131132","23231131","12331132","21431131","24122131","13222132","24131221","13231222","11422132","22331221","11431222","14113132","14122222","12313132","14131312","12322222","23231311","12331312","21431311","24113221","13213222","24122311","13222312","11413222","22322311","11422312","14113312","23213311","12313312","21413311","15131131","13331131","14222131","14231221","12422131","12431221","15113131","15122221","13313131","15131311","13322221","11513131","13331311","11522221","14213221","14222311","12413221","12422311","15113311","13313311","11513311","11141134","31141132","21132133","41132131","21141223","41141221","11123134","31123132","11132224","31132222","11141314","31141312","21114133","41114131","21123223","41123221","21132313","41132311","11114224","31114222","11123314","31123312","21114313","41114311","12141133","32141131","21241132","22132132","11232133","22141222","11241223","31241221","12123133","32123131","12132223","32132221","12141313","32141311","21241312","22114132","11214133","22123222","11223223","22132312","11232313","31232311","12114223","32114221","12123313","32123311","21223312","22114312","11214313","31214311","13141132","22241131","11341132","23132131","12232132","23141221","12241222","21341221","13123132","13132222","11323132","13141312","11332222","22241311","11341312","23114131","12214132","23123221","12223222","23132311","12232312","21332311","13114222","13123312","11314222","22223311","11323312","23114311","12214312","21314311","14141131","12341131","13232131","13241221","11432131","14123131","14132221","12323131","14141311","12332221","12341311","13214131","13223221","11414131","13232311","11423221","11432311","14114221","14123311","12314221","12323311","13214311","11414311","11151133","31151131","21142132","21151222","11133133","31133131","11142223","31142221","11151313","31151311","21124132","21133222","21142312","11115133","31115131","11124223","31124221","11133313","31133311","21115222","21124312","12151132","21251131","22142131","11242132","22151221","11251222","12133132","12142222","12151312","21251311","22124131","11224132","22133221","11233222","22142311","11242312","12115132","12124222","12133312","21233311","22115221","11215222","22124311","11224312","13151131","12242131","12251221","13133131","13142221","11333131","13151311","11342221","12224131","12233221","12242311","13115131","13124221","11315131","13133311","11324221","11333311","12215221","12224311","11161132","21152131","21161221","11143132","11152222","11161312","21134131","21143221","21152311","11125132","11134222","11143312","21116131","21125221","21134311","12161131","11252131","12143131","12152221","12161311","11234131","11243221","11252311","12125131","12134221","12143311","11216131","11225221","11234311","11111236","31111234","51111232","21111325","41111323","61111321","11111416","31111414","51111412","31211143","51211141","12111235","32111233","52111231","21211234","41211232","22111324","42111322","11211325","31211323","51211321","12111415","32111413","52111411","21211414","41211412","12211144","32211142","21311143","41311141","13111234","33111232","22211233","42211231","11311234","31311232","23111323","43111321","12211324","32211322","21311323","41311321","13111414","33111412","22211413","42211411","11311414","31311412","13211143","33211141","22311142","11411143","31411141","14111233","34111231","23211232","12311233","32311231","21411232","24111322","13211323","33211321","22311322","11411323","31411321","14111413","34111411","23211412","12311413","32311411","21411412","14211142","23311141","12411142","21511141","15111232","24211231","13311232","22411231","11511232","25111321","14211322","23311321","12411322","21511321","15111412","24211411","13311412","22411411","11511412","15211141","13411141","11611141","16111231","14311231","12511231","15211321","13411321","11611321","16111411","14311411","12511411","21121144","41121142","11112145","31112143","51112141","11121235","31121233","51121231","21112234","41112232","21121324","41121322","11112325","31112323","51112321","11121415","31121413","51121411","21112414","41112412","22121143","42121141","11221144","31221142","12112144","32112142","12121234","32121232","21221233","41221231","22112233","42112231","11212234","22121323","42121321","11221324","31221322","12112324","32112322","12121414","32121412","21221413","41221411","22112413","42112411","11212414","31212412","23121142","12221143","32221141","21321142","13112143","33112141","13121233","33121231","11312143","22221232","11321233","31321231","23112232","12212233","23121322","12221323","32221321","21321322","13112323","33112321","13121413","33121411","11312323","22221412","11321413","31321411","23112412","12212413","32212411","21312412","24121141","13221142","22321141","11421142","14112142","14121232","12312142","23221231","12321232","21421231","24112231","13212232","24121321","13221322","11412232","22321321","11421322","14112322","14121412","12312322","23221411","12321412","21421411","24112411","13212412","22312411","11412412","14221141","12421141","15112141","15121231","13312141","13321231","11512141","11521231","14212231","14221321","12412231","12421321","15112321","15121411","13312321","13321411","11512321","11521411","14212411","12412411","21131143","41131141","11122144","31122142","11131234","31131232","21113143","41113141","21122233","41122231","21131323","41131321","11113234","31113232","11122324","31122322","11131414","31131412","21113323","41113321","21122413","41122411","11113414","31113412","22131142","11231143","31231141","12122143","32122141","12131233","32131231","21231232","22113142","11213143","22122232","11222233","22131322","11231323","31231321","12113233","32113231","12122323","32122321","12131413","32131411","21231412","22113322","11213323","22122412","11222413","31222411","12113413","32113411","21213412","23131141","12231142","21331141","13122142","13131232","11322142","22231231","11331232","23113141","12213142","23122231","12222232","23131321","12231322","21331321","13113232","13122322","11313232","13131412","11322322","22231411","11331412","23113321","12213322","23122411","12222412","21322411","13113412","22213411","11313412","13231141","11431141","14122141","14131231","12322141","12331231","13213141","13222231","11413141","13231321","11422231","11431321","14113231","14122321","12313231","14131411","12322321","12331411","13213321","13222411","11413321","11422411","14113411","12313411","21141142","11132143","31132141","11141233","31141231","21123142","21132232","21141322","11114143","31114141","11123233","31123231","11132323","31132321","11141413","31141411","21114232","21123322","21132412","11114323","31114321","11123413","31123411","22141141","11241142","12132142","12141232","21241231","22123141","11223142","22132231","11232232","22141321","11241322","12114142","12123232","12132322","12141412","21241411","22114231","11214232","22123321","11223322","22132411","11232412","12114322","12123412","21223411","12241141","13132141","13141231","11332141","11341231","12223141","12232231","12241321","13114141","13123231","11314141","13132321","11323231","13141411","11332321","11341411","12214231","12223321","12232411","13114321","13123411","11314321","11323411","21151141","11142142","11151232","21133141","21142231","21151321","11124142","11133232","11142322","11151412","21115141","21124231","21133321","21142411","11115232","11124322","11133412","11251141","12142141","12151231","11233141","11242231","11251321","12124141","12133231","12142321","12151411","11215141","11224231","11233321","11242411","12115231","12124321","12133411","11152141","11161231","11134141","11143231","11152321","11161411","11116141","11125231","11134321","11143411","21111244","41111242","11111335","31111333","51111331","21111424","41111422","11111515","31111513","51111511","21211153","41211151","22111243","42111241","11211244","31211242","12111334","32111332","21211333","41211331","22111423","42111421","11211424","31211422","12111514","32111512","21211513","41211511","22211152","11311153","31311151","23111242","12211243","32211241","21311242","13111333","33111331","22211332","11311333","31311331","23111422","12211423","32211421","21311422","13111513","33111511","22211512","11311513","31311511","23211151","12311152","21411151","24111241","13211242","22311241","11411242","14111332","23211331","12311332","21411331","24111421","13211422","22311421","11411422","14111512","23211511","12311512","21411511","13311151","11511151","14211241","12411241","15111331","13311331","11511331","14211421","12411421","15111511","13311511","11511511","31121152","21112153","41112151","21121243","41121241","11112244","31112242","11121334","31121332","21112333","41112331","21121423","41121421","11112424","31112422","11121514","31121512","21112513","41112511","12121153","32121151","21221152","22112152","11212153","22121242","11221243","31221241","12112243","32112241","12121333","32121331","21221332","22112332","11212333","22121422","11221423","31221421","12112423","32112421","12121513","32121511","21221512","22112512","11212513","31212511","13121152","22221151","11321152","23112151","12212152","23121241","12221242","21321241","13112242","13121332","11312242","22221331","11321332","23112331","12212332","23121421","12221422","21321421","13112422","13121512","11312422","22221511","11321512","23112511","12212512","21312511","14121151","12321151","13212151","13221241","11412151","11421241","14112241","14121331","12312241","12321331","13212331","13221421","11412331","11421421","14112421","14121511","12312421","12321511","13212511","11412511","11131153","31131151","21122152","21131242","11113153","31113151","11122243","31122241","11131333","31131331","21113242","21122332","21131422","11113333","31113331","11122423","31122421","11131513","31131511","21113422","21122512","12131152","21231151","22122151","11222152","22131241","11231242","12113152","12122242","12131332","21231331","22113241","11213242","22122331","11222332","22131421","11231422","12113332","12122422","12131512","21231511","22113421","11213422","22122511","11222512","13131151","11331151","12222151","12231241","13113151","13122241","11313151","13131331","11322241","11331331","12213241","12222331","12231421","13113331","13122421","11313331","13131511","11322421","11331511","12213421","12222511","11141152","21132151","21141241","11123152","11132242","11141332","21114151","21123241","21132331","21141421","11114242","11123332","11132422","11141512","21114331","21123421","21132511","12141151","11232151","11241241","12123151","12132241","12141331","11214151","11223241","11232331","11241421","12114241","12123331","12132421","12141511","11214331","11223421","11232511","11151151","11133151","11142241","11151331","11115151","11124241","11133331","11142421","11151511","11111254","31111252","21111343","41111341","11111434","31111432","21111523","41111521","11111614","31111612","31211161","12111253","32111251","21211252","22111342","11211343","31211341","12111433","32111431","21211432","22111522","11211523","31211521","12111613","32111611","21211612","12211162","21311161","13111252","22211251","11311252","23111341","12211342","21311341","13111432","22211431","11311432","23111521","12211522","21311521","13111612","22211611","11311612","13211161","11411161","14111251","12311251","13211341","11411341","14111431","12311431","13211521","11411521","14111611","12311611","21121162","11112163","31112161","11121253","31121251","21112252","21121342","11112343","31112341","11121433","31121431","21112432","21121522","11112523","31112521","11121613","31121611","22121161","11221162","12112162","12121252","21221251","22112251","11212252","22121341","11221342","12112342","12121432","21221431","22112431","11212432","22121521","11221522","12112522","12121612","21221611","12221161","13112161","13121251","11312161","11321251","32121115","52121113","21221116","41221114","61221112","22112116","42112114","31212115","51212113","13121116","33121114","22221115","42221113","11321116","31321114","51321112","23112115","43112113","12212116","32212114","52212112","21312115","41312113","61312111","14121115","34121113","23221114","43221112","12321115","32321113","52321111","21421114","41421112","24112114","13212115","33212113","22312114","42312112","11412115","31412113","51412111","15121114","24221113","13321114","33321112","22421113","42421111","11521114","31521112","25112113","14212114","34212112","23312113","43312111","12412114","32412112","21512113","41512111","16121113","25221112","14321113","34321111","23421112","12521113","32521111","15212113","24312112","13412113","33412111","22512112","11612113","31612111","31131115","51131113","21122116","41122114","61122112","31113115","51113113","12131116","32131114","52131112","21231115","41231113","61231111","22122115","42122113","11222116","31222114","51222112","12113116","32113114","52113112","21213115","41213113","61213111","13131115","33131113","22231114","42231112","11331115","31331113","51331111","23122114","43122112","12222115","32222113","52222111","21322114","41322112","13113115","33113113","22213114","42213112","11313115","31313113","51313111","14131114","34131112","23231113","43231111","12331114","32331112","21431113","41431111","24122113","13222114","33222112","22322113","42322111","11422114","31422112","14113114","34113112","23213113","43213111","12313114","32313112","21413113","41413111","15131113","24231112","13331113","33331111","22431112","25122112","14222113","34222111","23322112","12422113","32422111","21522112","15113113","24213112","13313113","33313111","22413112","11513113","31513111","16131112","25231111","14331112","23431111","15222112","24322111","13422112","22522111","16113112","25213111","14313112","23413111","12513112","21613111","11141116","31141114","51141112","21132115","41132113","61132111","11123116","31123114","51123112","21114115","41114113","61114111","12141115","32141113","52141111","21241114","41241112","22132114","42132112","11232115","31232113","51232111","12123115","32123113","52123111","21223114","41223112","22114114","42114112","11214115","31214113","51214111","13141114","33141112","22241113","42241111","11341114","31341112","23132113","43132111","12232114","32232112","21332113","41332111","13123114","33123112","22223113","42223111","11323114","31323112","23114113","43114111","12214114","32214112","21314113","41314111","14141113","34141111","23241112","12341113","32341111","24132112","13232113","33232111","22332112","11432113","31432111","14123113","34123111","23223112","12323113","32323111","21423112","24114112","13214113","33214111","22314112","11414113","31414111","15141112","24241111","13341112","25132111","14232112","23332111","12432112","15123112","24223111","13323112","22423111","11523112","25114111","14214112","23314111","12414112","21514111","16141111","14341111","15232111","13432111","16123111","14323111","12523111","15214111","13414111","11614111","11151115","31151113","51151111","21142114","41142112","11133115","31133113","51133111","21124114","41124112","11115115","31115113","51115111","12151114","32151112","21251113","41251111","22142113","42142111","11242114","31242112","12133114","32133112","21233113","41233111","22124113","42124111","11224114","31224112","12115114","32115112","21215113","41215111","13151113","33151111","22251112","23142112","12242113","32242111","21342112","13133113","33133111","22233112","11333113","31333111","23124112","12224113","32224111","21324112","13115113","33115111","22215112","11315113","31315111","14151112","23251111","24142111","13242112","22342111","14133112","23233111","12333112","21433111","24124111","13224112","22324111","11424112","14115112","23215111","12315112","21415111","15151111","14242111","15133111","13333111","14224111","12424111","15115111","13315111","11515111","11161114","31161112","21152113","41152111","11143114","31143112","21134113","41134111","11125114","31125112","21116113","41116111","12161113","32161111","22152112","11252113","31252111","12143113","32143111","21243112","22134112","11234113","31234111","12125113","32125111","21225112","22116112","11216113","31216111","13161112","23152111","12252112","13143112","22243111","11343112","23134111","12234112","21334111","13125112","22225111","11325112","23116111","12216112","21316111","14161111","13252111","14143111","12343111","13234111","11434111","14125111","12325111","13216111","11416111","31111216","51111214","31211125","51211123","32111215","52111213","21211216","41211214","61211212","12211126","32211124","52211122","21311125","41311123","61311121","13111216","33111214","22211215","42211213","11311216","31311214","51311212","13211125","33211123","22311124","42311122","11411125","31411123","51411121","14111215","34111213","23211214","43211212","12311215","32311213","52311211","21411214","41411212","14211124","34211122","23311123","43311121","12411124","32411122","21511123","41511121","15111214","24211213","13311214","33311212","22411213","42411211","11511214","31511212","15211123","24311122","13411123","33411121","22511122","11611123","31611121","16111213","25211212","14311213","34311211","23411212","12511213","32511211","21611212","21121126","41121124","61121122","31112125","51112123","31121215","51121213","21112216","41112214","61112212","22121125","42121123","11221126","31221124","51221122","12112126","32112124","52112122","12121216","32121214","52121212","21221215","41221213","61221211","22112215","42112213","11212216","31212214","51212212","23121124","43121122","12221125","32221123","52221121","21321124","41321122","13112125","33112123","13121215","33121213","11312125","22221214","42221212","11321215","31321213","51321211","23112214","43112212","12212215","32212213","52212211","21312214","41312212","24121123","13221124","33221122","22321123","42321121","11421124","31421122","14112124","34112122","14121214","34121212","12312124","23221213","43221211","12321214","32321212","21421213","41421211","24112213","13212214","33212212","22312213","42312211","11412214","31412212","25121122","14221123","34221121","23321122","12421123","32421121","21521122","15112123","15121213","13312123","24221212","13321213","33321211","11512123","22421212","11521213","31521211","25112212","14212213","34212211","23312212","12412213","32412211","21512212","15221122","24321121","13421122","22521121","16112122","16121212","14312122","25221211","14321212","12512122","23421211","12521212","15212212","24312211","13412212","22512211","11612212","21131125","41131123","61131121","11122126","31122124","51122122","11131216","31131214","51131212","21113125","41113123","61113121","21122215","41122213","61122211","11113216","31113214","51113212","22131124","42131122","11231125","31231123","51231121","12122125","32122123","52122121","12131215","32131213","52131211","21231214","41231212","22113124","42113122","11213125","22122214","42122212","11222215","31222213","51222211","12113215","32113213","52113211","21213214","41213212","23131123","43131121","12231124","32231122","21331123","41331121","13122124","33122122","13131214","33131212","11322124","22231213","42231211","11331214","31331212","23113123","43113121","12213124","23122213","43122211","12222214","32222212","21322213","41322211","13113214","33113212","22213213","42213211","11313214","31313212","24131122","13231123","33231121","22331122","11431123","31431121","14122123","34122121","14131213","34131211","12322123","23231212","12331213","32331211","21431212","24113122","13213123","24122212","13222213","33222211","11413123","22322212","11422213","31422211","14113213","34113211","23213212","12313213","32313211","21413212","25131121","14231122","23331121","12431122","15122122","15131212","13322122","24231211","13331212","11522122","22431211","25113121","14213122","25122211","14222212","12413122","23322211","12422212","21522211","15113212","24213211","13313212","22413211","11513212","15231121","13431121","16122121","16131211","14322121","14331211","12522121","15213121","15222211","13413121","13422211","11613121","16113211","14313211","12513211","21141124","41141122","11132125","31132123","51132121","11141215","31141213","51141211","21123124","41123122","21132214","41132212","11114125","31114123","51114121","11123215","31123213","51123211","21114214","41114212","22141123","42141121","11241124","31241122","12132124","32132122","12141214","32141212","21241213","41241211","22123123","42123121","11223124","22132213","42132211","11232214","31232212","12114124","32114122","12123214","32123212","21223213","41223211","22114213","42114211","11214214","31214212","23141122","12241123","32241121","21341122","13132123","33132121","13141213","33141211","11332123","22241212","11341213","31341211","23123122","12223123","23132212","12232213","32232211","21332212","13114123","33114121","13123213","33123211","11314123","22223212","11323213","31323211","23114212","12214213","32214211","21314212","24141121","13241122","22341121","14132122","14141212","12332122","23241211","12341212","24123121","13223122","24132211","13232212","11423122","22332211","11432212","14114122","14123212","12314122","23223211","12323212","21423211","24114211","13214212","22314211","11414212","14241121","15132121","15141211","13332121","13341211","14223121","14232211","12423121","12432211","15114121","15123211","13314121","13323211","11514121","11523211","14214211","12414211","21151123","41151121","11142124","31142122","11151214","31151212","21133123","41133121","21142213","41142211","11124124","31124122","11133214","31133212","21115123","41115121","21124213","41124211","11115214","31115212","22151122","11251123","31251121","12142123","32142121","12151213","32151211","21251212","22133122","11233123","22142212","11242213","31242211","12124123","32124121","12133213","32133211","21233212","22115122","11215123","22124212","11224213","31224211","12115213","32115211","21215212","23151121","12251122","13142122","13151212","11342122","22251211","23133121","12233122","23142211","12242212","21342211","13124122","13133212","11324122","22233211","11333212","23115121","12215122","23124211","12224212","21324211","13115212","22215211","11315212","13251121","14142121","14151211","12342121","13233121","13242211","11433121","14124121","14133211","12324121","12333211","13215121","13224211","11415121","11424211","14115211","12315211","21161122","11152123","31152121","11161213","31161211","21143122","21152212","11134123","31134121","11143213","31143211","21125122","21134212","11116123","31116121","11125213","31125211","22161121","12152122","12161212","22143121","11243122","22152211","11252212","12134122","12143212","21243211","22125121","11225122","22134211","11234212","12116122","12125212","21225211","13152121","13161211","12243121","12252211","13134121","13143211","11334121","11343211","12225121","12234211","13116121","13125211","11316121","11325211","21111226","41111224","61111222","31111315","51111313","21211135","41211133","61211131","22111225","42111223","11211226","31211224","51211222","12111316","32111314","52111312","21211315","41211313","61211311","22211134","42211132","11311135","31311133","51311131","23111224","43111222","12211225","32211223","52211221","21311224","41311222","13111315","33111313","22211314","42211312","11311315","31311313","51311311","23211133","43211131","12311134","32311132","21411133","41411131","24111223","13211224","33211222","22311223","42311221","11411224","31411222","14111314","34111312","23211313","43211311","12311314","32311312","21411313","41411311","24211132","13311133","33311131","22411132","11511133","31511131","25111222","14211223","34211221","23311222","12411223","32411221","21511222","15111313","24211312","13311313","33311311","22411312","11511313","31511311","25211131","14311132","23411131","12511132","21611131","15211222","24311221","13411222","22511221","11611222","16111312","25211311","14311312","23411311","12511312","21611311","31121134","51121132","21112135","41112133","61112131","21121225","41121223","61121221","11112226","31112224","51112222","11121316","31121314","51121312","21112315","41112313","61112311","12121135","32121133","52121131","21221134","41221132","22112134","42112132","11212135","22121224","42121222","11221225","31221223","51221221","12112225","32112223","52112221","12121315","32121313","52121311","21221314","41221312","22112314","42112312","11212315","31212313","51212311","13121134","33121132","22221133","42221131","11321134","31321132","23112133","43112131","12212134","23121223","43121221","12221224","32221222","21321223","41321221","13112224","33112222","13121314","33121312","11312224","22221313","42221311","11321314","31321312","23112313","43112311","12212314","32212312","21312313","41312311","14121133","34121131","23221132","12321133","32321131","21421132","24112132","13212133","24121222","13221223","33221221","11412133","22321222","11421223","31421221","14112223","34112221","14121313","34121311","12312223","23221312","12321313","32321311","21421312","24112312","13212313","33212311","22312312","11412313","31412311","15121132","24221131","13321132","22421131"]),$a(["22121116","42121114","31221115","51221113","32112115","52112113","21212116","41212114","61212112","23121115","43121113","12221116","32221114","52221112","21321115","41321113","61321111","13112116","33112114","22212115","42212113","11312116","31312114","51312112","24121114","13221115","33221113","22321114","42321112","11421115","31421113","51421111","14112115","34112113","23212114","43212112","12312115","32312113","52312111","21412114","41412112","25121113","14221114","34221112","23321113","43321111","12421114","32421112","21521113","41521111","15112114","24212113","13312114","33312112","22412113","42412111","11512114","31512112","15221113","24321112","13421113","33421111","22521112","16112113","25212112","14312113","34312111","23412112","12512113","32512111","21612112","21131116","41131114","61131112","31122115","51122113","21113116","41113114","61113112","22131115","42131113","11231116","31231114","51231112","12122116","32122114","52122112","21222115","41222113","61222111","22113115","42113113","11213116","31213114","51213112","23131114","43131112","12231115","32231113","52231111","21331114","41331112","13122115","33122113","22222114","42222112","11322115","31322113","51322111","23113114","43113112","12213115","32213113","52213111","21313114","41313112","24131113","13231114","33231112","22331113","42331111","11431114","31431112","14122114","34122112","23222113","43222111","12322114","32322112","21422113","41422111","24113113","13213114","33213112","22313113","42313111","11413114","31413112","25131112","14231113","34231111","23331112","12431113","32431111","15122113","24222112","13322113","33322111","22422112","11522113","31522111","25113112","14213113","34213111","23313112","12413113","32413111","21513112","15231112","24331111","13431112","16122112","25222111","14322112","23422111","12522112","15213112","24313111","13413112","22513111","11613112","21141115","41141113","61141111","11132116","31132114","51132112","21123115","41123113","61123111","11114116","31114114","51114112","22141114","42141112","11241115","31241113","51241111","12132115","32132113","52132111","21232114","41232112","22123114","42123112","11223115","31223113","51223111","12114115","32114113","52114111","21214114","41214112","23141113","43141111","12241114","32241112","21341113","41341111","13132114","33132112","22232113","42232111","11332114","31332112","23123113","43123111","12223114","32223112","21323113","41323111","13114114","33114112","22214113","42214111","11314114","31314112","24141112","13241113","33241111","22341112","14132113","34132111","23232112","12332113","32332111","21432112","24123112","13223113","33223111","22323112","11423113","31423111","14114113","34114111","23214112","12314113","32314111","21414112","25141111","14241112","23341111","15132112","24232111","13332112","22432111","25123111","14223112","23323111","12423112","21523111","15114112","24214111","13314112","22414111","11514112","15241111","16132111","14332111","15223111","13423111","16114111","14314111","12514111","21151114","41151112","11142115","31142113","51142111","21133114","41133112","11124115","31124113","51124111","21115114","41115112","22151113","42151111","11251114","31251112","12142114","32142112","21242113","41242111","22133113","42133111","11233114","31233112","12124114","32124112","21224113","41224111","22115113","42115111","11215114","31215112","23151112","12251113","32251111","13142113","33142111","22242112","11342113","31342111","23133112","12233113","32233111","21333112","13124113","33124111","22224112","11324113","31324111","23115112","12215113","32215111","21315112","24151111","13251112","14142112","23242111","12342112","24133111","13233112","22333111","11433112","14124112","23224111","12324112","21424111","24115111","13215112","22315111","11415112","14251111","15142111","13342111","14233111","12433111","15124111","13324111","11524111","14215111","12415111","21161113","41161111","11152114","31152112","21143113","41143111","11134114","31134112","21125113","41125111","11116114","31116112","22161112","12152113","32152111","21252112","22143112","11243113","31243111","12134113","32134111","21234112","22125112","11225113","31225111","12116113","32116111","21216112","23161111","13152112","22252111","23143111","12243112","21343111","13134112","22234111","11334112","23125111","12225112","21325111","13116112","22216111","11316112","14152111","13243111","14134111","12334111","13225111","11425111","14116111","12316111","41111215","61111213","21211126","41211124","61211122","22111216","42111214","31211215","51211213","22211125","42211123","11311126","31311124","51311122","23111215","43111213","12211216","32211214","52211212","21311215","41311213","61311211","23211124","43211122","12311125","32311123","52311121","21411124","41411122","24111214","13211215","33211213","22311214","42311212","11411215","31411213","51411211","24211123","13311124","33311122","22411123","42411121","11511124","31511122","25111213","14211214","34211212","23311213","43311211","12411214","32411212","21511213","41511211","25211122","14311123","34311121","23411122","12511123","32511121","21611122","15211213","24311212","13411213","33411211","22511212","11611213","31611211","31121125","51121123","21112126","41112124","61112122","21121216","41121214","61121212","31112215","51112213","12121126","32121124","52121122","21221125","41221123","61221121","22112125","42112123","11212126","22121215","42121213","11221216","31221214","51221212","12112216","32112214","52112212","21212215","41212213","61212211","13121125","33121123","22221124","42221122","11321125","31321123","51321121","23112124","43112122","12212125","23121214","43121212","12221215","32221213","52221211","21321214","41321212","13112215","33112213","22212214","42212212","11312215","31312213","51312211","14121124","34121122","23221123","43221121","12321124","32321122","21421123","41421121","24112123","13212124","24121213","13221214","33221212","11412124","22321213","42321211","11421214","31421212","14112214","34112212","23212213","43212211","12312214","32312212","21412213","41412211","15121123","24221122","13321123","33321121","22421122","11521123","31521121","25112122","14212123","25121212","14221213","34221211","12412123","23321212","12421213","32421211","21521212","15112213","24212212","13312213","33312211","22412212","11512213","31512211","16121122","25221121","14321122","23421121","12521122","15212122","15221212","13412122","24321211","13421212","11612122","22521211","16112212","25212211","14312212","23412211","12512212","21612211","11131126","31131124","51131122","21122125","41122123","61122121","21131215","41131213","61131211","11113126","31113124","51113122","11122216","31122214","51122212","21113215","41113213","61113211","12131125","32131123","52131121","21231124","41231122","22122124","42122122","11222125","22131214","42131212","11231215","31231213","51231211","12113125","32113123","52113121","12122215","32122213","52122211","21222214","41222212","22113214","42113212","11213215","31213213","51213211","13131124","33131122","22231123","42231121","11331124","31331122","23122123","43122121","12222124","23131213","43131211","12231214","32231212","21331213","41331211","13113124","33113122","13122214","33122212","11313124","22222213","42222211","11322214","31322212","23113213","43113211","12213214","32213212","21313213","41313211","14131123","34131121","23231122","12331123","32331121","21431122","24122122","13222123","24131212","13231213","33231211","11422123","22331212","11431213","31431211","14113123","34113121","14122213","34122211","12313123","23222212","12322213","32322211","21422212","24113212","13213213","33213211","22313212","11413213","31413211","15131122","24231121","13331122","22431121","25122121","14222122","25131211","14231212","12422122","23331211","12431212","15113122","15122212","13313122","24222211","13322212","11513122","22422211","11522212","25113211","14213212","23313211","12413212","21513211","16131121","14331121","15222121","15231211","13422121","13431211","16113121","16122211","14313121","14322211","12513121","12522211","15213211","13413211","11613211","11141125","31141123","51141121","21132124","41132122","21141214","41141212","11123125","31123123","51123121","11132215","31132213","51132211","21114124","41114122","21123214","41123212","11114215","31114213","51114211","12141124","32141122","21241123","41241121","22132123","42132121","11232124","22141213","42141211","11241214","31241212","12123124","32123122","12132214","32132212","21232213","41232211","22114123","42114121","11214124","22123213","42123211","11223214","31223212","12114214","32114212","21214213","41214211","13141123","33141121","22241122","11341123","31341121","23132122","12232123","23141212","12241213","32241211","21341212","13123123","33123121","13132213","33132211","11323123","22232212","11332213","31332211","23114122","12214123","23123212","12223213","32223211","21323212","13114213","33114211","22214212","11314213","31314211","14141122","23241121","12341122","24132121","13232122","24141211","13241212","11432122","22341211","14123122","14132212","12323122","23232211","12332212","21432211","24114121","13214122","24123211","13223212","11414122","22323211","11423212","14114212","23214211","12314212","21414211","15141121","13341121","14232121","14241211","12432121","15123121","15132211","13323121","13332211","11523121","14214121","14223211","12414121","12423211","15114211","13314211","11514211","11151124","31151122","21142123","41142121","21151213","41151211","11133124","31133122","11142214","31142212","21124123","41124121","21133213","41133211","11115124","31115122","11124214","31124212","21115213","41115211","12151123","32151121","21251122","22142122","11242123","22151212","11251213","31251211","12133123","32133121","12142213","32142211","21242212","22124122","11224123","22133212","11233213","31233211","12115123","32115121","12124213","32124211","21224212","22115212","11215213","31215211","13151122","22251121","23142121","12242122","23151211","12251212","13133122","13142212","11333122","22242211","11342212","23124121","12224122","23133211","12233212","21333211","13115122","13124212","11315122","22224211","11324212","23115211","12215212","21315211","14151121","13242121","13251211","14133121","14142211","12333121","12342211","13224121","13233211","11424121","11433211","14115121","14124211","12315121","12324211","13215211","11415211","11161123","31161121","21152122","21161212","11143123","31143121","11152213","31152211","21134122","21143212","11125123","31125121","11134213","31134211","21116122","21125212","12161122","22152121","11252122","22161211","12143122","12152212","21252211","22134121","11234122","22143211","11243212","12125122","12134212","21234211","22116121","11216122","22125211","11225212","13161121","12252121","13143121","13152211","11343121","12234121","12243211","13125121","13134211","11325121","11334211","12216121","12225211","31111225","51111223","21111316","41111314","61111312","31211134","51211132","12111226","32111224","52111222","21211225","41211223","61211221","22111315","42111313","11211316","31211314","51211312","12211135","32211133","52211131","21311134","41311132","13111225","33111223","22211224","42211222","11311225","31311223","51311221","23111314","43111312","12211315","32211313","52211311","21311314","41311312","13211134","33211132","22311133","42311131","11411134","31411132","14111224","34111222","23211223","43211221","12311224","32311222","21411223","41411221","24111313","13211314","33211312","22311313","42311311","11411314","31411312","14211133","34211131","23311132","12411133","32411131","21511132","15111223","24211222","13311223","33311221","22411222","11511223","31511221","25111312","14211313","34211311","23311312","12411313","32411311","21511312","15211132","24311131","13411132","22511131","11611132","16111222","25211221","14311222","23411221","12511222","21611221","15211312","24311311","13411312","22511311","11611312","21121135","41121133","61121131","11112136","31112134","51112132","11121226","31121224","51121222","21112225","41112223","61112221","21121315","41121313","61121311","11112316","31112314","51112312","22121134","42121132","11221135","31221133","51221131","12112135","32112133","52112131","12121225","32121223","52121221","21221224","41221222","22112224","42112222","11212225","22121314","42121312","11221315","31221313","51221311","12112315","32112313","52112311","21212314","41212312","23121133","43121131","12221134","32221132","21321133","41321131","13112134","33112132","13121224","33121222","11312134","22221223","42221221","11321224","31321222","23112223","43112221","12212224","23121313","43121311","12221314","32221312","21321313","41321311","13112314","33112312","22212313","42212311","11312314","31312312","24121132","13221133","33221131","22321132","11421133","31421131","14112133","34112131","14121223","34121221","12312133","23221222","12321223","32321221","21421222","24112222","13212223","24121312","13221313","33221311","11412223","22321312","11421313","31421311","14112313","34112311","23212312","12312313","32312311","21412312","25121131","14221132","23321131","12421132","21521131","15112132","15121222","13312132","24221221","13321222","11512132","22421221","11521222","25112221","14212222","25121311","14221312","12412222","23321311","12421312","21521311","15112312","24212311","13312312","22412311","11512312","15221131","13421131","16112131","16121221","14312131","14321221","12512131","12521221","15212221","15221311","13412221","13421311","11612221","16112311","14312311","12512311","21131134","41131132","11122135","31122133","51122131","11131225","31131223","51131221","21113134","41113132","21122224","41122222","21131314","41131312","11113225","31113223","51113221","11122315","31122313","51122311","21113314","41113312","22131133","42131131","11231134","31231132","12122134","32122132","12131224","32131222","21231223","41231221","22113133","42113131","11213134","22122223","42122221","11222224","22131313","42131311","11231314","31231312","12113224","32113222","12122314","32122312","21222313","41222311","22113313","42113311","11213314","31213312","23131132","12231133","32231131","21331132","13122133","33122131","13131223","33131221","11322133","22231222","11331223","31331221","23113132","12213133","23122222","12222223","23131312","12231313","32231311","21331312","13113223","33113221","13122313","33122311","11313223","22222312","11322313","31322311","23113312","12213313","32213311","21313312","24131131","13231132","22331131","11431132","14122132","14131222","12322132","23231221","12331222","21431221","24113131","13213132","24122221","13222222","24131311","11413132","13231312","11422222","22331311","11431312","14113222","14122312","12313222","23222311","12322312","21422311","24113311","13213312","22313311","11413312","14231131","12431131","15122131","15131221","13322131","13331221","11522131","14213131","14222221","12413131","14231311","12422221","12431311","15113221","15122311","13313221","13322311","11513221","11522311","14213311","12413311","21141133","41141131","11132134","31132132","11141224","31141222","21123133","41123131","21132223","41132221","21141313","41141311","11114134","31114132","11123224","31123222","11132314","31132312","21114223","41114221","21123313","41123311","11114314","31114312","22141132","11241133","31241131","12132133","32132131","12141223","32141221","21241222","22123132","11223133","22132222","11232223","22141312","11241313","31241311","12114133","32114131","12123223","32123221","12132313","32132311","21232312","22114222","11214223","22123312","11223313","31223311","12114313","32114311","21214312","23141131","12241132","21341131","13132132","13141222","11332132","22241221","11341222","23123131","12223132","23132221","12232222","23141311","12241312","21341311","13114132","13123222","11314132","13132312","11323222","22232311","11332312","23114221","12214222","23123311","12223312","21323311","13114312","22214311","11314312","13241131","14132131","14141221","12332131","12341221","13223131","13232221","11423131","13241311","11432221","14114131","14123221","12314131","14132311","12323221","12332311","13214221","13223311","11414221","11423311","14114311","12314311","21151132","11142133","31142131","11151223","31151221","21133132","21142222","21151312","11124133","31124131","11133223","31133221","11142313","31142311","21115132","21124222","21133312","11115223","31115221","11124313","31124311","22151131","11251132","12142132","12151222","21251221","22133131","11233132","22142221","11242222","22151311","11251312","12124132","12133222","12142312","21242311","22115131","11215132","22124221","11224222","22133311","11233312","12115222","12124312","21224311","12251131","13142131","13151221","11342131","12233131","12242221","12251311","13124131","13133221","11324131","13142311","11333221","11342311","12215131","12224221","12233311","13115221","13124311","11315221","11324311","21161131","11152132","11161222","21143131","21152221","21161311","11134132","11143222","11152312","21125131","21134221","21143311","11116132","11125222","11134312","12152131","12161221","11243131","11252221","12134131","12143221","12152311","11225131","11234221","11243311","12116131","12125221","12134311","21111235","41111233","61111231","11111326","31111324","51111322","21111415","41111413","61111411","21211144","41211142","22111234","42111232","11211235","31211233","51211231","12111325","32111323","52111321","21211324","41211322","22111414","42111412","11211415","31211413","51211411","22211143","42211141","11311144","31311142","23111233","43111231","12211234","32211232","21311233","41311231","13111324","33111322","22211323","42211321","11311324","31311322","23111413","43111411","12211414","32211412","21311413","41311411","23211142","12311143","32311141","21411142","24111232","13211233","33211231","22311232","11411233","31411231","14111323","34111321","23211322","12311323","32311321","21411322","24111412","13211413","33211411","22311412","11411413","31411411","24211141","13311142","22411141","11511142","25111231","14211232","23311231","12411232","21511231","15111322","24211321","13311322","22411321","11511322","25111411","14211412","23311411","12411412","21511411","14311141","12511141","15211231","13411231","11611231","16111321","14311321","12511321","15211411","13411411","11611411","31121143","51121141","21112144","41112142","21121234","41121232","11112235","31112233","51112231","11121325","31121323","51121321","21112324","41112322","21121414","41121412","11112415","31112413","51112411","12121144","32121142","21221143","41221141","22112143","42112141","11212144","22121233","42121231","11221234","31221232","12112234","32112232","12121324","32121322","21221323","41221321","22112323","42112321","11212324","22121413","42121411","11221414","31221412","12112414","32112412","21212413","41212411","13121143","33121141","22221142","11321143","31321141","23112142","12212143","23121232","12221233","32221231","21321232","13112233","33112231","13121323","33121321","11312233","22221322","11321323","31321321","23112322","12212323","23121412","12221413","32221411","21321412","13112413","33112411","22212412","11312413","31312411","14121142","23221141","12321142","21421141","24112141","13212142","24121231","13221232","11412142","22321231","11421232","14112232","14121322","12312232","23221321","12321322","21421321","24112321","13212322","24121411","13221412","11412322","22321411","11421412","14112412","23212411","12312412","21412411","15121141","13321141","11521141","14212141","14221231","12412141","12421231","15112231","15121321","13312231","13321321","11512231","11521321","14212321","14221411","12412321","12421411","15112411","13312411","11512411","11131144","31131142","21122143","41122141","21131233","41131231","11113144","31113142","11122234","31122232","11131324","31131322","21113233","41113231","21122323","41122321","21131413","41131411","11113324","31113322","11122414","31122412","21113413","41113411","12131143","32131141","21231142","22122142","11222143","22131232","11231233","31231231","12113143","32113141","12122233","32122231","12131323","32131321","21231322","22113232","11213233","22122322","11222323","22131412","11231413","31231411","12113323","32113321","12122413","32122411","21222412","22113412","11213413","31213411","13131142","22231141","11331142","23122141","12222142","23131231","12231232","21331231","13113142","13122232","11313142","13131322","11322232","22231321","11331322","23113231","12213232","23122321","12222322","23131411","12231412","21331411","13113322","13122412","11313322","22222411","11322412","23113411","12213412","21313411","14131141","12331141","13222141","13231231","11422141","11431231","14113141","14122231","12313141","14131321","12322231","12331321","13213231","13222321","11413231","13231411","11422321","11431411","14113321","14122411","12313321","12322411","13213411","11413411","11141143","31141141","21132142","21141232","11123143","31123141","11132233","31132231","11141323","31141321","21114142","21123232","21132322","21141412","11114233","31114231","11123323","31123321","11132413","31132411","21114322","21123412","12141142","21241141","22132141","11232142","22141231","11241232","12123142","12132232","12141322","21241321","22114141","11214142","22123231","11223232","22132321","11232322","22141411","11241412","12114232","12123322","12132412","21232411","22114321","11214322","22123411","11223412","13141141","11341141","12232141","12241231","13123141","13132231","11323141","13141321","11332231","11341321","12214141","12223231","12232321","12241411","13114231","13123321","11314231","13132411","11323321","11332411","12214321","12223411","11151142","21142141","21151231","11133142","11142232","11151322","21124141","21133231","21142321","21151411","11115142","11124232","11133322","11142412","21115231","21124321","21133411","12151141","11242141","11251231","12133141","12142231","12151321","11224141","11233231","11242321","11251411","12115141","12124231","12133321","12142411","11215231","11224321","11233411","11161141","11143141","11152231","11161321","11125141","11134231","11143321","11152411","11111245","31111243","51111241","21111334","41111332","11111425","31111423","51111421","21111514","41111512","31211152","12111244","32111242","21211243","41211241","22111333","42111331","11211334","31211332","12111424","32111422","21211423","41211421","22111513","42111511","11211514","31211512","12211153","32211151","21311152","13111243","33111241","22211242","11311243","31311241","23111332","12211333","32211331","21311332","13111423","33111421","22211422","11311423","31311421","23111512","12211513","32211511","21311512","13211152","22311151","11411152","14111242","23211241","12311242","21411241","24111331","13211332","22311331","11411332","14111422","23211421","12311422","21411421","24111511","13211512","22311511","11411512","14211151","12411151","15111241","13311241","11511241","14211331","12411331","15111421","13311421","11511421","14211511","12411511","21121153","41121151","11112154","31112152","11121244","31121242","21112243","41112241","21121333","41121331","11112334","31112332","11121424","31121422","21112423","41112421","21121513","41121511","11112514","31112512","22121152","11221153","31221151","12112153","32112151","12121243","32121241","21221242","22112242","11212243","22121332","11221333","31221331","12112333","32112331","12121423","32121421","21221422","22112422","11212423","22121512","11221513","31221511","12112513","32112511","21212512","23121151","12221152","21321151","13112152","13121242","11312152","22221241","11321242","23112241","12212242","23121331","12221332","21321331","13112332","13121422","11312332","22221421","11321422","23112421","12212422","23121511","12221512","21321511","13112512","22212511","11312512","13221151","11421151","14112151","14121241","12312151","12321241","13212241","13221331","11412241","11421331","14112331","14121421","12312331","12321421","13212421","13221511","11412421","11421511","14112511","12312511","21131152","11122153","31122151","11131243","31131241","21113152","21122242","21131332","11113243","31113241","11122333","31122331","11131423","31131421","21113332","21122422","21131512","11113423","31113421","11122513","31122511","22131151","11231152","12122152","12131242","21231241","22113151","11213152","22122241","11222242","22131331","11231332","12113242","12122332","12131422","21231421","22113331","11213332","22122421","11222422","22131511","11231512","12113422","12122512","21222511","12231151","13122151","13131241","11322151","11331241","12213151","12222241","12231331","13113241","13122331","11313241","13131421","11322331","11331421","12213331","12222421","12231511","13113421","13122511","11313421","11322511","21141151","11132152","11141242","21123151","21132241","21141331","11114152","11123242","11132332","11141422","21114241","21123331","21132421","21141511","11114332","11123422","11132512","11241151","12132151","12141241","11223151","11232241","11241331","12114151","12123241","12132331","12141421","11214241","11223331","11232421","11241511","12114331","12123421","12132511","11142151","11151241","11124151","11133241","11142331","11151421","11115241","11124331","11133421","11142511","21111253","41111251","11111344","31111342","21111433","41111431","11111524","31111522","21111613","41111611","21211162","22111252","11211253","31211251","12111343","32111341","21211342","22111432","11211433","31211431","12111523","32111521","21211522","22111612","11211613","31211611","22211161","11311162","23111251","12211252","21311251","13111342","22211341","11311342","23111431","12211432","21311431","13111522","22211521","11311522","23111611","12211612","21311611","12311161","13211251","11411251","14111341","12311341","13211431","11411431","14111521","12311521","13211611","11411611","31121161","21112162","21121252","11112253","31112251","11121343","31121341","21112342","21121432","11112433","31112431","11121523","31121521","21112522","21121612","12121162","21221161","22112161","11212162","22121251","11221252","12112252","12121342","21221341","22112341","11212342","22121431","11221432","12112432","12121522","21221521","22112521","11212522","22121611","11221612","13121161","11321161","12212161","12221251","13112251","13121341","11312251","11321341","12212341","12221431","13112431","13121521","11312431","11321521","12212521","12221611","11131162","21122161","21131251","11113162"])]);$_.code49_parity=$a(["1001","0101","1100","0011","1010","0110","1111","0000"]);$_.charvals=new Map;for(var _T=0;_T<=48;_T+=1){$_.i=_T;var _V=$g($_.code49_charmap,$_.i);var _W=$t(_V);if($eq(_W,"stringtype")){_V=$g(_V,0)}$p($_.charvals,_V,$_.i)}for(var _c=0;_c<=127;_c+=1){$_.i=_c;var _e=$g($_.code49_combos,$_.i);$_.c1=$g(_e,0);$_.c2=$g(_e,1);if($_.c1==49){$p($_.charvals,$_.i,$a([$g($_.charvals,$_.code49_s1),$g($_.charvals,$_.c2)]))}if($_.c1==50){$p($_.charvals,$_.i,$a([$g($_.charvals,$_.code49_s2),$g($_.charvals,$_.c2)]))}}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_code49.globals);$_.dontdraw=false;$_.sam=-1;$_.append=false;$_.rows=0;$_.rowheight=8;$_.sepheight=1;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _10=$k[--$j];$_.options=_10;var _11=$k[--$j];$_.barcode=_11;if($_.barcode.length==0){$k[$j++]="bwipp.code49emptyData#20976";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.code49inputTooLong#20980";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.rows!=0&&($_.rows<2||$_.rows>8)){$k[$j++]="bwipp.code49badRows#20997";$k[$j++]="Code 49 must have 2 to 8 rows";bwipp_raiseerror()}if($_.rowheight<8||$_.rowheight>50){$k[$j++]="bwipp.code49badRowHeight#21001";$k[$j++]="Code 49 must have rowheight from 8 to 50";bwipp_raiseerror()}if($_.sepheight<1||$_.sepheight>5){$k[$j++]="bwipp.code49badSepHeight#21005";$k[$j++]="Code 49 must have sepheight from 1 to 5";bwipp_raiseerror()}if($_.append&&$_.sam!=-1){$k[$j++]="bwipp.code49samAndAppend#21009";$k[$j++]="sam and append cannot be specified together";bwipp_raiseerror()}if($_.sam!=-1){$k[$j++]=true;for(var _1G=0;_1G<1;_1G++){var _1H=$_.sam;if(_1H<12||_1H>99){$k[$j-1]=false;break}if($_.sam%10<2){$k[$j-1]=false;break}if(~~($_.sam/10)>$_.sam%10){$k[$j-1]=false;break}}var _1L=$k[--$j];if(!_1L){$k[$j++]="bwipp.code49badSAM#21020";$k[$j++]='SAM must be formatted as "NM" for Nth of M symbols, from 2 to 9 symbols';bwipp_raiseerror()}}$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.code49_fn1],["FNC2",$_.code49_fn2],["FNC3",$_.code49_fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _1Q=$k[--$j];$_.msg=_1Q;$_.msglen=$_.msg.length;$F($_.msg,function(){var _1T=$k[--$j];if(_1T>127){$k[$j++]="bwipp.code49badCharacter#21039";$k[$j++]="Code 49 can only support ASCII characters with values 0 to 127";bwipp_raiseerror()}});$_.encodealpha=function(){var _1V=$k[--$j];var _1W=$g($_.charvals,_1V);var _1X=$t(_1W);$k[$j++]=_1W;if($ne(_1X,"arraytype")){$as($a(1))}var _1Z=$k[--$j];$P($_.cws,$_.j,_1Z);$_.j=_1Z.length+$_.j};$_.base48=function(){var _1d=$k[--$j];$k[$j++]=0;$F(_1d,function(){var _1e=$k[--$j];var _1f=$k[--$j];$k[$j++]=$f(_1e-48+_1f*10)});$k[$j++]=Infinity;var _1g=$k[$j-2];var _1h=$k[$j-3];$k[$j-3]=$k[$j-1];$j-=2;$k[$j++]=_1g;for(var _1i=0,_1j=_1h-1;_1i<_1j;_1i++){var _1k=$k[--$j];$k[$j++]=_1k%48;$k[$j++]=~~(_1k/48)}var _1l=$a();$k[$j++]=Infinity;$k[$j++]=_1l;for(var _1o=_1l.length-1;_1o>=0;_1o-=1){var _1p=$k[--$j];$k[$j++]=$g(_1p,_1o);$k[$j++]=_1p}$j--;var _1r=$a();$P($_.cws,$_.j,_1r);$_.j=_1r.length+$_.j};$_.encodenumeric=function(){var _1v=$k[--$j];$_.nums=_1v;var _1x=$_.nums.length;var _1y=_1x%5;$k[$j++]="pre";$k[$j++]=_1x;$k[$j++]=_1y;if(_1y!=2){var _1z=$k[--$j];var _20=$k[--$j];$k[$j++]=$f(_20-_1z)}else{var _21=$k[--$j];var _22=$k[--$j];$k[$j++]=$f(_22-_21)-5}var _23=$k[--$j];var _24=$k[--$j];$_[_24]=_23;for(var _27=0,_26=$_.pre-1;_27<=_26;_27+=5){$k[$j++]=3;$k[$j++]=$G($_.nums,_27,5);$_.base48()}$_.nums=$G($_.nums,$_.pre,$f($_.nums.length-$_.pre));var _2G=$_.nums.length;$k[$j++]=_2G;if(_2G==1){$k[$j++]=$g($_.nums,$_.i);$_.encodealpha()}var _2K=$k[$j-1];if(_2K==3){$k[$j++]=2;$k[$j++]=$_.nums;$_.base48()}var _2M=$k[$j-1];if(_2M==4){$k[$j++]=3;$k[$j++]=Infinity;$k[$j++]=49;$k[$j++]=48;$q($_.nums);var _2O=$a();$k[$j++]=_2O;$_.base48()}var _2P=$k[--$j];if(_2P==7){$k[$j++]=3;$k[$j++]=Infinity;$k[$j++]=49;$k[$j++]=48;$q($G($_.nums,0,4));var _2S=$a();$k[$j++]=_2S;$_.base48();$k[$j++]=2;$k[$j++]=$G($_.nums,4,3);$_.base48()}};$k[$j++]=Infinity;for(var _2W=0,_2X=$_.msglen;_2W<_2X;_2W++){$k[$j++]=0}$k[$j++]=0;$_.numericruns=$a();for(var _2Z=$_.msglen-1;_2Z>=0;_2Z-=1){$_.i=_2Z;var _2c=$g($_.msg,$_.i);if(_2c>=48&&_2c<=57){$p($_.numericruns,$_.i,$g($_.numericruns,$_.i+1)+1)}else{$p($_.numericruns,$_.i,0)}}$_.cws=$a($_.msglen*2+1);for(;;){if($_.append){$_.mode=1;$_.method="alpha";$_.i=0;$_.j=0;break}if($_.sam!=-1){$_.mode=3;$k[$j++]=$_.cws;$k[$j++]=0;for(var _2p=0;_2p<=43;_2p+=1){$k[$j++]=_2p;if($g($_.code49_samval,_2p)!=$_.sam){$j--}}var _2s=$k[--$j];var _2t=$k[--$j];var _2u=$k[--$j];$p(_2u,_2t,_2s+1);$_.method="alpha";$_.i=0;$_.j=1;break}if($g($_.numericruns,0)>=5){$_.mode=2;$_.method="numeric";$_.i=0;$_.j=0;break}var _30=$g($_.charvals,$g($_.msg,0));var _31=$t(_30);$k[$j++]=_30;if($ne(_31,"arraytype")){$j--;$_.mode=0;$_.method="alpha";$_.i=0;$_.j=0;break}var _32=$k[--$j];var _34=$g(_32,0)==43?4:5;$_.mode=_34;$p($_.cws,0,$g($g($_.charvals,$g($_.msg,0)),1));$_.method="alpha";$_.i=1;$_.j=1;break}for(;;){if($_.i==$_.msglen){break}for(;;){if($eq($_.method,"alpha")){if($g($_.numericruns,$_.i)>=5){$k[$j++]=$_.code49_ns;$_.encodealpha();$_.method="numeric";break}$k[$j++]=$g($_.msg,$_.i);$_.encodealpha();$_.i=$_.i+1;break}if($eq($_.method,"numeric")){if($g($_.numericruns,$_.i)<5){$k[$j++]=$_.code49_ns;$_.encodealpha();$_.method="alpha";break}$k[$j++]=$G($_.msg,$_.i,$g($_.numericruns,$_.i));$_.encodenumeric();$_.i=$f($_.i+$g($_.numericruns,$_.i));break}}}$_.cws=$G($_.cws,0,$_.j);$_.urows=$_.rows;for(var _3d=0,_3e=$_.code49_metrics.length;_3d<_3e;_3d++){$_.m=$g($_.code49_metrics,_3d);$_.r=$g($_.m,0);$_.dcws=$g($_.m,1);$_.okay=true;if($_.urows!=0&&$_.urows!=$_.r){$_.okay=false}if($_.cws.length>$_.dcws){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.code49noValidSymbol#21172";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$k[$j++]=Infinity;$q($_.cws);for(var _3u=0,_3v=$f($_.dcws-$_.cws.length);_3u<_3v;_3u++){$k[$j++]=48}$_.cws=$a();$_.ccs=$a($_.r*8);$_.j=0;for(var _40=0,_3z=$_.r-2;_40<=_3z;_40+=1){$_.i=_40;$_.cc=$G($_.cws,$_.j,7);$P($_.ccs,$_.i*8,$_.cc);var _49=$_.cc;var _4G=$_.ccs;var _4F=$_.i*8+7;var _4E=0;for(var _4A=0,_4B=_49.length;_4A<_4B;_4A++){_4E=$f(_4E+$g(_49,_4A))}$p(_4G,_4F,_4E%49);$_.j=$_.j+7}if($_.j<$_.dcws){$P($_.ccs,$_.ccs.length-8,$G($_.cws,$_.j,$f($_.dcws-$_.j)))}$_.cr7=$f(($_.r-2)*7+$_.mode);$p($_.ccs,$_.ccs.length-2,$_.cr7);$_.calccheck=function(){var _4W=$k[--$j];$_.weights=_4W;$_.score=0;for(var _4Z=0,_4Y=~~(($_.r-1)*8/2)-1;_4Z<=_4Y;_4Z+=1){$_.i=_4Z;$_.score=$f(($g($_.ccs,$_.i*2)*49+$g($_.ccs,$_.i*2+1))*$g($_.weights,$_.i+1)+$_.score)}$k[$j++]=$_.score};$_.lastrow=$G($_.ccs,$_.ccs.length-8,8);if($_.r>=7){$k[$j++]=$_.cr7*$g($_.code49_weightz,0);$k[$j++]=$_.code49_weightz;$_.calccheck();var _4r=$k[--$j];var _4s=$k[--$j];var _4t=$f(_4s+_4r)%2401;var _4u=$a(2);$k[$j++]=~~(_4t/49);$k[$j++]=_4t%49;$as(_4u);$k[$j++]=$_.lastrow;$k[$j++]=0;var _4w=$k[$j-3];var _4x=$k[$j-1];var _4y=$k[$j-2];$j-=3;$P(_4y,_4x,_4w)}$_.wr1=$f($g($_.lastrow,0)*49+$g($_.lastrow,1));$k[$j++]=$_.cr7*$g($_.code49_weighty,0);$k[$j++]=$_.code49_weighty;$_.calccheck();var _55=$k[--$j];var _56=$k[--$j];var _5A=$f(_56+_55+$_.wr1*$g($_.code49_weighty,$_.r*4-3))%2401;$_.wr2=_5A;var _5B=$a(2);$k[$j++]=~~(_5A/49);$k[$j++]=_5A%49;$as(_5B);$k[$j++]=$_.lastrow;$k[$j++]=2;var _5D=$k[$j-3];var _5E=$k[$j-1];var _5F=$k[$j-2];$j-=3;$P(_5F,_5E,_5D);$k[$j++]=$_.cr7*$g($_.code49_weightx,0);$k[$j++]=$_.code49_weightx;$_.calccheck();var _5I=$k[--$j];var _5J=$k[--$j];var _5Q=$f(_5J+_5I+$_.wr1*$g($_.code49_weightx,$_.r*4-3)+$_.wr2*$g($_.code49_weightx,$_.r*4-2))%2401;var _5R=$a(2);$k[$j++]=~~(_5Q/49);$k[$j++]=_5Q%49;$as(_5R);$k[$j++]=$_.lastrow;$k[$j++]=4;var _5T=$k[$j-3];var _5U=$k[$j-1];var _5V=$k[$j-2];$j-=3;$P(_5V,_5U,_5T);var _5Y=$G($_.ccs,$_.ccs.length-8,7);var _5d=0;for(var _5Z=0,_5a=_5Y.length;_5Z<_5a;_5Z++){_5d=$f(_5d+$g(_5Y,_5Z))}$p($_.ccs,$_.ccs.length-1,_5d%49);if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#21254";$k[$j++]=$_.ccs;bwipp_raiseerror()}$_.rowbits=$a($_.r);for(var _5n=0,_5m=$_.r-1;_5n<=_5m;_5n+=1){$_.i=_5n;var _5s=$_.i!=$_.r-1?$g($_.code49_parity,$_.i):"0000";$_.p=_5s;$_.ccrow=$G($_.ccs,$_.i*8,8);$k[$j++]=Infinity;for(var _5x=0;_5x<=7;_5x+=2){$q($G($_.ccrow,_5x,2));var _60=$k[--$j];var _61=$k[--$j];$k[$j++]=$f(_60+_61*49)}$_.scrow=$a();$k[$j++]=Infinity;$k[$j++]=10;$k[$j++]=1;$k[$j++]=1;for(var _62=0;_62<=3;_62+=1){$_.j=_62;$F($g($g($_.code49_patterns,$g($_.p,$_.j)-48),$g($_.scrow,$_.j)),function(){$k[$j-1]-=48})}$k[$j++]=4;$k[$j++]=1;$_.sbs=$a();$k[$j++]=Infinity;var _6C=$_.sbs;$k[$j++]=1;for(var _6D=0,_6E=_6C.length;_6D<_6E;_6D++){var _6G=$k[$j-1];var _6H=_6G==0?1:0;for(var _6I=0,_6J=$g(_6C,_6D);_6I<_6J;_6I++){$k[$j++]=_6H}}$as($a($m()-1));var _6M=$k[--$j];$j--;$k[$j-1]=_6M;$k[$j++]=$_.rowbits;$k[$j++]=$_.i;var _6S=$k[$j-3];var _6T=$k[$j-1];var _6U=$k[$j-2];$j-=3;$p(_6U,_6T,_6S)}$_.numcomprows=$_.r*2+1;$k[$j++]=Infinity;for(var _6W=0;_6W<81;_6W++){$k[$j++]=1}for(var _6Z=0,_6Y=$_.r-2;_6Z<=_6Y;_6Z+=1){$_.i=_6Z;$q($g($_.rowbits,$_.i));for(var _6d=0;_6d<10;_6d++){$k[$j++]=0}for(var _6e=0;_6e<70;_6e++){$k[$j++]=1}$k[$j++]=0}$q($g($_.rowbits,$_.r-1));for(var _6i=0;_6i<81;_6i++){$k[$j++]=1}$_.pixs=$a();$_.symhgt=$f($_.sepheight*($_.r+1)+$_.r*$_.rowheight);$k[$j++]=Infinity;$k[$j++]=$_.sepheight;for(var _6q=0,_6p=$_.r-2;_6q<=_6p;_6q+=1){$k[$j++]=$_.rowheight;$k[$j++]=$_.sepheight}$k[$j++]=$_.rowheight;$k[$j++]=$_.sepheight;$_.rowmult=$a();$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",81],["pixy",$_.symhgt],["rowmult",$_.rowmult],["height",$_.symhgt/72],["width",81/72],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_flattermarken(){if(!bwipp_flattermarken.globals){var $__=$_;$_=bwipp_flattermarken.globals={};$_.flattermarken_encs=$a(["0018","0117","0216","0315","0414","0513","0612","0711","0810","0900"]);$_.flattermarken_barchars="1234567890";$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_flattermarken.globals);$_.dontdraw=false;$_.includetext=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;if($_.barcode.length>500){$k[$j++]="bwipp.flattermarkeninputTooLong#21708";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.flattermarkenBadCharacter#21721";$k[$j++]="Flattermarken must contain only digits";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;$_.sbs=$s($_.barlen*4);for(var _D=0,_C=$_.barlen-1;_D<=_C;_D+=1){$_.i=_D;$X($_.flattermarken_barchars,$G($_.barcode,$_.i,1));$j--;var _H=$k[--$j];$_.indx=_H.length;$j-=2;$_.enc=$g($_.flattermarken_encs,$_.indx);$P($_.sbs,$_.i*4,$_.enc)}if($_.height==-1){$_.height=.3}$k[$j++]=Infinity;var _S=[];var _O=$_.sbs;for(var _P=0,_Q=_O.length;_P<_Q;_P++){_S[_P]=$g(_O,_P)-48}_S=$a(_S);var _X=[];for(var _U=0,_V=~~(($_.sbs.length+1)/2);_U<_V;_U++){_X[_U]=$_.height}_X=$a(_X);var _b=[];for(var _Z=0,_a=~~(($_.sbs.length+1)/2);_Z<_a;_Z++){_b[_Z]=0}_b=$a(_b);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_S;$k[$j++]="bhs";$k[$j++]=_X;$k[$j++]="bbs";$k[$j++]=_b;$k[$j++]="txt";$k[$j++]=$a([$a([$_.barcode,0,0,$_.text1font,$_.text1size])]);$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="opt";$k[$j++]=$_.options;var _i=$d();$k[$j++]=_i;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_raw(){var $__=$_;$_=Object.assign({},$_,bwipp_raw.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length>2500){$k[$j++]="bwipp.rawinputTooLong#21830";$k[$j++]="The input data is too long";bwipp_raiseerror()}$F($_.barcode,function(){var _6=$k[--$j];if(_6<49||_6>57){$k[$j++]="bwipp.rawBadCharacter#21835";$k[$j++]="Raw must contain only digits 1 to 9";bwipp_raiseerror()}});if($_.height==-1){$_.height=1}$k[$j++]=Infinity;$k[$j++]=Infinity;$F($_.barcode,function(){$k[$j-1]-=48});var _A=$a();var _F=[];for(var _C=0,_D=~~(($_.barcode.length+1)/2);_C<_D;_C++){_F[_C]=$_.height}_F=$a(_F);var _J=[];for(var _H=0,_I=~~(($_.barcode.length+1)/2);_H<_I;_H++){_J[_H]=0}_J=$a(_J);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_A;$k[$j++]="bhs";$k[$j++]=_F;$k[$j++]="bbs";$k[$j++]=_J;$k[$j++]="opt";$k[$j++]=$_.options;var _L=$d();$k[$j++]=_L;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_daft(){var $__=$_;$_=Object.assign({},$_,bwipp_daft.globals);$_.dontdraw=false;$_.height=-1;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.daftEmptyData#21925";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>2500){$k[$j++]="bwipp.daftinputTooLong#21929";$k[$j++]="The input data is too long";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7!=68&&(_7!=65&&(_7!=70&&_7!=84))){$k[$j++]="bwipp.daftBadCharacter#21934";$k[$j++]="DAFT must contain only characters D, A, F and T";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;if($_.height==-1){$_.height=.175}$_.bbs=$a($_.barlen);$_.bhs=$a($_.barlen);for(var _G=0,_F=$_.barlen-1;_G<=_F;_G+=1){$_.i=_G;$_.enc=$G($_.barcode,$_.i,1);if($eq($_.enc,"D")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"A")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,5*$_.height/8)}if($eq($_.enc,"F")){$p($_.bbs,$_.i,0*$_.height/8);$p($_.bhs,$_.i,8*$_.height/8)}if($eq($_.enc,"T")){$p($_.bbs,$_.i,3*$_.height/8);$p($_.bhs,$_.i,2*$_.height/8)}}$k[$j++]=Infinity;var _m=$_.bbs;var _n=$_.bhs;$k[$j++]=Infinity;for(var _p=0,_q=$_.bhs.length-1;_p<_q;_p++){$k[$j++]=1.44;$k[$j++]=1.872}$k[$j++]=1.44;var _r=$a();$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="bbs";$k[$j++]=_m;$k[$j++]="bhs";$k[$j++]=_n;$k[$j++]="sbs";$k[$j++]=_r;$k[$j++]="opt";$k[$j++]=$_.options;var _t=$d();$k[$j++]=_t;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_symbol(){if(!bwipp_symbol.globals){var $__=$_;$_=bwipp_symbol.globals={};$_.symbol_fimasbs=$a([2.25,2.25,2.25,11.25,2.25,11.25,2.25,2.25,2.25]);var _3=[];for(var _1=0,_2=~~($_.symbol_fimasbs.length/2)+1;_1<_2;_1++){_3[_1]=.625}_3=$a(_3);$_.symbol_fimabhs=_3;var _6=[];for(var _4=0,_5=~~($_.symbol_fimasbs.length/2)+1;_4<_5;_4++){_6[_4]=0}_6=$a(_6);$_.symbol_fimabbs=_6;$_.symbol_fimbsbs=$a([2.25,6.75,2.25,2.25,2.25,6.25,2.25,2.25,2.25,6.75,2.25]);var _A=[];for(var _8=0,_9=~~($_.symbol_fimbsbs.length/2)+1;_8<_9;_8++){_A[_8]=.625}_A=$a(_A);$_.symbol_fimbbhs=_A;var _D=[];for(var _B=0,_C=~~($_.symbol_fimbsbs.length/2)+1;_B<_C;_B++){_D[_B]=0}_D=$a(_D);$_.symbol_fimbbbs=_D;$_.symbol_fimcsbs=$a([2.25,2.25,2.25,6.75,2.25,6.75,2.25,6.75,2.25,2.25,2.25]);var _H=[];for(var _F=0,_G=~~($_.symbol_fimcsbs.length/2)+1;_F<_G;_F++){_H[_F]=.625}_H=$a(_H);$_.symbol_fimcbhs=_H;var _K=[];for(var _I=0,_J=~~($_.symbol_fimcsbs.length/2)+1;_I<_J;_I++){_K[_I]=0}_K=$a(_K);$_.symbol_fimcbbs=_K;$_.symbol_fimdsbs=$a([2.25,2.25,2.25,2.25,2.25,6.75,2.25,6.75,2.25,2.25,2.25,2.25,2.25]);var _O=[];for(var _M=0,_N=~~($_.symbol_fimdsbs.length/2)+1;_M<_N;_M++){_O[_M]=.625}_O=$a(_O);$_.symbol_fimdbhs=_O;var _R=[];for(var _P=0,_Q=~~($_.symbol_fimdsbs.length/2)+1;_P<_Q;_P++){_R[_P]=0}_R=$a(_R);$_.symbol_fimdbbs=_R;$_.symbol_fimesbs=$a([2.25,6.75,2.25,15.75,2.25,6.75,2.25]);var _V=[];for(var _T=0,_U=~~($_.symbol_fimesbs.length/2)+1;_T<_U;_T++){_V[_T]=.625}_V=$a(_V);$_.symbol_fimebhs=_V;var _Y=[];for(var _W=0,_X=~~($_.symbol_fimesbs.length/2)+1;_W<_X;_W++){_Y[_W]=0}_Y=$a(_Y);$_.symbol_fimebbs=_Y;$k[$j++]=Infinity;for(var _Z=0;_Z<100;_Z++){$k[$j++]=1;$k[$j++]=1}$k[$j++]=1;var _a=$a();$_.symbol_zebrasbs=_a;var _d=[];for(var _b=0,_c=~~($_.symbol_zebrasbs.length/2)+1;_b<_c;_b++){_d[_b]=1}_d=$a(_d);$_.symbol_zebrabhs=_d;var _g=[];for(var _e=0,_f=~~($_.symbol_zebrasbs.length/2)+1;_e<_f;_e++){_g[_e]=0}_g=$a(_g);$_.symbol_zebrabbs=_g;$_.symbol_checksize=199;$k[$j++]=Infinity;var _h=$_.symbol_checksize;for(var _i=0,_j=~~(_h*_h/2);_i<_j;_i++){$k[$j++]=1;$k[$j++]=0}$k[$j++]=1;var _k=$a();$_.symbol_checkpixs=_k;var _s=new Map([["fima",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_fimasbs],["bhs",$_.symbol_fimabhs],["bbs",$_.symbol_fimabbs]])}],["fimb",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_fimbsbs],["bhs",$_.symbol_fimbbhs],["bbs",$_.symbol_fimbbbs]])}],["fimc",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_fimcsbs],["bhs",$_.symbol_fimcbhs],["bbs",$_.symbol_fimcbbs]])}],["fimd",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_fimdsbs],["bhs",$_.symbol_fimdbhs],["bbs",$_.symbol_fimdbbs]])}],["fime",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_fimesbs],["bhs",$_.symbol_fimebhs],["bbs",$_.symbol_fimebbs]])}],["zebra",function(){$k[$j++]=new Map([["ren","renlinear"],["sbs",$_.symbol_zebrasbs],["bhs",$_.symbol_zebrabhs],["bbs",$_.symbol_zebrabbs]])}],["check",function(){$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.symbol_checkpixs],["pixx",$_.symbol_checksize],["pixy",$_.symbol_checksize],["height",$_.symbol_checksize/72],["width",$_.symbol_checksize/72]])}]]);$_.symbol_symbols=_s;var _t=new Map([["renlinear",bwipp_renlinear],["renmatrix",bwipp_renmatrix]]);$_.symbol_renmap=_t;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_symbol.globals);$_.dontdraw=false;$_.width=0;$_.modunit=1;bwipp_processoptions();var _u=$k[--$j];$_.options=_u;var _v=$k[--$j];$_.barcode=_v;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length>50){$k[$j++]="bwipp.symbolinputTooLong#22096";$k[$j++]="The input data is too long";bwipp_raiseerror()}if(!$has($_.symbol_symbols,$_.barcode)){$k[$j++]="bwipp.symbolUnknownSymbol#22100";$k[$j++]="Unknown symbol name provided";bwipp_raiseerror()}if($g($_.symbol_symbols,$_.barcode)()===true){return true}var _13=$k[$j-1];$p(_13,"strictspec",$_.strictspec);$p(_13,"loosespec",$_.loosespec);$p(_13,"xdim",$_.xdim);$p(_13,"xmin",$_.xmin);$p(_13,"xmax",$_.xmax);$p(_13,"modunit",$_.modunit);$p(_13,"opt",$_.options);if($_._render){var _1C=$k[$j-1];var _1E=$g($_.symbol_renmap,$g(_1C,"ren"));if(_1E()===true){return true}}$_=$__}function bwipp_pdf417(){if(!bwipp_pdf417.globals){var $__=$_;$_=bwipp_pdf417.globals={};$_.pdf417_t=0;$_.pdf417_n=1;$_.pdf417_b=2;$_.pdf417_a=0;$_.pdf417_l=1;$_.pdf417_m=2;$_.pdf417_p=3;$_.pdf417_tl=-1;$_.pdf417_nl=-2;$_.pdf417_bl=-3;$_.pdf417_bl6=-4;$_.pdf417_bs=-5;$_.pdf417_al=-6;$_.pdf417_ll=-7;$_.pdf417_ml=-8;$_.pdf417_pl=-9;$_.pdf417_as=-10;$_.pdf417_ps=-11;$_.al=$_.pdf417_al;$_.ll=$_.pdf417_ll;$_.ml=$_.pdf417_ml;$_.pl=$_.pdf417_pl;$_.as=$_.pdf417_as;$_.ps=$_.pdf417_ps;$_.pdf417_textsubmodes=$a([$_.pdf417_a,$_.pdf417_l,$_.pdf417_m,$_.pdf417_p]);$_.pdf417_charmaps=$a([$a(["A","a","0",";"]),$a(["B","b","1","<"]),$a(["C","c","2",">"]),$a(["D","d","3","@"]),$a(["E","e","4","["]),$a(["F","f","5",92]),$a(["G","g","6","]"]),$a(["H","h","7","_"]),$a(["I","i","8","`"]),$a(["J","j","9","~"]),$a(["K","k","&","!"]),$a(["L","l",13,13]),$a(["M","m",9,9]),$a(["N","n",",",","]),$a(["O","o",":",":"]),$a(["P","p","#",10]),$a(["Q","q","-","-"]),$a(["R","r",".","."]),$a(["S","s","$","$"]),$a(["T","t","/","/"]),$a(["U","u","+",'"']),$a(["V","v","%","|"]),$a(["W","w","*","*"]),$a(["X","x","=",40]),$a(["Y","y","^",41]),$a(["Z","z",$_.pl,"?"]),$a([" "," "," ","{"]),$a([$_.ll,$_.as,$_.ll,"}"]),$a([$_.ml,$_.ml,$_.al,"'"]),$a([$_.ps,$_.ps,$_.ps,$_.al])]);$_.pdf417_e=4e4;$_.e=$_.pdf417_e;$_.pdf417_latlen=$a([$a([0,1,1,2]),$a([2,0,1,2]),$a([1,1,0,1]),$a([1,2,2,0])]);$_.pdf417_latseq=$a([$a([$a([]),$a([$_.ll]),$a([$_.ml]),$a([$_.ml,$_.pl])]),$a([$a([$_.ml,$_.al]),$a([]),$a([$_.ml]),$a([$_.ml,$_.pl])]),$a([$a([$_.al]),$a([$_.ll]),$a([]),$a([$_.pl])]),$a([$a([$_.al]),$a([$_.al,$_.ll]),$a([$_.al,$_.ml]),$a([])])]);$_.pdf417_shftlen=$a([$a([$_.e,$_.e,$_.e,1]),$a([1,$_.e,$_.e,1]),$a([$_.e,$_.e,$_.e,1]),$a([$_.e,$_.e,$_.e,$_.e])]);$k[$j++]=Infinity;$k[$j++]=$_.pdf417_tl;$k[$j++]=900;$k[$j++]=$_.pdf417_bl;$k[$j++]=901;$k[$j++]=$_.pdf417_bl6;$k[$j++]=924;$k[$j++]=$_.pdf417_nl;$k[$j++]=902;$k[$j++]=$_.pdf417_bs;$k[$j++]=913;var _1j=$d();$_.pdf417_latchcws=_1j;$_.pdf417_textencfuncs=$a(["enca","encl","encm","encp"]);$_.pdf417_encfuncs=$a(["enct","encn","encb"]);$_.pdf417_clusters=$a([$a([120256,125680,128380,120032,125560,128318,108736,119920,108640,86080,108592,86048,110016,120560,125820,109792,120440,125758,88256,109680,88160,89536,110320,120700,89312,110200,120638,89200,110140,89840,110460,89720,110398,89980,128506,119520,125304,128190,107712,119408,125244,107616,119352,84032,107568,119324,84e3,107544,83984,108256,119672,125374,85184,108144,119612,85088,108088,119582,85040,108060,85728,108408,119742,85616,108348,85560,108318,85880,108478,85820,85790,107200,119152,125116,107104,119096,125086,83008,107056,119068,82976,107032,82960,82952,83648,107376,119228,83552,107320,119198,83504,107292,83480,83468,83824,107452,83768,107422,83740,83900,106848,118968,125022,82496,106800,118940,82464,106776,118926,82448,106764,82440,106758,82784,106936,119006,82736,106908,82712,106894,82700,82694,106974,82830,82240,106672,118876,82208,106648,118862,82192,106636,82184,106630,82180,82352,82328,82316,82080,118830,106572,106566,82050,117472,124280,127678,103616,117360,124220,103520,117304,124190,75840,103472,75808,104160,117624,124350,76992,104048,117564,76896,103992,76848,76824,77536,104312,117694,77424,104252,77368,77340,77688,104382,77628,77758,121536,126320,128700,121440,126264,128670,111680,121392,126236,111648,121368,126222,111632,121356,103104,117104,124092,112320,103008,117048,124062,112224,121656,126366,93248,74784,102936,117006,93216,112152,93200,75456,103280,117180,93888,75360,103224,117150,93792,112440,121758,93744,75288,93720,75632,103356,94064,75576,103326,94008,112542,93980,75708,94140,75678,94110,121184,126136,128606,111168,121136,126108,111136,121112,126094,111120,121100,111112,111108,102752,116920,123998,111456,102704,116892,91712,74272,121244,116878,91680,74256,102668,91664,111372,102662,74244,74592,102840,116958,92e3,74544,102812,91952,111516,102798,91928,74508,74502,74680,102878,92088,74652,92060,74638,92046,92126,110912,121008,126044,110880,120984,126030,110864,120972,110856,120966,110852,110850,74048,102576,116828,90944,74016,102552,116814,90912,111e3,121038,90896,73992,102534,90888,110982,90884,74160,102620,91056,74136,102606,91032,111054,91020,74118,91014,91100,91086,110752,120920,125998,110736,120908,110728,120902,110724,110722,73888,102488,116782,90528,73872,102476,90512,110796,102470,90504,73860,90500,73858,73944,90584,90572,90566,120876,120870,110658,102444,73800,90312,90308,90306,101056,116080,123580,100960,116024,70720,100912,115996,70688,100888,70672,70664,71360,101232,116156,71264,101176,116126,71216,101148,71192,71180,71536,101308,71480,101278,71452,71612,71582,118112,124600,127838,105024,118064,124572,104992,118040,124558,104976,118028,104968,118022,100704,115896,123486,105312,100656,115868,79424,70176,118172,115854,79392,105240,100620,79376,70152,79368,70496,100792,115934,79712,70448,118238,79664,105372,100750,79640,70412,79628,70584,100830,79800,70556,79772,70542,70622,79838,122176,126640,128860,122144,126616,128846,122128,126604,122120,126598,122116,104768,117936,124508,113472,104736,126684,124494,113440,122264,126670,113424,104712,117894,113416,122246,104706,69952,100528,115804,78656,69920,100504,115790,96064,78624,104856,117966,96032,113560,122318,100486,96016,78600,104838,96008,69890,70064,100572,78768,70040,100558,96176,78744,104910,96152,113614,70022,78726,70108,78812,70094,96220,78798,122016,126552,128814,122e3,126540,121992,126534,121988,121986,104608,117848,124462,113056,104592,126574,113040,122060,117830,113032,104580,113028,104578,113026,69792,100440,115758,78240,69776,100428,95136,78224,104652,100422,95120,113100,69764,95112,78212,69762,78210,69848,100462,78296,69836,95192,78284,69830,95180,78278,69870,95214,121936,126508,121928,126502,121924,121922,104528,117804,112848,104520,117798,112840,121958,112836,104514,112834,69712,100396,78032,69704,100390,94672,78024,104550,94664,112870,69698,94660,78018,94658,78060,94700,94694,126486,121890,117782,104484,104482,69672,77928,94440,69666,77922,99680,68160,99632,68128,99608,115342,68112,99596,68104,99590,68448,99768,115422,68400,99740,68376,99726,68364,68358,68536,99806,68508,68494,68574,101696,116400,123740,101664,116376,101648,116364,101640,116358,101636,67904,99504,115292,72512,67872,116444,115278,72480,101784,116430,72464,67848,99462,72456,101766,67842,68016,99548,72624,67992,99534,72600,101838,72588,67974,68060,72668,68046,72654,118432,124760,127918,118416,124748,118408,124742,118404,118402,101536,116312,105888,101520,116300,105872,118476,116294,105864,101508,105860,101506,105858,67744,99416,72096,67728,116334,80800,72080,101580,99398,80784,105932,67716,80776,72068,67714,72066,67800,99438,72152,67788,80856,72140,67782,80844,72134,67822,72174,80878,126800,128940,126792,128934,126788,126786,118352,124716,122576,126828,124710,122568,126822,122564,118338,122562,101456,116268,105680,101448,116262,114128,105672,118374,114120,122598,101442,114116,105666,114114,67664,99372,71888,67656,99366,80336,71880,101478,97232,80328,105702,67650,97224,114150,71874,97220,67692,71916,67686,80364,71910,97260,80358,97254,126760,128918,126756,126754,118312,124694,122472,126774,122468,118306,122466,101416,116246,105576,101412,113896,105572,101410,113892,105570,113890,67624,99350,71784,101430,80104,71780,67618,96744,80100,71778,96740,80098,96738,71798,96758,126738,122420,122418,105524,113780,113778,71732,79988,96500,96498,66880,66848,98968,66832,66824,66820,66992,66968,66956,66950,67036,67022,1e5,99984,115532,99976,115526,99972,99970,66720,98904,69024,100056,98892,69008,100044,69e3,100038,68996,66690,68994,66776,98926,69080,100078,69068,66758,69062,66798,69102,116560,116552,116548,116546,99920,102096,116588,115494,102088,116582,102084,99906,102082,66640,68816,66632,98854,73168,68808,66628,73160,68804,66626,73156,68802,66668,68844,66662,73196,68838,73190,124840,124836,124834,116520,118632,124854,118628,116514,118626,99880,115478,101992,116534,106216,101988,99874,106212,101986,106210,66600,98838,68712,99894,72936,68708,66594,81384,72932,68706,81380,72930,66614,68726,72950,81398,128980,128978,124820,126900,124818,126898,116500,118580,116498,122740,118578,122738,99860,101940,99858,106100,101938,114420]),$a([128352,129720,125504,128304,129692,125472,128280,129678,125456,128268,125448,128262,125444,125792,128440,129758,120384,125744,128412,120352,125720,128398,120336,125708,120328,125702,120324,120672,125880,128478,110144,120624,125852,110112,120600,125838,110096,120588,110088,120582,110084,110432,120760,125918,89664,110384,120732,89632,110360,120718,89616,110348,89608,110342,89952,110520,120798,89904,110492,89880,110478,89868,90040,110558,90012,89998,125248,128176,129628,125216,128152,129614,125200,128140,125192,128134,125188,125186,119616,125360,128220,119584,125336,128206,119568,125324,119560,125318,119556,119554,108352,119728,125404,108320,119704,125390,108304,119692,108296,119686,108292,108290,85824,108464,119772,85792,108440,119758,85776,108428,85768,108422,85764,85936,108508,85912,108494,85900,85894,85980,85966,125088,128088,129582,125072,128076,125064,128070,125060,125058,119200,125144,128110,119184,125132,119176,125126,119172,119170,107424,119256,125166,107408,119244,107400,119238,107396,107394,83872,107480,119278,83856,107468,83848,107462,83844,83842,83928,107502,83916,83910,83950,125008,128044,125e3,128038,124996,124994,118992,125036,118984,125030,118980,118978,106960,119020,106952,119014,106948,106946,82896,106988,82888,106982,82884,82882,82924,82918,124968,128022,124964,124962,118888,124982,118884,118882,106728,118902,106724,106722,82408,106742,82404,82402,124948,124946,118836,118834,106612,106610,124224,127664,129372,124192,127640,129358,124176,127628,124168,127622,124164,124162,117568,124336,127708,117536,124312,127694,117520,124300,117512,124294,117508,117506,104256,117680,124380,104224,117656,124366,104208,117644,104200,117638,104196,104194,77632,104368,117724,77600,104344,117710,77584,104332,77576,104326,77572,77744,104412,77720,104398,77708,77702,77788,77774,128672,129880,93168,128656,129868,92664,128648,129862,92412,128644,128642,124064,127576,129326,126368,124048,129902,126352,128716,127558,126344,124036,126340,124034,126338,117152,124120,127598,121760,117136,124108,121744,126412,124102,121736,117124,121732,117122,121730,103328,117208,124142,112544,103312,117196,112528,121804,117190,112520,103300,112516,103298,112514,75680,103384,117230,94112,75664,103372,94096,112588,103366,94088,75652,94084,75650,75736,103406,94168,75724,94156,75718,94150,75758,128592,129836,91640,128584,129830,91388,128580,91262,128578,123984,127532,126160,123976,127526,126152,128614,126148,123970,126146,116944,124012,121296,116936,124006,121288,126182,121284,116930,121282,102864,116972,111568,102856,116966,111560,121318,111556,102850,111554,74704,102892,92112,74696,102886,92104,111590,92100,74690,92098,74732,92140,74726,92134,128552,129814,90876,128548,90750,128546,123944,127510,126056,128566,126052,123938,126050,116840,123958,121064,116836,121060,116834,121058,102632,116854,111080,121078,111076,102626,111074,74216,102646,91112,74212,91108,74210,91106,74230,91126,128532,90494,128530,123924,126004,123922,126002,116788,120948,116786,120946,102516,110836,102514,110834,73972,90612,73970,90610,128522,123914,125978,116762,120890,102458,110714,123552,127320,129198,123536,127308,123528,127302,123524,123522,116128,123608,127342,116112,123596,116104,123590,116100,116098,101280,116184,123630,101264,116172,101256,116166,101252,101250,71584,101336,116206,71568,101324,71560,101318,71556,71554,71640,101358,71628,71622,71662,127824,129452,79352,127816,129446,79100,127812,78974,127810,123472,127276,124624,123464,127270,124616,127846,124612,123458,124610,115920,123500,118224,115912,123494,118216,124646,118212,115906,118210,100816,115948,105424,100808,115942,105416,118246,105412,100802,105410,70608,100844,79824,70600,100838,79816,105446,79812,70594,79810,70636,79852,70630,79846,129960,95728,113404,129956,95480,113278,129954,95356,95294,127784,129430,78588,128872,129974,95996,78462,128868,127778,95870,128866,123432,127254,124520,123428,126696,128886,123426,126692,124514,126690,115816,123446,117992,115812,122344,117988,115810,122340,117986,122338,100584,115830,104936,100580,113640,104932,100578,113636,104930,113634,70120,100598,78824,70116,96232,78820,70114,96228,78818,96226,70134,78838,129940,94968,113022,129938,94844,94782,127764,78206,128820,127762,95102,128818,123412,124468,123410,126580,124466,126578,115764,117876,115762,122100,117874,122098,100468,104692,100466,113140,104690,113138,69876,78324,69874,95220,78322,95218,129930,94588,94526,127754,128794,123402,124442,126522,115738,117818,121978,100410,104570,112890,69754,78074,94714,94398,123216,127148,123208,127142,123204,123202,115408,123244,115400,123238,115396,115394,99792,115436,99784,115430,99780,99778,68560,99820,68552,99814,68548,68546,68588,68582,127400,129238,72444,127396,72318,127394,123176,127126,123752,123172,123748,123170,123746,115304,123190,116456,115300,116452,115298,116450,99560,115318,101864,99556,101860,99554,101858,68072,99574,72680,68068,72676,68066,72674,68086,72694,129492,80632,105854,129490,80508,80446,127380,72062,127924,127378,80766,127922,123156,123700,123154,124788,123698,124786,115252,116340,115250,118516,116338,118514,99444,101620,99442,105972,101618,105970,67828,72180,67826,80884,72178,80882,97008,114044,96888,113982,96828,96798,129482,80252,130010,97148,80190,97086,127370,127898,128954,123146,123674,124730,126842,115226,116282,118394,122618,99386,101498,105722,114170,67706,71930,80378,96632,113854,96572,96542,80062,96702,96444,96414,96350,123048,123044,123042,115048,123062,115044,115042,99048,115062,99044,99042,67048,99062,67044,67042,67062,127188,68990,127186,123028,123316,123026,123314,114996,115572,114994,115570,98932,100084,98930,100082,66804,69108,66802,69106,129258,73084,73022,127178,127450,123018,123290,123834,114970,115514,116602,98874,99962,102138,66682,68858,73210,81272,106174,81212,81182,72894,81342,97648,114364,97592,114334,97564,97550,81084,97724,81054,97694,97464,114270,97436,97422,80990,97502,97372,97358,97326,114868,114866,98676,98674,66292,66290,123098,114842,115130,98618,99194,66170,67322,69310,73404,73374,81592,106334,81564,81550,73310,81630,97968,114524,97944,114510,97932,97926,81500,98012,81486,97998,97880,114478,97868,97862,81454,97902,97836,97830,69470,73564,73550,81752,106414,81740,81734,73518,81774,81708,81702]),$a([109536,120312,86976,109040,120060,86496,108792,119934,86256,108668,86136,129744,89056,110072,129736,88560,109820,129732,88312,109694,129730,88188,128464,129772,89592,128456,129766,89340,128452,89214,128450,125904,128492,125896,128486,125892,125890,120784,125932,120776,125926,120772,120770,110544,120812,110536,120806,110532,84928,108016,119548,84448,107768,119422,84208,107644,84088,107582,84028,129640,85488,108284,129636,85240,108158,129634,85116,85054,128232,129654,85756,128228,85630,128226,125416,128246,125412,125410,119784,125430,119780,119778,108520,119798,108516,108514,83424,107256,119166,83184,107132,83064,107070,83004,82974,129588,83704,107390,129586,83580,83518,128116,83838,128114,125172,125170,119284,119282,107508,107506,82672,106876,82552,106814,82492,82462,129562,82812,82750,128058,125050,119034,82296,106686,82236,82206,82366,82108,82078,76736,103920,117500,76256,103672,117374,76016,103548,75896,103486,75836,129384,77296,104188,129380,77048,104062,129378,76924,76862,127720,129398,77564,127716,77438,127714,124392,127734,124388,124386,117736,124406,117732,117730,104424,117750,104420,104418,112096,121592,126334,92608,111856,121468,92384,111736,121406,92272,111676,92216,111646,92188,75232,103160,117118,93664,74992,103036,93424,112252,102974,93304,74812,93244,74782,93214,129332,75512,103294,129908,129330,93944,75388,129906,93820,75326,93758,127604,75646,128756,127602,94078,128754,124148,126452,124146,126450,117236,121844,117234,121842,103412,103410,91584,111344,121212,91360,111224,121150,91248,111164,91192,111134,91164,91150,74480,102780,91888,74360,102718,91768,111422,91708,74270,91678,129306,74620,129850,92028,74558,91966,127546,128634,124026,126202,116986,121338,102906,90848,110968,121022,90736,110908,90680,110878,90652,90638,74104,102590,91e3,74044,90940,74014,90910,74174,91070,90480,110780,90424,110750,90396,90382,73916,90556,73886,90526,90296,110686,90268,90254,73822,90334,90204,90190,71136,101112,116094,70896,100988,70776,100926,70716,70686,129204,71416,101246,129202,71292,71230,127348,71550,127346,123636,123634,116212,116210,101364,101362,79296,105200,118140,79072,105080,118078,78960,105020,78904,104990,78876,78862,70384,100732,79600,70264,100670,79480,105278,79420,70174,79390,129178,70524,129466,79740,70462,79678,127290,127866,123514,124666,115962,118266,100858,113376,122232,126654,95424,113264,122172,95328,113208,122142,95280,113180,95256,113166,95244,78560,104824,117950,95968,78448,104764,95856,113468,104734,95800,78364,95772,78350,95758,70008,100542,78712,69948,96120,78652,69918,96060,78622,96030,70078,78782,96190,94912,113008,122044,94816,112952,122014,94768,112924,94744,112910,94732,94726,78192,104636,95088,78136,104606,95032,113054,95004,78094,94990,69820,78268,69790,95164,78238,95134,94560,112824,121950,94512,112796,94488,112782,94476,94470,78008,104542,94648,77980,94620,77966,94606,69726,78046,94686,94384,112732,94360,112718,94348,94342,77916,94428,77902,94414,94296,112686,94284,94278,77870,94318,94252,94246,68336,99708,68216,99646,68156,68126,68476,68414,127162,123258,115450,99834,72416,101752,116414,72304,101692,72248,101662,72220,72206,67960,99518,72568,67900,72508,67870,72478,68030,72638,80576,105840,118460,80480,105784,118430,80432,105756,80408,105742,80396,80390,72048,101564,80752,71992,101534,80696,71964,80668,71950,80654,67772,72124,67742,80828,72094,80798,114016,122552,126814,96832,113968,122524,96800,113944,122510,96784,113932,96776,113926,96772,80224,105656,118366,97120,80176,105628,97072,114076,105614,97048,80140,97036,80134,97030,71864,101470,80312,71836,97208,80284,71822,97180,80270,97166,67678,71902,80350,97246,96576,113840,122460,96544,113816,122446,96528,113804,96520,113798,96516,96514,80048,105564,96688,80024,105550,96664,113870,96652,80006,96646,71772,80092,71758,96732,80078,96718,96416,113752,122414,96400,113740,96392,113734,96388,96386,79960,105518,96472,79948,96460,79942,96454,71726,79982,96494,96336,113708,96328,113702,96324,96322,79916,96364,79910,96358,96296,113686,96292,96290,79894,96310,66936,99006,66876,66846,67006,68976,100028,68920,99998,68892,68878,66748,69052,66718,69022,73056,102072,116574,73008,102044,72984,102030,72972,72966,68792,99934,73144,68764,73116,68750,73102,66654,68830,73182,81216,106160,118620,81184,106136,118606,81168,106124,81160,106118,81156,81154,72880,101980,81328,72856,101966,81304,106190,81292,72838,81286,68700,72924,68686,81372,72910,81358,114336,122712,126894,114320,122700,114312,122694,114308,114306,81056,106072,118574,97696,81040,106060,97680,114380,106054,97672,81028,97668,81026,97666,72792,101934,81112,72780,97752,81100,72774,97740,81094,97734,68654,72814,81134,97774,114256,122668,114248,122662,114244,114242,80976,106028,97488,80968,106022,97480,114278,97476,80962,97474,72748,81004,72742,97516,80998,97510,114216,122646,114212,114210,80936,106006,97384,80932,97380,80930,97378,72726,80950,97398,114196,114194,80916,97332,80914,97330,66236,66206,67256,99166,67228,67214,66142,67294,69296,100188,69272,100174,69260,69254,67164,69340,67150,69326,73376,102232,116654,73360,102220,73352,102214,73348,73346,69208,100142,73432,102254,73420,69190,73414,67118,69230,73454,106320,118700,106312,118694,106308,106306,73296,102188,81616,106348,102182,81608,73284,81604,73282,81602,69164,73324,69158,81644,73318,81638,122792,126934,122788,122786,106280,118678,114536,106276,114532,106274,114530,73256,102166,81512,73252,98024,81508,73250,98020,81506,98018,69142,73270,81526,98038,122772,122770,106260,114484,106258,114482,73236,81460,73234,97908,81458,97906,122762,106250,114458,73226,81434,97850,66396,66382,67416,99246,67404,67398,66350,67438,69456,100268,69448,100262,69444,69442,67372,69484,67366,69478,102312,116694,102308,102306,69416,100246,73576,102326,73572,69410,73570,67350,69430,73590,118740,118738,102292,106420,102290,106418,69396,73524,69394,81780,73522,81778,118730,102282,106394,69386,73498,81722,66476,66470,67496,99286,67492,67490,66454,67510,100308,100306,67476,69556,67474,69554,116714])]);$_.pdf417_rsprod=function(){var _1q=$k[$j-1];var _1r=$k[$j-2];if(_1q!=0&&_1r!=0){var _1t=$k[--$j];var _1v=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_1t)+$g($_.rslog,_1v))%928)}else{$j-=2;$k[$j++]=0}};$_.pdf417_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _21=0,_22=$_.k;_21<_22;_21++){$k[$j++]=0}$_.coeffs=$a();for(var _25=1,_24=$_.k;_25<=_24;_25+=1){var _26=$_.coeffs;$p(_26,_25,$g(_26,_25-1));$k[$j++]=$g($_.rsalog,_25);for(var _2A=_25-1;_2A>=1;_2A-=1){var _2B=$_.coeffs;var _2D=$k[$j-1];$k[$j++]=_2B;$k[$j++]=_2A;$k[$j++]=$g(_2B,_2A);$k[$j++]=_2D;$_.pdf417_rsprod();var _2F=$k[--$j];var _2G=$k[--$j];var _2I=$k[--$j];$p(_2I,_2G,$f(_2F+$g($_.coeffs,_2G-1))%929)}var _2J=$_.coeffs;var _2L=$k[$j-1];$k[$j++]=_2J;$k[$j++]=0;$k[$j++]=$g(_2J,0);$k[$j++]=_2L;$_.pdf417_rsprod();var _2M=$k[--$j];var _2N=$k[--$j];var _2O=$k[--$j];$p(_2O,_2N,_2M);$j--}$_.coeffs=$G($_.coeffs,0,$_.k);for(var _2T=$_.k-1;_2T>=0;_2T-=2){var _2U=$_.coeffs;$p(_2U,_2T,929-$g(_2U,_2T))}$k[$j++]=$_.coeffs};$_.pdf417_coeffscachemax=9;$_.pdf417_coeffscachelimit=1022;$k[$j++]=$_.pdf417_coeffscachemax;$k[$j++]=$_.pdf417_coeffscachelimit;bwipp_fifocache();var _2Z=$k[--$j];$_.pdf417_coeffscache=_2Z;$_.pdf417_coeffscachefetch=function(){var _2a=$k[--$j];$_.k=_2a;var _2c=$g($_.pdf417_coeffscache,"fetch");$k[$j++]=$_.k;$k[$j++]=function(){$_.pdf417_gencoeffs()};$k[$j++]=function(){var _2d=$k[--$j];$k[$j++]=_2d.length};if(_2c()===true){return true}};$_.charvals=$a([new Map,new Map,new Map,new Map]);$_.alltext=new Map;for(var _2f=0,_2e=$_.pdf417_charmaps.length-1;_2f<=_2e;_2f+=1){$_.i=_2f;$_.encs=$g($_.pdf417_charmaps,$_.i);for(var _2i=0;_2i<=3;_2i+=1){$_.j=_2i;var _2l=$g($_.encs,$_.j);var _2m=$t(_2l);if($eq(_2m,"stringtype")){_2l=$g(_2l,0)}$p($g($_.charvals,$_.j),_2l,$_.i);$p($_.alltext,_2l,-1)}}$_.charvals=$_.charvals;$_.alltext=$_.alltext;$k[$j++]=Infinity;$k[$j++]=1;for(var _2x=0;_2x<928;_2x++){var _2y=$k[$j-1];$k[$j++]=_2y*3%929}var _2z=$a();$_.rsalog=_2z;$_.rslog=$a(929);for(var _31=1;_31<=928;_31+=1){$p($_.rslog,$g($_.rsalog,_31),_31)}$_.rslog=$_.rslog;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_pdf417.globals);$_.dontdraw=false;$_.compact=false;$_.eclevel=-1;$_.fixedeclevel=false;$_.columns=0;$_.rows=0;$_.rowmult=3;$_.ccc=false;$_.raw=false;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _36=$k[--$j];$_.options=_36;var _37=$k[--$j];$_.barcode=_37;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.pdf417emptyData#22667";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>12500){$k[$j++]="bwipp.pdf417inputTooLong#22671";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.eclevel!=-1&&($_.eclevel<0||$_.eclevel>8)){$k[$j++]="bwipp.pdf417InvalidErrorCorrectionLevel#22675";$k[$j++]="Valid error correction levels are 0 to 8";bwipp_raiseerror()}if($_.ccc&&$_.raw){$k[$j++]="bwipp.pdf417cccAndRaw#22679";$k[$j++]="Cannot combine ccc and raw";bwipp_raiseerror()}if($_.ccc&&$_.compact){$k[$j++]="bwipp.pdf417cccAndCompact#22683";$k[$j++]="Cannot combine ccc and compact";bwipp_raiseerror()}if($_.rows!=0&&($_.rows<3||$_.rows>90)){$k[$j++]="bwipp.pdf417invalidRows#22687";$k[$j++]="There must be between 3 and 90 rows";bwipp_raiseerror()}if($_.columns!=0&&($_.columns<1||$_.columns>30)){$k[$j++]="bwipp.pdf417invalidColumns#22691";$k[$j++]="There must be between 1 and 30 columns";bwipp_raiseerror()}if($_.rowmult<=0||$_.rowmult>50){$k[$j++]="bwipp.pdf417badRowMult#22695";$k[$j++]="The row multiplier must be greater than 0 and at most 50";bwipp_raiseerror()}if($_.raw){$_.datcws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _3b=$G($_.barcode,$_.i+1,3);$k[$j++]=_3b;$k[$j++]=false;for(var _3c=0,_3d=_3b.length;_3c<_3d;_3c++){var _3e=$g(_3b,_3c);if(_3e<48||_3e>57){$k[$j-1]=true}}var _3f=$k[--$j];if(_3f){$j--;break}var _3g=$k[--$j];$_.cw=$i(_3g);if($_.cw>928){$k[$j++]="bwipp.pdf417badRawCodeword#22714";$k[$j++]="Raw codewords must be 0 to 928";bwipp_raiseerror()}$p($_.datcws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.pdf417badRawFormat#22721";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.datcws=$G($_.datcws,0,$_.j)}$_.encb=function(){var _3s=$k[--$j];$_.in=_3s;$_.inlen=$_.in.length;$_.out=$a(~~($_.inlen/6)*5+$_.inlen%6);for(var _3z=0,_3y=~~($_.inlen/6)-1;_3z<=_3y;_3z+=1){$_.k=_3z;$k[$j++]=Infinity;$q($G($_.in,$_.k*6,3));$_.msbs=$a();$k[$j++]=Infinity;$q($_.msbs);var _44=$k[--$j];var _45=$k[--$j];var _46=$k[--$j];$k[$j++]=$f(_44+_45*256+_46*65536);for(var _47=0;_47<3;_47++){var _48=$k[--$j];$k[$j++]=_48%900;$k[$j++]=~~(_48/900)}$_.mscs=$a();$k[$j++]=Infinity;$q($G($_.in,$_.k*6+3,3));$_.lsbs=$a();$k[$j++]=Infinity;$q($_.lsbs);var _4D=$k[--$j];var _4E=$k[--$j];var _4F=$k[--$j];$k[$j++]=$f(_4D+_4E*256+_4F*65536);for(var _4G=0;_4G<3;_4G++){var _4H=$k[--$j];$k[$j++]=_4H%900;$k[$j++]=~~(_4H/900)}$_.lscs=$a();var _4J=$g($_.lscs,0);var _4L=$g($_.mscs,0);$p($_.out,$_.k*5+4,$f(_4J+_4L*316)%900);var _4P=$g($_.lscs,1);var _4R=$g($_.mscs,0);var _4T=$g($_.mscs,1);$p($_.out,$_.k*5+3,$f(~~((_4J+_4L*316)/900)+_4P+_4R*641+_4T*316)%900);var _4X=$g($_.lscs,2);var _4Z=$g($_.mscs,0);var _4b=$g($_.mscs,1);var _4d=$g($_.mscs,2);$p($_.out,$_.k*5+2,$f(~~((~~((_4J+_4L*316)/900)+_4P+_4R*641+_4T*316)/900)+_4X+_4Z*20+_4b*641+_4d*316)%900);var _4h=$g($_.lscs,3);var _4j=$g($_.mscs,1);var _4l=$g($_.mscs,2);$p($_.out,$_.k*5+1,$f(~~((~~((~~((_4J+_4L*316)/900)+_4P+_4R*641+_4T*316)/900)+_4X+_4Z*20+_4b*641+_4d*316)/900)+_4h+_4j*20+_4l*641)%900);$p($_.out,$_.k*5,$f(~~((~~((~~((~~((_4J+_4L*316)/900)+_4P+_4R*641+_4T*316)/900)+_4X+_4Z*20+_4b*641+_4d*316)/900)+_4h+_4j*20+_4l*641)/900)+$g($_.mscs,2)*20)%900)}$_.rem=$_.inlen%6;if($_.rem!=0){var _54=$_.out;var _53=$_.out.length-$_.rem;$k[$j++]=Infinity;$q($G($_.in,$_.inlen-$_.rem,$_.rem));var _52=$a();$P(_54,_53,_52)}$k[$j++]=$_.out};if($_.ccc){$_.barlen=$_.barcode.length;$_.datcws=$a(~~($_.barlen/6)*5+$_.barlen%6+2);$p($_.datcws,0,920);var _5E=$_.barlen%6==0?924:901;$p($_.datcws,1,_5E);$k[$j++]=$_.datcws;$k[$j++]=2;$k[$j++]=Infinity;$F($_.barcode);var _5H=$a();$k[$j++]=_5H;$_.encb();var _5I=$k[--$j];var _5J=$k[--$j];var _5K=$k[--$j];$P(_5K,_5J,_5I)}if(!$_.raw&&!$_.ccc){$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _5R=$k[--$j];$_.msg=_5R;$_.msglen=$_.msg.length;$k[$j++]=Infinity;for(var _5U=0,_5V=$_.msglen;_5U<_5V;_5U++){$k[$j++]=0}$k[$j++]=0;$_.numdigits=$a();$k[$j++]=Infinity;for(var _5X=0,_5Y=$_.msglen;_5X<_5Y;_5X++){$k[$j++]=0}$k[$j++]=0;$_.numtext=$a();$k[$j++]=Infinity;for(var _5a=0,_5b=$_.msglen;_5a<_5b;_5a++){$k[$j++]=0}$k[$j++]=0;$_.numbytes=$a();$k[$j++]=Infinity;for(var _5d=0,_5e=$_.msglen;_5d<_5e;_5d++){$k[$j++]=0}$k[$j++]=0;$_.iseci=$a();for(var _5g=$_.msglen-1;_5g>=0;_5g-=1){$_.i=_5g;var _5j=$g($_.msg,$_.i);if(_5j>=48&&_5j<=57){$p($_.numdigits,$_.i,$g($_.numdigits,$_.i+1)+1)}if($has($_.alltext,$g($_.msg,$_.i))&&$g($_.numdigits,$_.i)<13){$p($_.numtext,$_.i,$g($_.numtext,$_.i+1)+1)}if($g($_.msg,$_.i)>=0&&$g($_.numtext,$_.i)<5&&$g($_.numdigits,$_.i)<13){$p($_.numbytes,$_.i,$g($_.numbytes,$_.i+1)+1)}$p($_.iseci,$_.i,$g($_.msg,$_.i)<=-1e6)}$_.numdigits=$G($_.numdigits,0,$_.msglen);$_.numtext=$G($_.numtext,0,$_.msglen);$_.numbytes=$G($_.numbytes,0,$_.msglen);$k[$j++]=Infinity;$_.seqlen=0;$_.state=$_.pdf417_t;$_.p=0;for(;;){if($_.p==$_.msglen){break}if($g($_.iseci,$_.p)){$_.eci=$g($_.msg,$_.p);$_.p=$_.p+1;$k[$j++]=$a([$_.eci]);var _6k=$_.seqlen;var _6j=$_.eci<=-1810900?2:$_.eci<=-1000900?3:2;$_.seqlen=$f(_6k+_6j)}else{$_.n=$g($_.numdigits,$_.p);if($_.n>=13||$_.n==$_.msglen&&$_.n>=8){$k[$j++]=$_.pdf417_nl;$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.n));var _6x=$a();$_.state=$_.pdf417_n;$_.p=$f($_.p+$_.n);$_.seqlen=$f($_.seqlen+1+$_.n);$k[$j++]=_6x}else{$_.t=$g($_.numtext,$_.p);if($_.t>=5){if($_.state!=$_.pdf417_t){$k[$j++]=$_.pdf417_tl}$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.t));var _7B=$a();$_.state=$_.pdf417_t;$_.p=$f($_.p+$_.t);$_.seqlen=$f($_.seqlen+1+$_.t);$k[$j++]=_7B}else{$_.b=$g($_.numbytes,$_.p);if($_.b==1&&$_.state==$_.pdf417_t){$_.p=$f($_.p+$_.b);$_.seqlen=$_.seqlen+2;$k[$j++]=$_.pdf417_bs;$k[$j++]=$a([$g($_.msg,$_.p)])}else{if($_.b%6!=0){$k[$j++]=$_.pdf417_bl}else{$k[$j++]=$_.pdf417_bl6}$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.b));var _7X=$a();$_.state=$_.pdf417_b;$_.p=$f($_.p+$_.b);$_.seqlen=$f($_.seqlen+1+$_.b);$k[$j++]=_7X}}}}}$as($a($m()));var _7e=$k[--$j];$j--;$_.seq=_7e;$_.enca=function(){var _7j=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.pdf417_a),_7j)};$_.encl=function(){var _7n=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.pdf417_l),_7n)};$_.encm=function(){var _7r=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.pdf417_m),_7r)};$_.encp=function(){var _7v=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.pdf417_p),_7v)};$_.textencfuncs=$_.pdf417_textencfuncs;$_.addtotext=function(){var _7y=$k[--$j];$p($_.text,$_.l,_7y);$_.l=$_.l+1};$_.enct=function(){var _81=$k[--$j];$_.in=_81;$_.maxseqlen=$_.in.length*3+4;$k[$j++]=Infinity;for(var _83=0;_83<4;_83++){$k[$j++]=$a($_.maxseqlen)}$_.seq0=$a();$k[$j++]=Infinity;for(var _86=0;_86<4;_86++){$k[$j++]=$a($_.maxseqlen)}$_.seq1=$a();$_.len0=$a(4);$p($_.len0,0,0);$p($_.len0,1,0);$p($_.len0,2,0);$p($_.len0,3,0);$_.len1=$a(4);$_.curseq=$_.seq0;$_.curseqlen=$_.len0;$_.nxtseq=$_.seq1;$_.nxtseqlen=$_.len1;$_.curlen=$a([$_.pdf417_e,$_.pdf417_e,$_.pdf417_e,$_.pdf417_e]);$p($_.curlen,$_.submode,0);$F($_.in,function(){var _8M=$k[--$j];$_.char=_8M;for(;;){$_.imp=false;for(var _8N=0,_8O=$_.pdf417_textsubmodes.length;_8N<_8O;_8N++){$_.x=$g($_.pdf417_textsubmodes,_8N);for(var _8Q=0,_8R=$_.pdf417_textsubmodes.length;_8Q<_8R;_8Q++){$_.y=$g($_.pdf417_textsubmodes,_8Q);$_.cost=$f($g($_.curlen,$_.x)+$g($g($_.pdf417_latlen,$_.x),$_.y));if($_.cost<$g($_.curlen,$_.y)){$p($_.curlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.curseq,$_.y),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$F($g($g($_.pdf417_latseq,$_.x),$_.y),function(){$k[$j++]=$g($_.curseq,$_.y);$k[$j++]=$_.srclen;var _91=$k[$j-3];var _92=$k[$j-1];var _93=$k[$j-2];$j-=3;$p(_93,_92,_91);$_.srclen=$_.srclen+1});$p($_.curseqlen,$_.y,$_.srclen);$_.imp=true}}}if(!$_.imp){break}}$_.nxtlen=$a([$_.pdf417_e,$_.pdf417_e,$_.pdf417_e,$_.pdf417_e]);$p($_.nxtseqlen,0,0);$p($_.nxtseqlen,1,0);$p($_.nxtseqlen,2,0);$p($_.nxtseqlen,3,0);for(var _9D=0,_9E=$_.pdf417_textsubmodes.length;_9D<_9E;_9D++){$_.x=$g($_.pdf417_textsubmodes,_9D);for(;;){if(!$has($g($_.charvals,$_.x),$_.char)){break}$_.cost=$g($_.curlen,$_.x)+1;if($_.cost<$g($_.nxtlen,$_.x)){$p($_.nxtlen,$_.x,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.nxtseq,$_.x),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$p($g($_.nxtseq,$_.x),$_.srclen,$_.char);$p($_.nxtseqlen,$_.x,$_.srclen+1)}for(var _9p=0,_9q=$_.pdf417_textsubmodes.length;_9p<_9q;_9p++){$_.y=$g($_.pdf417_textsubmodes,_9p);if($ne($_.x,$_.y)){$_.cost=$f($g($_.curlen,$_.y)+$g($g($_.pdf417_shftlen,$_.y),$_.x))+1;if($_.cost<$g($_.nxtlen,$_.y)){$p($_.nxtlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.y);if($_.srclen>0){$P($g($_.nxtseq,$_.y),0,$G($g($_.curseq,$_.y),0,$_.srclen))}var _AR=$g($_.nxtseq,$_.y);var _AQ=$_.srclen;var _AP=$_.x==$_.pdf417_a?$_.pdf417_as:$_.pdf417_ps;$p(_AR,_AQ,_AP);$p($g($_.nxtseq,$_.y),$_.srclen+1,$_.char);$p($_.nxtseqlen,$_.y,$_.srclen+2)}}}break}}$_.curlen=$_.nxtlen;var _Ab=$_.curseq;$_.curseq=$_.nxtseq;$_.nxtseq=_Ab;var _Ad=$_.curseqlen;$_.curseqlen=$_.nxtseqlen;$_.nxtseqlen=_Ad});$_.minseq=$_.pdf417_e;for(var _Af=0,_Ag=$_.pdf417_textsubmodes.length;_Af<_Ag;_Af++){$_.k=$g($_.pdf417_textsubmodes,_Af);if($g($_.curlen,$_.k)<$_.minseq){$_.minseq=$g($_.curlen,$_.k);$_.txtseq=$G($g($_.curseq,$_.k),0,$g($_.curseqlen,$_.k))}}$_.text=$a($_.minseq);$_.k=0;$_.l=0;for(;;){if($_.k>=$_.txtseq.length){break}$_.char=$g($_.txtseq,$_.k);var _B7=$_[$g($_.textencfuncs,$_.submode)];$k[$j++]=$_.char;if(_B7()===true){break}$_.addtotext();$_.k=$_.k+1;if($_.char==$_.pdf417_as||$_.char==$_.pdf417_ps){$k[$j++]=$g($_.txtseq,$_.k);if($_.char==$_.pdf417_as){$_.enca()}else{$_.encp()}$_.addtotext();$_.k=$_.k+1}if($_.char==$_.pdf417_al){$_.submode=$_.pdf417_a}if($_.char==$_.pdf417_ll){$_.submode=$_.pdf417_l}if($_.char==$_.pdf417_ml){$_.submode=$_.pdf417_m}if($_.char==$_.pdf417_pl){$_.submode=$_.pdf417_p}}if($_.text.length%2==1){if($_.submode==$_.pdf417_p){$k[$j++]="pad";$k[$j++]=$_.pdf417_al;$_.encp();var _BM=$k[--$j];var _BN=$k[--$j];$_[_BN]=_BM;$_.submode=$_.pdf417_a}else{$_.nextecitext=false;for(var _BR=$_.i+1,_BQ=$_.seq.length-1;_BR<=_BQ;_BR+=1){$_.ti=_BR;if($ne($t($g($_.seq,$_.ti)),"arraytype")){$_.nextecitext=false;break}if($g($g($_.seq,$_.ti),0)>-1e6){break}$_.nextecitext=true}if($_.nextecitext){if($_.submode==$_.pdf417_a){if($has($g($_.charvals,$_.pdf417_l),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.pdf417_ll;$_.enca();var _Bj=$k[--$j];var _Bk=$k[--$j];$_[_Bk]=_Bj;$_.submode=$_.pdf417_l}else{$k[$j++]="pad";$k[$j++]=$_.pdf417_ml;$_.enca();var _Bl=$k[--$j];var _Bm=$k[--$j];$_[_Bm]=_Bl;$_.submode=$_.pdf417_m}}else{if($_.submode==$_.pdf417_m){if($has($g($_.charvals,$_.pdf417_l),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.pdf417_ll;$_.encm();var _Bv=$k[--$j];var _Bw=$k[--$j];$_[_Bw]=_Bv;$_.submode=$_.pdf417_l}else{if($has($g($_.charvals,$_.pdf417_p),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.pdf417_pl;$_.encm();var _C4=$k[--$j];var _C5=$k[--$j];$_[_C5]=_C4;$_.submode=$_.pdf417_p}else{$k[$j++]="pad";$k[$j++]=$_.pdf417_al;$_.encm();var _C6=$k[--$j];var _C7=$k[--$j];$_[_C7]=_C6;$_.submode=$_.pdf417_a}}}else{$k[$j++]="pad";$k[$j++]=$_.pdf417_ml;$_.encl();var _C8=$k[--$j];var _C9=$k[--$j];$_[_C9]=_C8;$_.submode=$_.pdf417_m}}}else{var _CD=$_[$g($_.textencfuncs,$_.submode)];$k[$j++]="pad";$k[$j++]=$_.pdf417_ps;if(_CD()===true){return true}var _CE=$k[--$j];var _CF=$k[--$j];$_[_CF]=_CE}}$k[$j++]=Infinity;$q($_.text);$k[$j++]=$_.pad;$_.text=$a()}$_.out=$a(~~($_.text.length/2));for(var _CM=0,_CL=$_.out.length-1;_CM<=_CL;_CM+=1){$_.k=_CM;$p($_.out,$_.k,$f($g($_.text,$_.k*2)*30+$g($_.text,$_.k*2+1)))}$k[$j++]=$_.out};$_.encn=function(){var _CW=$k[--$j];$_.in=_CW;$k[$j++]=Infinity;for(var _CZ=0,_CY=$_.in.length-1;_CZ<=_CY;_CZ+=44){$_.k=_CZ;$k[$j++]=Infinity;var _Ce=$_.in.length-$_.k;$k[$j++]=1;var _Ch=$_.in;var _Cg=$_.k;if(_Ce>44){_Ce=44}var _Ci=$G(_Ch,_Cg,_Ce);for(var _Cj=0,_Ck=_Ci.length;_Cj<_Ck;_Cj++){$k[$j++]=$g(_Ci,_Cj)-48}$_.gmod=$a();$_.cwn=$a(15);$_.cwi=15;for(;;){$_.dv=900;$_.val=0;$_.gmulstart=true;$k[$j++]=Infinity;for(;;){if($_.gmod.length==0){break}$_.val=$f($_.val*10+$g($_.gmod,0));$_.gmod=$G($_.gmod,1,$_.gmod.length-1);if($_.val<$_.dv){if(!$_.gmulstart){$k[$j++]=0}}else{$_.gmulstart=false;$k[$j++]=~~($_.val/$_.dv)}$_.val=$_.val%$_.dv}$as($a($m()));var _D3=$k[--$j];$j--;$_.cwi=$_.cwi-1;$p($_.cwn,$_.cwi,$_.val);$_.gmod=_D3;if($_.gmod.length==0){break}}$q($G($_.cwn,$_.cwi,15-$_.cwi))}$as($a($m()));var _DH=$k[--$j];$k[$j-1]=_DH};$_.ence=function(){var _DJ=$k[--$j];var _DL=-$g(_DJ,0)-1e6;$k[$j++]=_DL;if(_DL<=899){var _DM=$k[--$j];var _DN=$a(2);$k[$j++]=927;$k[$j++]=_DM;$as(_DN)}else{var _DO=$k[$j-1];if(_DO<=810899){var _DP=$k[--$j];var _DQ=$a(3);$k[$j++]=926;$k[$j++]=~~(_DP/900)-1;$k[$j++]=_DP%900;$as(_DQ)}else{var _DR=$k[$j-1];if(_DR<=811799){var _DS=$k[--$j];var _DT=$a(2);$k[$j++]=925;$k[$j++]=_DS-810900;$as(_DT)}else{$k[$j-1]="bwipp.pdf417badECI#23137";$k[$j++]="PDF417 supports ECIs 000000 to 811799";bwipp_raiseerror()}}}};$_.encfuncs=$_.pdf417_encfuncs;$_.addtocws=function(){var _DU=$k[--$j];$P($_.datcws,$_.j,_DU);$_.j=_DU.length+$_.j};$_.state=$_.pdf417_t;$_.submode=$_.pdf417_a;$_.datcws=$a($_.seqlen);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.seq.length){break}$_.chars=$g($_.seq,$_.i);if($eq($t($_.chars),"arraytype")){if($g($_.chars,0)<=-1e6){$k[$j++]=$_.chars;$_.ence();$_.addtocws()}else{var _Do=$_[$g($_.encfuncs,$_.state)];$k[$j++]=$_.chars;if(_Do()===true){break}$_.addtocws()}}else{$k[$j++]=$a([$g($_.pdf417_latchcws,$_.chars)]);$_.addtocws();if($_.chars==$_.pdf417_tl){$_.state=$_.pdf417_t;$_.submode=$_.pdf417_a}if($_.chars==$_.pdf417_nl){$_.state=$_.pdf417_n}if($_.chars==$_.pdf417_bl||$_.chars==$_.pdf417_bl6){$_.state=$_.pdf417_b}if($_.chars==$_.pdf417_bs){$_.i=$_.i+1;$k[$j++]=$g($_.seq,$_.i);$_.encb();$_.addtocws()}}$_.i=$_.i+1}$_.datcws=$G($_.datcws,0,$_.j)}$_.m=$_.datcws.length;if($_.m>926){$k[$j++]="bwipp.pdf417dataTooLong#23182";$k[$j++]="The data is too long";bwipp_raiseerror()}if($_.eclevel==-1){if($_.m<=40){$_.eclevel=2}if($_.m>=41&&$_.m<=160){$_.eclevel=3}if($_.m>=161&&$_.m<=320){$_.eclevel=4}if($_.m>=321){$_.eclevel=5}}if(!$_.fixedeclevel){$_.maxeclevel=~~($log(928-1-$_.m)/$log(2))-1;if($_.eclevel>$_.maxeclevel){$_.eclevel=$_.maxeclevel}}$_.k=$pow(2,$_.eclevel+1);if($_.columns==0){$_.columns=~~$rnd($sqrt($f($_.m+$_.k)/3))}var _EP=$_.columns>=1?$_.columns:1;$_.c=_EP;$_.r=$ceil(($f($_.m+$_.k)+1)/$_.columns);if($_.r<$_.rows&&$_.rows<=90){$_.r=$_.rows}if($_.r<3){$_.r=3}if($_.r>90){$k[$j++]="bwipp.pdf417insufficientCapacity#23221";$k[$j++]="Insufficient capacity in the symbol";bwipp_raiseerror()}if(!$_.fixedeclevel){var _Eb=$_.c;var _Ec=$_.r;var _Ed=$_.m;var _Ee=8;var _Ef=~~($log($f(_Eb*_Ec-1-_Ed))/$log(2))-1;if(~~($log($f(_Eb*_Ec-1-_Ed))/$log(2))-1>8){var _=_Ee;_Ee=_Ef;_Ef=_}$_.maxeclevel=_Ef;if($_.maxeclevel>$_.eclevel){$_.eclevel=$_.maxeclevel;$_.k=$pow(2,$_.eclevel+1)}}$k[$j++]="coeffs";$k[$j++]=$_.k;$_.pdf417_coeffscachefetch();var _El=$k[--$j];var _Em=$k[--$j];$_[_Em]=_El;$_.n=$f($_.c*$_.r-$_.k);if($_.n>928){$k[$j++]="bwipp.pdf417insufficientCapacity#23249";$k[$j++]="Insufficient capacity in the symbol";bwipp_raiseerror()}$_.cws=$a($_.c*$_.r);$p($_.cws,0,$_.n);$P($_.cws,1,$_.datcws);var _F6=$_.cws;var _F5=$_.m+1;var _F4=[];for(var _F2=0,_F3=$f($_.n-$_.m)-1;_F2<_F3;_F2++){_F4[_F2]=900}_F4=$a(_F4);$P(_F6,_F5,_F4);if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#23258";$k[$j++]=$G($_.cws,0,$_.n);bwipp_raiseerror()}var _FC=$_.n;var _FD=$_.coeffs;var _FE=$_.k;var _FI=$G($_.cws,$_.n,$_.k);$k[$j++]=function(){var _FK=$k[--$j];$k[$j++]=$g($_.cws,_FK)};$k[$j++]=_FC;$k[$j++]=_FD;$k[$j++]=_FE;$k[$j++]=_FI;$k[$j++]=929;bwipp_rsecprime();if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#23267";$k[$j++]=$G($_.cws,$_.n,$_.k);bwipp_raiseerror()}$_.cwtobits=function(){var _FS=$k[--$j];var _FU=$k[--$j];$_.v=$g($g($_.pdf417_clusters,_FS),_FU);$k[$j++]=Infinity;for(var _FW=0;_FW<17;_FW++){$k[$j++]=0}var _FZ=$R($s(17),$_.v,2);for(var _Fa=0,_Fb=_FZ.length;_Fa<_Fb;_Fa++){$k[$j++]=$g(_FZ,_Fa)-48}var _Fd=$a();$k[$j++]=$G(_Fd,_Fd.length-17,17)};if($_.compact){$_.rwid=17*$_.c+17+17+1}else{$_.rwid=17*$_.c+17+17+17+18}$k[$j++]=$_.rwid*$_.r;try{var _Fk=$k[--$j];$k[$j++]=$a(_Fk);var _Fm=false}catch(e){$k[$j++]=true}if(_Fm){$k[$j-1]="bwipp.pdf417PixsTooLarge#23291";$k[$j++]="The resulting symbol exceeds the implementation maximum array size";bwipp_raiseerror()}var _Fn=$k[--$j];$_.pixs=_Fn;for(var _Fq=0,_Fp=$_.r-1;_Fq<=_Fp;_Fq+=1){$_.i=_Fq;if($_.i%3==0){$_.lcw=~~($_.i/3)*30+~~(($_.r-1)/3);$_.rcw=$f(~~($_.i/3)*30+$_.c)-1}if($_.i%3==1){$_.lcw=~~($_.i/3)*30+$_.eclevel*3+($_.r-1)%3;$_.rcw=~~($_.i/3)*30+~~(($_.r-1)/3)}if($_.i%3==2){$_.lcw=$f(~~($_.i/3)*30+$_.c)-1;$_.rcw=~~($_.i/3)*30+$_.eclevel*3+($_.r-1)%3}var _GU=$_.pixs;var _GT=$_.i*$_.rwid;$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=$_.lcw;$k[$j++]=$_.i%3;$_.cwtobits();var _GD=$k[--$j];$q(_GD);var _GI=$G($_.cws,$_.c*$_.i,$_.c);for(var _GJ=0,_GK=_GI.length;_GJ<_GK;_GJ++){$k[$j++]=$g(_GI,_GJ);$k[$j++]=$_.i%3;$_.cwtobits();var _GN=$k[--$j];$q(_GN)}if($_.compact){$k[$j++]=1}else{$k[$j++]=$_.rcw;$k[$j++]=$_.i%3;$_.cwtobits();var _GR=$k[--$j];$q(_GR);$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=1}var _GS=$a();$P(_GU,_GT,_GS)}$k[$j++]=Infinity;var _GV=$_.pixs;var _GW=$_.rwid;var _GX=$_.r;var _GY=$_.rowmult;var _Gd=[];for(var _Ga=0,_Gb=$_.r;_Ga<_Gb;_Ga++){_Gd[_Ga]=$_.rowmult}_Gd=$a(_Gd);$k[$j++]="ren";$k[$j++]="renmatrix";$k[$j++]="pixs";$k[$j++]=_GV;$k[$j++]="pixx";$k[$j++]=_GW;$k[$j++]="pixy";$k[$j++]=_GX*_GY;$k[$j++]="rowmult";$k[$j++]=_Gd;$k[$j++]="height";$k[$j++]=$_.r*$_.rowmult/72;$k[$j++]="width";$k[$j++]=$_.rwid/72;$k[$j++]="borderleft";$k[$j++]=2;$k[$j++]="borderright";$k[$j++]=2;$k[$j++]="bordertop";$k[$j++]=2;$k[$j++]="borderbottom";$k[$j++]=2;$k[$j++]="opt";$k[$j++]=$_.options;var _Gi=$d();$k[$j++]=_Gi;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_pdf417compact(){var $__=$_;$_=Object.assign({},$_,bwipp_pdf417compact.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"compact",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_pdf417();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_micropdf417(){if(!bwipp_micropdf417.globals){var $__=$_;$_=bwipp_micropdf417.globals={};$_.micropdf417_t=0;$_.micropdf417_n=1;$_.micropdf417_b=2;$_.micropdf417_a=0;$_.micropdf417_l=1;$_.micropdf417_m=2;$_.micropdf417_p=3;$_.micropdf417_tl=-1;$_.micropdf417_nl=-2;$_.micropdf417_bl=-3;$_.micropdf417_bl6=-4;$_.micropdf417_bs=-5;$_.micropdf417_al=-6;$_.micropdf417_ll=-7;$_.micropdf417_ml=-8;$_.micropdf417_pl=-9;$_.micropdf417_as=-10;$_.micropdf417_ps=-11;$_.al=$_.micropdf417_al;$_.ll=$_.micropdf417_ll;$_.ml=$_.micropdf417_ml;$_.pl=$_.micropdf417_pl;$_.as=$_.micropdf417_as;$_.ps=$_.micropdf417_ps;$_.micropdf417_m05=-12;$_.micropdf417_m06=-13;$_.micropdf417_textsubmodes=$a([$_.micropdf417_a,$_.micropdf417_l,$_.micropdf417_m,$_.micropdf417_p]);$_.micropdf417_charmaps=$a([$a(["A","a","0",";"]),$a(["B","b","1","<"]),$a(["C","c","2",">"]),$a(["D","d","3","@"]),$a(["E","e","4","["]),$a(["F","f","5",92]),$a(["G","g","6","]"]),$a(["H","h","7","_"]),$a(["I","i","8","`"]),$a(["J","j","9","~"]),$a(["K","k","&","!"]),$a(["L","l",13,13]),$a(["M","m",9,9]),$a(["N","n",",",","]),$a(["O","o",":",":"]),$a(["P","p","#",10]),$a(["Q","q","-","-"]),$a(["R","r",".","."]),$a(["S","s","$","$"]),$a(["T","t","/","/"]),$a(["U","u","+",'"']),$a(["V","v","%","|"]),$a(["W","w","*","*"]),$a(["X","x","=",40]),$a(["Y","y","^",41]),$a(["Z","z",$_.pl,"?"]),$a([" "," "," ","{"]),$a([$_.ll,$_.as,$_.ll,"}"]),$a([$_.ml,$_.ml,$_.al,"'"]),$a([$_.ps,$_.ps,$_.ps,$_.al])]);$_.micropdf417_e=2e4;$_.e=$_.micropdf417_e;$_.micropdf417_latlen=$a([$a([0,1,1,2]),$a([2,0,1,2]),$a([1,1,0,1]),$a([1,2,2,0])]);$_.micropdf417_latseq=$a([$a([$a([]),$a([$_.ll]),$a([$_.ml]),$a([$_.ml,$_.pl])]),$a([$a([$_.ml,$_.al]),$a([]),$a([$_.ml]),$a([$_.ml,$_.pl])]),$a([$a([$_.al]),$a([$_.ll]),$a([]),$a([$_.pl])]),$a([$a([$_.al]),$a([$_.al,$_.ll]),$a([$_.al,$_.ml]),$a([])])]);$_.micropdf417_shftlen=$a([$a([$_.e,$_.e,$_.e,1]),$a([1,$_.e,$_.e,1]),$a([$_.e,$_.e,$_.e,1]),$a([$_.e,$_.e,$_.e,$_.e])]);$_.micropdf417_ccametrics=$a([$a([2,5,4,39,0,19]),$a([2,6,4,1,0,33]),$a([2,7,5,32,0,12]),$a([2,8,5,8,0,40]),$a([2,9,6,14,0,46]),$a([2,10,6,43,0,23]),$a([2,12,7,20,0,52]),$a([3,4,4,11,43,23]),$a([3,5,5,1,33,13]),$a([3,6,6,5,37,17]),$a([3,7,7,15,47,27]),$a([3,8,7,21,1,33]),$a([4,3,4,40,20,52]),$a([4,4,5,43,23,3]),$a([4,5,6,46,26,6]),$a([4,6,7,34,14,46]),$a([4,7,8,29,9,41])]);$_.micropdf417_nonccametrics=$a([$a([1,11,7,1,0,9]),$a([1,14,7,8,0,8]),$a([1,17,7,36,0,36]),$a([1,20,8,19,0,19]),$a([1,24,8,9,0,17]),$a([1,28,8,25,0,33]),$a([2,8,8,1,0,1]),$a([2,11,9,1,0,9]),$a([2,14,9,8,0,8]),$a([2,17,10,36,0,36]),$a([2,20,11,19,0,19]),$a([2,23,13,9,0,17]),$a([2,26,15,27,0,35]),$a([3,6,12,1,1,1]),$a([3,8,14,7,7,7]),$a([3,10,16,15,15,15]),$a([3,12,18,25,25,25]),$a([3,15,21,37,37,37]),$a([3,20,26,1,17,33]),$a([3,26,32,1,9,17]),$a([3,32,38,21,29,37]),$a([3,38,44,15,31,47]),$a([3,44,50,1,25,49]),$a([4,4,8,47,19,43]),$a([4,6,12,1,1,1]),$a([4,8,14,7,7,7]),$a([4,10,16,15,15,15]),$a([4,12,18,25,25,25]),$a([4,15,21,37,37,37]),$a([4,20,26,1,17,33]),$a([4,26,32,1,9,17]),$a([4,32,38,21,29,37]),$a([4,38,44,15,31,47]),$a([4,44,50,1,25,49])]);$_.micropdf417_clusters=$a([$a([120256,125680,128380,120032,125560,128318,108736,119920,108640,86080,108592,86048,110016,120560,125820,109792,120440,125758,88256,109680,88160,89536,110320,120700,89312,110200,120638,89200,110140,89840,110460,89720,110398,89980,128506,119520,125304,128190,107712,119408,125244,107616,119352,84032,107568,119324,84e3,107544,83984,108256,119672,125374,85184,108144,119612,85088,108088,119582,85040,108060,85728,108408,119742,85616,108348,85560,108318,85880,108478,85820,85790,107200,119152,125116,107104,119096,125086,83008,107056,119068,82976,107032,82960,82952,83648,107376,119228,83552,107320,119198,83504,107292,83480,83468,83824,107452,83768,107422,83740,83900,106848,118968,125022,82496,106800,118940,82464,106776,118926,82448,106764,82440,106758,82784,106936,119006,82736,106908,82712,106894,82700,82694,106974,82830,82240,106672,118876,82208,106648,118862,82192,106636,82184,106630,82180,82352,82328,82316,82080,118830,106572,106566,82050,117472,124280,127678,103616,117360,124220,103520,117304,124190,75840,103472,75808,104160,117624,124350,76992,104048,117564,76896,103992,76848,76824,77536,104312,117694,77424,104252,77368,77340,77688,104382,77628,77758,121536,126320,128700,121440,126264,128670,111680,121392,126236,111648,121368,126222,111632,121356,103104,117104,124092,112320,103008,117048,124062,112224,121656,126366,93248,74784,102936,117006,93216,112152,93200,75456,103280,117180,93888,75360,103224,117150,93792,112440,121758,93744,75288,93720,75632,103356,94064,75576,103326,94008,112542,93980,75708,94140,75678,94110,121184,126136,128606,111168,121136,126108,111136,121112,126094,111120,121100,111112,111108,102752,116920,123998,111456,102704,116892,91712,74272,121244,116878,91680,74256,102668,91664,111372,102662,74244,74592,102840,116958,92e3,74544,102812,91952,111516,102798,91928,74508,74502,74680,102878,92088,74652,92060,74638,92046,92126,110912,121008,126044,110880,120984,126030,110864,120972,110856,120966,110852,110850,74048,102576,116828,90944,74016,102552,116814,90912,111e3,121038,90896,73992,102534,90888,110982,90884,74160,102620,91056,74136,102606,91032,111054,91020,74118,91014,91100,91086,110752,120920,125998,110736,120908,110728,120902,110724,110722,73888,102488,116782,90528,73872,102476,90512,110796,102470,90504,73860,90500,73858,73944,90584,90572,90566,120876,120870,110658,102444,73800,90312,90308,90306,101056,116080,123580,100960,116024,70720,100912,115996,70688,100888,70672,70664,71360,101232,116156,71264,101176,116126,71216,101148,71192,71180,71536,101308,71480,101278,71452,71612,71582,118112,124600,127838,105024,118064,124572,104992,118040,124558,104976,118028,104968,118022,100704,115896,123486,105312,100656,115868,79424,70176,118172,115854,79392,105240,100620,79376,70152,79368,70496,100792,115934,79712,70448,118238,79664,105372,100750,79640,70412,79628,70584,100830,79800,70556,79772,70542,70622,79838,122176,126640,128860,122144,126616,128846,122128,126604,122120,126598,122116,104768,117936,124508,113472,104736,126684,124494,113440,122264,126670,113424,104712,117894,113416,122246,104706,69952,100528,115804,78656,69920,100504,115790,96064,78624,104856,117966,96032,113560,122318,100486,96016,78600,104838,96008,69890,70064,100572,78768,70040,100558,96176,78744,104910,96152,113614,70022,78726,70108,78812,70094,96220,78798,122016,126552,128814,122e3,126540,121992,126534,121988,121986,104608,117848,124462,113056,104592,126574,113040,122060,117830,113032,104580,113028,104578,113026,69792,100440,115758,78240,69776,100428,95136,78224,104652,100422,95120,113100,69764,95112,78212,69762,78210,69848,100462,78296,69836,95192,78284,69830,95180,78278,69870,95214,121936,126508,121928,126502,121924,121922,104528,117804,112848,104520,117798,112840,121958,112836,104514,112834,69712,100396,78032,69704,100390,94672,78024,104550,94664,112870,69698,94660,78018,94658,78060,94700,94694,126486,121890,117782,104484,104482,69672,77928,94440,69666,77922,99680,68160,99632,68128,99608,115342,68112,99596,68104,99590,68448,99768,115422,68400,99740,68376,99726,68364,68358,68536,99806,68508,68494,68574,101696,116400,123740,101664,116376,101648,116364,101640,116358,101636,67904,99504,115292,72512,67872,116444,115278,72480,101784,116430,72464,67848,99462,72456,101766,67842,68016,99548,72624,67992,99534,72600,101838,72588,67974,68060,72668,68046,72654,118432,124760,127918,118416,124748,118408,124742,118404,118402,101536,116312,105888,101520,116300,105872,118476,116294,105864,101508,105860,101506,105858,67744,99416,72096,67728,116334,80800,72080,101580,99398,80784,105932,67716,80776,72068,67714,72066,67800,99438,72152,67788,80856,72140,67782,80844,72134,67822,72174,80878,126800,128940,126792,128934,126788,126786,118352,124716,122576,126828,124710,122568,126822,122564,118338,122562,101456,116268,105680,101448,116262,114128,105672,118374,114120,122598,101442,114116,105666,114114,67664,99372,71888,67656,99366,80336,71880,101478,97232,80328,105702,67650,97224,114150,71874,97220,67692,71916,67686,80364,71910,97260,80358,97254,126760,128918,126756,126754,118312,124694,122472,126774,122468,118306,122466,101416,116246,105576,101412,113896,105572,101410,113892,105570,113890,67624,99350,71784,101430,80104,71780,67618,96744,80100,71778,96740,80098,96738,71798,96758,126738,122420,122418,105524,113780,113778,71732,79988,96500,96498,66880,66848,98968,66832,66824,66820,66992,66968,66956,66950,67036,67022,1e5,99984,115532,99976,115526,99972,99970,66720,98904,69024,100056,98892,69008,100044,69e3,100038,68996,66690,68994,66776,98926,69080,100078,69068,66758,69062,66798,69102,116560,116552,116548,116546,99920,102096,116588,115494,102088,116582,102084,99906,102082,66640,68816,66632,98854,73168,68808,66628,73160,68804,66626,73156,68802,66668,68844,66662,73196,68838,73190,124840,124836,124834,116520,118632,124854,118628,116514,118626,99880,115478,101992,116534,106216,101988,99874,106212,101986,106210,66600,98838,68712,99894,72936,68708,66594,81384,72932,68706,81380,72930,66614,68726,72950,81398,128980,128978,124820,126900,124818,126898,116500,118580,116498,122740,118578,122738,99860,101940,99858,106100,101938,114420]),$a([128352,129720,125504,128304,129692,125472,128280,129678,125456,128268,125448,128262,125444,125792,128440,129758,120384,125744,128412,120352,125720,128398,120336,125708,120328,125702,120324,120672,125880,128478,110144,120624,125852,110112,120600,125838,110096,120588,110088,120582,110084,110432,120760,125918,89664,110384,120732,89632,110360,120718,89616,110348,89608,110342,89952,110520,120798,89904,110492,89880,110478,89868,90040,110558,90012,89998,125248,128176,129628,125216,128152,129614,125200,128140,125192,128134,125188,125186,119616,125360,128220,119584,125336,128206,119568,125324,119560,125318,119556,119554,108352,119728,125404,108320,119704,125390,108304,119692,108296,119686,108292,108290,85824,108464,119772,85792,108440,119758,85776,108428,85768,108422,85764,85936,108508,85912,108494,85900,85894,85980,85966,125088,128088,129582,125072,128076,125064,128070,125060,125058,119200,125144,128110,119184,125132,119176,125126,119172,119170,107424,119256,125166,107408,119244,107400,119238,107396,107394,83872,107480,119278,83856,107468,83848,107462,83844,83842,83928,107502,83916,83910,83950,125008,128044,125e3,128038,124996,124994,118992,125036,118984,125030,118980,118978,106960,119020,106952,119014,106948,106946,82896,106988,82888,106982,82884,82882,82924,82918,124968,128022,124964,124962,118888,124982,118884,118882,106728,118902,106724,106722,82408,106742,82404,82402,124948,124946,118836,118834,106612,106610,124224,127664,129372,124192,127640,129358,124176,127628,124168,127622,124164,124162,117568,124336,127708,117536,124312,127694,117520,124300,117512,124294,117508,117506,104256,117680,124380,104224,117656,124366,104208,117644,104200,117638,104196,104194,77632,104368,117724,77600,104344,117710,77584,104332,77576,104326,77572,77744,104412,77720,104398,77708,77702,77788,77774,128672,129880,93168,128656,129868,92664,128648,129862,92412,128644,128642,124064,127576,129326,126368,124048,129902,126352,128716,127558,126344,124036,126340,124034,126338,117152,124120,127598,121760,117136,124108,121744,126412,124102,121736,117124,121732,117122,121730,103328,117208,124142,112544,103312,117196,112528,121804,117190,112520,103300,112516,103298,112514,75680,103384,117230,94112,75664,103372,94096,112588,103366,94088,75652,94084,75650,75736,103406,94168,75724,94156,75718,94150,75758,128592,129836,91640,128584,129830,91388,128580,91262,128578,123984,127532,126160,123976,127526,126152,128614,126148,123970,126146,116944,124012,121296,116936,124006,121288,126182,121284,116930,121282,102864,116972,111568,102856,116966,111560,121318,111556,102850,111554,74704,102892,92112,74696,102886,92104,111590,92100,74690,92098,74732,92140,74726,92134,128552,129814,90876,128548,90750,128546,123944,127510,126056,128566,126052,123938,126050,116840,123958,121064,116836,121060,116834,121058,102632,116854,111080,121078,111076,102626,111074,74216,102646,91112,74212,91108,74210,91106,74230,91126,128532,90494,128530,123924,126004,123922,126002,116788,120948,116786,120946,102516,110836,102514,110834,73972,90612,73970,90610,128522,123914,125978,116762,120890,102458,110714,123552,127320,129198,123536,127308,123528,127302,123524,123522,116128,123608,127342,116112,123596,116104,123590,116100,116098,101280,116184,123630,101264,116172,101256,116166,101252,101250,71584,101336,116206,71568,101324,71560,101318,71556,71554,71640,101358,71628,71622,71662,127824,129452,79352,127816,129446,79100,127812,78974,127810,123472,127276,124624,123464,127270,124616,127846,124612,123458,124610,115920,123500,118224,115912,123494,118216,124646,118212,115906,118210,100816,115948,105424,100808,115942,105416,118246,105412,100802,105410,70608,100844,79824,70600,100838,79816,105446,79812,70594,79810,70636,79852,70630,79846,129960,95728,113404,129956,95480,113278,129954,95356,95294,127784,129430,78588,128872,129974,95996,78462,128868,127778,95870,128866,123432,127254,124520,123428,126696,128886,123426,126692,124514,126690,115816,123446,117992,115812,122344,117988,115810,122340,117986,122338,100584,115830,104936,100580,113640,104932,100578,113636,104930,113634,70120,100598,78824,70116,96232,78820,70114,96228,78818,96226,70134,78838,129940,94968,113022,129938,94844,94782,127764,78206,128820,127762,95102,128818,123412,124468,123410,126580,124466,126578,115764,117876,115762,122100,117874,122098,100468,104692,100466,113140,104690,113138,69876,78324,69874,95220,78322,95218,129930,94588,94526,127754,128794,123402,124442,126522,115738,117818,121978,100410,104570,112890,69754,78074,94714,94398,123216,127148,123208,127142,123204,123202,115408,123244,115400,123238,115396,115394,99792,115436,99784,115430,99780,99778,68560,99820,68552,99814,68548,68546,68588,68582,127400,129238,72444,127396,72318,127394,123176,127126,123752,123172,123748,123170,123746,115304,123190,116456,115300,116452,115298,116450,99560,115318,101864,99556,101860,99554,101858,68072,99574,72680,68068,72676,68066,72674,68086,72694,129492,80632,105854,129490,80508,80446,127380,72062,127924,127378,80766,127922,123156,123700,123154,124788,123698,124786,115252,116340,115250,118516,116338,118514,99444,101620,99442,105972,101618,105970,67828,72180,67826,80884,72178,80882,97008,114044,96888,113982,96828,96798,129482,80252,130010,97148,80190,97086,127370,127898,128954,123146,123674,124730,126842,115226,116282,118394,122618,99386,101498,105722,114170,67706,71930,80378,96632,113854,96572,96542,80062,96702,96444,96414,96350,123048,123044,123042,115048,123062,115044,115042,99048,115062,99044,99042,67048,99062,67044,67042,67062,127188,68990,127186,123028,123316,123026,123314,114996,115572,114994,115570,98932,100084,98930,100082,66804,69108,66802,69106,129258,73084,73022,127178,127450,123018,123290,123834,114970,115514,116602,98874,99962,102138,66682,68858,73210,81272,106174,81212,81182,72894,81342,97648,114364,97592,114334,97564,97550,81084,97724,81054,97694,97464,114270,97436,97422,80990,97502,97372,97358,97326,114868,114866,98676,98674,66292,66290,123098,114842,115130,98618,99194,66170,67322,69310,73404,73374,81592,106334,81564,81550,73310,81630,97968,114524,97944,114510,97932,97926,81500,98012,81486,97998,97880,114478,97868,97862,81454,97902,97836,97830,69470,73564,73550,81752,106414,81740,81734,73518,81774,81708,81702]),$a([109536,120312,86976,109040,120060,86496,108792,119934,86256,108668,86136,129744,89056,110072,129736,88560,109820,129732,88312,109694,129730,88188,128464,129772,89592,128456,129766,89340,128452,89214,128450,125904,128492,125896,128486,125892,125890,120784,125932,120776,125926,120772,120770,110544,120812,110536,120806,110532,84928,108016,119548,84448,107768,119422,84208,107644,84088,107582,84028,129640,85488,108284,129636,85240,108158,129634,85116,85054,128232,129654,85756,128228,85630,128226,125416,128246,125412,125410,119784,125430,119780,119778,108520,119798,108516,108514,83424,107256,119166,83184,107132,83064,107070,83004,82974,129588,83704,107390,129586,83580,83518,128116,83838,128114,125172,125170,119284,119282,107508,107506,82672,106876,82552,106814,82492,82462,129562,82812,82750,128058,125050,119034,82296,106686,82236,82206,82366,82108,82078,76736,103920,117500,76256,103672,117374,76016,103548,75896,103486,75836,129384,77296,104188,129380,77048,104062,129378,76924,76862,127720,129398,77564,127716,77438,127714,124392,127734,124388,124386,117736,124406,117732,117730,104424,117750,104420,104418,112096,121592,126334,92608,111856,121468,92384,111736,121406,92272,111676,92216,111646,92188,75232,103160,117118,93664,74992,103036,93424,112252,102974,93304,74812,93244,74782,93214,129332,75512,103294,129908,129330,93944,75388,129906,93820,75326,93758,127604,75646,128756,127602,94078,128754,124148,126452,124146,126450,117236,121844,117234,121842,103412,103410,91584,111344,121212,91360,111224,121150,91248,111164,91192,111134,91164,91150,74480,102780,91888,74360,102718,91768,111422,91708,74270,91678,129306,74620,129850,92028,74558,91966,127546,128634,124026,126202,116986,121338,102906,90848,110968,121022,90736,110908,90680,110878,90652,90638,74104,102590,91e3,74044,90940,74014,90910,74174,91070,90480,110780,90424,110750,90396,90382,73916,90556,73886,90526,90296,110686,90268,90254,73822,90334,90204,90190,71136,101112,116094,70896,100988,70776,100926,70716,70686,129204,71416,101246,129202,71292,71230,127348,71550,127346,123636,123634,116212,116210,101364,101362,79296,105200,118140,79072,105080,118078,78960,105020,78904,104990,78876,78862,70384,100732,79600,70264,100670,79480,105278,79420,70174,79390,129178,70524,129466,79740,70462,79678,127290,127866,123514,124666,115962,118266,100858,113376,122232,126654,95424,113264,122172,95328,113208,122142,95280,113180,95256,113166,95244,78560,104824,117950,95968,78448,104764,95856,113468,104734,95800,78364,95772,78350,95758,70008,100542,78712,69948,96120,78652,69918,96060,78622,96030,70078,78782,96190,94912,113008,122044,94816,112952,122014,94768,112924,94744,112910,94732,94726,78192,104636,95088,78136,104606,95032,113054,95004,78094,94990,69820,78268,69790,95164,78238,95134,94560,112824,121950,94512,112796,94488,112782,94476,94470,78008,104542,94648,77980,94620,77966,94606,69726,78046,94686,94384,112732,94360,112718,94348,94342,77916,94428,77902,94414,94296,112686,94284,94278,77870,94318,94252,94246,68336,99708,68216,99646,68156,68126,68476,68414,127162,123258,115450,99834,72416,101752,116414,72304,101692,72248,101662,72220,72206,67960,99518,72568,67900,72508,67870,72478,68030,72638,80576,105840,118460,80480,105784,118430,80432,105756,80408,105742,80396,80390,72048,101564,80752,71992,101534,80696,71964,80668,71950,80654,67772,72124,67742,80828,72094,80798,114016,122552,126814,96832,113968,122524,96800,113944,122510,96784,113932,96776,113926,96772,80224,105656,118366,97120,80176,105628,97072,114076,105614,97048,80140,97036,80134,97030,71864,101470,80312,71836,97208,80284,71822,97180,80270,97166,67678,71902,80350,97246,96576,113840,122460,96544,113816,122446,96528,113804,96520,113798,96516,96514,80048,105564,96688,80024,105550,96664,113870,96652,80006,96646,71772,80092,71758,96732,80078,96718,96416,113752,122414,96400,113740,96392,113734,96388,96386,79960,105518,96472,79948,96460,79942,96454,71726,79982,96494,96336,113708,96328,113702,96324,96322,79916,96364,79910,96358,96296,113686,96292,96290,79894,96310,66936,99006,66876,66846,67006,68976,100028,68920,99998,68892,68878,66748,69052,66718,69022,73056,102072,116574,73008,102044,72984,102030,72972,72966,68792,99934,73144,68764,73116,68750,73102,66654,68830,73182,81216,106160,118620,81184,106136,118606,81168,106124,81160,106118,81156,81154,72880,101980,81328,72856,101966,81304,106190,81292,72838,81286,68700,72924,68686,81372,72910,81358,114336,122712,126894,114320,122700,114312,122694,114308,114306,81056,106072,118574,97696,81040,106060,97680,114380,106054,97672,81028,97668,81026,97666,72792,101934,81112,72780,97752,81100,72774,97740,81094,97734,68654,72814,81134,97774,114256,122668,114248,122662,114244,114242,80976,106028,97488,80968,106022,97480,114278,97476,80962,97474,72748,81004,72742,97516,80998,97510,114216,122646,114212,114210,80936,106006,97384,80932,97380,80930,97378,72726,80950,97398,114196,114194,80916,97332,80914,97330,66236,66206,67256,99166,67228,67214,66142,67294,69296,100188,69272,100174,69260,69254,67164,69340,67150,69326,73376,102232,116654,73360,102220,73352,102214,73348,73346,69208,100142,73432,102254,73420,69190,73414,67118,69230,73454,106320,118700,106312,118694,106308,106306,73296,102188,81616,106348,102182,81608,73284,81604,73282,81602,69164,73324,69158,81644,73318,81638,122792,126934,122788,122786,106280,118678,114536,106276,114532,106274,114530,73256,102166,81512,73252,98024,81508,73250,98020,81506,98018,69142,73270,81526,98038,122772,122770,106260,114484,106258,114482,73236,81460,73234,97908,81458,97906,122762,106250,114458,73226,81434,97850,66396,66382,67416,99246,67404,67398,66350,67438,69456,100268,69448,100262,69444,69442,67372,69484,67366,69478,102312,116694,102308,102306,69416,100246,73576,102326,73572,69410,73570,67350,69430,73590,118740,118738,102292,106420,102290,106418,69396,73524,69394,81780,73522,81778,118730,102282,106394,69386,73498,81722,66476,66470,67496,99286,67492,67490,66454,67510,100308,100306,67476,69556,67474,69554,116714])]);$_.micropdf417_raps=$a([$a([802,930,946,818,882,890,826,954,922,986,970,906,778,794,786,914,978,982,980,916,948,932,934,942,940,936,808,812,814,806,822,950,918,790,788,820,884,868,870,878,876,872,840,856,860,862,846,844,836,838,834,866]),$a([718,590,622,558,550,566,534,530,538,570,562,546,610,626,634,762,754,758,630,628,612,614,582,578,706,738,742,740,748,620,556,552,616,744,712,716,708,710,646,654,652,668,664,696,688,656,720,592,600,604,732,734])]);$_.micropdf417_rwids=$a([38,55,82,99]);$_.micropdf417_textencfuncs=$a(["enca","encl","encm","encp"]);$_.micropdf417_encfuncs=$a(["enct","encn","encb"]);$_.charvals=$a([new Map,new Map,new Map,new Map]);$_.alltext=new Map;for(var _2l=0,_2k=$_.micropdf417_charmaps.length-1;_2l<=_2k;_2l+=1){$_.i=_2l;$_.encs=$g($_.micropdf417_charmaps,$_.i);for(var _2o=0;_2o<=3;_2o+=1){$_.j=_2o;var _2r=$g($_.encs,$_.j);var _2s=$t(_2r);if($eq(_2s,"stringtype")){_2r=$g(_2r,0)}$p($g($_.charvals,$_.j),_2r,$_.i);$p($_.alltext,_2r,-1)}}$_.charvals=$_.charvals;$_.alltext=$_.alltext;$k[$j++]=Infinity;$k[$j++]=1;for(var _33=0;_33<928;_33++){var _34=$k[$j-1];$k[$j++]=_34*3%929}var _35=$a();$_.rsalog=_35;$_.rslog=$a(929);for(var _37=1;_37<=928;_37+=1){$p($_.rslog,$g($_.rsalog,_37),_37)}$_.rslog=$_.rslog;$_.micropdf417_rsprod=function(){var _3C=$k[$j-1];if(_3C!=0){var _3E=$k[$j-2];if(_3E!=0){var _3G=$k[--$j];var _3I=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_3G)+$g($_.rslog,_3I))%928)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.micropdf417_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _3O=0,_3P=$_.k;_3O<_3P;_3O++){$k[$j++]=0}$_.coeffs=$a();for(var _3S=1,_3R=$_.k;_3S<=_3R;_3S+=1){var _3T=$_.coeffs;$p(_3T,_3S,$g(_3T,_3S-1));$k[$j++]=$g($_.rsalog,_3S);for(var _3X=_3S-1;_3X>=1;_3X-=1){var _3Y=$_.coeffs;var _3a=$k[$j-1];$k[$j++]=_3Y;$k[$j++]=_3X;$k[$j++]=$g(_3Y,_3X);$k[$j++]=_3a;$_.micropdf417_rsprod();var _3c=$k[--$j];var _3d=$k[--$j];var _3f=$k[--$j];$p(_3f,_3d,$f(_3c+$g($_.coeffs,_3d-1))%929)}var _3g=$_.coeffs;var _3i=$k[$j-1];$k[$j++]=_3g;$k[$j++]=0;$k[$j++]=$g(_3g,0);$k[$j++]=_3i;$_.micropdf417_rsprod();var _3j=$k[--$j];var _3k=$k[--$j];var _3l=$k[--$j];$p(_3l,_3k,_3j);$j--}$_.coeffs=$G($_.coeffs,0,$_.coeffs.length-1);for(var _3q=$_.coeffs.length-1;_3q>=0;_3q-=2){var _3r=$_.coeffs;$p(_3r,_3q,929-$g(_3r,_3q))}$k[$j++]=$_.coeffs};$_.micropdf417_coeffscachemax=20;$_.micropdf417_coeffscachelimit=359;$k[$j++]=$_.micropdf417_coeffscachemax;$k[$j++]=$_.micropdf417_coeffscachelimit;bwipp_fifocache();var _3w=$k[--$j];$_.micropdf417_coeffscache=_3w;$_.micropdf417_coeffscachefetch=function(){var _3x=$k[--$j];$_.k=_3x;var _3z=$g($_.micropdf417_coeffscache,"fetch");$k[$j++]=$_.k;$k[$j++]=function(){$_.micropdf417_gencoeffs()};$k[$j++]=function(){var _40=$k[--$j];$k[$j++]=_40.length};if(_3z()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_micropdf417.globals);$_.dontdraw=false;$_.version="unset";$_.columns=0;$_.rows=0;$_.rowmult=2;$_.cca=false;$_.ccb=false;$_.raw=false;$_.parse=false;$_.parsefnc=false;$_.modunit=1;bwipp_processoptions();var _41=$k[--$j];$_.options=_41;var _42=$k[--$j];$_.barcode=_42;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.micropdf417emptyData#24035";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>5e3){$k[$j++]="bwipp.micropdf417inputTooLong#24039";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.rowmult<=0||$_.rowmult>50){$k[$j++]="bwipp.micropdf417badRowMult#24043";$k[$j++]="The row multiplier must be greater than 0 and at most 50";bwipp_raiseerror()}if($_.cca&&$_.ccb||($_.cca&&$_.raw||$_.ccb&&$_.raw)){$k[$j++]="bwipp.micropdf417ccaAndCcb#24047";$k[$j++]="Cannot combine cca, ccb and raw";bwipp_raiseerror()}if($ne($_.version,"unset")){$X($_.version,"x");var _4H=$k[--$j];if(_4H){var _4I=$k[--$j];$k[$j-1]=_4I;var _4K=$k[$j-1];var _4L=$k[$j-2];var _4M=$a(2);$k[$j++]=_4L;$k[$j++]=_4K;$as(_4M);var _4N=$k[--$j];$F(_4N,function(){var _4O=$k[$j-1];var _4P=true;if(_4O.length==0){_4P=false}var _4Q=$k[--$j];$k[$j++]=_4P;$F(_4Q,function(){var _4R=$k[--$j];if(_4R<48||_4R>57){$k[$j-1]=false}});var _4S=$k[--$j];if(!_4S){$j-=2;$k[$j++]="bwipp.micropdf417BadVersionBadRowOrColumn#24063";$k[$j++]="version must be formatted as RxC";bwipp_raiseerror()}});var _4T=$k[--$j];$_.rows=$i(_4T);var _4U=$k[--$j];$_.columns=$i(_4U)}else{$k[$j-1]="bwipp.micropdf417badVersionFormat#24069";$k[$j++]="version must be formatted as RxC";bwipp_raiseerror()}}if($_.raw||$_.cca){$_.datcws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _4g=$G($_.barcode,$_.i+1,3);$k[$j++]=_4g;$k[$j++]=false;for(var _4h=0,_4i=_4g.length;_4h<_4i;_4h++){var _4j=$g(_4g,_4h);if(_4j<48||_4j>57){$k[$j-1]=true}}var _4k=$k[--$j];if(_4k){$j--;break}var _4l=$k[--$j];$_.cw=$i(_4l);if($_.cw>928){$k[$j++]="bwipp.micropdf417badRawCodeword#24089";$k[$j++]="Raw codewords must be 0 to 928";bwipp_raiseerror()}$p($_.datcws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.micropdf417badCcaRawFormat#24096";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.datcws=$G($_.datcws,0,$_.j)}$_.encb=function(){var _4x=$k[--$j];$_.in=_4x;$_.inlen=$_.in.length;$_.out=$a(~~($_.inlen/6)*5+$_.inlen%6);for(var _54=0,_53=~~($_.inlen/6)-1;_54<=_53;_54+=1){$_.k=_54;$k[$j++]=Infinity;$q($G($_.in,$_.k*6,3));$_.msbs=$a();$k[$j++]=Infinity;$q($_.msbs);var _59=$k[--$j];var _5A=$k[--$j];var _5B=$k[--$j];$k[$j++]=$f(_59+_5A*256+_5B*65536);for(var _5C=0;_5C<3;_5C++){var _5D=$k[--$j];$k[$j++]=_5D%900;$k[$j++]=~~(_5D/900)}$_.mscs=$a();$k[$j++]=Infinity;$q($G($_.in,$_.k*6+3,3));$_.lsbs=$a();$k[$j++]=Infinity;$q($_.lsbs);var _5I=$k[--$j];var _5J=$k[--$j];var _5K=$k[--$j];$k[$j++]=$f(_5I+_5J*256+_5K*65536);for(var _5L=0;_5L<3;_5L++){var _5M=$k[--$j];$k[$j++]=_5M%900;$k[$j++]=~~(_5M/900)}$_.lscs=$a();var _5O=$g($_.lscs,0);var _5Q=$g($_.mscs,0);$p($_.out,$_.k*5+4,$f(_5O+_5Q*316)%900);var _5U=$g($_.lscs,1);var _5W=$g($_.mscs,0);var _5Y=$g($_.mscs,1);$p($_.out,$_.k*5+3,$f(~~((_5O+_5Q*316)/900)+_5U+_5W*641+_5Y*316)%900);var _5c=$g($_.lscs,2);var _5e=$g($_.mscs,0);var _5g=$g($_.mscs,1);var _5i=$g($_.mscs,2);$p($_.out,$_.k*5+2,$f(~~((~~((_5O+_5Q*316)/900)+_5U+_5W*641+_5Y*316)/900)+_5c+_5e*20+_5g*641+_5i*316)%900);var _5m=$g($_.lscs,3);var _5o=$g($_.mscs,1);var _5q=$g($_.mscs,2);$p($_.out,$_.k*5+1,$f(~~((~~((~~((_5O+_5Q*316)/900)+_5U+_5W*641+_5Y*316)/900)+_5c+_5e*20+_5g*641+_5i*316)/900)+_5m+_5o*20+_5q*641)%900);$p($_.out,$_.k*5,$f(~~((~~((~~((~~((_5O+_5Q*316)/900)+_5U+_5W*641+_5Y*316)/900)+_5c+_5e*20+_5g*641+_5i*316)/900)+_5m+_5o*20+_5q*641)/900)+$g($_.mscs,2)*20)%900)}$_.rem=$_.inlen%6;if($_.rem!=0){var _69=$_.out;var _68=$_.out.length-$_.rem;$k[$j++]=Infinity;$q($G($_.in,$_.inlen-$_.rem,$_.rem));var _67=$a();$P(_69,_68,_67)}$k[$j++]=$_.out};if($_.ccb){$_.barlen=$_.barcode.length;$_.datcws=$a(~~($_.barlen/6)*5+$_.barlen%6+2);$p($_.datcws,0,920);var _6J=$_.barlen%6==0?924:901;$p($_.datcws,1,_6J);$k[$j++]=$_.datcws;$k[$j++]=2;$k[$j++]=Infinity;$F($_.barcode);var _6M=$a();$k[$j++]=_6M;$_.encb();var _6N=$k[--$j];var _6O=$k[--$j];var _6P=$k[--$j];$P(_6P,_6O,_6N)}if(!$_.raw&&!$_.cca&&!$_.ccb){$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _6X=$k[--$j];$_.msg=_6X;$_.msglen=$_.msg.length;if($_.msglen>=9){$q($G($_.msg,0,7));var _6c=$k[--$j];$j--;var _6e=_6c==29;var _6f=$k[--$j];var _6g=$k[--$j];var _6h=$k[--$j];var _6i=$k[--$j];var _6j=$k[--$j];if(_6e&&_6f==48&&_6g==30&&_6h==62&&_6i==41&&_6j==91){$q($G($_.msg,$_.msglen-2,2));var _6n=$k[--$j];var _6o=$k[--$j];if(_6n==4&&_6o==30){if($g($_.msg,5)==53){$k[$j++]=Infinity;$k[$j++]=$_.micropdf417_m05;$q($G($_.msg,7,$_.msg.length-9));$_.msg=$a()}else{if($g($_.msg,5)==54){$k[$j++]=Infinity;$k[$j++]=$_.micropdf417_m06;$q($G($_.msg,7,$_.msg.length-9));$_.msg=$a()}}}}}$_.msglen=$_.msg.length;$k[$j++]=Infinity;for(var _71=0,_72=$_.msglen;_71<_72;_71++){$k[$j++]=0}$k[$j++]=0;$_.numdigits=$a();$k[$j++]=Infinity;for(var _74=0,_75=$_.msglen;_74<_75;_74++){$k[$j++]=0}$k[$j++]=0;$_.numtext=$a();$k[$j++]=Infinity;for(var _77=0,_78=$_.msglen;_77<_78;_77++){$k[$j++]=0}$k[$j++]=0;$_.numbytes=$a();$k[$j++]=Infinity;for(var _7A=0,_7B=$_.msglen;_7A<_7B;_7A++){$k[$j++]=0}$_.iseci=$a();for(var _7D=$_.msglen-1;_7D>=0;_7D-=1){$_.i=_7D;var _7G=$g($_.msg,$_.i);if(_7G>=48&&_7G<=57){$p($_.numdigits,$_.i,$g($_.numdigits,$_.i+1)+1)}if($has($_.alltext,$g($_.msg,$_.i))&&$g($_.numdigits,$_.i)<13){$p($_.numtext,$_.i,$g($_.numtext,$_.i+1)+1)}if($g($_.msg,$_.i)>=0&&$g($_.numtext,$_.i)<5&&$g($_.numdigits,$_.i)<13){$p($_.numbytes,$_.i,$g($_.numbytes,$_.i+1)+1)}$p($_.iseci,$_.i,$g($_.msg,$_.i)<=-1e6)}$_.numdigits=$G($_.numdigits,0,$_.msglen);$_.numtext=$G($_.numtext,0,$_.msglen);$_.numbytes=$G($_.numbytes,0,$_.msglen);$k[$j++]=Infinity;$_.seqlen=0;$_.state=$_.micropdf417_b;$_.p=0;for(;;){if($_.p==$_.msglen){break}var _86=$g($_.msg,$_.p);if($_.p==0&&(_86==$_.micropdf417_m05||_86==$_.micropdf417_m06)){if($g($_.msg,$_.p)==$_.micropdf417_m05){$k[$j++]=$_.micropdf417_m05}else{$k[$j++]=$_.micropdf417_m06}$_.p=$_.p+1;$_.seqlen=$_.seqlen+1}else{if($g($_.iseci,$_.p)){$_.eci=$g($_.msg,$_.p);$_.p=$_.p+1;$k[$j++]=$a([$_.eci]);var _8Q=$_.seqlen;var _8P=$_.eci<=-1810900?2:$_.eci<=-1000900?3:2;$_.seqlen=$f(_8Q+_8P)}else{$_.n=$g($_.numdigits,$_.p);if($_.n>=13||$_.n==$_.msglen&&$_.n>=8){$k[$j++]=$_.micropdf417_nl;$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.n));var _8d=$a();$_.state=$_.micropdf417_n;$_.p=$f($_.p+$_.n);$_.seqlen=$f($_.seqlen+1+$_.n);$k[$j++]=_8d}else{$_.t=$g($_.numtext,$_.p);if($_.t>=5){if($_.state!=$_.micropdf417_t){$k[$j++]=$_.micropdf417_tl}$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.t));var _8r=$a();$_.state=$_.micropdf417_t;$_.p=$f($_.p+$_.t);$_.seqlen=$f($_.seqlen+1+$_.t);$k[$j++]=_8r}else{$_.b=$g($_.numbytes,$_.p);if($_.b==1&&$_.state==$_.micropdf417_t){$_.p=$f($_.p+$_.b);$_.seqlen=$_.seqlen+2;$k[$j++]=$_.micropdf417_bs;$k[$j++]=$a([$g($_.msg,$_.p)])}else{if($_.b%6!=0){$k[$j++]=$_.micropdf417_bl}else{$k[$j++]=$_.micropdf417_bl6}$k[$j++]=Infinity;$q($G($_.msg,$_.p,$_.b));var _9D=$a();$_.state=$_.micropdf417_b;$_.p=$f($_.p+$_.b);$_.seqlen=$f($_.seqlen+1+$_.b);$k[$j++]=_9D}}}}}}$as($a($m()));var _9K=$k[--$j];$j--;$_.seq=_9K;$k[$j++]=Infinity;$k[$j++]=$_.micropdf417_tl;$k[$j++]=900;$k[$j++]=$_.micropdf417_bl;$k[$j++]=901;$k[$j++]=$_.micropdf417_bl6;$k[$j++]=924;$k[$j++]=$_.micropdf417_nl;$k[$j++]=902;$k[$j++]=$_.micropdf417_bs;$k[$j++]=913;$k[$j++]=$_.micropdf417_m05;$k[$j++]=916;$k[$j++]=$_.micropdf417_m06;$k[$j++]=917;$_.latchcws=$d();$_.enca=function(){var _9P=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.micropdf417_a),_9P)};$_.encl=function(){var _9T=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.micropdf417_l),_9T)};$_.encm=function(){var _9X=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.micropdf417_m),_9X)};$_.encp=function(){var _9b=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.micropdf417_p),_9b)};$_.textencfuncs=$_.micropdf417_textencfuncs;$_.addtotext=function(){var _9e=$k[--$j];$p($_.text,$_.l,_9e);$_.l=$_.l+1};$_.enct=function(){var _9h=$k[--$j];$_.in=_9h;$_.maxseqlen=$_.in.length*3+4;$k[$j++]=Infinity;for(var _9j=0;_9j<4;_9j++){$k[$j++]=$a($_.maxseqlen)}$_.seq0=$a();$k[$j++]=Infinity;for(var _9m=0;_9m<4;_9m++){$k[$j++]=$a($_.maxseqlen)}$_.seq1=$a();$_.len0=$a(4);$p($_.len0,0,0);$p($_.len0,1,0);$p($_.len0,2,0);$p($_.len0,3,0);$_.len1=$a(4);$_.curseq=$_.seq0;$_.curseqlen=$_.len0;$_.nxtseq=$_.seq1;$_.nxtseqlen=$_.len1;$_.curlen=$a([$_.micropdf417_e,$_.micropdf417_e,$_.micropdf417_e,$_.micropdf417_e]);$p($_.curlen,$_.submode,0);$F($_.in,function(){var _A2=$k[--$j];$_.char=_A2;for(;;){$_.imp=false;for(var _A3=0,_A4=$_.micropdf417_textsubmodes.length;_A3<_A4;_A3++){$_.x=$g($_.micropdf417_textsubmodes,_A3);for(var _A6=0,_A7=$_.micropdf417_textsubmodes.length;_A6<_A7;_A6++){$_.y=$g($_.micropdf417_textsubmodes,_A6);$_.cost=$f($g($_.curlen,$_.x)+$g($g($_.micropdf417_latlen,$_.x),$_.y));if($_.cost<$g($_.curlen,$_.y)){$p($_.curlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.curseq,$_.y),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$F($g($g($_.micropdf417_latseq,$_.x),$_.y),function(){$k[$j++]=$g($_.curseq,$_.y);$k[$j++]=$_.srclen;var _Ah=$k[$j-3];var _Ai=$k[$j-1];var _Aj=$k[$j-2];$j-=3;$p(_Aj,_Ai,_Ah);$_.srclen=$_.srclen+1});$p($_.curseqlen,$_.y,$_.srclen);$_.imp=true}}}if(!$_.imp){break}}$_.nxtlen=$a([$_.micropdf417_e,$_.micropdf417_e,$_.micropdf417_e,$_.micropdf417_e]);$p($_.nxtseqlen,0,0);$p($_.nxtseqlen,1,0);$p($_.nxtseqlen,2,0);$p($_.nxtseqlen,3,0);for(var _At=0,_Au=$_.micropdf417_textsubmodes.length;_At<_Au;_At++){$_.x=$g($_.micropdf417_textsubmodes,_At);for(;;){if(!$has($g($_.charvals,$_.x),$_.char)){break}$_.cost=$g($_.curlen,$_.x)+1;if($_.cost<$g($_.nxtlen,$_.x)){$p($_.nxtlen,$_.x,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.nxtseq,$_.x),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$p($g($_.nxtseq,$_.x),$_.srclen,$_.char);$p($_.nxtseqlen,$_.x,$_.srclen+1)}for(var _BV=0,_BW=$_.micropdf417_textsubmodes.length;_BV<_BW;_BV++){$_.y=$g($_.micropdf417_textsubmodes,_BV);if($ne($_.x,$_.y)){$_.cost=$f($g($_.curlen,$_.y)+$g($g($_.micropdf417_shftlen,$_.y),$_.x))+1;if($_.cost<$g($_.nxtlen,$_.y)){$p($_.nxtlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.y);if($_.srclen>0){$P($g($_.nxtseq,$_.y),0,$G($g($_.curseq,$_.y),0,$_.srclen))}var _C7=$g($_.nxtseq,$_.y);var _C6=$_.srclen;var _C5=$_.x==$_.micropdf417_a?$_.micropdf417_as:$_.micropdf417_ps;$p(_C7,_C6,_C5);$p($g($_.nxtseq,$_.y),$_.srclen+1,$_.char);$p($_.nxtseqlen,$_.y,$_.srclen+2)}}}break}}$_.curlen=$_.nxtlen;var _CH=$_.curseq;$_.curseq=$_.nxtseq;$_.nxtseq=_CH;var _CJ=$_.curseqlen;$_.curseqlen=$_.nxtseqlen;$_.nxtseqlen=_CJ});$_.minseq=$_.micropdf417_e;for(var _CL=0,_CM=$_.micropdf417_textsubmodes.length;_CL<_CM;_CL++){$_.k=$g($_.micropdf417_textsubmodes,_CL);if($g($_.curlen,$_.k)<$_.minseq){$_.minseq=$g($_.curlen,$_.k);$_.txtseq=$G($g($_.curseq,$_.k),0,$g($_.curseqlen,$_.k))}}$_.text=$a($_.minseq);$_.k=0;$_.l=0;for(;;){if($_.k>=$_.txtseq.length){break}$_.char=$g($_.txtseq,$_.k);var _Cn=$_[$g($_.textencfuncs,$_.submode)];$k[$j++]=$_.char;if(_Cn()===true){break}$_.addtotext();$_.k=$_.k+1;if($_.char==$_.micropdf417_as||$_.char==$_.micropdf417_ps){$k[$j++]=$g($_.txtseq,$_.k);if($_.char==$_.micropdf417_as){$_.enca()}else{$_.encp()}$_.addtotext();$_.k=$_.k+1}if($_.char==$_.micropdf417_al){$_.submode=$_.micropdf417_a}if($_.char==$_.micropdf417_ll){$_.submode=$_.micropdf417_l}if($_.char==$_.micropdf417_ml){$_.submode=$_.micropdf417_m}if($_.char==$_.micropdf417_pl){$_.submode=$_.micropdf417_p}}if($_.text.length%2==1){if($_.submode==$_.micropdf417_p){$k[$j++]="pad";$k[$j++]=$_.micropdf417_al;$_.encp();var _D2=$k[--$j];var _D3=$k[--$j];$_[_D3]=_D2;$_.submode=$_.micropdf417_a}else{$_.nextecitext=false;for(var _D7=$_.i+1,_D6=$_.seq.length-1;_D7<=_D6;_D7+=1){$_.ti=_D7;if($ne($t($g($_.seq,$_.ti)),"arraytype")){$_.nextecitext=false;break}if($g($g($_.seq,$_.ti),0)>-1e6){break}$_.nextecitext=true}if($_.nextecitext){if($_.submode==$_.micropdf417_a){if($has($g($_.charvals,$_.micropdf417_l),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.micropdf417_ll;$_.enca();var _DP=$k[--$j];var _DQ=$k[--$j];$_[_DQ]=_DP;$_.submode=$_.micropdf417_l}else{$k[$j++]="pad";$k[$j++]=$_.micropdf417_ml;$_.enca();var _DR=$k[--$j];var _DS=$k[--$j];$_[_DS]=_DR;$_.submode=$_.micropdf417_m}}else{if($_.submode==$_.micropdf417_m){if($has($g($_.charvals,$_.micropdf417_l),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.micropdf417_ll;$_.encm();var _Db=$k[--$j];var _Dc=$k[--$j];$_[_Dc]=_Db;$_.submode=$_.micropdf417_l}else{if($has($g($_.charvals,$_.micropdf417_p),$g($g($_.seq,$_.ti),0))){$k[$j++]="pad";$k[$j++]=$_.micropdf417_pl;$_.encm();var _Dk=$k[--$j];var _Dl=$k[--$j];$_[_Dl]=_Dk;$_.submode=$_.micropdf417_p}else{$k[$j++]="pad";$k[$j++]=$_.micropdf417_al;$_.encm();var _Dm=$k[--$j];var _Dn=$k[--$j];$_[_Dn]=_Dm;$_.submode=$_.micropdf417_a}}}else{$k[$j++]="pad";$k[$j++]=$_.micropdf417_ml;$_.encl();var _Do=$k[--$j];var _Dp=$k[--$j];$_[_Dp]=_Do;$_.submode=$_.micropdf417_m}}}else{var _Dt=$_[$g($_.textencfuncs,$_.submode)];$k[$j++]="pad";$k[$j++]=$_.micropdf417_ps;if(_Dt()===true){return true}var _Du=$k[--$j];var _Dv=$k[--$j];$_[_Dv]=_Du}}$k[$j++]=Infinity;$q($_.text);$k[$j++]=$_.pad;$_.text=$a()}$_.out=$a(~~($_.text.length/2));for(var _E2=0,_E1=$_.out.length-1;_E2<=_E1;_E2+=1){$_.k=_E2;$p($_.out,$_.k,$f($g($_.text,$_.k*2)*30+$g($_.text,$_.k*2+1)))}$k[$j++]=$_.out};$_.encn=function(){var _EC=$k[--$j];$_.in=_EC;$k[$j++]=Infinity;for(var _EF=0,_EE=$_.in.length-1;_EF<=_EE;_EF+=44){$_.k=_EF;$k[$j++]=Infinity;var _EK=$_.in.length-$_.k;$k[$j++]=1;var _EN=$_.in;var _EM=$_.k;if(_EK>44){_EK=44}var _EO=$G(_EN,_EM,_EK);for(var _EP=0,_EQ=_EO.length;_EP<_EQ;_EP++){$k[$j++]=$g(_EO,_EP)-48}$_.gmod=$a();$_.cwn=$a(15);$_.cwi=15;for(;;){$_.dv=900;$_.val=0;$_.gmulstart=true;$k[$j++]=Infinity;for(;;){if($_.gmod.length==0){break}$_.val=$f($_.val*10+$g($_.gmod,0));$_.gmod=$G($_.gmod,1,$_.gmod.length-1);if($_.val<$_.dv){if(!$_.gmulstart){$k[$j++]=0}}else{$_.gmulstart=false;$k[$j++]=~~($_.val/$_.dv)}$_.val=$_.val%$_.dv}$as($a($m()));var _Ej=$k[--$j];$j--;$_.dv=$_.val;$_.cwi=$_.cwi-1;$p($_.cwn,$_.cwi,$_.dv);$_.gmod=_Ej;if($_.gmod.length==0){break}}$q($G($_.cwn,$_.cwi,15-$_.cwi))}$as($a($m()));var _Ey=$k[--$j];$k[$j-1]=_Ey};$_.ence=function(){var _F0=$k[--$j];var _F2=-$g(_F0,0)-1e6;$k[$j++]=_F2;if(_F2<=899){var _F3=$k[--$j];var _F4=$a(2);$k[$j++]=927;$k[$j++]=_F3;$as(_F4)}else{var _F5=$k[$j-1];if(_F5<=810899){var _F6=$k[--$j];var _F7=$a(3);$k[$j++]=926;$k[$j++]=~~(_F6/900)-1;$k[$j++]=_F6%900;$as(_F7)}else{var _F8=$k[$j-1];if(_F8<=811799){var _F9=$k[--$j];var _FA=$a(2);$k[$j++]=925;$k[$j++]=_F9-810900;$as(_FA)}else{$k[$j-1]="bwipp.pdf417badECI#24539";$k[$j++]="PDF417 supports ECIs 000000 to 811799";bwipp_raiseerror()}}}};$_.encfuncs=$_.micropdf417_encfuncs;$_.addtocws=function(){var _FB=$k[--$j];$P($_.datcws,$_.j,_FB);$_.j=_FB.length+$_.j};$_.datcws=$a($_.seqlen);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.seq.length){break}$_.chars=$g($_.seq,$_.i);if($eq($t($_.chars),"arraytype")){if($g($_.chars,0)<=-1e6){$k[$j++]=$_.chars;$_.ence();$_.addtocws()}else{var _FV=$_[$g($_.encfuncs,$_.state)];$k[$j++]=$_.chars;if(_FV()===true){break}$_.addtocws()}}else{$k[$j++]=$a([$g($_.latchcws,$_.chars)]);$_.addtocws();if($_.chars==$_.micropdf417_tl){$_.state=$_.micropdf417_t;$_.submode=$_.micropdf417_a}if($_.chars==$_.micropdf417_nl){$_.state=$_.micropdf417_n}if($_.chars==$_.micropdf417_bl||$_.chars==$_.micropdf417_bl6){$_.state=$_.micropdf417_b}if($_.chars==$_.micropdf417_bs){$_.i=$_.i+1;$k[$j++]=$g($_.seq,$_.i);$_.encb();$_.addtocws()}if($_.chars==$_.micropdf417_m05){if($_.i+1<$_.seq.length){if($g($_.seq,$_.i+1)==$_.micropdf417_nl){$_.i=$_.i+1}}$_.state=$_.micropdf417_n}if($_.chars==$_.micropdf417_m06){if($_.i+1<$_.seq.length){if($g($_.seq,$_.i+1)==$_.micropdf417_tl){$_.i=$_.i+1}}$_.state=$_.micropdf417_t;$_.submode=$_.micropdf417_m}}$_.i=$_.i+1}$_.datcws=$G($_.datcws,0,$_.j)}$_.urows=$_.rows;$_.ucols=$_.columns;var _G4=$_.cca?$_.micropdf417_ccametrics:$_.micropdf417_nonccametrics;$_.metrics=_G4;$F($_.metrics,function(){var _G7=$k[--$j];$_.m=_G7;$_.c=$g($_.m,0);$_.r=$g($_.m,1);$_.k=$g($_.m,2);$_.rapl=$g($_.m,3);$_.rapc=$g($_.m,4);$_.rapr=$g($_.m,5);$_.ncws=$f($_.r*$_.c-$_.k);$_.okay=true;if($_.datcws.length>$_.ncws){$_.okay=false}if($_.urows!=0&&$_.urows!=$_.r){$_.okay=false}if($_.ucols!=0&&$_.ucols!=$_.c){$_.okay=false}if($_.okay){return true}});if(!$_.okay){$k[$j++]="bwipp.micropdf417noValidSymbol#24625";$k[$j++]="Maximum length exceeded or invalid size";bwipp_raiseerror()}$k[$j++]="coeffs";$k[$j++]=$_.k;$_.micropdf417_coeffscachefetch();var _GY=$k[--$j];var _GZ=$k[--$j];$_[_GZ]=_GY;$_.m=$_.datcws.length;$_.n=$f($_.c*$_.r-$_.k);$_.cws=$a($_.c*$_.r);$P($_.cws,0,$_.datcws);var _Gr=$_.cws;var _Gq=$_.m;var _Gp=[];for(var _Gn=0,_Go=$f($_.n-$_.m);_Gn<_Go;_Gn++){_Gp[_Gn]=900}_Gp=$a(_Gp);$P(_Gr,_Gq,_Gp);if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#24650";$k[$j++]=$G($_.cws,0,$_.n);bwipp_raiseerror()}var _Gx=$_.n;var _Gy=$_.coeffs;var _Gz=$_.k;var _H3=$G($_.cws,$_.n,$_.k);$k[$j++]=function(){var _H5=$k[--$j];$k[$j++]=$g($_.cws,_H5)};$k[$j++]=_Gx;$k[$j++]=_Gy;$k[$j++]=_Gz;$k[$j++]=_H3;$k[$j++]=929;bwipp_rsecprime();if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#24659";$k[$j++]=$G($_.cws,$_.n,$_.k);bwipp_raiseerror()}$_.cwtobits=function(){var _HD=$k[--$j];var _HF=$k[--$j];$_.v=$g($g($_.micropdf417_clusters,_HD),_HF);$k[$j++]=Infinity;for(var _HH=0;_HH<17;_HH++){$k[$j++]=0}var _HK=$R($s(17),$_.v,2);for(var _HL=0,_HM=_HK.length;_HL<_HM;_HL++){$k[$j++]=$g(_HK,_HL)-48}var _HO=$a();$k[$j++]=$G(_HO,_HO.length-17,17)};$_.raptobits=function(){var _HQ=$k[--$j];var _HS=$k[--$j];$_.v=$g($g($_.micropdf417_raps,_HQ),_HS);$k[$j++]=Infinity;for(var _HU=0;_HU<10;_HU++){$k[$j++]=0}var _HX=$R($s(10),$_.v,2);for(var _HY=0,_HZ=_HX.length;_HY<_HZ;_HY++){$k[$j++]=$g(_HX,_HY)-48}var _Hb=$a();$k[$j++]=$G(_Hb,_Hb.length-10,10)};$_.rwid=$g($_.micropdf417_rwids,$_.c-1);if($_.c==3&&$_.cca){$_.rwid=72}$k[$j++]=$_.rwid*$_.r;try{var _Hj=$k[--$j];$k[$j++]=$a(_Hj);var _Hl=false}catch(e){$k[$j++]=true}if(_Hl){$k[$j-1]="bwipp.micropdf417PixsTooLarge#24689";$k[$j++]="The resulting symbol exceeds the implementation maximum array size";bwipp_raiseerror()}var _Hm=$k[--$j];$_.pixs=_Hm;for(var _Hp=0,_Ho=$_.r-1;_Hp<=_Ho;_Hp+=1){$_.i=_Hp;$_.clst=($f($_.i+$_.rapl)-1)%3;var _JK=$_.pixs;var _JJ=$_.i*$_.rwid;$k[$j++]=Infinity;if($_.c==1){$k[$j++]=($f($_.i+$_.rapl)-1)%52;$k[$j++]=0;$_.raptobits();var _Hy=$k[--$j];$q(_Hy);$k[$j++]=$g($_.cws,$_.i);$k[$j++]=$_.clst;$_.cwtobits();var _I3=$k[--$j];$q(_I3);$k[$j++]=($f($_.i+$_.rapr)-1)%52;$k[$j++]=0;$_.raptobits();var _I6=$k[--$j];$q(_I6)}if($_.c==2){$k[$j++]=($f($_.i+$_.rapl)-1)%52;$k[$j++]=0;$_.raptobits();var _IA=$k[--$j];$q(_IA);$k[$j++]=$g($_.cws,$_.i*2);$k[$j++]=$_.clst;$_.cwtobits();var _IF=$k[--$j];$q(_IF);$k[$j++]=$g($_.cws,$_.i*2+1);$k[$j++]=$_.clst;$_.cwtobits();var _IK=$k[--$j];$q(_IK);$k[$j++]=($f($_.i+$_.rapr)-1)%52;$k[$j++]=0;$_.raptobits();var _IN=$k[--$j];$q(_IN)}if($_.c==3){if(!$_.cca){$k[$j++]=($f($_.i+$_.rapl)-1)%52;$k[$j++]=0;$_.raptobits();var _IS=$k[--$j];$q(_IS)}$k[$j++]=$g($_.cws,$_.i*3);$k[$j++]=$_.clst;$_.cwtobits();var _IX=$k[--$j];$q(_IX);$k[$j++]=($f($_.i+$_.rapc)-1)%52;$k[$j++]=1;$_.raptobits();var _Ia=$k[--$j];$q(_Ia);$k[$j++]=$g($_.cws,$_.i*3+1);$k[$j++]=$_.clst;$_.cwtobits();var _If=$k[--$j];$q(_If);$k[$j++]=$g($_.cws,$_.i*3+2);$k[$j++]=$_.clst;$_.cwtobits();var _Ik=$k[--$j];$q(_Ik);$k[$j++]=($f($_.i+$_.rapr)-1)%52;$k[$j++]=0;$_.raptobits();var _In=$k[--$j];$q(_In)}if($_.c==4){$k[$j++]=($f($_.i+$_.rapl)-1)%52;$k[$j++]=0;$_.raptobits();var _Ir=$k[--$j];$q(_Ir);$k[$j++]=$g($_.cws,$_.i*4);$k[$j++]=$_.clst;$_.cwtobits();var _Iw=$k[--$j];$q(_Iw);$k[$j++]=$g($_.cws,$_.i*4+1);$k[$j++]=$_.clst;$_.cwtobits();var _J1=$k[--$j];$q(_J1);$k[$j++]=($f($_.i+$_.rapc)-1)%52;$k[$j++]=1;$_.raptobits();var _J4=$k[--$j];$q(_J4);$k[$j++]=$g($_.cws,$_.i*4+2);$k[$j++]=$_.clst;$_.cwtobits();var _J9=$k[--$j];$q(_J9);$k[$j++]=$g($_.cws,$_.i*4+3);$k[$j++]=$_.clst;$_.cwtobits();var _JE=$k[--$j];$q(_JE);$k[$j++]=($f($_.i+$_.rapr)-1)%52;$k[$j++]=0;$_.raptobits();var _JH=$k[--$j];$q(_JH)}$k[$j++]=1;var _JI=$a();$P(_JK,_JJ,_JI)}$k[$j++]=Infinity;var _JL=$_.pixs;var _JM=$_.rwid;var _JN=$_.r;var _JO=$_.rowmult;var _JT=[];for(var _JQ=0,_JR=$_.r;_JQ<_JR;_JQ++){_JT[_JQ]=$_.rowmult}_JT=$a(_JT);$k[$j++]="ren";$k[$j++]="renmatrix";$k[$j++]="pixs";$k[$j++]=_JL;$k[$j++]="pixx";$k[$j++]=_JM;$k[$j++]="pixy";$k[$j++]=_JN*_JO;$k[$j++]="rowmult";$k[$j++]=_JT;$k[$j++]="height";$k[$j++]=$_.r*$_.rowmult/72;$k[$j++]="width";$k[$j++]=$_.rwid/72;$k[$j++]="borderleft";$k[$j++]=1;$k[$j++]="borderright";$k[$j++]=1;$k[$j++]="bordertop";$k[$j++]=1;$k[$j++]="borderbottom";$k[$j++]=1;$k[$j++]="opt";$k[$j++]=$_.options;var _JY=$d();$k[$j++]=_JY;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_datamatrix(){if(!bwipp_datamatrix.globals){var $__=$_;$_=bwipp_datamatrix.globals={};$_.datamatrix_metrics=$a([$a([10,10,1,1,5,1,0]),$a([12,12,1,1,7,1,0]),$a([14,14,1,1,10,1,0]),$a([16,16,1,1,12,1,0]),$a([18,18,1,1,14,1,0]),$a([20,20,1,1,18,1,0]),$a([22,22,1,1,20,1,0]),$a([24,24,1,1,24,1,0]),$a([26,26,1,1,28,1,0]),$a([32,32,2,2,36,1,0]),$a([36,36,2,2,42,1,0]),$a([40,40,2,2,48,1,0]),$a([44,44,2,2,56,1,0]),$a([48,48,2,2,68,1,0]),$a([52,52,2,2,84,2,0]),$a([64,64,4,4,112,2,0]),$a([72,72,4,4,144,4,0]),$a([80,80,4,4,192,4,0]),$a([88,88,4,4,224,4,0]),$a([96,96,4,4,272,4,0]),$a([104,104,4,4,336,6,0]),$a([120,120,6,6,408,6,0]),$a([132,132,6,6,496,8,0]),$a([144,144,6,6,620,10,0]),$a([8,18,1,1,7,1,0]),$a([8,32,1,2,11,1,0]),$a([8,48,1,2,15,1,1]),$a([8,64,1,4,18,1,1]),$a([8,80,1,4,22,1,1]),$a([8,96,1,4,28,1,1]),$a([8,120,1,6,32,1,1]),$a([8,144,1,6,36,1,1]),$a([12,26,1,1,14,1,0]),$a([12,36,1,2,18,1,0]),$a([12,64,1,4,27,1,1]),$a([12,88,1,4,36,1,1]),$a([16,36,1,2,24,1,0]),$a([16,48,1,2,28,1,0]),$a([16,64,1,4,36,1,1]),$a([20,36,1,2,28,1,1]),$a([20,44,1,2,34,1,1]),$a([20,64,1,4,42,1,1]),$a([22,48,1,2,38,1,1]),$a([24,48,1,2,41,1,1]),$a([24,64,1,4,46,1,1]),$a([26,40,1,2,38,1,1]),$a([26,48,1,2,42,1,1]),$a([26,64,1,4,50,1,1])]);$_.datamatrix_fnc1=-1;$_.datamatrix_prog=-2;$_.datamatrix_m05=-3;$_.datamatrix_m06=-4;$_.datamatrix_lC=-5;$_.datamatrix_lB=-6;$_.datamatrix_lX=-7;$_.datamatrix_lT=-8;$_.datamatrix_lE=-9;$_.datamatrix_unl=-10;$_.datamatrix_sapp=-11;$_.datamatrix_usft=-12;$_.datamatrix_sft1=-13;$_.datamatrix_sft2=-14;$_.datamatrix_sft3=-15;$_.datamatrix_eci=-16;$_.datamatrix_pad=-17;$_.datamatrix_unlcw=254;$_.datamatrix_A=0;$_.datamatrix_C=1;$_.datamatrix_T=2;$_.datamatrix_X=3;$_.datamatrix_E=4;$_.datamatrix_B=5;$_.datamatrix_encfuncs=$a(["encA","encCTX","encCTX","encCTX","encE","encB"]);var _14=$a([function(){var _o=$k[$j-1];var _p=$k[$j-2];$k[$j++]=_p-2;$k[$j++]=_o-2},function(){var _q=$k[$j-1];var _r=$k[$j-2];$k[$j++]=_r-2;$k[$j++]=_q-1},function(){var _s=$k[$j-1];var _t=$k[$j-2];$k[$j++]=_t-1;$k[$j++]=_s-2},function(){var _u=$k[$j-1];var _v=$k[$j-2];$k[$j++]=_v-1;$k[$j++]=_u-1},function(){var _w=$k[$j-1];var _x=$k[$j-2];$k[$j++]=_x-1;$k[$j++]=_w},function(){var _y=$k[$j-1];var _z=$k[$j-2];$k[$j++]=_z;$k[$j++]=_y-2},function(){var _10=$k[$j-1];var _11=$k[$j-2];$k[$j++]=_11;$k[$j++]=_10-1},function(){var _12=$k[$j-1];var _13=$k[$j-2];$k[$j++]=_13;$k[$j++]=_12}]);$_.datamatrix_dmn=_14;var _1D=$a([function(){$k[$j++]=$_.mrows-1;$k[$j++]=0},function(){$k[$j++]=$_.mrows-1;$k[$j++]=1},function(){$k[$j++]=$_.mrows-1;$k[$j++]=2},function(){$k[$j++]=0;$k[$j++]=$_.mcols-2},function(){$k[$j++]=0;$k[$j++]=$_.mcols-1},function(){$k[$j++]=1;$k[$j++]=$_.mcols-1},function(){$k[$j++]=2;$k[$j++]=$_.mcols-1},function(){$k[$j++]=3;$k[$j++]=$_.mcols-1}]);$_.datamatrix_dmc1=_1D;var _1M=$a([function(){$k[$j++]=$_.mrows-3;$k[$j++]=0},function(){$k[$j++]=$_.mrows-2;$k[$j++]=0},function(){$k[$j++]=$_.mrows-1;$k[$j++]=0},function(){$k[$j++]=0;$k[$j++]=$_.mcols-4},function(){$k[$j++]=0;$k[$j++]=$_.mcols-3},function(){$k[$j++]=0;$k[$j++]=$_.mcols-2},function(){$k[$j++]=0;$k[$j++]=$_.mcols-1},function(){$k[$j++]=1;$k[$j++]=$_.mcols-1}]);$_.datamatrix_dmc2=_1M;var _1V=$a([function(){$k[$j++]=$_.mrows-3;$k[$j++]=0},function(){$k[$j++]=$_.mrows-2;$k[$j++]=0},function(){$k[$j++]=$_.mrows-1;$k[$j++]=0},function(){$k[$j++]=0;$k[$j++]=$_.mcols-2},function(){$k[$j++]=0;$k[$j++]=$_.mcols-1},function(){$k[$j++]=1;$k[$j++]=$_.mcols-1},function(){$k[$j++]=2;$k[$j++]=$_.mcols-1},function(){$k[$j++]=3;$k[$j++]=$_.mcols-1}]);$_.datamatrix_dmc3=_1V;var _1f=$a([function(){$k[$j++]=$_.mrows-1;$k[$j++]=0},function(){$k[$j++]=$_.mrows-1;$k[$j++]=$_.mcols-1},function(){$k[$j++]=0;$k[$j++]=$_.mcols-3},function(){$k[$j++]=0;$k[$j++]=$_.mcols-2},function(){$k[$j++]=0;$k[$j++]=$_.mcols-1},function(){$k[$j++]=1;$k[$j++]=$_.mcols-3},function(){$k[$j++]=1;$k[$j++]=$_.mcols-2},function(){$k[$j++]=1;$k[$j++]=$_.mcols-1}]);$_.datamatrix_dmc4=_1f;$k[$j++]=Infinity;for(var _1g=0;_1g<=128;_1g+=1){$k[$j++]=_1g;$k[$j++]=_1g+1}$k[$j++]=$_.datamatrix_pad;$k[$j++]=129;for(var _1h=0;_1h<=99;_1h+=1){var _1j=$R($s(2),_1h,10);var _1l=$Z($s(2),"00");$P(_1l,2-_1j.length,_1j);$k[$j++]=_1l;$k[$j++]=_1h+130}var _1m=$a([$_.datamatrix_lC,$_.datamatrix_lB,$_.datamatrix_fnc1,$_.datamatrix_sapp,$_.datamatrix_prog,$_.datamatrix_usft,$_.datamatrix_m05,$_.datamatrix_m06,$_.datamatrix_lX,$_.datamatrix_lT,$_.datamatrix_lE,$_.datamatrix_eci]);$k[$j++]=229;for(var _1n=0,_1o=_1m.length;_1n<_1o;_1n++){var _1q=$k[--$j];var _1r=_1q+1;$k[$j++]=$g(_1m,_1n);$k[$j++]=_1r;$k[$j++]=_1r}$j--;$_.Avals=$d();$k[$j++]=Infinity;var _1s=$_.Avals;for(var _1x=_1s.size,_1w=_1s.keys(),_1v=0;_1v<_1x;_1v++){var _1t=_1w.next().value;var _1u=_1s.get(_1t);$k[$j++]=_1t;$k[$j++]=Infinity;$k[$j++]=_1u;var _20=$a();$k[$j++]=_20}$_.Avals=$d();$k[$j++]=Infinity;$k[$j++]=$_.datamatrix_sft1;$k[$j++]=0;$k[$j++]=$_.datamatrix_sft2;$k[$j++]=1;$k[$j++]=$_.datamatrix_sft3;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _21=48;_21<=57;_21+=1){$k[$j++]=_21;$k[$j++]=_21-44}for(var _22=65;_22<=90;_22+=1){$k[$j++]=_22;$k[$j++]=_22-51}var _23=$d();$_.CNvals=_23;$k[$j++]=Infinity;for(var _24=0;_24<=31;_24+=1){$k[$j++]=_24;$k[$j++]=_24}var _25=$d();$_.C1vals=_25;$k[$j++]=Infinity;for(var _26=33;_26<=47;_26+=1){$k[$j++]=_26;$k[$j++]=_26-33}for(var _27=58;_27<=64;_27+=1){$k[$j++]=_27;$k[$j++]=_27-43}for(var _28=91;_28<=95;_28+=1){$k[$j++]=_28;$k[$j++]=_28-69}$k[$j++]=$_.datamatrix_fnc1;$k[$j++]=27;$k[$j++]=$_.datamatrix_usft;$k[$j++]=30;var _29=$d();$_.C2vals=_29;$k[$j++]=Infinity;for(var _2A=96;_2A<=127;_2A+=1){$k[$j++]=_2A;$k[$j++]=_2A-96}var _2B=$d();$_.C3vals=_2B;$k[$j++]=Infinity;var _2C=$_.CNvals;for(var _2H=_2C.size,_2G=_2C.keys(),_2F=0;_2F<_2H;_2F++){var _2D=_2G.next().value;var _2E=_2C.get(_2D);$k[$j++]=_2D;$k[$j++]=Infinity;$k[$j++]=_2E;var _2K=$a();$k[$j++]=_2K}var _2L=$_.C1vals;for(var _2Q=_2L.size,_2P=_2L.keys(),_2O=0;_2O<_2Q;_2O++){var _2M=_2P.next().value;var _2N=_2L.get(_2M);$k[$j++]=_2M;$k[$j++]=Infinity;$k[$j++]=$g($_.CNvals,$_.datamatrix_sft1);$k[$j++]=_2N;var _2V=$a();$k[$j++]=_2V}var _2W=$_.C2vals;for(var _2b=_2W.size,_2a=_2W.keys(),_2Z=0;_2Z<_2b;_2Z++){var _2X=_2a.next().value;var _2Y=_2W.get(_2X);$k[$j++]=_2X;$k[$j++]=Infinity;$k[$j++]=$g($_.CNvals,$_.datamatrix_sft2);$k[$j++]=_2Y;var _2g=$a();$k[$j++]=_2g}var _2h=$_.C3vals;for(var _2m=_2h.size,_2l=_2h.keys(),_2k=0;_2k<_2m;_2k++){var _2i=_2l.next().value;var _2j=_2h.get(_2i);$k[$j++]=_2i;$k[$j++]=Infinity;$k[$j++]=$g($_.CNvals,$_.datamatrix_sft3);$k[$j++]=_2j;var _2r=$a();$k[$j++]=_2r}$_.Cvals=$d();$k[$j++]=Infinity;$k[$j++]=$_.datamatrix_sft1;$k[$j++]=0;$k[$j++]=$_.datamatrix_sft2;$k[$j++]=1;$k[$j++]=$_.datamatrix_sft3;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _2s=48;_2s<=57;_2s+=1){$k[$j++]=_2s;$k[$j++]=_2s-44}for(var _2t=97;_2t<=122;_2t+=1){$k[$j++]=_2t;$k[$j++]=_2t-83}var _2u=$d();$_.TNvals=_2u;$k[$j++]=Infinity;for(var _2v=0;_2v<=31;_2v+=1){$k[$j++]=_2v;$k[$j++]=_2v}var _2w=$d();$_.T1vals=_2w;$k[$j++]=Infinity;for(var _2x=33;_2x<=47;_2x+=1){$k[$j++]=_2x;$k[$j++]=_2x-33}for(var _2y=58;_2y<=64;_2y+=1){$k[$j++]=_2y;$k[$j++]=_2y-43}for(var _2z=91;_2z<=95;_2z+=1){$k[$j++]=_2z;$k[$j++]=_2z-69}$k[$j++]=$_.datamatrix_fnc1;$k[$j++]=27;$k[$j++]=$_.datamatrix_usft;$k[$j++]=30;var _30=$d();$_.T2vals=_30;$k[$j++]=Infinity;$k[$j++]=96;$k[$j++]=0;for(var _31=65;_31<=90;_31+=1){$k[$j++]=_31;$k[$j++]=_31-64}for(var _32=123;_32<=127;_32+=1){$k[$j++]=_32;$k[$j++]=_32-96}var _33=$d();$_.T3vals=_33;$k[$j++]=Infinity;var _34=$_.TNvals;for(var _39=_34.size,_38=_34.keys(),_37=0;_37<_39;_37++){var _35=_38.next().value;var _36=_34.get(_35);$k[$j++]=_35;$k[$j++]=Infinity;$k[$j++]=_36;var _3C=$a();$k[$j++]=_3C}var _3D=$_.T1vals;for(var _3I=_3D.size,_3H=_3D.keys(),_3G=0;_3G<_3I;_3G++){var _3E=_3H.next().value;var _3F=_3D.get(_3E);$k[$j++]=_3E;$k[$j++]=Infinity;$k[$j++]=$g($_.TNvals,$_.datamatrix_sft1);$k[$j++]=_3F;var _3N=$a();$k[$j++]=_3N}var _3O=$_.T2vals;for(var _3T=_3O.size,_3S=_3O.keys(),_3R=0;_3R<_3T;_3R++){var _3P=_3S.next().value;var _3Q=_3O.get(_3P);$k[$j++]=_3P;$k[$j++]=Infinity;$k[$j++]=$g($_.TNvals,$_.datamatrix_sft2);$k[$j++]=_3Q;var _3Y=$a();$k[$j++]=_3Y}var _3Z=$_.T3vals;for(var _3e=_3Z.size,_3d=_3Z.keys(),_3c=0;_3c<_3e;_3c++){var _3a=_3d.next().value;var _3b=_3Z.get(_3a);$k[$j++]=_3a;$k[$j++]=Infinity;$k[$j++]=$g($_.TNvals,$_.datamatrix_sft3);$k[$j++]=_3b;var _3j=$a();$k[$j++]=_3j}$_.Tvals=$d();for(var _3k=128;_3k<=255;_3k+=1){$_.i=_3k;var _3u=$_.Avals;var _3t=$_.i;$k[$j++]=Infinity;$q($g($_.Avals,$_.datamatrix_usft));$q($g($_.Avals,$_.i-128));var _3s=$a();$p(_3u,_3t,_3s);var _44=$_.Cvals;var _43=$_.i;$k[$j++]=Infinity;$q($g($_.Cvals,$_.datamatrix_usft));$q($g($_.Cvals,$_.i-128));var _42=$a();$p(_44,_43,_42);var _4E=$_.Tvals;var _4D=$_.i;$k[$j++]=Infinity;$q($g($_.Tvals,$_.datamatrix_usft));$q($g($_.Tvals,$_.i-128));var _4C=$a();$p(_4E,_4D,_4C)}$_.Avals=$_.Avals;$_.Cvals=$_.Cvals;$_.Tvals=$_.Tvals;$k[$j++]=Infinity;$k[$j++]=13;$k[$j++]=0;$k[$j++]=42;$k[$j++]=1;$k[$j++]=62;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _4I=48;_4I<=57;_4I+=1){$k[$j++]=_4I;$k[$j++]=_4I-44}for(var _4J=65;_4J<=90;_4J+=1){$k[$j++]=_4J;$k[$j++]=_4J-51}var _4K=$d();$_.Xvals=_4K;$k[$j++]=Infinity;var _4L=$_.Xvals;for(var _4Q=_4L.size,_4P=_4L.keys(),_4O=0;_4O<_4Q;_4O++){var _4M=_4P.next().value;var _4N=_4L.get(_4M);$k[$j++]=_4M;$k[$j++]=Infinity;$k[$j++]=_4N;var _4T=$a();$k[$j++]=_4T}var _4U=$d();$_.Xvals=_4U;$k[$j++]=Infinity;for(var _4V=64;_4V<=94;_4V+=1){$k[$j++]=_4V;$k[$j++]=_4V-64}$k[$j++]=$_.datamatrix_unl;$k[$j++]=31;for(var _4W=32;_4W<=63;_4W+=1){$k[$j++]=_4W;$k[$j++]=_4W}var _4X=$d();$_.Evals=_4X;$k[$j++]=Infinity;var _4Y=$_.Evals;for(var _4d=_4Y.size,_4c=_4Y.keys(),_4b=0;_4b<_4d;_4b++){var _4Z=_4c.next().value;var _4a=_4Y.get(_4Z);$k[$j++]=_4Z;$k[$j++]=Infinity;$k[$j++]=_4a;var _4g=$a();$k[$j++]=_4g}var _4h=$d();$_.Evals=_4h;$k[$j++]=Infinity;for(var _4i=0;_4i<=255;_4i+=1){$k[$j++]=_4i;$k[$j++]=_4i}var _4j=$d();$_.Bvals=_4j;$k[$j++]=Infinity;var _4k=$_.Bvals;for(var _4p=_4k.size,_4o=_4k.keys(),_4n=0;_4n<_4p;_4n++){var _4l=_4o.next().value;var _4m=_4k.get(_4l);$k[$j++]=_4l;$k[$j++]=Infinity;$k[$j++]=_4m;var _4s=$a();$k[$j++]=_4s}var _4t=$d();$_.Bvals=_4t;$_.encvals=$a([$_.Avals,$_.Cvals,$_.Tvals,$_.Xvals,$_.Evals,$_.Bvals]);$k[$j++]=Infinity;$k[$j++]=1;for(var _51=0;_51<255;_51++){var _52=$k[$j-1];var _53=_52*2;$k[$j++]=_53;if(_53>=256){var _54=$k[--$j];$k[$j++]=_54^301}}var _55=$a();$_.rsalog=_55;$_.rslog=$a(256);for(var _57=1;_57<=255;_57+=1){$p($_.rslog,$g($_.rsalog,_57),_57)}$_.rslog=$_.rslog;$_.datamatrix_rsprod=function(){var _5C=$k[$j-1];if(_5C!=0){var _5E=$k[$j-2];if(_5E!=0){var _5G=$k[--$j];var _5I=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_5G)+$g($_.rslog,_5I))%255)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.datamatrix_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _5O=0,_5P=$_.k;_5O<_5P;_5O++){$k[$j++]=0}$_.coeffs=$a();for(var _5S=1,_5R=$_.k;_5S<=_5R;_5S+=1){var _5T=$_.coeffs;$p(_5T,_5S,$g(_5T,_5S-1));$k[$j++]=$g($_.rsalog,_5S);for(var _5X=_5S-1;_5X>=1;_5X-=1){var _5Y=$_.coeffs;var _5a=$k[$j-1];$k[$j++]=_5Y;$k[$j++]=_5X;$k[$j++]=$g(_5Y,_5X);$k[$j++]=_5a;$_.datamatrix_rsprod();var _5c=$k[--$j];var _5d=$k[--$j];var _5f=$k[--$j];$p(_5f,_5d,$xo(_5c,$g($_.coeffs,_5d-1)))}var _5g=$_.coeffs;var _5i=$k[$j-1];$k[$j++]=_5g;$k[$j++]=0;$k[$j++]=$g(_5g,0);$k[$j++]=_5i;$_.datamatrix_rsprod();var _5j=$k[--$j];var _5k=$k[--$j];var _5l=$k[--$j];$p(_5l,_5k,_5j);$j--}$k[$j++]=$G($_.coeffs,0,$_.coeffs.length-1)};$_.datamatrix_coeffscachemax=25;$_.datamatrix_coeffscachelimit=766;$k[$j++]=$_.datamatrix_coeffscachemax;$k[$j++]=$_.datamatrix_coeffscachelimit;bwipp_fifocache();var _5r=$k[--$j];$_.datamatrix_coeffscache=_5r;$_.datamatrix_coeffscachefetch=function(){var _5s=$k[--$j];$_.k=_5s;var _5u=$g($_.datamatrix_coeffscache,"fetch");$k[$j++]=$_.k;$k[$j++]=function(){$_.datamatrix_gencoeffs()};$k[$j++]=function(){var _5v=$k[--$j];$k[$j++]=_5v.length};if(_5u()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_datamatrix.globals);$_.dontdraw=false;$_.columns=0;$_.rows=0;$_.format="unset";$_.version="unset";$_.parse=false;$_.parsefnc=false;$_.c40headerlength=-1;$_.raw=false;$_.dmre=false;bwipp_processoptions();var _5w=$k[--$j];$_.options=_5w;var _5x=$k[--$j];$_.barcode=_5x;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.barcode.length==0){$k[$j++]="bwipp.datamatrixEmptyData#25160";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>15e3){$k[$j++]="bwipp.datamatrixinputTooLong#25164";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($ne($_.version,"unset")&&($_.rows!=0||$_.columns!=0)){$k[$j++]="bwipp.datamatrixVersionRowsCols#25168";$k[$j++]="rows and columns must not be given if version is specified";bwipp_raiseerror()}if($ne($_.version,"unset")){$X($_.version,"x");var _67=$k[--$j];if(_67){var _68=$k[--$j];$k[$j-1]=_68;var _6A=$k[$j-1];var _6B=$k[$j-2];var _6C=$a(2);$k[$j++]=_6B;$k[$j++]=_6A;$as(_6C);var _6D=$k[--$j];$F(_6D,function(){var _6E=$k[$j-1];var _6F=true;if(_6E.length==0){_6F=false}var _6G=$k[--$j];$k[$j++]=_6F;$F(_6G,function(){var _6H=$k[--$j];if(_6H<48||_6H>57){$k[$j-1]=false}});var _6I=$k[--$j];if(!_6I){$j-=2;$k[$j++]="bwipp.datamatrixVersionBadRowOrColumn#25184";$k[$j++]="version must be formatted as RxC";bwipp_raiseerror()}});var _6J=$k[--$j];$_.rows=$i(_6J);var _6K=$k[--$j];$_.columns=$i(_6K);var _6N=$_.rows==$_.columns?"square":"rectangle";$_.format=_6N}else{$k[$j-1]="bwipp.datamatrixVersionFormat#25191";$k[$j++]="version must be formatted as RxC";bwipp_raiseerror()}}else{if($eq($_.format,"unset")){var _6R=$_.dmre?"rectangle":"square";$_.format=_6R}}if($ne($_.format,"square")&&$ne($_.format,"rectangle")){$k[$j++]="bwipp.datamatrixInvalidFormat#25200";$k[$j++]="The format must be either square or rectangle";bwipp_raiseerror()}$_.urows=$_.rows;$_.ucols=$_.columns;$k[$j++]=Infinity;for(var _6X=0,_6Y=$_.datamatrix_metrics.length;_6X<_6Y;_6X++){$_.m=$g($_.datamatrix_metrics,_6X);$_.rows=$g($_.m,0);$_.cols=$g($_.m,1);$_.regh=$g($_.m,2);$_.regv=$g($_.m,3);$_.rscw=$g($_.m,4);$_.rsbl=$g($_.m,5);$_.doly=$g($_.m,6);$_.mrows=$f($_.rows-2*$_.regh);$_.mcols=$f($_.cols-2*$_.regv);$_.ncws=$f(~~($_.mrows*$_.mcols/8)-$_.rscw);$_.okay=true;if($_.urows!=0&&$_.urows!=$_.rows){$_.okay=false}if($_.ucols!=0&&$_.ucols!=$_.cols){$_.okay=false}if($eq($_.format,"square")&&$ne($_.rows,$_.cols)){$_.okay=false}if($eq($_.format,"rectangle")&&$eq($_.rows,$_.cols)){$_.okay=false}if(!$_.dmre&&$_.doly==1){$_.okay=false}if($_.okay){$k[$j++]=$_.ncws}}$as($a($m()));var _7D=$k[--$j];$_.fullcws=_7D;$k[$j-1]=Infinity;for(var _7E=0;_7E<1558;_7E++){$k[$j++]=1e4}$_.numremcws=$a();$F($_.fullcws,function(){var _7H=$k[--$j];$p($_.numremcws,_7H-1,1)});for(var _7I=1556;_7I>=0;_7I-=1){$_.i=_7I;if($g($_.numremcws,$_.i)!=1){$p($_.numremcws,$_.i,$g($_.numremcws,$_.i+1)+1)}}$_.getnumremcws=function(){var _7R=$k[$j-1];if(_7R>=$_.numremcws.length){$k[$j-1]="bwipp.datamatrixTooMuchData#25243";$k[$j++]="The input data exceeds the symbol capacity";bwipp_raiseerror()}var _7U=$k[--$j];$k[$j++]=$g($_.numremcws,_7U)};if($_.raw){$_.cws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _7g=$G($_.barcode,$_.i+1,3);$k[$j++]=_7g;$k[$j++]=false;for(var _7h=0,_7i=_7g.length;_7h<_7i;_7h++){var _7j=$g(_7g,_7h);if(_7j<48||_7j>57){$k[$j-1]=true}}var _7k=$k[--$j];if(_7k){$j--;break}var _7l=$k[--$j];$_.cw=$i(_7l);if($_.cw>255){$k[$j++]="bwipp.datamatrixBadRawCodeword#25260";$k[$j++]="Raw codewords must be 0 to 255";bwipp_raiseerror()}$p($_.cws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.datamatrixBadRawFormat#25267";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.cws=$G($_.cws,0,$_.j)}else{$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true],["FNC1",$_.datamatrix_fnc1],["PROG",$_.datamatrix_prog]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _81=$k[--$j];$_.msg=_81;$_.msglen=$_.msg.length;if($_.msglen>=9){$q($G($_.msg,0,7));var _86=$k[--$j];$j--;var _88=_86==29;var _89=$k[--$j];var _8A=$k[--$j];var _8B=$k[--$j];var _8C=$k[--$j];var _8D=$k[--$j];if(_88&&_89==48&&_8A==30&&_8B==62&&_8C==41&&_8D==91){$q($G($_.msg,$_.msglen-2,2));var _8H=$k[--$j];var _8I=$k[--$j];if(_8H==4&&_8I==30){if($g($_.msg,5)==53){$k[$j++]=Infinity;$k[$j++]=$_.datamatrix_m05;$q($G($_.msg,7,$_.msg.length-9));$_.msg=$a()}else{if($g($_.msg,5)==54){$k[$j++]=Infinity;$k[$j++]=$_.datamatrix_m06;$q($G($_.msg,7,$_.msg.length-9));$_.msg=$a()}}}}}$_.msglen=$_.msg.length;if($_.c40headerlength>$_.msglen){$_.c40headerlength=$_.msglen}$k[$j++]=Infinity;for(var _8Y=0,_8Z=$_.msglen;_8Y<_8Z;_8Y++){$k[$j++]=0}$k[$j++]=0;$_.numD=$a();$k[$j++]=Infinity;for(var _8b=0,_8c=$_.msglen;_8b<_8c;_8b++){$k[$j++]=0}$k[$j++]=9999;$_.nextXterm=$a();$k[$j++]=Infinity;for(var _8e=0,_8f=$_.msglen;_8e<_8f;_8e++){$k[$j++]=0}$k[$j++]=9999;$_.nextNonX=$a();$k[$j++]=Infinity;for(var _8h=0,_8i=$_.msglen;_8h<_8i;_8h++){$k[$j++]=false}$k[$j++]=false;$_.isECI=$a();for(var _8k=$_.msglen-1;_8k>=0;_8k-=1){$_.i=_8k;$_.barchar=$g($_.msg,$_.i);if($_.barchar>=48&&$_.barchar<=57){$p($_.numD,$_.i,$g($_.numD,$_.i+1)+1)}if($_.barchar==13||$_.barchar==42||$_.barchar==62){$p($_.nextXterm,$_.i,0)}else{$p($_.nextXterm,$_.i,$g($_.nextXterm,$_.i+1)+1)}if(!$has($_.Xvals,$_.barchar)){$p($_.nextNonX,$_.i,0)}else{$p($_.nextNonX,$_.i,$g($_.nextNonX,$_.i+1)+1)}$p($_.isECI,$_.i,$_.barchar<=-1e6)}$k[$j++]=Infinity;var _9I=$_.nextXterm;for(var _9J=0,_9K=_9I.length;_9J<_9K;_9J++){var _9L=$g(_9I,_9J);$k[$j++]=_9L;if(_9L>1e4){$k[$j-1]=1e4}}$_.nextXterm=$a();$k[$j++]=Infinity;var _9M=$_.nextNonX;for(var _9N=0,_9O=_9M.length;_9N<_9O;_9N++){var _9P=$g(_9M,_9N);$k[$j++]=_9P;if(_9P>1e4){$k[$j-1]=1e4}}$_.nextNonX=$a();$_.isD=function(){$k[$j++]=$_.char>=48&&$_.char<=57};$_.isC=function(){$k[$j++]=$has($_.CNvals,$_.char)};$_.isT=function(){$k[$j++]=$has($_.TNvals,$_.char)};$_.isX=function(){$k[$j++]=$has($_.Xvals,$_.char)};$_.isE=function(){$k[$j++]=$has($_.Evals,$_.char)};$_.isEA=function(){$k[$j++]=$_.char>127};$_.isFN=function(){$k[$j++]=$_.char<0};$_.XtermFirst=function(){var _9g=$k[--$j];$k[$j++]=$lt($g($_.nextXterm,_9g),$g($_.nextNonX,_9g))};$_.lookup=function(){$_.ac=1;$_.cc=2;$_.tc=2;$_.xc=2;$_.ec=2;$_.bc=2.25;if($_.mode==$_.datamatrix_A){$_.ac=0;$_.cc=1;$_.tc=1;$_.xc=1;$_.ec=1;$_.bc=1.25}if($_.mode==$_.datamatrix_C){$_.cc=0}if($_.mode==$_.datamatrix_T){$_.tc=0}if($_.mode==$_.datamatrix_X){$_.xc=0}if($_.mode==$_.datamatrix_E){$_.ec=0}if($_.mode==$_.datamatrix_B){$_.bc=0}for(var _9r=0;_9r<1;_9r++){if($g($_.isECI,$_.i)){$k[$j++]=$_.datamatrix_A;break}if($_.i<$_.c40headerlength){$k[$j++]=$_.datamatrix_C;break}$_.isfnc1=$g($_.msg,$_.i)==$_.datamatrix_fnc1;$_.k=0;for(;;){if($_.i+$_.k==$_.msglen){var _A3=$a(["ac","cc","tc","xc","ec","bc"]);for(var _A4=0,_A5=_A3.length;_A4<_A5;_A4++){var _A6=$g(_A3,_A4);var _A7=$_[_A6];$_[_A6]=$ceil(_A7)}var _AD=$a([$_.cc,$_.tc,$_.xc,$_.ec,$_.bc]);var _AJ=true;for(var _AE=0,_AF=_AD.length;_AE<_AF;_AE++){_AJ=_AJ&&$_.ac<=$g(_AD,_AE)}if(_AJ){$k[$j++]=$_.datamatrix_A;break}var _AP=$a([$_.ac,$_.cc,$_.tc,$_.xc,$_.ec]);var _AV=true;for(var _AQ=0,_AR=_AP.length;_AQ<_AR;_AQ++){_AV=_AV&&$_.bc<$g(_AP,_AQ)}if(_AV){if($_.isfnc1){$k[$j++]=$_.datamatrix_A}else{$k[$j++]=$_.datamatrix_B}break}var _Ac=$a([$_.ac,$_.cc,$_.tc,$_.xc,$_.bc]);var _Ai=true;for(var _Ad=0,_Ae=_Ac.length;_Ad<_Ae;_Ad++){_Ai=_Ai&&$_.ec<$g(_Ac,_Ad)}if(_Ai){$k[$j++]=$_.datamatrix_E;break}var _Ao=$a([$_.ac,$_.cc,$_.xc,$_.ec,$_.bc]);var _Au=true;for(var _Ap=0,_Aq=_Ao.length;_Ap<_Aq;_Ap++){_Au=_Au&&$_.tc<$g(_Ao,_Ap)}if(_Au){$k[$j++]=$_.datamatrix_T;break}var _B0=$a([$_.ac,$_.cc,$_.tc,$_.ec,$_.bc]);var _B6=true;for(var _B1=0,_B2=_B0.length;_B1<_B2;_B1++){_B6=_B6&&$_.xc<$g(_B0,_B1)}if(_B6){$k[$j++]=$_.datamatrix_X;break}$k[$j++]=$_.datamatrix_C;break}$_.char=$g($_.msg,$_.i+$_.k);$k[$j++]="ac";$k[$j++]=$_.ac;$_.isD();var _BC=$k[--$j];if(_BC){var _BD=$k[--$j];$k[$j++]=$f(_BD+1/2)}else{$_.isEA();var _BE=$k[--$j];if(_BE){var _BF=$k[--$j];$k[$j++]=$ceil(_BF)+2}else{var _BG=$k[--$j];$k[$j++]=$ceil(_BG)+1}}var _BH=$k[--$j];var _BI=$k[--$j];$_[_BI]=_BH;$k[$j++]="cc";$k[$j++]=$_.cc;$_.isC();var _BK=$k[--$j];if(_BK){var _BL=$k[--$j];$k[$j++]=$f(_BL+.6666667)}else{$_.isEA();var _BM=$k[--$j];if(_BM){var _BN=$k[--$j];$k[$j++]=$f(_BN+2.6666667)}else{var _BO=$k[--$j];$k[$j++]=$f(_BO+1.3333334)}}var _BP=$k[--$j];var _BQ=$k[--$j];$_[_BQ]=_BP;$k[$j++]="tc";$k[$j++]=$_.tc;$_.isT();var _BS=$k[--$j];if(_BS){var _BT=$k[--$j];$k[$j++]=$f(_BT+.6666667)}else{$_.isEA();var _BU=$k[--$j];if(_BU){var _BV=$k[--$j];$k[$j++]=$f(_BV+2.6666667)}else{var _BW=$k[--$j];$k[$j++]=$f(_BW+1.3333334)}}var _BX=$k[--$j];var _BY=$k[--$j];$_[_BY]=_BX;$k[$j++]="xc";$k[$j++]=$_.xc;$_.isX();var _Ba=$k[--$j];if(_Ba){var _Bb=$k[--$j];$k[$j++]=$f(_Bb+.6666667)}else{$_.isEA();var _Bc=$k[--$j];if(_Bc){var _Bd=$k[--$j];$k[$j++]=$f(_Bd+4.3333334)}else{var _Be=$k[--$j];$k[$j++]=$f(_Be+3.3333334)}}var _Bf=$k[--$j];var _Bg=$k[--$j];$_[_Bg]=_Bf;$k[$j++]="ec";$k[$j++]=$_.ec;$_.isE();var _Bi=$k[--$j];if(_Bi){var _Bj=$k[--$j];$k[$j++]=$f(_Bj+3/4)}else{$_.isEA();var _Bk=$k[--$j];if(_Bk){var _Bl=$k[--$j];$k[$j++]=$f(_Bl+17/4)}else{var _Bm=$k[--$j];$k[$j++]=$f(_Bm+13/4)}}var _Bn=$k[--$j];var _Bo=$k[--$j];$_[_Bo]=_Bn;$k[$j++]="bc";$k[$j++]=$_.bc;$_.isFN();var _Bq=$k[--$j];if(_Bq){$k[$j-1]+=4}else{$k[$j-1]+=1}var _Bt=$k[--$j];var _Bu=$k[--$j];$_[_Bu]=_Bt;if($_.k>=4){var _C1=$a([$_.cc,$_.tc,$_.xc,$_.ec,$_.bc]);var _C7=true;for(var _C2=0,_C3=_C1.length;_C2<_C3;_C2++){_C7=_C7&&$_.ac+1<=$g(_C1,_C2)}if(_C7){$k[$j++]=$_.datamatrix_A;break}if($_.bc+1<=$_.ac){if($_.isfnc1){$k[$j++]=$_.datamatrix_A}else{$k[$j++]=$_.datamatrix_B}break}var _CF=$a([$_.cc,$_.tc,$_.xc,$_.ec]);var _CL=true;for(var _CG=0,_CH=_CF.length;_CG<_CH;_CG++){_CL=_CL&&$_.bc+1<$g(_CF,_CG)}if(_CL){if($_.isfnc1){$k[$j++]=$_.datamatrix_A}else{$k[$j++]=$_.datamatrix_B}break}var _CS=$a([$_.ac,$_.cc,$_.tc,$_.xc,$_.bc]);var _CY=true;for(var _CT=0,_CU=_CS.length;_CT<_CU;_CT++){_CY=_CY&&$_.ec+1<$g(_CS,_CT)}if(_CY){$k[$j++]=$_.datamatrix_E;break}var _Ce=$a([$_.ac,$_.cc,$_.xc,$_.ec,$_.bc]);var _Ck=true;for(var _Cf=0,_Cg=_Ce.length;_Cf<_Cg;_Cf++){_Ck=_Ck&&$_.tc+1<$g(_Ce,_Cf)}if(_Ck){$k[$j++]=$_.datamatrix_T;break}var _Cq=$a([$_.ac,$_.cc,$_.tc,$_.ec,$_.bc]);var _Cw=true;for(var _Cr=0,_Cs=_Cq.length;_Cr<_Cs;_Cr++){_Cw=_Cw&&$_.xc+1<$g(_Cq,_Cr)}if(_Cw){$k[$j++]=$_.datamatrix_X;break}var _D1=$a([$_.ac,$_.tc,$_.ec,$_.bc]);var _D7=true;for(var _D2=0,_D3=_D1.length;_D2<_D3;_D2++){_D7=_D7&&$_.cc+1<$g(_D1,_D2)}if(_D7){if($_.cc<$_.xc){$k[$j++]=$_.datamatrix_C;break}if($_.cc==$_.xc){$k[$j++]=$_.i+$_.k+1;$_.XtermFirst();var _DE=$k[--$j];if(_DE){$k[$j++]=$_.datamatrix_X;break}else{$k[$j++]=$_.datamatrix_C;break}}}}$_.k=$_.k+1}}};$_.addtocws=function(){var _DG=$k[$j-1];if(_DG.length+$_.j>$_.cws.length){$k[$j-1]="bwipp.datamatrixTooMuchData#25405";$k[$j++]="The input data exceeds the symbol capacity";bwipp_raiseerror()}var _DJ=$k[--$j];$P($_.cws,$_.j,_DJ);$_.j=_DJ.length+$_.j};$_.ECItocws=function(){var _DN=$k[--$j];var _DO=-_DN-1e6;$k[$j++]=_DO;if(_DO<=126){var _DP=$k[--$j];var _DQ=$a(1);$k[$j++]=_DP+1;$as(_DQ)}else{var _DR=$k[$j-1];if(_DR<=16382){var _DS=$k[--$j];var _DT=_DS-127;var _DU=$a(2);$k[$j++]=~~(_DT/254)+128;$k[$j++]=_DT%254+1;$as(_DU)}else{var _DV=$k[--$j];var _DW=_DV-16383;var _DX=$a(3);$k[$j++]=~~(_DW/64516)+192;$k[$j++]=~~(_DW/254)%254+1;$k[$j++]=_DW%254+1;$as(_DX)}}};$_.encA=function(){for(var _DY=0;_DY<1;_DY++){if($g($_.isECI,$_.i)){$k[$j++]=$g($_.Avals,$_.datamatrix_eci);$_.addtocws();$k[$j++]=$g($_.msg,$_.i);$_.ECItocws();$_.addtocws();$_.i=$_.i+1;break}if($_.i>=$_.c40headerlength&&$g($_.numD,$_.i)>=2){var _Dn=$s(2);$p(_Dn,0,$g($_.msg,$_.i));$p(_Dn,1,$g($_.msg,$_.i+1));$k[$j++]=$g($_.Avals,_Dn);$_.addtocws();$_.i=$_.i+2;break}$k[$j++]="newmode";$_.lookup();var _Dx=$k[--$j];var _Dy=$k[--$j];$_[_Dy]=_Dx;if($_.newmode!=$_.mode){$k[$j++]=$g($_.Avals,$g($a([-1,$_.datamatrix_lC,$_.datamatrix_lT,$_.datamatrix_lX,$_.datamatrix_lE,$_.datamatrix_lB]),$_.newmode));$_.addtocws();$_.mode=$_.newmode;break}$k[$j++]=$g($_.Avals,$g($_.msg,$_.i));$_.addtocws();$_.i=$_.i+1;break}};$_.CTXvalstocws=function(){var _ED=$k[--$j];$_.in=_ED;$k[$j++]=Infinity;for(var _EG=0,_EF=$_.in.length-1;_EG<=_EF;_EG+=3){var _EI=$G($_.in,_EG,3);var _EN=0;for(var _EJ=0,_EK=_EI.length;_EJ<_EK;_EJ++){_EN=$f(_EN+$g(_EI,_EJ))*40}var _EO=~~(_EN/40)+1;$k[$j++]=~~(_EO/256);$k[$j++]=_EO%256}$as($a($m()));var _ER=$k[--$j];$k[$j-1]=_ER};$_.encCTX=function(){$_.p=0;$_.ctxvals=$a(2500);$_.done=false;for(;;){if($_.i==$_.msglen){break}if(!$has($g($_.encvals,$_.mode),$g($_.msg,$_.i))){break}if($_.p%3==0){if($_.p>0){$k[$j++]="newmode";$_.lookup();var _Ef=$k[--$j];var _Eg=$k[--$j];$_[_Eg]=_Ef;if($ne($_.newmode,$_.mode)){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.datamatrix_unlcw]);$_.addtocws();if($_.newmode!=$_.datamatrix_A){$k[$j++]=$g($_.Avals,$g($a([-1,$_.datamatrix_lC,$_.datamatrix_lT,$_.datamatrix_lX,$_.datamatrix_lE,$_.datamatrix_lB]),$_.newmode));$_.addtocws()}$_.mode=$_.newmode;$_.done=true;break}}if($_.msglen-$_.i<=3){$k[$j++]=$_.j+~~($_.p/3)*2;$_.getnumremcws();var _Ey=$k[--$j];$_.remcws=_Ey;$k[$j++]=Infinity;var _F3=$G($_.msg,$_.i,$_.msglen-$_.i);for(var _F4=0,_F5=_F3.length;_F4<_F5;_F4++){var _F6=$g(_F3,_F4);var _FA=$has($g($_.encvals,$_.mode),_F6);$k[$j++]=_F6;if(_FA){var _FE=$k[--$j];$q($g($g($_.encvals,$_.mode),_FE))}else{$k[$j-1]=-1;$k[$j++]=-1;$k[$j++]=-1;$k[$j++]=-1}}$_.remvals=$a();if($_.remcws==2&&$_.remvals.length==3){$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));$q($_.remvals);var _FM=$a();$k[$j++]=_FM;$_.CTXvalstocws();$_.addtocws();$_.mode=$_.datamatrix_A;$_.i=$_.msglen;$_.done=true;break}if($_.remcws==2&&$_.remvals.length==2&&$_.mode!=$_.datamatrix_X){$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));$q($_.remvals);$q($g($g($_.encvals,$_.mode),$_.datamatrix_sft1));var _FZ=$a();$k[$j++]=_FZ;$_.CTXvalstocws();$_.addtocws();$_.mode=$_.datamatrix_A;$_.i=$_.msglen;$_.done=true;break}if($_.remcws==2&&$_.remvals.length==1){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.datamatrix_unlcw]);$_.addtocws();$k[$j++]=$g($_.Avals,$g($_.msg,$_.i));$_.addtocws();$_.mode=$_.datamatrix_A;$_.i=$_.msglen;$_.done=true;break}if($_.remcws==1&&$_.remvals.length==1){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$g($_.Avals,$g($_.msg,$_.i));$_.addtocws();$_.mode=$_.datamatrix_A;$_.i=$_.msglen;$_.done=true;break}}}var _G4=$g($g($_.encvals,$_.mode),$g($_.msg,$_.i));$k[$j++]=_G4;if(_G4.length+$_.p>$_.ctxvals.length){$k[$j-1]="bwipp.datamatrixTooMuchData#25545";$k[$j++]="The input data exceeds the symbol capacity";bwipp_raiseerror()}var _G7=$k[--$j];$P($_.ctxvals,$_.p,_G7);$_.p=_G7.length+$_.p;$_.i=$_.i+1}if(!$_.done){for(;;){if($_.p%3==0){break}$_.i=$_.i-1;$_.p=$_.p-$g($g($_.encvals,$_.mode),$g($_.msg,$_.i)).length}$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));var _GQ=$a();$k[$j++]=_GQ;$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.datamatrix_unlcw]);$_.addtocws();$_.mode=$_.datamatrix_A;$_.c40headerlength=-1;if($_.i!=$_.msglen&&!$g($_.isECI,$_.i)){if($g($_.numD,$_.i)>=2){var _Ga=$s(2);$p(_Ga,0,$g($_.msg,$_.i));$p(_Ga,1,$g($_.msg,$_.i+1));$k[$j++]=$g($_.Avals,_Ga);$_.addtocws();$_.i=$_.i+2}else{$k[$j++]=$g($_.Avals,$g($_.msg,$_.i));$_.addtocws();$_.i=$_.i+1}}}};$_.Evalstocws=function(){var _Gq=$k[--$j];$_.in=_Gq;$_.inlen=$_.in.length;$_.outlen=$ceil($_.in.length/4*3);$k[$j++]=Infinity;$q($_.in);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$_.in=$a();$k[$j++]=Infinity;for(var _Gw=0,_Gv=$_.inlen-1;_Gw<=_Gv;_Gw+=4){var _Gy=$G($_.in,_Gw,4);var _H3=0;for(var _Gz=0,_H0=_Gy.length;_Gz<_H0;_Gz++){_H3=$or(_H3,$g(_Gy,_Gz))*64}var _H4=$flr(_H3/64);$k[$j++]=$flr(_H4/65536)&255;$k[$j++]=$flr(_H4/256)&255;$k[$j++]=_H4&255}$as($a($m()));var _H7=$k[--$j];$k[$j-1]=$G(_H7,0,$_.outlen)};$_.encE=function(){$_.p=0;$_.edifactvals=$a(2100);for(;;){if($_.i==$_.msglen){break}if(!$has($_.Evals,$g($_.msg,$_.i))){break}if($_.p>=$_.edifactvals.length){$k[$j++]="bwipp.datamatrixTooMuchData#25608";$k[$j++]="The input data exceeds the symbol capacity";bwipp_raiseerror()}if($_.p%4==0){if($_.msglen-$_.i<=2){$k[$j++]=$_.j+~~($_.p/4)*3;$_.getnumremcws();var _HR=$k[--$j];$_.remcws=_HR;$k[$j++]=Infinity;var _HW=$G($_.msg,$_.i,$_.msglen-$_.i);for(var _HX=0,_HY=_HW.length;_HX<_HY;_HX++){$q($g($_.Avals,$g(_HW,_HX)))}$_.remvals=$a();if(($_.remcws==1||$_.remcws==2)&&$_.remvals.length<=$_.remcws){$k[$j++]=$G($_.edifactvals,0,$_.p);$_.Evalstocws();$_.addtocws();$k[$j++]=$_.remvals;$_.addtocws();$_.mode=$_.datamatrix_A;$_.i=$_.msglen;break}}$_.lookup();var _Hm=$k[--$j];if(_Hm!=$_.mode){break}}var _Hr=$g($_.Evals,$g($_.msg,$_.i));$P($_.edifactvals,$_.p,_Hr);$_.p=_Hr.length+$_.p;$_.i=$_.i+1}if($_.mode!=$_.datamatrix_A){$k[$j++]=$_.j+~~($_.p/4)*3-1;$_.getnumremcws();var _Hz=$k[--$j];$_.remcws=_Hz-1;if($_.p%4!=0||$_.i!=$_.msglen||$_.remcws>=3){var _I5=$g($_.Evals,$_.datamatrix_unl);$P($_.edifactvals,$_.p,_I5);$_.p=_I5.length+$_.p}$k[$j++]=$G($_.edifactvals,0,$_.p);$_.Evalstocws();$_.addtocws();$_.mode=$_.datamatrix_A;$_.c40headerlength=-1;if($_.i!=$_.msglen&&!$g($_.isECI,$_.i)){if($g($_.numD,$_.i)>=2){var _IK=$s(2);$p(_IK,0,$g($_.msg,$_.i));$p(_IK,1,$g($_.msg,$_.i+1));$k[$j++]=$g($_.Avals,_IK);$_.addtocws();$_.i=$_.i+2}else{$k[$j++]=$g($_.Avals,$g($_.msg,$_.i));$_.addtocws();$_.i=$_.i+1}}}};$_.encB=function(){$_.p=0;$_.bvals=$a(1558);for(;;){if($_.i==$_.msglen){break}$_.lookup();var _Ie=$k[--$j];if(_Ie!=$_.mode){break}if($_.p>=$_.bvals.length){$k[$j++]="bwipp.datamatrixTooMuchData#25667";$k[$j++]="The input data exceeds the symbol capacity";bwipp_raiseerror()}$p($_.bvals,$_.p,$g($_.msg,$_.i));$_.p=$_.p+1;$_.i=$_.i+1}$k[$j++]=$_.j+$_.p;$_.getnumremcws();var _Iq=$k[--$j];$_.remcws=_Iq-1;$k[$j++]=Infinity;if($_.remcws==0&&$_.i==$_.msglen){$k[$j++]=0}else{if($_.p<250){$k[$j++]=$_.p}else{$k[$j++]=~~($_.p/250)+249;$k[$j++]=$_.p%250}}$q($G($_.bvals,0,$_.p));$_.bvals=$a();for(var _J3=0,_J2=$_.bvals.length-1;_J3<=_J2;_J3+=1){$_.p=_J3;var _J9=$f(($_.j+$_.p+1)*149%255+1+$g($_.bvals,$_.p));if(_J9>=256){_J9=_J9-256}$p($_.bvals,$_.p,_J9)}$k[$j++]=$_.bvals;$_.addtocws();$_.mode=$_.datamatrix_A};$_.cws=$a(1558);$_.mode=$_.datamatrix_A;$_.i=0;$_.j=0;if($g($_.msg,0)==$_.datamatrix_fnc1){$k[$j++]=$g($_.Avals,$_.datamatrix_fnc1);$_.addtocws();$_.i=1;if($_.c40headerlength>0){$_.c40headerlength=$_.c40headerlength+1}}for(;;){if($_.i>=$_.msglen){break}var _JQ=$_[$g($_.datamatrix_encfuncs,$_.mode)];if(_JQ()===true){break}}$_.cws=$G($_.cws,0,$_.j)}$_.datlen=$_.cws.length;$k[$j++]=$_.j-1;$_.getnumremcws();var _JW=$k[--$j];$_.remcws=_JW-1;if($_.remcws>0){$k[$j++]=Infinity;$q($_.cws);for(var _Ja=0,_Jb=$_.remcws;_Ja<_Jb;_Ja++){$k[$j++]=129}$_.cws=$a();for(var _Jg=$_.datlen+1,_Jf=$f($_.datlen+$_.remcws)-1;_Jg<=_Jf;_Jg+=1){$_.i=_Jg;var _Ji=($_.i+1)*149%253+1+129;if(_Ji>254){_Ji=_Ji-254}$p($_.cws,$_.i,_Ji)}}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#25729";$k[$j++]=$_.cws;bwipp_raiseerror()}for(var _Jq=0,_Jr=$_.datamatrix_metrics.length;_Jq<_Jr;_Jq++){$_.m=$g($_.datamatrix_metrics,_Jq);$_.rows=$g($_.m,0);$_.cols=$g($_.m,1);$_.regh=$g($_.m,2);$_.regv=$g($_.m,3);$_.rscw=$g($_.m,4);$_.rsbl=$g($_.m,5);$_.doly=$g($_.m,6);$_.mrows=$f($_.rows-2*$_.regh);$_.mcols=$f($_.cols-2*$_.regv);$_.rrows=~~($_.mrows/$_.regh);$_.rcols=~~($_.mcols/$_.regv);$_.ncws=$f(~~($_.mrows*$_.mcols/8)-$_.rscw);$_.okay=true;if($_.cws.length!=$_.ncws){$_.okay=false}if($_.urows!=0&&$_.urows!=$_.rows){$_.okay=false}if($_.ucols!=0&&$_.ucols!=$_.cols){$_.okay=false}if($eq($_.format,"square")&&$ne($_.rows,$_.cols)){$_.okay=false}if($eq($_.format,"rectangle")&&$eq($_.rows,$_.cols)){$_.okay=false}if(!$_.dmre&&$_.doly==1){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.datamatrixNoValidSymbol#25761";$k[$j++]="Maximum length exceeded or invalid size";bwipp_raiseerror()}$k[$j++]="coeffs";$k[$j++]=~~($_.rscw/$_.rsbl);$_.datamatrix_coeffscachefetch();var _Kc=$k[--$j];var _Kd=$k[--$j];$_[_Kd]=_Kc;$_.ecbs=$a($_.rsbl);$_.ecpb=~~($_.rscw/$_.rsbl);for(var _Kk=0,_Kj=$_.rsbl-1;_Kk<=_Kj;_Kk+=1){$_.blk=_Kk;if($_.cws.length!=1558){$_.cwbsize=~~($_.cws.length/$_.rsbl)}else{if($_.blk<=7){$_.cwbsize=156}else{$_.cwbsize=155}}$_.lfsr=$a($_.ecpb);var _Kt=$_.cwbsize;var _Ku=$_.coeffs;var _Kv=$_.ecpb;var _Kw=$_.lfsr;$k[$j++]=$_.ecbs;$k[$j++]=$_.blk;$k[$j++]=function(){var _Ky=$k[--$j];$k[$j++]=$g($_.cws,$f(_Ky*$_.rsbl+$_.blk))};$k[$j++]=_Kt;$k[$j++]=_Ku;$k[$j++]=_Kv;$k[$j++]=_Kw;$k[$j++]=$_.datamatrix_rsprod;bwipp_rsecbinary();var _L3=$k[--$j];var _L4=$k[--$j];$p(_L4,_L3,$_.lfsr)}if($_.ncws==1558){$k[$j++]=Infinity;$q($G($_.ecbs,8,2));$q($G($_.ecbs,0,8));$_.ecbs=$a()}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#25805";$k[$j++]=Infinity;var _LC=$_.ecbs;for(var _LD=0,_LE=_LC.length;_LD<_LE;_LD++){$q($g(_LC,_LD))}var _LG=$a();$k[$j++]=_LG;bwipp_raiseerror()}var _LJ=$a($f($_.cws.length+$_.rscw));$P(_LJ,0,$_.cws);$_.cws=_LJ;for(var _LN=0,_LM=$_.rscw-1;_LN<=_LM;_LN+=1){$_.i=_LN;$p($_.cws,$f($_.ncws+$_.i),$g($g($_.ecbs,$_.i%$_.rsbl),~~($_.i/$_.rsbl)))}$_.module=function(){$r(4,-1);var _LZ=$Z($s(8),"00000000");$k[$j++]=_LZ;$k[$j++]=_LZ;var _La=$s(8);var _Lb=$k[$j-3];var _Lc=$R(_La,_Lb,2);var _Ld=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;$P(_Ld,8-_Lc.length,_Lc);for(var _Le=7;_Le>=0;_Le-=1){var _Lf=$k[--$j];$k[$j++]=$g(_Lf,_Le)-48;$k[$j++]=_Lf}$j--;$r(11,-3);var _Lh=$k[--$j];$F(_Lh,function(){var _Li=$k[--$j];if(_Li()===true){return true}var _Lk=$k[$j-2];if(_Lk<0){var _Ll=$k[--$j];var _Lm=$k[--$j];$k[$j++]=$f(_Lm+$_.mrows);$k[$j++]=$f(_Ll+(4-($_.mrows+4)%8))}var _Lp=$k[$j-1];if(_Lp<0){var _Lr=$k[--$j];var _Ls=$k[--$j];$k[$j++]=$f(_Ls+(4-($_.mcols+4)%8));$k[$j++]=$f(_Lr+$_.mcols)}var _Lv=$k[$j-2];if(_Lv>=$_.mrows){var _Lx=$k[--$j];var _Ly=$k[--$j];$k[$j++]=$f(_Ly-$_.mrows);$k[$j++]=_Lx}var _M0=$k[--$j];var _M1=$k[--$j];$k[$j++]=$_.mmat;$k[$j++]=$f(_M0+_M1*$_.mcols);$r(5,-1);var _M4=$k[--$j];var _M5=$k[--$j];var _M6=$k[--$j];$p(_M6,_M5,_M4)})};$k[$j++]=Infinity;for(var _M9=0,_MA=$_.mrows*$_.mcols;_M9<_MA;_M9++){$k[$j++]=-1}$_.mmat=$a();for(var _MC=$_.cws.length-1;_MC>=0;_MC-=1){$k[$j++]=$g($_.cws,_MC)}$k[$j++]=4;$k[$j++]=0;for(;;){var _MF=$k[$j-1];var _MG=$k[$j-2];if(_MF==0&&_MG==$_.mrows){$k[$j++]=$_.datamatrix_dmc1;$_.module()}var _MI=$k[$j-1];var _MJ=$k[$j-2];if(_MI==0&&_MJ==$_.mrows-2&&$_.mcols%4!=0){$k[$j++]=$_.datamatrix_dmc2;$_.module()}var _MM=$k[$j-1];var _MN=$k[$j-2];if(_MM==0&&_MN==$_.mrows-2&&$_.mcols%8==4){$k[$j++]=$_.datamatrix_dmc3;$_.module()}var _MQ=$k[$j-1];var _MR=$k[$j-2];if(_MQ==2&&_MR==$_.mrows+4&&$_.mcols%8==0){$k[$j++]=$_.datamatrix_dmc4;$_.module()}for(;;){var _MU=$k[$j-1];var _MV=$k[$j-2];if(_MU>=0&&_MV<$_.mrows){var _MX=$k[$j-1];var _MY=$k[$j-2];var _Mb=$g($_.mmat,$f(_MX+_MY*$_.mcols));if(_Mb==-1){$k[$j++]=$_.datamatrix_dmn;$_.module()}}var _Mc=$k[--$j];var _Md=$k[--$j];$k[$j++]=_Md-2;$k[$j++]=_Mc+2;if(!(_Mc+2<$_.mcols&&_Md-2>=0)){break}}var _Mf=$k[--$j];$k[$j-1]+=1;$k[$j++]=_Mf+3;for(;;){var _Mh=$k[$j-1];var _Mi=$k[$j-2];if(_Mh<$_.mcols&&_Mi>=0){var _Mk=$k[$j-1];var _Ml=$k[$j-2];var _Mo=$g($_.mmat,$f(_Mk+_Ml*$_.mcols));if(_Mo==-1){$k[$j++]=$_.datamatrix_dmn;$_.module()}}var _Mp=$k[--$j];var _Mq=$k[--$j];$k[$j++]=_Mq+2;$k[$j++]=_Mp-2;if(!(_Mp-2>=0&&_Mq+2<$_.mrows)){break}}var _Ms=$k[--$j];var _Mt=$k[--$j];$k[$j++]=_Mt+3;$k[$j++]=_Ms+1;if(!(_Ms+1<$_.mcols||_Mt+3<$_.mrows)){$j-=2;break}}if($g($_.mmat,$_.mrows*$_.mcols-1)==-1){$P($_.mmat,$_.mrows*($_.mcols-1)-2,$a([1,0]));$P($_.mmat,$_.mrows*$_.mcols-2,$a([0,1]))}$_.pixs=$a($_.rows*$_.cols);$_.cwpos=0;for(var _ND=0,_NC=$_.rows-1;_ND<=_NC;_ND+=1){$_.i=_ND;if($_.i%($_.rrows+2)==0){var _NO=$_.pixs;var _NN=$_.i*$_.cols;$k[$j++]=Infinity;for(var _NK=0,_NL=~~($_.cols/2);_NK<_NL;_NK++){$k[$j++]=1;$k[$j++]=0}var _NM=$a();$P(_NO,_NN,_NM)}if($_.i%($_.rrows+2)==$_.rrows+1){var _Na=$_.pixs;var _NZ=$_.i*$_.cols;var _NY=[];for(var _NW=0,_NX=$_.cols;_NW<_NX;_NW++){_NY[_NW]=1}_NY=$a(_NY);$P(_Na,_NZ,_NY)}if($_.i%($_.rrows+2)!=0&&$_.i%($_.rrows+2)!=$_.rrows+1){for(var _Ni=0,_Nh=$_.cols-1;_Ni<=_Nh;_Ni+=1){$_.j=_Ni;if($_.j%($_.rcols+2)==0){$p($_.pixs,$f($_.i*$_.cols+$_.j),1)}if($_.j%($_.rcols+2)==$_.rcols+1){$p($_.pixs,$f($_.i*$_.cols+$_.j),$_.i%2)}if($_.j%($_.rcols+2)!=0&&$_.j%($_.rcols+2)!=$_.rcols+1){$p($_.pixs,$f($_.i*$_.cols+$_.j),$g($_.mmat,$_.cwpos));$_.cwpos=$_.cwpos+1}}}}$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.cols],["pixy",$_.rows],["height",$_.rows*$_.modunit/72],["width",$_.cols*$_.modunit/72],["borderleft",1],["borderright",1],["bordertop",1],["borderbottom",1],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_datamatrixrectangular(){var $__=$_;$_=Object.assign({},$_,bwipp_datamatrixrectangular.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","rectangle");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_datamatrixrectangularextension(){var $__=$_;$_=Object.assign({},$_,bwipp_datamatrixrectangularextension.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"dmre",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_mailmark(){if(!bwipp_mailmark.globals){var $__=$_;$_=bwipp_mailmark.globals={};var _0=new Map([["7","24x24"],["9","32x32"],["29","16x48"]]);$_.mailmark_typetoversion=_0;var _1=new Map([["7","square"],["9","square"],["29","rectangle"]]);$_.mailmark_typetoformat=_1;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_mailmark.globals);$_.type="unset";$_.parse=false;$_.dontdraw=false;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _9=$k[--$j];$_.barcode=_9;$_.barlen=$_.barcode.length;$del($_.options,"parse");var _C=$_.type;if($ne(_C,"7")&&($ne(_C,"9")&&$ne(_C,"29"))){$k[$j++]="bwipp.mailmarkBadType#26146";$k[$j++]="Royal Mail Mailmark type must be 7, 9 or 29";bwipp_raiseerror()}$_.version=$g($_.mailmark_typetoversion,$_.type);$_.format=$g($_.mailmark_typetoformat,$_.type);if($_.barcode.length<45){$k[$j++]="bwipp.mailmarkBadLength#26155";$k[$j++]="Royal Mail Mailmark must contain at least 45 characters of Mailmark formatted data, including any required space padding";bwipp_raiseerror()}if($ne($G($_.barcode,0,4),"JGB ")){$k[$j++]="bwipp.mailmarkBadIndicator#26158";$k[$j++]="Royal Mail Mailmark must begin with JGB identifier";bwipp_raiseerror()}$p($_.options,"version",$_.version);$p($_.options,"format",$_.format);$p($_.options,"c40headerlength",45);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _P=$k[--$j];$_.args=_P;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_qrcode(){if(!bwipp_qrcode.globals){var $__=$_;$_=bwipp_qrcode.globals={};$_.qrcode_v1to9=0;$_.qrcode_v10to26=1;$_.qrcode_v27to40=2;$_.qrcode_vM1=3;$_.qrcode_vM2=4;$_.qrcode_vM3=5;$_.qrcode_vM4=6;$_.qrcode_vR7x43=7;$_.qrcode_vR7x59=8;$_.qrcode_vR7x77=9;$_.qrcode_vR7x99=10;$_.qrcode_vR7x139=11;$_.qrcode_vR9x43=12;$_.qrcode_vR9x59=13;$_.qrcode_vR9x77=14;$_.qrcode_vR9x99=15;$_.qrcode_vR9x139=16;$_.qrcode_vR11x27=17;$_.qrcode_vR11x43=18;$_.qrcode_vR11x59=19;$_.qrcode_vR11x77=20;$_.qrcode_vR11x99=21;$_.qrcode_vR11x139=22;$_.qrcode_vR13x27=23;$_.qrcode_vR13x43=24;$_.qrcode_vR13x59=25;$_.qrcode_vR13x77=26;$_.qrcode_vR13x99=27;$_.qrcode_vR13x139=28;$_.qrcode_vR15x43=29;$_.qrcode_vR15x59=30;$_.qrcode_vR15x77=31;$_.qrcode_vR15x99=32;$_.qrcode_vR15x139=33;$_.qrcode_vR17x43=34;$_.qrcode_vR17x59=35;$_.qrcode_vR17x77=36;$_.qrcode_vR17x99=37;$_.qrcode_vR17x139=38;$_.qrcode_N=0;$_.qrcode_A=1;$_.qrcode_B=2;$_.qrcode_K=3;$_.qrcode_E=4;$_.qrcode_encfuncs=$a(["encN","encA","encB","encK","encE"]);$_.qrcode_fn1=-1;$k[$j++]=Infinity;$k[$j++]=Infinity;for(var _1=48;_1<=57;_1+=1){$k[$j++]=_1}var _2=$a();for(var _3=0,_4=_2.length;_3<_4;_3++){$k[$j++]=$g(_2,_3);$k[$j++]=-1}var _6=$d();$_.qrcode_Nexcl=_6;$k[$j++]=Infinity;$k[$j++]=Infinity;$k[$j++]=32;$k[$j++]=36;$k[$j++]=37;$k[$j++]=42;$k[$j++]=43;$k[$j++]=45;$k[$j++]=46;$k[$j++]=47;$k[$j++]=58;for(var _7=65;_7<=90;_7+=1){$k[$j++]=_7}$k[$j++]=$_.qrcode_fn1;var _8=$a();for(var _9=0,_A=_8.length;_9<_A;_9++){$k[$j++]=$g(_8,_9);$k[$j++]=-1}var _C=$d();$_.qrcode_Aexcl=_C;$k[$j++]=Infinity;$k[$j++]=Infinity;for(var _D=129;_D<=159;_D+=1){$k[$j++]=_D}for(var _E=224;_E<=235;_E+=1){$k[$j++]=_E}var _F=$a();for(var _G=0,_H=_F.length;_G<_H;_G++){$k[$j++]=$g(_F,_G);$k[$j++]=-1}var _J=$d();$_.qrcode_Kexcl=_J;$k[$j++]=Infinity;var _K=$a(["0001","0010","0100","1000","0111"]);$k[$j++]=_K;$k[$j++]=_K;$k[$j++]=_K;$k[$j++]=$a(["",-1,-1,-1,-1]);$k[$j++]=$a(["0","1",-1,-1,-1]);$k[$j++]=$a(["00","01","10","11",-1]);$k[$j++]=$a(["000","001","010","011",-1]);$k[$j++]=$a(["001","010","011","100","111"]);for(var _Q=0;_Q<31;_Q++){var _R=$k[$j-1];$k[$j++]=_R}var _S=$a();$_.qrcode_mids=_S;$_.qrcode_cclens=$a([$a([10,9,8,8]),$a([12,11,16,10]),$a([14,13,16,12]),$a([3,-1,-1,-1]),$a([4,3,-1,-1]),$a([5,4,4,3]),$a([6,5,5,4]),$a([4,3,3,2]),$a([5,5,4,3]),$a([6,5,5,4]),$a([7,6,5,5]),$a([7,6,6,5]),$a([5,5,4,3]),$a([6,5,5,4]),$a([7,6,5,5]),$a([7,6,6,5]),$a([8,7,6,6]),$a([4,4,3,2]),$a([6,5,5,4]),$a([7,6,5,5]),$a([7,6,6,5]),$a([8,7,6,6]),$a([8,7,7,6]),$a([5,5,4,3]),$a([6,6,5,5]),$a([7,6,6,5]),$a([7,7,6,6]),$a([8,7,7,6]),$a([8,8,7,7]),$a([7,6,6,5]),$a([7,7,6,5]),$a([8,7,7,6]),$a([8,7,7,6]),$a([9,8,7,7]),$a([7,6,6,5]),$a([8,7,6,6]),$a([8,7,7,6]),$a([8,8,7,6]),$a([9,8,8,7])]);$k[$j++]=Infinity;for(var _17=0;_17<3;_17++){$k[$j++]=4}$k[$j++]=3;$k[$j++]=5;$k[$j++]=7;$k[$j++]=9;for(var _18=0;_18<32;_18++){$k[$j++]=3}var _19=$a();$_.qrcode_termlens=_19;$_.qrcode_padstrs=$a(["11101100","00010001"]);$_.qrcode_charmap="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";$k[$j++]=Infinity;$k[$j++]="full";$k[$j++]=Infinity;for(var _1B=0;_1B<=9;_1B+=1){$k[$j++]=$R($s(2),_1B,10);$k[$j++]=$_.qrcode_v1to9}for(var _1E=10;_1E<=26;_1E+=1){$k[$j++]=$R($s(2),_1E,10);$k[$j++]=$_.qrcode_v10to26}for(var _1H=27;_1H<=40;_1H+=1){$k[$j++]=$R($s(2),_1H,10);$k[$j++]=$_.qrcode_v27to40}var _1K=$d();var _1L=new Map([["M1",$_.qrcode_vM1],["M2",$_.qrcode_vM2],["M3",$_.qrcode_vM3],["M4",$_.qrcode_vM4]]);var _1M=new Map([["R7x43",$_.qrcode_vR7x43],["R7x59",$_.qrcode_vR7x59],["R7x77",$_.qrcode_vR7x77],["R7x99",$_.qrcode_vR7x99],["R7x139",$_.qrcode_vR7x139],["R9x43",$_.qrcode_vR9x43],["R9x59",$_.qrcode_vR9x59],["R9x77",$_.qrcode_vR9x77],["R9x99",$_.qrcode_vR9x99],["R9x139",$_.qrcode_vR9x139],["R11x27",$_.qrcode_vR11x27],["R11x43",$_.qrcode_vR11x43],["R11x59",$_.qrcode_vR11x59],["R11x77",$_.qrcode_vR11x77],["R11x99",$_.qrcode_vR11x99],["R11x139",$_.qrcode_vR11x139],["R13x27",$_.qrcode_vR13x27],["R13x43",$_.qrcode_vR13x43],["R13x59",$_.qrcode_vR13x59],["R13x77",$_.qrcode_vR13x77],["R13x99",$_.qrcode_vR13x99],["R13x139",$_.qrcode_vR13x139],["R15x43",$_.qrcode_vR15x43],["R15x59",$_.qrcode_vR15x59],["R15x77",$_.qrcode_vR15x77],["R15x99",$_.qrcode_vR15x99],["R15x139",$_.qrcode_vR15x139],["R17x43",$_.qrcode_vR17x43],["R17x59",$_.qrcode_vR17x59],["R17x77",$_.qrcode_vR17x77],["R17x99",$_.qrcode_vR17x99],["R17x139",$_.qrcode_vR17x139]]);$k[$j++]=_1K;$k[$j++]="micro";$k[$j++]=_1L;$k[$j++]="rmqr";$k[$j++]=_1M;var _1N=$d();$_.qrcode_versetmap=_1N;$_.qrcode_versetfull=$a([$_.qrcode_v1to9,$_.qrcode_v10to26,$_.qrcode_v27to40]);$_.qrcode_versetmicro=$a([$_.qrcode_vM1,$_.qrcode_vM2,$_.qrcode_vM3,$_.qrcode_vM4]);$_.qrcode_metrics=$a([$a(["micro","M1",$_.qrcode_vM1,11,11,98,99,36,$a([2,99,99,99]),$a([1,0,-1,-1,-1,-1,-1,-1])]),$a(["micro","M2",$_.qrcode_vM2,13,13,98,99,80,$a([5,6,99,99]),$a([1,0,1,0,-1,-1,-1,-1])]),$a(["micro","M3",$_.qrcode_vM3,15,15,98,99,132,$a([6,8,99,99]),$a([1,0,1,0,-1,-1,-1,-1])]),$a(["micro","M4",$_.qrcode_vM4,17,17,98,99,192,$a([8,10,14,99]),$a([1,0,1,0,1,0,-1,-1])]),$a(["full","1",$_.qrcode_v1to9,21,21,98,99,208,$a([7,10,13,17]),$a([1,0,1,0,1,0,1,0])]),$a(["full","2",$_.qrcode_v1to9,25,25,18,99,359,$a([10,16,22,28]),$a([1,0,1,0,1,0,1,0])]),$a(["full","3",$_.qrcode_v1to9,29,29,22,99,567,$a([15,26,36,44]),$a([1,0,1,0,2,0,2,0])]),$a(["full","4",$_.qrcode_v1to9,33,33,26,99,807,$a([20,36,52,64]),$a([1,0,2,0,2,0,4,0])]),$a(["full","5",$_.qrcode_v1to9,37,37,30,99,1079,$a([26,48,72,88]),$a([1,0,2,0,2,2,2,2])]),$a(["full","6",$_.qrcode_v1to9,41,41,34,99,1383,$a([36,64,96,112]),$a([2,0,4,0,4,0,4,0])]),$a(["full","7",$_.qrcode_v1to9,45,45,22,38,1568,$a([40,72,108,130]),$a([2,0,4,0,2,4,4,1])]),$a(["full","8",$_.qrcode_v1to9,49,49,24,42,1936,$a([48,88,132,156]),$a([2,0,2,2,4,2,4,2])]),$a(["full","9",$_.qrcode_v1to9,53,53,26,46,2336,$a([60,110,160,192]),$a([2,0,3,2,4,4,4,4])]),$a(["full","10",$_.qrcode_v10to26,57,57,28,50,2768,$a([72,130,192,224]),$a([2,2,4,1,6,2,6,2])]),$a(["full","11",$_.qrcode_v10to26,61,61,30,54,3232,$a([80,150,224,264]),$a([4,0,1,4,4,4,3,8])]),$a(["full","12",$_.qrcode_v10to26,65,65,32,58,3728,$a([96,176,260,308]),$a([2,2,6,2,4,6,7,4])]),$a(["full","13",$_.qrcode_v10to26,69,69,34,62,4256,$a([104,198,288,352]),$a([4,0,8,1,8,4,12,4])]),$a(["full","14",$_.qrcode_v10to26,73,73,26,46,4651,$a([120,216,320,384]),$a([3,1,4,5,11,5,11,5])]),$a(["full","15",$_.qrcode_v10to26,77,77,26,48,5243,$a([132,240,360,432]),$a([5,1,5,5,5,7,11,7])]),$a(["full","16",$_.qrcode_v10to26,81,81,26,50,5867,$a([144,280,408,480]),$a([5,1,7,3,15,2,3,13])]),$a(["full","17",$_.qrcode_v10to26,85,85,30,54,6523,$a([168,308,448,532]),$a([1,5,10,1,1,15,2,17])]),$a(["full","18",$_.qrcode_v10to26,89,89,30,56,7211,$a([180,338,504,588]),$a([5,1,9,4,17,1,2,19])]),$a(["full","19",$_.qrcode_v10to26,93,93,30,58,7931,$a([196,364,546,650]),$a([3,4,3,11,17,4,9,16])]),$a(["full","20",$_.qrcode_v10to26,97,97,34,62,8683,$a([224,416,600,700]),$a([3,5,3,13,15,5,15,10])]),$a(["full","21",$_.qrcode_v10to26,101,101,28,50,9252,$a([224,442,644,750]),$a([4,4,17,0,17,6,19,6])]),$a(["full","22",$_.qrcode_v10to26,105,105,26,50,10068,$a([252,476,690,816]),$a([2,7,17,0,7,16,34,0])]),$a(["full","23",$_.qrcode_v10to26,109,109,30,54,10916,$a([270,504,750,900]),$a([4,5,4,14,11,14,16,14])]),$a(["full","24",$_.qrcode_v10to26,113,113,28,54,11796,$a([300,560,810,960]),$a([6,4,6,14,11,16,30,2])]),$a(["full","25",$_.qrcode_v10to26,117,117,32,58,12708,$a([312,588,870,1050]),$a([8,4,8,13,7,22,22,13])]),$a(["full","26",$_.qrcode_v10to26,121,121,30,58,13652,$a([336,644,952,1110]),$a([10,2,19,4,28,6,33,4])]),$a(["full","27",$_.qrcode_v27to40,125,125,34,62,14628,$a([360,700,1020,1200]),$a([8,4,22,3,8,26,12,28])]),$a(["full","28",$_.qrcode_v27to40,129,129,26,50,15371,$a([390,728,1050,1260]),$a([3,10,3,23,4,31,11,31])]),$a(["full","29",$_.qrcode_v27to40,133,133,30,54,16411,$a([420,784,1140,1350]),$a([7,7,21,7,1,37,19,26])]),$a(["full","30",$_.qrcode_v27to40,137,137,26,52,17483,$a([450,812,1200,1440]),$a([5,10,19,10,15,25,23,25])]),$a(["full","31",$_.qrcode_v27to40,141,141,30,56,18587,$a([480,868,1290,1530]),$a([13,3,2,29,42,1,23,28])]),$a(["full","32",$_.qrcode_v27to40,145,145,34,60,19723,$a([510,924,1350,1620]),$a([17,0,10,23,10,35,19,35])]),$a(["full","33",$_.qrcode_v27to40,149,149,30,58,20891,$a([540,980,1440,1710]),$a([17,1,14,21,29,19,11,46])]),$a(["full","34",$_.qrcode_v27to40,153,153,34,62,22091,$a([570,1036,1530,1800]),$a([13,6,14,23,44,7,59,1])]),$a(["full","35",$_.qrcode_v27to40,157,157,30,54,23008,$a([570,1064,1590,1890]),$a([12,7,12,26,39,14,22,41])]),$a(["full","36",$_.qrcode_v27to40,161,161,24,50,24272,$a([600,1120,1680,1980]),$a([6,14,6,34,46,10,2,64])]),$a(["full","37",$_.qrcode_v27to40,165,165,28,54,25568,$a([630,1204,1770,2100]),$a([17,4,29,14,49,10,24,46])]),$a(["full","38",$_.qrcode_v27to40,169,169,32,58,26896,$a([660,1260,1860,2220]),$a([4,18,13,32,48,14,42,32])]),$a(["full","39",$_.qrcode_v27to40,173,173,26,54,28256,$a([720,1316,1950,2310]),$a([20,4,40,7,43,22,10,67])]),$a(["full","40",$_.qrcode_v27to40,177,177,30,58,29648,$a([750,1372,2040,2430]),$a([19,6,18,31,34,34,20,61])]),$a(["rmqr","R7x43",$_.qrcode_vR7x43,7,43,22,99,104,$a([99,7,99,10]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R7x59",$_.qrcode_vR7x59,7,59,20,40,171,$a([99,9,99,14]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R7x77",$_.qrcode_vR7x77,7,77,26,52,261,$a([99,12,99,22]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R7x99",$_.qrcode_vR7x99,7,99,24,50,358,$a([99,16,99,30]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R7x139",$_.qrcode_vR7x139,7,139,28,56,545,$a([99,24,99,44]),$a([-1,-1,1,0,-1,-1,2,0])]),$a(["rmqr","R9x43",$_.qrcode_vR9x43,9,43,22,99,170,$a([99,9,99,14]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R9x59",$_.qrcode_vR9x59,9,59,20,40,267,$a([99,12,99,22]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R9x77",$_.qrcode_vR9x77,9,77,26,52,393,$a([99,18,99,32]),$a([-1,-1,1,0,-1,-1,1,1])]),$a(["rmqr","R9x99",$_.qrcode_vR9x99,9,99,24,50,532,$a([99,24,99,44]),$a([-1,-1,1,0,-1,-1,2,0])]),$a(["rmqr","R9x139",$_.qrcode_vR9x139,9,139,28,56,797,$a([99,36,99,66]),$a([-1,-1,1,1,-1,-1,3,0])]),$a(["rmqr","R11x27",$_.qrcode_vR11x27,11,27,98,99,122,$a([99,8,99,10]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R11x43",$_.qrcode_vR11x43,11,43,22,99,249,$a([99,12,99,20]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R11x59",$_.qrcode_vR11x59,11,59,20,40,376,$a([99,16,99,32]),$a([-1,-1,1,0,-1,-1,1,1])]),$a(["rmqr","R11x77",$_.qrcode_vR11x77,11,77,26,52,538,$a([99,24,99,44]),$a([-1,-1,1,0,-1,-1,1,1])]),$a(["rmqr","R11x99",$_.qrcode_vR11x99,11,99,24,50,719,$a([99,32,99,60]),$a([-1,-1,1,1,-1,-1,1,1])]),$a(["rmqr","R11x139",$_.qrcode_vR11x139,11,139,28,56,1062,$a([99,48,99,90]),$a([-1,-1,2,0,-1,-1,3,0])]),$a(["rmqr","R13x27",$_.qrcode_vR13x27,13,27,98,99,172,$a([99,9,99,14]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R13x43",$_.qrcode_vR13x43,13,43,22,99,329,$a([99,14,99,28]),$a([-1,-1,1,0,-1,-1,1,0])]),$a(["rmqr","R13x59",$_.qrcode_vR13x59,13,59,20,40,486,$a([99,22,99,40]),$a([-1,-1,1,0,-1,-1,2,0])]),$a(["rmqr","R13x77",$_.qrcode_vR13x77,13,77,26,52,684,$a([99,32,99,56]),$a([-1,-1,1,1,-1,-1,1,1])]),$a(["rmqr","R13x99",$_.qrcode_vR13x99,13,99,24,50,907,$a([99,40,99,78]),$a([-1,-1,1,1,-1,-1,1,2])]),$a(["rmqr","R13x139",$_.qrcode_vR13x139,13,139,28,56,1328,$a([99,60,99,112]),$a([-1,-1,2,1,-1,-1,2,2])]),$a(["rmqr","R15x43",$_.qrcode_vR15x43,15,43,22,99,409,$a([99,18,99,36]),$a([-1,-1,1,0,-1,-1,1,1])]),$a(["rmqr","R15x59",$_.qrcode_vR15x59,15,59,20,40,596,$a([99,26,99,48]),$a([-1,-1,1,0,-1,-1,2,0])]),$a(["rmqr","R15x77",$_.qrcode_vR15x77,15,77,26,52,830,$a([99,36,99,72]),$a([-1,-1,1,1,-1,-1,2,1])]),$a(["rmqr","R15x99",$_.qrcode_vR15x99,15,99,24,50,1095,$a([99,48,99,88]),$a([-1,-1,2,0,-1,-1,4,0])]),$a(["rmqr","R15x139",$_.qrcode_vR15x139,15,139,28,56,1594,$a([99,72,99,130]),$a([-1,-1,2,1,-1,-1,1,4])]),$a(["rmqr","R17x43",$_.qrcode_vR17x43,17,43,22,99,489,$a([99,22,99,40]),$a([-1,-1,1,0,-1,-1,1,1])]),$a(["rmqr","R17x59",$_.qrcode_vR17x59,17,59,20,40,706,$a([99,32,99,60]),$a([-1,-1,2,0,-1,-1,2,0])]),$a(["rmqr","R17x77",$_.qrcode_vR17x77,17,77,26,52,976,$a([99,44,99,84]),$a([-1,-1,2,0,-1,-1,1,2])]),$a(["rmqr","R17x99",$_.qrcode_vR17x99,17,99,24,50,1283,$a([99,60,99,104]),$a([-1,-1,2,1,-1,-1,4,0])]),$a(["rmqr","R17x139",$_.qrcode_vR17x139,17,139,28,56,1860,$a([99,80,99,156]),$a([-1,-1,4,0,-1,-1,2,4])])]);var _57=$a([1,1,1,1,1,1,1,0]);var _58=$a([1,0,0,0,0,0,1,0]);var _59=$a([1,0,1,1,1,0,1,0]);$_.qrcode_fpat=$a([_57,_58,_59,_59,_59,_58,_57,$a([0,0,0,0,0,0,0,0])]);var _5C=$a([1,1,1,1,1,9,9,9]);var _5D=$a([1,0,0,0,1,9,9,9]);var _5F=$a([9,9,9,9,9,9,9,9]);$_.qrcode_fsubpat=$a([_5C,_5D,$a([1,0,1,0,1,9,9,9]),_5D,_5C,_5F,_5F,_5F]);var _5K=$a([9,9,9,9,9,9,9,9]);$_.qrcode_fcorpat=$a([$a([1,1,1,9,9,9,9,9]),$a([1,0,9,9,9,9,9,9]),$a([1,9,9,9,9,9,9,9]),_5K,_5K,_5K,_5K,_5K]);var _5M=$a([9,9,9,9,9,9,9,9]);$_.qrcode_fnullpat=$a([_5M,_5M,_5M,_5M,_5M,_5M,_5M,_5M]);var _5R=new Map([["full",$a([$_.qrcode_fpat,$_.qrcode_fpat,$_.qrcode_fpat,$_.qrcode_fnullpat])],["micro",$a([$_.qrcode_fpat,$_.qrcode_fnullpat,$_.qrcode_fnullpat,$_.qrcode_fnullpat])],["rmqr",$a([$_.qrcode_fpat,$_.qrcode_fcorpat,$_.qrcode_fcorpat,$_.qrcode_fsubpat])]]);$_.qrcode_fpatmap=_5R;var _5S=$a([1,1,1,1,1]);var _5T=$a([1,0,0,0,1]);$_.qrcode_algnpatfull=$a([_5S,_5T,$a([1,0,1,0,1]),_5T,_5S]);var _5W=$a([1,1,1,9,9]);var _5Y=$a([9,9,9,9,9]);$_.qrcode_algnpatrmqr=$a([_5W,$a([1,0,1,9,9]),_5W,_5Y,_5Y]);var _5b=$a([function(){$j-=2;$k[$j++]=0;$k[$j++]=8},function(){$j--;var _5a=$k[--$j];$k[$j++]=8;$k[$j++]=_5a-1}]);var _5d=$a([function(){$j-=2;$k[$j++]=1;$k[$j++]=8},function(){$j--;var _5c=$k[--$j];$k[$j++]=8;$k[$j++]=_5c-2}]);var _5f=$a([function(){$j-=2;$k[$j++]=2;$k[$j++]=8},function(){$j--;var _5e=$k[--$j];$k[$j++]=8;$k[$j++]=_5e-3}]);var _5h=$a([function(){$j-=2;$k[$j++]=3;$k[$j++]=8},function(){$j--;var _5g=$k[--$j];$k[$j++]=8;$k[$j++]=_5g-4}]);var _5j=$a([function(){$j-=2;$k[$j++]=4;$k[$j++]=8},function(){$j--;var _5i=$k[--$j];$k[$j++]=8;$k[$j++]=_5i-5}]);var _5l=$a([function(){$j-=2;$k[$j++]=5;$k[$j++]=8},function(){$j--;var _5k=$k[--$j];$k[$j++]=8;$k[$j++]=_5k-6}]);var _5n=$a([function(){$j-=2;$k[$j++]=7;$k[$j++]=8},function(){$j--;var _5m=$k[--$j];$k[$j++]=8;$k[$j++]=_5m-7}]);var _5p=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=8},function(){$j--;$k[$j-1]-=8;$k[$j++]=8}]);var _5r=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=7},function(){$j--;$k[$j-1]-=7;$k[$j++]=8}]);var _5t=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=5},function(){$j--;$k[$j-1]-=6;$k[$j++]=8}]);var _5v=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=4},function(){$j--;$k[$j-1]-=5;$k[$j++]=8}]);var _5x=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=3},function(){$j--;$k[$j-1]-=4;$k[$j++]=8}]);var _5z=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=2},function(){$j--;$k[$j-1]-=3;$k[$j++]=8}]);var _61=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=1},function(){$j--;$k[$j-1]-=2;$k[$j++]=8}]);var _63=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=0},function(){$j--;$k[$j-1]-=1;$k[$j++]=8}]);var _64=$a([_5b,_5d,_5f,_5h,_5j,_5l,_5n,_5p,_5r,_5t,_5v,_5x,_5z,_61,_63]);var _65=$a([function(){$j-=2;$k[$j++]=1;$k[$j++]=8}]);var _66=$a([function(){$j-=2;$k[$j++]=2;$k[$j++]=8}]);var _67=$a([function(){$j-=2;$k[$j++]=3;$k[$j++]=8}]);var _68=$a([function(){$j-=2;$k[$j++]=4;$k[$j++]=8}]);var _69=$a([function(){$j-=2;$k[$j++]=5;$k[$j++]=8}]);var _6A=$a([function(){$j-=2;$k[$j++]=6;$k[$j++]=8}]);var _6B=$a([function(){$j-=2;$k[$j++]=7;$k[$j++]=8}]);var _6C=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=8}]);var _6D=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=7}]);var _6E=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=6}]);var _6F=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=5}]);var _6G=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=4}]);var _6H=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=3}]);var _6I=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=2}]);var _6J=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=1}]);var _6K=$a([_65,_66,_67,_68,_69,_6A,_6B,_6C,_6D,_6E,_6F,_6G,_6H,_6I,_6J]);var _6N=$a([function(){$j-=2;$k[$j++]=11;$k[$j++]=3},function(){var _6L=$k[--$j];var _6M=$k[--$j];$k[$j++]=_6L-3;$k[$j++]=_6M-6}]);var _6Q=$a([function(){$j-=2;$k[$j++]=11;$k[$j++]=2},function(){var _6O=$k[--$j];var _6P=$k[--$j];$k[$j++]=_6O-4;$k[$j++]=_6P-6}]);var _6T=$a([function(){$j-=2;$k[$j++]=11;$k[$j++]=1},function(){var _6R=$k[--$j];var _6S=$k[--$j];$k[$j++]=_6R-5;$k[$j++]=_6S-6}]);var _6W=$a([function(){$j-=2;$k[$j++]=10;$k[$j++]=5},function(){var _6U=$k[--$j];var _6V=$k[--$j];$k[$j++]=_6U-6;$k[$j++]=_6V-2}]);var _6Z=$a([function(){$j-=2;$k[$j++]=10;$k[$j++]=4},function(){var _6X=$k[--$j];var _6Y=$k[--$j];$k[$j++]=_6X-6;$k[$j++]=_6Y-3}]);var _6c=$a([function(){$j-=2;$k[$j++]=10;$k[$j++]=3},function(){var _6a=$k[--$j];var _6b=$k[--$j];$k[$j++]=_6a-6;$k[$j++]=_6b-4}]);var _6f=$a([function(){$j-=2;$k[$j++]=10;$k[$j++]=2},function(){var _6d=$k[--$j];var _6e=$k[--$j];$k[$j++]=_6d-6;$k[$j++]=_6e-5}]);var _6i=$a([function(){$j-=2;$k[$j++]=10;$k[$j++]=1},function(){var _6g=$k[--$j];var _6h=$k[--$j];$k[$j++]=_6g-6;$k[$j++]=_6h-6}]);var _6l=$a([function(){$j-=2;$k[$j++]=9;$k[$j++]=5},function(){var _6j=$k[--$j];var _6k=$k[--$j];$k[$j++]=_6j-7;$k[$j++]=_6k-2}]);var _6o=$a([function(){$j-=2;$k[$j++]=9;$k[$j++]=4},function(){var _6m=$k[--$j];var _6n=$k[--$j];$k[$j++]=_6m-7;$k[$j++]=_6n-3}]);var _6r=$a([function(){$j-=2;$k[$j++]=9;$k[$j++]=3},function(){var _6p=$k[--$j];var _6q=$k[--$j];$k[$j++]=_6p-7;$k[$j++]=_6q-4}]);var _6u=$a([function(){$j-=2;$k[$j++]=9;$k[$j++]=2},function(){var _6s=$k[--$j];var _6t=$k[--$j];$k[$j++]=_6s-7;$k[$j++]=_6t-5}]);var _6x=$a([function(){$j-=2;$k[$j++]=9;$k[$j++]=1},function(){var _6v=$k[--$j];var _6w=$k[--$j];$k[$j++]=_6v-7;$k[$j++]=_6w-6}]);var _70=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=5},function(){var _6y=$k[--$j];var _6z=$k[--$j];$k[$j++]=_6y-8;$k[$j++]=_6z-2}]);var _73=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=4},function(){var _71=$k[--$j];var _72=$k[--$j];$k[$j++]=_71-8;$k[$j++]=_72-3}]);var _76=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=3},function(){var _74=$k[--$j];var _75=$k[--$j];$k[$j++]=_74-8;$k[$j++]=_75-4}]);var _79=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=2},function(){var _77=$k[--$j];var _78=$k[--$j];$k[$j++]=_77-8;$k[$j++]=_78-5}]);var _7C=$a([function(){$j-=2;$k[$j++]=8;$k[$j++]=1},function(){var _7A=$k[--$j];var _7B=$k[--$j];$k[$j++]=_7A-8;$k[$j++]=_7B-6}]);var _7E=new Map([["full",_64],["micro",_6K],["rmqr",$a([_6N,_6Q,_6T,_6W,_6Z,_6c,_6f,_6i,_6l,_6o,_6r,_6u,_6x,_70,_73,_76,_79,_7C])]]);$_.qrcode_formatfimmap=_7E;$_.qrcode_ecidfull=$a([1,0,3,2]);$_.qrcode_ecidrmqr=$a([-1,0,-1,1]);$_.qrcode_ecidmicrosym=$a([$a([0]),$a([1,2]),$a([3,4]),$a([5,6,7])]);var _7O=$a([function(){$k[$j-1]-=9;$k[$j++]=5},function(){var _7N=$k[--$j];$k[$j++]=5;$k[$j++]=_7N-9}]);var _7R=$a([function(){$k[$j-1]-=10;$k[$j++]=5},function(){var _7Q=$k[--$j];$k[$j++]=5;$k[$j++]=_7Q-10}]);var _7U=$a([function(){$k[$j-1]-=11;$k[$j++]=5},function(){var _7T=$k[--$j];$k[$j++]=5;$k[$j++]=_7T-11}]);var _7X=$a([function(){$k[$j-1]-=9;$k[$j++]=4},function(){var _7W=$k[--$j];$k[$j++]=4;$k[$j++]=_7W-9}]);var _7a=$a([function(){$k[$j-1]-=10;$k[$j++]=4},function(){var _7Z=$k[--$j];$k[$j++]=4;$k[$j++]=_7Z-10}]);var _7d=$a([function(){$k[$j-1]-=11;$k[$j++]=4},function(){var _7c=$k[--$j];$k[$j++]=4;$k[$j++]=_7c-11}]);var _7g=$a([function(){$k[$j-1]-=9;$k[$j++]=3},function(){var _7f=$k[--$j];$k[$j++]=3;$k[$j++]=_7f-9}]);var _7j=$a([function(){$k[$j-1]-=10;$k[$j++]=3},function(){var _7i=$k[--$j];$k[$j++]=3;$k[$j++]=_7i-10}]);var _7m=$a([function(){$k[$j-1]-=11;$k[$j++]=3},function(){var _7l=$k[--$j];$k[$j++]=3;$k[$j++]=_7l-11}]);var _7p=$a([function(){$k[$j-1]-=9;$k[$j++]=2},function(){var _7o=$k[--$j];$k[$j++]=2;$k[$j++]=_7o-9}]);var _7s=$a([function(){$k[$j-1]-=10;$k[$j++]=2},function(){var _7r=$k[--$j];$k[$j++]=2;$k[$j++]=_7r-10}]);var _7v=$a([function(){$k[$j-1]-=11;$k[$j++]=2},function(){var _7u=$k[--$j];$k[$j++]=2;$k[$j++]=_7u-11}]);var _7y=$a([function(){$k[$j-1]-=9;$k[$j++]=1},function(){var _7x=$k[--$j];$k[$j++]=1;$k[$j++]=_7x-9}]);var _81=$a([function(){$k[$j-1]-=10;$k[$j++]=1},function(){var _80=$k[--$j];$k[$j++]=1;$k[$j++]=_80-10}]);var _84=$a([function(){$k[$j-1]-=11;$k[$j++]=1},function(){var _83=$k[--$j];$k[$j++]=1;$k[$j++]=_83-11}]);var _87=$a([function(){$k[$j-1]-=9;$k[$j++]=0},function(){var _86=$k[--$j];$k[$j++]=0;$k[$j++]=_86-9}]);var _8A=$a([function(){$k[$j-1]-=10;$k[$j++]=0},function(){var _89=$k[--$j];$k[$j++]=0;$k[$j++]=_89-10}]);var _8D=$a([function(){$k[$j-1]-=11;$k[$j++]=0},function(){var _8C=$k[--$j];$k[$j++]=0;$k[$j++]=_8C-11}]);$_.qrcode_vimmap=$a([_7O,_7R,_7U,_7X,_7a,_7d,_7g,_7j,_7m,_7p,_7s,_7v,_7y,_81,_84,_87,_8A,_8D]);$_.e=1e4;$_.qrcode_mode0forceKB=$a([1,1,1,$_.e,$_.e,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);$_.qrcode_mode0forceA=$a([1,1,1,$_.e,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);$_.qrcode_mode0forceN=$a([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]);$_.qrcode_mode0NbeforeB=$a([4,4,5,$_.e,$_.e,2,3,2,2,3,3,3,2,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]);$_.qrcode_modeBKbeforeB=$a([9,12,13,$_.e,$_.e,4,6,4,5,6,6,6,5,6,6,6,7,4,6,6,6,7,7,5,6,6,7,7,7,6,6,7,7,7,6,7,7,7,8]);$_.qrcode_modeBKbeforeA=$a([8,10,11,$_.e,$_.e,4,5,4,5,5,6,6,5,5,6,6,6,4,5,6,6,6,6,5,6,6,6,6,7,6,6,6,6,7,6,6,6,7,7]);$_.qrcode_modeBKbeforeN=$a([8,9,11,$_.e,$_.e,3,5,3,4,5,5,5,4,5,5,5,6,3,5,5,5,6,6,4,5,5,6,6,6,5,5,6,6,7,5,6,6,6,7]);$_.qrcode_modeBKbeforeE=$a([5,5,6,$_.e,$_.e,2,3,2,3,3,3,3,3,3,3,3,4,2,3,3,3,4,4,3,3,3,4,4,4,3,3,4,4,4,3,4,4,4,4]);$_.qrcode_modeBAbeforeK=$a([11,12,14,$_.e,$_.e,5,7,5,6,7,8,8,6,7,8,8,8,6,7,8,8,8,8,6,8,8,8,8,9,8,8,8,8,9,8,8,8,9,9]);$_.qrcode_modeBAbeforeB=$a([11,15,16,$_.e,$_.e,6,7,6,7,7,8,8,7,7,8,8,8,6,7,8,8,8,9,7,8,8,8,9,9,8,8,9,9,9,8,8,9,9,10]);$_.qrcode_modeBAbeforeN=$a([12,13,15,$_.e,$_.e,6,8,6,7,8,8,8,7,8,8,8,9,6,8,8,8,9,9,7,8,8,9,9,10,8,9,9,9,10,8,9,9,10,10]);$_.qrcode_modeBAbeforeE=$a([6,7,8,$_.e,$_.e,3,4,3,4,4,4,4,4,4,4,4,5,4,4,4,4,5,5,4,4,4,5,5,5,4,5,5,5,5,4,5,5,5,5]);$_.qrcode_modeBNbeforeK=$a([6,7,8,$_.e,$_.e,3,4,3,4,4,5,5,4,4,5,5,5,3,4,5,5,5,5,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5]);$_.qrcode_modeBNbeforeB=$a([6,8,9,$_.e,$_.e,3,4,3,4,4,5,5,4,4,5,5,5,3,4,5,5,5,5,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,6]);$_.qrcode_modeBNbeforeA=$a([6,7,8,$_.e,$_.e,3,4,3,4,4,5,5,4,4,5,5,5,4,4,5,5,5,5,4,5,5,5,5,5,5,5,5,5,6,5,5,5,5,6]);$_.qrcode_modeBNbeforeE=$a([3,4,4,$_.e,$_.e,2,3,2,2,3,3,3,2,3,3,3,3,2,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]);$_.qrcode_modeANbeforeA=$a([13,15,17,$_.e,5,7,9,7,8,9,9,9,8,9,9,9,11,7,9,9,9,11,11,8,9,9,10,11,11,9,10,11,11,11,9,11,11,11,11]);$_.qrcode_modeANbeforeB=$a([13,17,18,$_.e,$_.e,7,9,7,8,9,9,9,8,9,9,9,10,7,9,9,9,10,11,8,9,9,9,11,11,9,9,11,11,11,9,10,11,11,11]);$_.qrcode_modeANbeforeE=$a([7,8,9,$_.e,3,4,5,4,5,5,5,5,5,5,5,5,6,4,5,5,5,6,6,5,5,5,5,6,6,5,5,6,6,6,5,6,6,6,6]);var _9N=$a([function(){var _95=$k[--$j];var _96=$k[--$j];$k[$j++]=$f(_96+_95)%2},function(){var _97=$k[--$j];$k[$j-1]=_97%2},function(){$j--;var _9A=$k[--$j];$k[$j++]=_9A%3},function(){var _9B=$k[--$j];var _9C=$k[--$j];$k[$j++]=$f(_9C+_9B)%3},function(){var _9D=$k[--$j];var _9E=$k[--$j];$k[$j++]=(~~(_9D/2)+~~(_9E/3))%2},function(){var _9F=$k[--$j];var _9G=$k[--$j];var _9H=_9G*_9F;$k[$j++]=$f(_9H%2+_9H%3)},function(){var _9I=$k[--$j];var _9J=$k[--$j];var _9K=_9J*_9I;$k[$j++]=$f(_9K%2+_9K%3)%2},function(){var _9L=$k[--$j];var _9M=$k[--$j];$k[$j++]=$f(_9M*_9L%3+(_9M+_9L)%2)%2}]);$_.qrcode_maskfuncs=_9N;var _9R=new Map([["full",$a([0,1,2,3,4,5,6,7])],["micro",$a([1,4,6,7])],["rmqr",$a([4])]]);$_.qrcode_formatmaskbits=_9R;$_.qrcode_bchrem=function(){var _9S=$k[--$j];var _9T=$k[$j-1];$k[$j++]=$bs(_9S,_9T);for(;;){var _9U=$k[$j-1];if(_9U==0){break}var _9V=$k[$j-1];$k[$j++]=0;$k[$j++]=_9V;if(_9V>=65536){var _9W=$k[--$j];$k[$j-1]+=16;$k[$j++]=$flr(_9W/65536)}var _9Y=$k[$j-1];if(_9Y>=256){var _9Z=$k[--$j];$k[$j-1]+=8;$k[$j++]=$flr(_9Z/256)}var _9b=$k[$j-1];if(_9b>=16){var _9c=$k[--$j];$k[$j-1]+=4;$k[$j++]=$flr(_9c/16)}var _9e=$k[$j-1];if(_9e>=4){var _9f=$k[--$j];$k[$j-1]+=2;$k[$j++]=$flr(_9f/4)}var _9h=$k[--$j];if(_9h>=2){$k[$j-1]+=1}var _9j=$k[$j-1];var _9l=$k[$j-3];if($lt(_9j,_9l)){$j--;break}var _9m=$k[--$j];var _9n=$k[--$j];var _9o=$k[$j-1];var _9p=$k[$j-2];$k[$j++]=$bs(_9p,$f(_9m-_9o))^_9n}$r(3,1);$j-=2};$_.charvals=new Map;for(var _9q=0;_9q<=44;_9q+=1){$p($_.charvals,$g($_.qrcode_charmap,_9q),_9q)}$_.charvals=$_.charvals;$k[$j++]=Infinity;$k[$j++]=1;for(var _9u=0;_9u<255;_9u++){var _9v=$k[$j-1];var _9w=_9v*2;$k[$j++]=_9w;if(_9w>=256){var _9x=$k[--$j];$k[$j++]=_9x^285}}var _9y=$a();$_.rsalog=_9y;$_.rslog=$a(256);for(var _A0=1;_A0<=255;_A0+=1){$p($_.rslog,$g($_.rsalog,_A0),_A0)}$_.rslog=$_.rslog;$_.funcpatlayers=$a(6*12);for(var _A6=0;_A6<=11;_A6+=1){$_.j=_A6;for(var _A7=0;_A7<=5;_A7+=1){$_.i=_A7;$_.bits=0;for(var _A8=0;_A8<=7;_A8+=1){$_.m=_A8;$k[$j++]=$_.i;$k[$j++]=$_.j;if($g($_.qrcode_maskfuncs,$_.m)()===true){break}var _AD=$k[--$j];if(_AD==0){$_.bits=$_.bits|$bs(1,$_.m)}}$p($_.funcpatlayers,$_.j*6+$_.i,$_.bits)}}$_.funcpatlayers=$_.funcpatlayers;$_.fmtvalsfull=$a(32);$_.fmtvalsmicro=$a(32);for(var _AN=0;_AN<=31;_AN+=1){$k[$j++]=_AN;$k[$j++]=1335;$k[$j++]=10;$k[$j++]=_AN;$_.qrcode_bchrem();var _AO=$k[--$j];var _AP=$k[--$j];var _AQ=_AO|_AP*1024;$p($_.fmtvalsfull,_AP,_AQ^21522);$p($_.fmtvalsmicro,_AP,_AQ^17477)}$_.fmtvalsfull=$_.fmtvalsfull;$_.fmtvalsmicro=$_.fmtvalsmicro;$_.fmtvalsrmqr1=$a(64);$_.fmtvalsrmqr2=$a(64);$_.vervals=$a(34);for(var _AY=0;_AY<=63;_AY+=1){$k[$j++]=_AY;$k[$j++]=7973;$k[$j++]=12;$k[$j++]=_AY;$_.qrcode_bchrem();var _AZ=$k[--$j];var _Aa=$k[--$j];$p($_.fmtvalsrmqr1,_Aa,(_AZ|_Aa*4096)^129714);var _Ac=_AZ|_Aa*4096;$p($_.fmtvalsrmqr2,_Aa,_Ac^133755);$k[$j++]=_Ac;$k[$j++]=_Aa;if(_Aa>=7&&_Aa<=40){var _Ae=$k[--$j];var _Af=$k[--$j];$p($_.vervals,_Ae-7,_Af)}else{$j-=2}}$_.fmtvalsrmqr1=$_.fmtvalsrmqr1;$_.fmtvalsrmqr2=$_.fmtvalsrmqr2;$_.vervals=$_.vervals;$_.qrcode_rsprod=function(){var _Ak=$k[$j-1];if(_Ak!=0){var _Am=$k[$j-2];if(_Am!=0){var _Ao=$k[--$j];var _Aq=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_Ao)+$g($_.rslog,_Aq))%255)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.qrcode_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _Aw=0,_Ax=$_.ecpb;_Aw<_Ax;_Aw++){$k[$j++]=0}$_.coeffs=$a();for(var _B0=0,_Az=$_.ecpb-1;_B0<=_Az;_B0+=1){var _B3=$_.coeffs;$p(_B3,_B0+1,$g(_B3,_B0+1-1));$k[$j++]=$g($_.rsalog,_B0);for(var _B5=_B0;_B5>=1;_B5-=1){var _B6=$_.coeffs;var _B8=$k[$j-1];$k[$j++]=_B6;$k[$j++]=_B5;$k[$j++]=$g(_B6,_B5);$k[$j++]=_B8;$_.qrcode_rsprod();var _BA=$k[--$j];var _BB=$k[--$j];var _BD=$k[--$j];$p(_BD,_BB,$xo(_BA,$g($_.coeffs,_BB-1)))}var _BE=$_.coeffs;var _BG=$k[$j-1];$k[$j++]=_BE;$k[$j++]=0;$k[$j++]=$g(_BE,0);$k[$j++]=_BG;$_.qrcode_rsprod();var _BH=$k[--$j];var _BI=$k[--$j];var _BJ=$k[--$j];$p(_BJ,_BI,_BH);$j--}$k[$j++]=$G($_.coeffs,0,$_.coeffs.length-1)};$_.qrcode_coeffscachemax=20;$_.qrcode_coeffscachelimit=302;$k[$j++]=$_.qrcode_coeffscachemax;$k[$j++]=$_.qrcode_coeffscachelimit;bwipp_fifocache();var _BP=$k[--$j];$_.qrcode_coeffscache=_BP;$_.qrcode_coeffscachefetch=function(){var _BQ=$k[--$j];$_.ecpb=_BQ;var _BS=$g($_.qrcode_coeffscache,"fetch");$k[$j++]=$_.ecpb;$k[$j++]=function(){$_.qrcode_gencoeffs()};$k[$j++]=function(){var _BT=$k[--$j];$k[$j++]=_BT.length};if(_BS()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_qrcode.globals);$_.dontdraw=false;$_.format="unset";$_.version="unset";$_.eclevel="unset";$_.fixedeclevel=false;$_.parse=false;$_.parsefnc=false;$_.mask=-1;$_.suppresskanjimode=true;bwipp_processoptions();var _BU=$k[--$j];$_.options=_BU;var _BV=$k[--$j];$_.barcode=_BV;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.barcode.length==0){$k[$j++]="bwipp.qrcodeEmptyData#26910";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>3e4){$k[$j++]="bwipp.qrcodeinputTooLong#26914";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($ne($_.version,"unset")){if($eq($_.format,"unset")){$k[$j++]="full";if($_.version.length>0){if($eq($G($_.version,0,1),"M")){$k[$j-1]="micro"}if($eq($G($_.version,0,1),"R")){$k[$j-1]="rmqr"}}var _Bh=$k[--$j];$_.format=_Bh}}else{if($eq($_.format,"unset")){$_.format="full"}}if($ne($_.format,"full")&&($ne($_.format,"micro")&&$ne($_.format,"rmqr"))){$k[$j++]="bwipp.qrcodeInvalidFormat#26934";$k[$j++]="The format must be either full, micro or rmqr";bwipp_raiseerror()}if($eq($_.format,"rmqr")&&$eq($_.version,"unset")){$k[$j++]="bwipp.qrcodeRMQRwithoutVersion#26938";$k[$j++]="A version must be provided for RMQR";bwipp_raiseerror()}if($eq($_.eclevel,"unset")){var _Bq=$ne($_.format,"micro")?"M":"L";$_.eclevel=_Bq}if($ne($_.eclevel,"L")&&($ne($_.eclevel,"M")&&($ne($_.eclevel,"Q")&&$ne($_.eclevel,"H")))){$k[$j++]="bwipp.qrcodeInvalidEClevel#26947";$k[$j++]="Error correction level must be either L, M, Q, or H";bwipp_raiseerror()}if($_.mask!=-1&&$eq($_.format,"rmqr")){$k[$j++]="bwipp.qrcodeRMQRmask#26951";$k[$j++]="A mask cannot be supplied for RMQR";bwipp_raiseerror()}if($_.mask!=-1){var _C2=$eq($_.format,"full")?8:4;if($_.mask<1||$_.mask>_C2){$k[$j++]="bwipp.qrcodeBadMask#26956";$k[$j++]="An invalid mask was supplied";bwipp_raiseerror()}}$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true],["FNC1",$_.qrcode_fn1]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _C7=$k[--$j];$_.msg=_C7;$_.msglen=$_.msg.length;$_.fnc1first=false;if($_.msglen>0){if($g($_.msg,0)==$_.qrcode_fn1){$_.fnc1first=true;$k[$j++]=Infinity;var _CE=$G($_.msg,1,$_.msglen-1);for(var _CF=0,_CG=_CE.length;_CF<_CG;_CF++){var _CH=$g(_CE,_CF);$k[$j++]=_CH;if(_CH==37){var _CI=$k[$j-1];$k[$j++]=_CI}}$_.msg=$a();$_.msglen=$_.msg.length}}$_.tobin=function(){var _CK=$k[--$j];var _CL=$s(_CK);$k[$j++]=_CL;for(var _CN=0,_CM=_CL.length-1;_CN<=_CM;_CN+=1){var _CO=$k[$j-1];$p(_CO,_CN,48)}var _CP=$k[$j-1];$k[$j++]=_CP;var _CQ=$k[$j-3];var _CR=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _CT=$R($s(_CR.length),_CQ,2);$P(_CR,_CR.length-_CT.length,_CT)};$_.encA=function(){var _CU=$k[--$j];$_.in=_CU;if($_.fnc1first){$k[$j++]=Infinity;$F($_.in,function(){var _CX=$k[$j-1];if(_CX==$_.qrcode_fn1){$k[$j-1]=37}});$_.in=$a()}$k[$j++]=~~($_.in.length*11/2)+1;try{var _CZ=$k[--$j];$k[$j++]=$s(_CZ);var _Cb=false}catch(e){$k[$j++]=true}if(_Cb){$k[$j-1]="bwipp.qrcodeInputTooLarge#27011";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _Cc=$k[--$j];$_.out=_Cc;$_.k=0;$_.m=0;for(;;){if($_.k==$_.in.length){break}if($_.k<$_.in.length-1){$k[$j++]=$f($g($_.charvals,$g($_.in,$_.k))*45+$g($_.charvals,$g($_.in,$_.k+1)));$k[$j++]=11;$_.tobin();$_.k=$_.k+2}else{$k[$j++]=$g($_.charvals,$g($_.in,$_.k));$k[$j++]=6;$_.tobin();$_.k=$_.k+1}var _Cy=$k[--$j];$P($_.out,$_.m,_Cy);$_.m=_Cy.length+$_.m}$k[$j++]=$G($_.out,0,$_.m)};$_.encN=function(){var _D5=$k[--$j];$_.in=_D5;$k[$j++]=~~($_.in.length*10/3)+1;try{var _D7=$k[--$j];$k[$j++]=$s(_D7);var _D9=false}catch(e){$k[$j++]=true}if(_D9){$k[$j-1]="bwipp.qrcodeInputTooLarge#27032";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _DA=$k[--$j];$_.out=_DA;$_.k=0;$_.m=0;for(;;){if($_.k==$_.in.length){break}if($_.k<$_.in.length-2){var _DH=$G($_.in,$_.k,3);$k[$j++]=0;for(var _DI=0,_DJ=_DH.length;_DI<_DJ;_DI++){var _DL=$k[--$j];$k[$j++]=$f($g(_DH,_DI)+(_DL*10-48))}$k[$j++]=10;$_.tobin();$_.k=$_.k+3}else{if($_.k==$_.in.length-2){var _DR=$G($_.in,$_.k,2);$k[$j++]=0;for(var _DS=0,_DT=_DR.length;_DS<_DT;_DS++){var _DV=$k[--$j];$k[$j++]=$f($g(_DR,_DS)+(_DV*10-48))}$k[$j++]=7;$_.tobin();$_.k=$_.k+2}else{var _DZ=$G($_.in,$_.k,1);$k[$j++]=0;for(var _Da=0,_Db=_DZ.length;_Da<_Db;_Da++){var _Dd=$k[--$j];$k[$j++]=$f($g(_DZ,_Da)+(_Dd*10-48))}$k[$j++]=4;$_.tobin();$_.k=$_.k+1}}var _Df=$k[--$j];$P($_.out,$_.m,_Df);$_.m=_Df.length+$_.m}$k[$j++]=$G($_.out,0,$_.m)};$_.encB=function(){var _Dm=$k[--$j];$_.in=_Dm;if($_.fnc1first){$k[$j++]=Infinity;$F($_.in,function(){var _Dp=$k[$j-1];if(_Dp==$_.qrcode_fn1){$k[$j-1]=29}});$_.in=$a()}$k[$j++]=$_.in.length*8;try{var _Dr=$k[--$j];$k[$j++]=$s(_Dr);var _Dt=false}catch(e){$k[$j++]=true}if(_Dt){$k[$j-1]="bwipp.qrcodeInputTooLarge#27061";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _Du=$k[--$j];$_.out=_Du;for(var _Dx=0,_Dw=$_.in.length-1;_Dx<=_Dw;_Dx+=1){$_.k=_Dx;$k[$j++]=$i($g($_.in,$_.k));$k[$j++]=8;$_.tobin();$k[$j++]=$_.out;$k[$j++]=$_.k*8;var _E3=$k[$j-3];var _E4=$k[$j-1];var _E5=$k[$j-2];$j-=3;$P(_E5,_E4,_E3)}$k[$j++]=$_.out};$_.encK=function(){var _E7=$k[--$j];$_.in=_E7;$k[$j++]=~~($_.in.length/2)*13;try{var _E9=$k[--$j];$k[$j++]=$s(_E9);var _EB=false}catch(e){$k[$j++]=true}if(_EB){$k[$j-1]="bwipp.qrcodeInputTooLarge#27075";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _EC=$k[--$j];$_.out=_EC;$_.k=0;$_.m=0;for(;;){if($_.k==$_.in.length){break}var _EL=$f($g($_.in,$_.k)*256+$g($_.in,$_.k+1));var _EM=_EL<57408?33088:49472;var _EO=$f(_EL-_EM);$k[$j++]=$f($flr(_EO/256)*192+(_EO&255));$k[$j++]=13;$_.tobin();var _EP=$k[--$j];$P($_.out,$_.m,_EP);$_.m=_EP.length+$_.m;$_.k=$_.k+2}$k[$j++]=$_.out};$_.encE=function(){var _EV=$k[--$j];var _EX=-$g(_EV,0)-1e6;$k[$j++]=_EX;if(_EX<=127){$k[$j++]=8;$_.tobin()}else{var _EY=$k[$j-1];if(_EY<=16383){$k[$j-1]+=32768;$k[$j++]=16;$_.tobin()}else{$k[$j-1]+=12582912;$k[$j++]=24;$_.tobin()}}};$_.addtobits=function(){var _Eb=$k[$j-1];if(_Eb.length+$_.j>$_.bits.length){$k[$j-1]="bwipp.qrcodeNoValidSymbol#27102";$k[$j++]="Maximum length exceeded or invalid content";bwipp_raiseerror()}var _Ee=$k[--$j];$P($_.bits,$_.j,_Ee);$_.j=_Ee.length+$_.j};$k[$j++]=Infinity;for(var _Ej=0,_Ek=$_.msglen;_Ej<_Ek;_Ej++){$k[$j++]=0}$k[$j++]=0;$_.numNs=$a();$k[$j++]=Infinity;for(var _Em=0,_En=$_.msglen;_Em<_En;_Em++){$k[$j++]=0}$k[$j++]=0;$_.numAs=$a();$k[$j++]=Infinity;for(var _Ep=0,_Eq=$_.msglen;_Ep<_Eq;_Ep++){$k[$j++]=0}$k[$j++]=0;$_.numAorNs=$a();$k[$j++]=Infinity;for(var _Es=0,_Et=$_.msglen;_Es<_Et;_Es++){$k[$j++]=0}$k[$j++]=0;$_.numBs=$a();$k[$j++]=Infinity;for(var _Ev=0,_Ew=$_.msglen;_Ev<_Ew;_Ev++){$k[$j++]=0}$k[$j++]=0;$_.numKs=$a();$k[$j++]=Infinity;for(var _Ey=0,_Ez=$_.msglen;_Ey<_Ez;_Ey++){$k[$j++]=0}$k[$j++]=9999;$_.nextNs=$a();$k[$j++]=Infinity;for(var _F1=0,_F2=$_.msglen;_F1<_F2;_F1++){$k[$j++]=0}$k[$j++]=9999;$_.nextBs=$a();$k[$j++]=Infinity;for(var _F4=0,_F5=$_.msglen;_F4<_F5;_F4++){$k[$j++]=0}$k[$j++]=9999;$_.nextAs=$a();$k[$j++]=Infinity;for(var _F7=0,_F8=$_.msglen;_F7<_F8;_F7++){$k[$j++]=0}$k[$j++]=9999;$_.nextKs=$a();$_.isECI=$a($_.msglen);for(var _FC=$_.msglen-1;_FC>=0;_FC-=1){$_.i=_FC;$_.barchar=$g($_.msg,$_.i);if($has($_.qrcode_Kexcl,$_.barchar)&&!$_.suppresskanjimode){var _FP=$_.i+1<$_.msglen?$f($_.barchar*256+$g($_.msg,$_.i+1)):0;var _FQ=_FP&255;if((_FP>=33088&&_FP<=40956||_FP>=57408&&_FP<=60351)&&(_FQ>=64&&_FQ<=252&&_FQ!=127)){$p($_.nextKs,$_.i,0);$p($_.numKs,$_.i,$g($_.numKs,$_.i+2)+1)}else{$p($_.nextKs,$_.i,$g($_.nextKs,$_.i+1)+1)}}else{$p($_.nextKs,$_.i,$g($_.nextKs,$_.i+1)+1)}if($has($_.qrcode_Nexcl,$_.barchar)){$p($_.nextNs,$_.i,0);$p($_.numNs,$_.i,$g($_.numNs,$_.i+1)+1);$p($_.numAorNs,$_.i,$g($_.numAorNs,$_.i+1)+1)}else{$p($_.nextNs,$_.i,$g($_.nextNs,$_.i+1)+1)}if($has($_.qrcode_Aexcl,$_.barchar)){$p($_.nextAs,$_.i,0);$p($_.numAs,$_.i,$g($_.numAs,$_.i+1)+1);$p($_.numAorNs,$_.i,$g($_.numAorNs,$_.i+1)+1)}else{$p($_.nextAs,$_.i,$g($_.nextAs,$_.i+1)+1)}$p($_.isECI,$_.i,$_.barchar<=-1e6)}for(var _GP=0,_GO=$_.msglen-1;_GP<=_GO;_GP+=1){$_.i=_GP;if($g($_.numKs,$_.i)>0){$p($_.numKs,$_.i+1,0);$p($_.nextKs,$_.i+1,$g($_.nextKs,$_.i+1)+1)}}for(var _Gb=$_.msglen-1;_Gb>=0;_Gb-=1){$_.i=_Gb;if($f($g($_.numNs,$_.i)+($g($_.numAs,$_.i)+$g($_.numKs,$_.i)))==0&&!$g($_.isECI,$_.i)){$p($_.nextBs,$_.i,0);$p($_.numBs,$_.i,$g($_.numBs,$_.i+1)+1)}else{$p($_.nextBs,$_.i,$g($_.nextBs,$_.i+1)+1)}}$_.KbeforeB=function(){var _H1=$k[--$j];$k[$j++]=$ge($_.numK,$g(_H1,$_.ver))&&$g($_.nextBs,$f($_.numK*2+$_.i))==0};$_.KbeforeA=function(){var _H9=$k[--$j];$k[$j++]=$ge($_.numK,$g(_H9,$_.ver))&&$g($_.nextAs,$f($_.numK*2+$_.i))==0};$_.KbeforeN=function(){var _HH=$k[--$j];$k[$j++]=$ge($_.numK,$g(_HH,$_.ver))&&$g($_.nextNs,$f($_.numK*2+$_.i))==0};$_.KbeforeE=function(){var _HP=$k[--$j];$k[$j++]=$ge($_.numK,$g(_HP,$_.ver))&&$f($_.numK*2+$_.i)==$_.msglen};$_.AbeforeK=function(){var _HW=$k[--$j];$k[$j++]=$ge($_.numA,$g(_HW,$_.ver))&&$g($_.nextKs,$f($_.numA+$_.i))==0};$_.AbeforeB=function(){var _He=$k[--$j];$k[$j++]=$ge($_.numA,$g(_He,$_.ver))&&$g($_.nextBs,$f($_.numA+$_.i))==0};$_.AbeforeN=function(){var _Hm=$k[--$j];$k[$j++]=$ge($_.numA,$g(_Hm,$_.ver))&&$g($_.nextNs,$f($_.numA+$_.i))==0};$_.AbeforeE=function(){var _Hu=$k[--$j];$k[$j++]=$ge($_.numA,$g(_Hu,$_.ver))&&$f($_.numA+$_.i)==$_.msglen};$_.NbeforeK=function(){var _I1=$k[--$j];$k[$j++]=$ge($_.numN,$g(_I1,$_.ver))&&$g($_.nextKs,$f($_.numN+$_.i))==0};$_.NbeforeB=function(){var _I9=$k[--$j];$k[$j++]=$ge($_.numN,$g(_I9,$_.ver))&&$g($_.nextBs,$f($_.numN+$_.i))==0};$_.NbeforeA=function(){var _IH=$k[--$j];$k[$j++]=$ge($_.numN,$g(_IH,$_.ver))&&$g($_.nextAs,$f($_.numN+$_.i))==0};$_.NbeforeE=function(){var _IP=$k[--$j];$k[$j++]=$ge($_.numN,$g(_IP,$_.ver))&&$f($_.numN+$_.i)==$_.msglen};$_.AorNbeforeB=function(){var _IW=$k[--$j];$k[$j++]=$ge($_.numAorN,$g(_IW,$_.ver))&&$g($_.nextBs,$f($_.numAorN+$_.i))==0};$_.AorNbeforeE=function(){var _Ie=$k[--$j];$k[$j++]=$ge($_.numAorN,$g(_Ie,$_.ver))&&$f($_.numAorN+$_.i)==$_.msglen};$_.nextNslt=function(){if($g($_.nextNs,$_.i)>=$_.msglen){$k[$j-1]=true}else{var _It=$g($_.numNs,$f($g($_.nextNs,$_.i)+$_.i));var _Iu=$k[--$j];$k[$j++]=$lt(_It,$g(_Iu,$_.ver))}};if($ne($_.version,"unset")){var _Iz=$g($_.qrcode_versetmap,$_.format);var _J0=$_.version;var _J1=$has(_Iz,_J0);$k[$j++]=_Iz;$k[$j++]=_J0;if(!_J1){$j-=2;if($eq($_.format,"full")){$k[$j++]="bwipp.qrcodeInvalidFullVersion#27201";$k[$j++]="Valid versions for QR Code symbols are 1 to 40";bwipp_raiseerror()}else{if($eq($_.format,"micro")){$k[$j++]="bwipp.qrcodeInvalidMicroVersion#27204";$k[$j++]="Valid versions for Micro QR Code symbols are M1 to M4";bwipp_raiseerror()}else{$k[$j++]="bwipp.qrcodeInvalidRMQRversion#27206";$k[$j++]="Invalid version for an RMQR symbol";bwipp_raiseerror()}}}var _J4=$k[--$j];var _J5=$k[--$j];$k[$j++]=Infinity;$k[$j++]=$g(_J5,_J4);var _J9=$a();$_.verset=_J9}else{if($eq($_.format,"full")){$_.verset=$_.qrcode_versetfull}if($eq($_.format,"micro")){$_.verset=$_.qrcode_versetmicro}}$k[$j++]=Infinity;for(var _JC=0;_JC<39;_JC++){$k[$j++]=-1}$_.msgbits=$a();var _JD=$_.verset;for(var _JE=0,_JF=_JD.length;_JE<_JF;_JE++){$_.ver=$g(_JD,_JE);$_.mode=-1;$_.seqok=true;$k[$j++]=Infinity;$_.i=0;for(;;){if($_.i>=$_.msglen){break}$_.numK=$g($_.numKs,$_.i);$_.numB=$g($_.numBs,$_.i);$_.numA=$g($_.numAs,$_.i);$_.numN=$g($_.numNs,$_.i);$_.numAorN=$g($_.numAorNs,$_.i);$_.eci=$g($_.isECI,$_.i);if($_.ver==$_.qrcode_vM1&&$_.numA>=1){$_.seqok=false;break}if($_.ver==$_.qrcode_vM1&&$_.numB>=1){$_.seqok=false;break}if($_.ver==$_.qrcode_vM1&&$_.numK>=1){$_.seqok=false;break}if($_.ver==$_.qrcode_vM1&&$_.eci){$_.seqok=false;break}if($_.ver==$_.qrcode_vM2&&$_.numB>=1){$_.seqok=false;break}if($_.ver==$_.qrcode_vM2&&$_.numK>=1){$_.seqok=false;break}if($_.ver==$_.qrcode_vM2&&$_.eci){$_.seqok=false;break}if($_.ver==$_.qrcode_vM3&&$_.eci){$_.seqok=false;break}if($_.ver==$_.qrcode_vM4&&$_.eci){$_.seqok=false;break}for(;;){if($_.eci){$k[$j++]=$_.qrcode_E;break}if($_.mode==-1){$k[$j++]=$_.qrcode_mode0forceKB;$_.KbeforeA();var _Jv=$k[--$j];if(_Jv){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_mode0forceKB;$_.KbeforeN();var _Jw=$k[--$j];if(_Jw){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_modeBKbeforeE;$_.KbeforeB();var _Jx=$k[--$j];if(_Jx){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_mode0forceKB;$_.KbeforeE();var _Jy=$k[--$j];if(_Jy){$k[$j++]=$_.qrcode_K;break}if($_.numK>=1){$k[$j++]=$_.qrcode_B;break}$k[$j++]=$_.qrcode_mode0NbeforeB;$_.NbeforeK();var _K0=$k[--$j];if(_K0){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_mode0NbeforeB;$_.NbeforeB();var _K1=$k[--$j];if(_K1){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_mode0forceKB;$_.NbeforeB();var _K2=$k[--$j];if(_K2){$k[$j++]=$_.qrcode_B;break}$k[$j++]=$_.qrcode_modeANbeforeE;$_.NbeforeA();var _K3=$k[--$j];if(_K3){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_mode0forceN;$_.NbeforeE();var _K4=$k[--$j];if(_K4){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeBAbeforeE;$_.AbeforeK();var _K5=$k[--$j];if(_K5){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_modeBAbeforeE;$_.AorNbeforeB();var _K6=$k[--$j];if(_K6){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_mode0forceA;$_.AorNbeforeE();var _K7=$k[--$j];if(_K7){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_B;break}if($_.mode==$_.qrcode_B){$k[$j++]=$_.qrcode_modeBKbeforeB;$_.KbeforeB();var _K9=$k[--$j];if(_K9){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_modeBKbeforeA;$_.KbeforeA();var _KA=$k[--$j];if(_KA){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_modeBKbeforeN;$_.KbeforeN();var _KB=$k[--$j];if(_KB){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_modeBKbeforeE;$_.KbeforeE();var _KC=$k[--$j];if(_KC){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_modeBAbeforeK;$_.AbeforeK();var _KD=$k[--$j];if(_KD){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_modeBAbeforeB;$_.AbeforeB();var _KE=$k[--$j];if(_KE){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_modeBAbeforeN;$_.AbeforeN();var _KF=$k[--$j];if(_KF){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_modeBAbeforeE;$_.AbeforeE();var _KG=$k[--$j];if(_KG){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_modeBNbeforeK;$_.NbeforeK();var _KH=$k[--$j];if(_KH){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeBNbeforeB;$_.NbeforeB();var _KI=$k[--$j];if(_KI){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeBNbeforeA;$_.NbeforeA();var _KJ=$k[--$j];if(_KJ){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeBNbeforeE;$_.NbeforeE();var _KK=$k[--$j];if(_KK){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeBAbeforeE;$_.AorNbeforeE();var _KO=$k[--$j];if(_KO&&$le($_.numAorN,$g($_.qrcode_modeBAbeforeN,$_.ver))){$k[$j++]=$_.qrcode_modeBNbeforeA;$_.nextNslt();var _KP=$k[--$j];if(_KP){$k[$j++]=$_.qrcode_A;break}}$k[$j++]=$_.qrcode_B;break}if($_.mode==$_.qrcode_A){if($_.numK>=1){$k[$j++]=$_.qrcode_K;break}if($_.numB>=1){$k[$j++]=$_.qrcode_B;break}$k[$j++]=$_.qrcode_modeANbeforeA;$_.NbeforeA();var _KT=$k[--$j];if(_KT){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeANbeforeB;$_.NbeforeB();var _KU=$k[--$j];if(_KU){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_modeANbeforeE;$_.NbeforeE();var _KV=$k[--$j];if(_KV){$k[$j++]=$_.qrcode_N;break}if($_.numA>=1||$_.numN>=1){$k[$j++]=$_.qrcode_A;break}$k[$j++]=$_.qrcode_B;break}if($_.mode==$_.qrcode_N){if($_.numK>=1){$k[$j++]=$_.qrcode_K;break}if($_.numB>=1){$k[$j++]=$_.qrcode_B;break}if($_.numA>=1){$k[$j++]=$_.qrcode_A;break}if($_.numN>=1){$k[$j++]=$_.qrcode_N;break}$k[$j++]=$_.qrcode_B;break}if($_.mode==$_.qrcode_K){if($_.numB>=1){$k[$j++]=$_.qrcode_B;break}if($_.numA>=1){$k[$j++]=$_.qrcode_A;break}if($_.numN>=1){$k[$j++]=$_.qrcode_N;break}if($_.numK>=1){$k[$j++]=$_.qrcode_K;break}$k[$j++]=$_.qrcode_B;break}}var _Ki=$k[$j-1];if(_Ki==$_.qrcode_K&&$_.fnc1first){$k[$j-1]=$_.qrcode_B}var _Kk=$k[$j-1];if(_Kk==$_.mode){$j--;var _Kp=$_.mode==$_.qrcode_K?2:1;$_.dat=$G($_.msg,$_.i,_Kp);var _Ks=$k[--$j];$k[$j++]=Infinity;$q(_Ks);$q($_.dat);var _Ku=$a();$k[$j++]=_Ku}else{var _Kv=$k[--$j];$_.mode=_Kv;if($_.mode==$_.qrcode_K){$k[$j++]=$_.qrcode_K;$k[$j++]=$G($_.msg,$_.i,$_.numK*2)}if($_.mode==$_.qrcode_B){$k[$j++]=$_.qrcode_B;$k[$j++]=$G($_.msg,$_.i,$_.numB)}if($_.mode==$_.qrcode_A){$k[$j++]=$_.qrcode_A;$k[$j++]=$G($_.msg,$_.i,$_.numA)}if($_.mode==$_.qrcode_N){$k[$j++]=$_.qrcode_N;$k[$j++]=$G($_.msg,$_.i,$_.numN)}if($_.mode==$_.qrcode_E){$_.mode=-1;$k[$j++]=$_.qrcode_E;$k[$j++]=$G($_.msg,$_.i,1)}var _LK=$k[--$j];$_.dat=_LK;$k[$j++]=_LK}$_.i=$_.i+$_.dat.length}if($_.seqok){$as($a($m()));var _LQ=$k[--$j];$k[$j-1]=_LQ}else{$l();$k[$j++]=-1}var _LS=$k[--$j];$_.seq=_LS;for(;;){if($_.seq==-1){break}$_.bits=$s(23648);$_.j=0;if($_.fnc1first){if($_.ver<$_.qrcode_vR7x43){$k[$j++]="0101"}else{$k[$j++]="101"}$_.addtobits()}$_.abort=false;for(var _LZ=0,_LY=$_.seq.length-1;_LZ<=_LY;_LZ+=2){$_.i=_LZ;$_.mode=$g($_.seq,$_.i);$k[$j++]=$g($g($_.qrcode_mids,$_.ver),$_.mode);$_.addtobits();$_.chars=$g($_.seq,$_.i+1);var _Ln=$_.chars.length;if($_.mode==$_.qrcode_K){_Ln=~~(_Ln/2)}$_.charslen=_Ln;if($_.mode!=$_.qrcode_E){$_.cclen=$g($g($_.qrcode_cclens,$_.ver),$_.mode);if($_.charslen>=$pow(2,$_.cclen)){$_.abort=true;break}$k[$j++]=$_.charslen;$k[$j++]=$_.cclen;$_.tobin();$_.addtobits()}var _M1=$_[$g($_.qrcode_encfuncs,$_.mode)];$k[$j++]=$_.chars;if(_M1()===true){break}$_.addtobits()}if($_.abort){break}$_.bits=$G($_.bits,0,$_.j);$p($_.msgbits,$_.ver,$_.bits);break}}if($has($_.options,"debugbitseqs")){$k[$j++]="bwipp.debugbitseqs#27361";$k[$j++]=$_.msgbits;bwipp_raiseerror()}$k[$j++]="eclval";$X("LMQH",$_.eclevel);$j--;var _MD=$k[--$j];$j--;var _MF=_MD.length;$j--;var _MI=$k[--$j];$_[_MI]=_MF;for(var _MK=0,_MJ=$_.qrcode_metrics.length-1;_MK<=_MJ;_MK+=1){$_.i=_MK;$_.m=$g($_.qrcode_metrics,$_.i);$_.frmt=$g($_.m,0);$_.vers=$g($_.m,1);$_.vergrp=$g($_.m,2);$_.verind=$_.i-44;$_.rows=$g($_.m,3);$_.cols=$g($_.m,4);$_.asp2=$g($_.m,5);$_.asp3=$g($_.m,6);$_.nmod=$g($_.m,7);$_.ncws=~~($_.nmod/8);$_.rbit=$_.nmod%8;$_.lc4b=false;if($eq($_.vers,"M1")||$eq($_.vers,"M3")){$_.ncws=$_.ncws+1;$_.rbit=0;$_.lc4b=true}$_.ecws=$g($g($_.m,8),$_.eclval);$_.dcws=$f($_.ncws-$_.ecws);var _Mr=$_.lc4b?4:0;$_.dmod=$f($_.dcws*8-_Mr);$_.ecb1=$g($g($_.m,9),$_.eclval*2);$_.ecb2=$g($g($_.m,9),$_.eclval*2+1);$_.okay=true;if($ne($_.format,$_.frmt)){$_.okay=false}if($eq($_.frmt,"micro")&&$_.fnc1first){$_.okay=false}if($ne($_.version,"unset")&&$ne($_.version,$_.vers)){$_.okay=false}if($_.ecb1==-1||$_.ecb2==-1){$_.okay=false}$_.verbits=$g($_.msgbits,$_.vergrp);if($_.verbits==-1){$_.okay=false}else{if($_.verbits.length>$_.dmod){$_.okay=false}}$_.term=$G("000000000",0,$g($_.qrcode_termlens,$_.vergrp));if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.qrcodeNoValidSymbol#27408";$k[$j++]="Maximum length exceeded or invalid content";bwipp_raiseerror()}$_.format=$_.frmt;$_.version=$_.vers;$_.msgbits=$_.verbits;if(!$_.fixedeclevel){for(var _NP=$_.eclval+1;_NP<=3;_NP+=1){$_.eclval_=_NP;$_.ecws_=$g($g($_.m,8),$_.eclval_);$_.dcws_=$f($_.ncws-$_.ecws_);var _NY=$_.lc4b?4:0;$_.dmod_=$f($_.dcws_*8-_NY);$_.ecb1_=$g($g($_.m,9),$_.eclval_*2);$_.ecb2_=$g($g($_.m,9),$_.eclval_*2+1);$_.okay=true;if($_.ecb1_==-1||$_.ecb2_==-1){$_.okay=false}if($_.msgbits.length>$_.dmod_){$_.okay=false}if($_.okay){$_.eclval=$_.eclval_;$_.dcws=$_.dcws_;$_.dmod=$_.dmod_;$_.ecb1=$_.ecb1_;$_.ecb2=$_.ecb2_}}}$_.dcpb=~~($_.dcws/$f($_.ecb1+$_.ecb2));$_.ecpb=~~($_.ncws/$f($_.ecb1+$_.ecb2))-$_.dcpb;var _Ny=$_.term;var _Nz=$_.dmod;var _O0=$_.msgbits;var _O1=$_.term;var _O2=_O1.length;var _O3=$f(_Nz-_O0.length);if($f(_Nz-_O0.length)>_O1.length){var _=_O2;_O2=_O3;_O3=_}$_.term=$G(_Ny,0,_O3);var _O7=$s($_.msgbits.length+$_.term.length);$P(_O7,0,$_.msgbits);$P(_O7,$_.msgbits.length,$_.term);$_.msgbits=_O7;$_.pad=$s($_.dmod);for(var _OF=0,_OE=$_.pad.length-1;_OF<=_OE;_OF+=1){$p($_.pad,_OF,48)}$P($_.pad,0,$_.msgbits);$_.padnum=0;var _OM=$_.lc4b?5:1;for(var _OO=$ceil($_.msgbits.length/8)*8,_ON=$f($_.dmod-_OM);_OO<=_ON;_OO+=8){$P($_.pad,_OO,$g($_.qrcode_padstrs,$_.padnum));$_.padnum=($_.padnum+1)%2}$_.cws=$a($_.dcws);for(var _OX=0,_OW=$_.cws.length-1;_OX<=_OW;_OX+=1){$_.c=_OX;$_.bpcw=8;if($_.lc4b&&$_.c==$_.cws.length-1){$_.bpcw=4}$_.cwb=$G($_.pad,$_.c*8,$_.bpcw);$_.cw=0;for(var _Oh=0,_Og=$_.bpcw-1;_Oh<=_Og;_Oh+=1){$_.i=_Oh;$_.cw=$f($_.cw+$pow(2,$_.bpcw-$_.i-1)*($g($_.cwb,$_.i)-48))}$p($_.cws,$_.c,$_.cw)}if($_.lc4b){var _Os=$_.cws;var _Ot=$_.cws;$p(_Os,_Ot.length-1,$g(_Os,_Ot.length-1)*16)}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#27487";$k[$j++]=$_.cws;bwipp_raiseerror()}$k[$j++]="coeffs";$k[$j++]=$_.ecpb;$_.qrcode_coeffscachefetch();var _Oz=$k[--$j];var _P0=$k[--$j];$_[_P0]=_Oz;$_.rscodes=function(){var _P1=$k[--$j];$_.rscws=_P1;$_.lfsr=$a($_.ecpb);var _P4=$_.rscws;var _P5=$_.coeffs;var _P6=$_.ecpb;var _P7=$_.lfsr;$k[$j++]=function(){var _P9=$k[--$j];$k[$j++]=$g($_.rscws,_P9)};$k[$j++]=_P4.length;$k[$j++]=_P5;$k[$j++]=_P6;$k[$j++]=_P7;$k[$j++]=$_.qrcode_rsprod;bwipp_rsecbinary();$k[$j++]=$_.lfsr};$_.dcwsb=$a($f($_.ecb1+$_.ecb2));$_.ecwsb=$a($f($_.ecb1+$_.ecb2));for(var _PK=0,_PJ=$_.ecb1-1;_PK<=_PJ;_PK+=1){$_.i=_PK;$p($_.dcwsb,$_.i,$G($_.cws,$_.i*$_.dcpb,$_.dcpb));$k[$j++]=$_.ecwsb;$k[$j++]=$_.i;$k[$j++]=$g($_.dcwsb,$_.i);$_.rscodes();var _PX=$k[--$j];var _PY=$k[--$j];var _PZ=$k[--$j];$p(_PZ,_PY,_PX)}for(var _Pc=0,_Pb=$_.ecb2-1;_Pc<=_Pb;_Pc+=1){$_.i=_Pc;$p($_.dcwsb,$f($_.ecb1+$_.i),$G($_.cws,$f($_.ecb1*$_.dcpb+$_.i*($_.dcpb+1)),$_.dcpb+1));var _Pt=$g($_.dcwsb,$f($_.ecb1+$_.i));$k[$j++]=$_.ecwsb;$k[$j++]=$f($_.ecb1+$_.i);$k[$j++]=_Pt;$_.rscodes();var _Pu=$k[--$j];var _Pv=$k[--$j];var _Pw=$k[--$j];$p(_Pw,_Pv,_Pu)}$_.cws=$a($_.ncws);$_.cw=0;for(var _Q1=0,_Q0=$_.dcpb;_Q1<=_Q0;_Q1+=1){$_.i=_Q1;for(var _Q5=0,_Q4=$f($_.ecb1+$_.ecb2)-1;_Q5<=_Q4;_Q5+=1){$_.j=_Q5;if($_.i<$g($_.dcwsb,$_.j).length){$p($_.cws,$_.cw,$g($g($_.dcwsb,$_.j),$_.i));$_.cw=$_.cw+1}}}for(var _QK=0,_QJ=$_.ecpb-1;_QK<=_QJ;_QK+=1){$_.i=_QK;for(var _QO=0,_QN=$f($_.ecb1+$_.ecb2)-1;_QO<=_QN;_QO+=1){$_.j=_QO;$p($_.cws,$_.cw,$g($g($_.ecwsb,$_.j),$_.i));$_.cw=$_.cw+1}}if($_.rbit>0){$_.pad=$a($_.cws.length+1);$P($_.pad,0,$_.cws);$p($_.pad,$_.pad.length-1,0);$_.cws=$_.pad}if($_.lc4b){var _Qg=$_.cws;var _Qh=$_.dcws;$p(_Qg,_Qh-1,$flr($g(_Qg,_Qh-1)/16));for(var _Qm=$_.dcws-1,_Ql=$_.ncws-2;_Qm<=_Ql;_Qm+=1){$_.i=_Qm;$p($_.cws,$_.i,($g($_.cws,$_.i)&15)*16);$p($_.cws,$_.i,$flr($g($_.cws,$_.i+1)/16)&15|$g($_.cws,$_.i))}$p($_.cws,$_.ncws-1,($g($_.cws,$_.ncws-1)&15)*16)}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#27577";$k[$j++]=$_.cws;bwipp_raiseerror()}$k[$j++]=Infinity;for(var _RA=0,_RB=$_.rows*$_.cols;_RA<_RB;_RA++){$k[$j++]=-1}$_.pixs=$a();$_.qmv=function(){var _RD=$k[--$j];var _RE=$k[--$j];$k[$j++]=$f(_RE+_RD*$_.cols)};if($eq($_.format,"full")){for(var _RI=8,_RH=$_.cols-9;_RI<=_RH;_RI+=1){$_.i=_RI;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=6;$_.qmv();var _RM=$k[--$j];var _RN=$k[--$j];$p(_RN,_RM,($_.i+1)%2);$k[$j++]=$_.pixs;$k[$j++]=6;$k[$j++]=$_.i;$_.qmv();var _RR=$k[--$j];var _RS=$k[--$j];$p(_RS,_RR,($_.i+1)%2)}}if($eq($_.format,"micro")){for(var _RW=8,_RV=$_.cols-1;_RW<=_RV;_RW+=1){$_.i=_RW;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=0;$_.qmv();var _Ra=$k[--$j];var _Rb=$k[--$j];$p(_Rb,_Ra,($_.i+1)%2);$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=$_.i;$_.qmv();var _Rf=$k[--$j];var _Rg=$k[--$j];$p(_Rg,_Rf,($_.i+1)%2)}}if($eq($_.format,"rmqr")){for(var _Rk=3,_Rj=$_.cols-4;_Rk<=_Rj;_Rk+=1){$_.i=_Rk;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=0;$_.qmv();var _Ro=$k[--$j];var _Rp=$k[--$j];$p(_Rp,_Ro,($_.i+1)%2);$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.rows-1;$_.qmv();var _Ru=$k[--$j];var _Rv=$k[--$j];$p(_Rv,_Ru,($_.i+1)%2)}for(var _Ry=3,_Rx=$_.rows-4;_Ry<=_Rx;_Ry+=1){$_.i=_Ry;$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=$_.i;$_.qmv();var _S2=$k[--$j];var _S3=$k[--$j];$p(_S3,_S2,($_.i+1)%2);$k[$j++]=$_.pixs;$k[$j++]=$_.cols-1;$k[$j++]=$_.i;$_.qmv();var _S8=$k[--$j];var _S9=$k[--$j];$p(_S9,_S8,($_.i+1)%2)}for(var _SF=$_.asp2-1,_SG=$f($_.asp3-$_.asp2),_SE=$_.cols-13;_SG<0?_SF>=_SE:_SF<=_SE;_SF+=_SG){$_.i=_SF;for(var _SJ=3,_SI=$_.rows-4;_SJ<=_SI;_SJ+=1){$_.j=_SJ;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.j;$_.qmv();var _SO=$k[--$j];var _SP=$k[--$j];$p(_SP,_SO,($_.j+1)%2)}}}$_.fpats=$g($_.qrcode_fpatmap,$_.format);for(var _SS=0;_SS<=7;_SS+=1){$_.y=_SS;for(var _ST=0;_ST<=7;_ST+=1){$_.x=_ST;$_.fpb0=$g($g($g($_.fpats,0),$_.y),$_.x);$_.fpb1=$g($g($g($_.fpats,1),$_.y),$_.x);$_.fpb2=$g($g($g($_.fpats,2),$_.y),$_.x);$_.fpb3=$g($g($g($_.fpats,3),$_.y),$_.x);if($_.fpb0!=9&&$_.y<$_.rows){$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.qmv();var _Sz=$k[--$j];var _T0=$k[--$j];$p(_T0,_Sz,$_.fpb0)}if($_.fpb1!=9){$k[$j++]=$_.pixs;$k[$j++]=$f($_.cols-$_.x)-1;$k[$j++]=$_.y;$_.qmv();var _T7=$k[--$j];var _T8=$k[--$j];$p(_T8,_T7,$_.fpb1)}if($_.fpb2!=9){$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$f($_.rows-$_.y)-1;$_.qmv();var _TF=$k[--$j];var _TG=$k[--$j];$p(_TG,_TF,$_.fpb2)}if($_.fpb3!=9){$k[$j++]=$_.pixs;$k[$j++]=$f($_.cols-$_.x)-1;$k[$j++]=$f($_.rows-$_.y)-1;$_.qmv();var _TO=$k[--$j];var _TP=$k[--$j];$p(_TP,_TO,$_.fpb3)}}}$_.putalgnpat=function(){var _TQ=$k[--$j];$_.py=_TQ;var _TR=$k[--$j];$_.px=_TR;for(var _TS=0;_TS<=4;_TS+=1){$_.pb=_TS;for(var _TT=0;_TT<=4;_TT+=1){$_.pa=_TT;$_.algnb=$g($g($_.algnpat,$_.pb),$_.pa);if($_.algnb!=9){$k[$j++]=$_.pixs;$k[$j++]=$f($_.px+$_.pa);$k[$j++]=$f($_.py+$_.pb);$_.qmv();var _Tg=$k[--$j];var _Th=$k[--$j];$p(_Th,_Tg,$_.algnb)}}}};if($eq($_.format,"full")){$_.algnpat=$_.qrcode_algnpatfull;for(var _To=$_.asp2-2,_Tp=$f($_.asp3-$_.asp2),_Tn=$_.cols-13;_Tp<0?_To>=_Tn:_To<=_Tn;_To+=_Tp){$_.i=_To;$k[$j++]=$_.i;$k[$j++]=4;$_.putalgnpat();$k[$j++]=4;$k[$j++]=$_.i;$_.putalgnpat()}for(var _Tx=$_.asp2-2,_Ty=$f($_.asp3-$_.asp2),_Tw=$_.cols-9;_Ty<0?_Tx>=_Tw:_Tx<=_Tw;_Tx+=_Ty){$_.x=_Tx;for(var _U4=$_.asp2-2,_U5=$f($_.asp3-$_.asp2),_U3=$_.rows-9;_U5<0?_U4>=_U3:_U4<=_U3;_U4+=_U5){$_.y=_U4;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.putalgnpat()}}}if($eq($_.format,"rmqr")){$_.algnpat=$_.qrcode_algnpatrmqr;for(var _UE=$_.asp2-2,_UF=$f($_.asp3-$_.asp2),_UD=$_.cols-13;_UF<0?_UE>=_UD:_UE<=_UD;_UE+=_UF){$_.i=_UE;$k[$j++]=$_.i;$k[$j++]=0;$_.putalgnpat();$k[$j++]=$_.i;$k[$j++]=$_.rows-3;$_.putalgnpat()}}$k[$j++]=Infinity;$F($g($_.qrcode_formatfimmap,$_.format),function(){var _UM=$k[--$j];$k[$j++]=Infinity;$F(_UM,function(){var _UO=$k[--$j];$k[$j++]=$_.rows;$k[$j++]=$_.cols;if(_UO()===true){return true}$as($a(2))});var _UR=$a();$k[$j++]=_UR});$_.formatmap=$a();var _US=$_.formatmap;for(var _UT=0,_UU=_US.length;_UT<_UU;_UT++){$F($g(_US,_UT),function(){var _UW=$k[--$j];$q(_UW);$_.qmv();var _UY=$k[--$j];$p($_.pixs,_UY,1)})}if($eq($_.format,"full")&&$_.cols>=45){$k[$j++]=Infinity;for(var _Ub=0,_Uc=$_.qrcode_vimmap.length;_Ub<_Uc;_Ub++){var _Uf=$g($_.qrcode_vimmap,_Ub);$k[$j++]=Infinity;$F(_Uf,function(){var _Uh=$k[--$j];$k[$j++]=$_.cols;if(_Uh()===true){return true}$as($a(2))});var _Uj=$a();$k[$j++]=_Uj}$_.versionmap=$a()}else{$_.versionmap=$a([])}var _Uk=$_.versionmap;for(var _Ul=0,_Um=_Uk.length;_Ul<_Um;_Ul++){$F($g(_Uk,_Ul),function(){var _Uo=$k[--$j];$q(_Uo);$_.qmv();var _Uq=$k[--$j];$p($_.pixs,_Uq,0)})}if($eq($_.format,"full")){$k[$j++]=$_.pixs;$k[$j++]=8;$k[$j++]=$_.rows-8;$_.qmv();var _Uu=$k[--$j];var _Uv=$k[--$j];$p(_Uv,_Uu,0)}if($_.mask==-1){$_.maskbits=$g($_.qrcode_formatmaskbits,$_.format)}else{$_.maskbits=$a([$g($g($_.qrcode_formatmaskbits,$_.format),$_.mask-1)]);$_.bestmaskval=$_.mask-1}$_.nmasks=$_.maskbits.length;$_.masklayers=$a($_.rows*$_.cols);for(var _VA=0,_V9=$_.rows-1;_VA<=_V9;_VA+=1){$_.j=_VA;for(var _VD=0,_VC=$_.cols-1;_VD<=_VC;_VD+=1){$_.i=_VD;$k[$j++]="pos";$k[$j++]=$_.i;$k[$j++]=$_.j;$_.qmv();var _VG=$k[--$j];var _VH=$k[--$j];$_[_VH]=_VG;var _VM=$g($_.pixs,$_.pos);$k[$j++]=$_.masklayers;$k[$j++]=$_.pos;$k[$j++]=_VM;if(_VM==-1){$k[$j-1]=$g($_.funcpatlayers,$_.j*6%72+$_.i%6)}else{var _VR=$k[--$j];$k[$j++]=_VR*255}var _VS=$k[--$j];var _VT=$k[--$j];var _VU=$k[--$j];$p(_VU,_VT,_VS)}}var _VX=$ne($_.format,"rmqr")?1:2;$_.posx=$f($_.cols-_VX);$_.posy=$_.rows-1;$_.dir=-1;$_.col=1;$_.num=0;for(;;){if($_.posx<0){break}$k[$j++]="pos";$k[$j++]=$_.posx;$k[$j++]=$_.posy;$_.qmv();var _Vc=$k[--$j];var _Vd=$k[--$j];$_[_Vd]=_Vc;if($g($_.pixs,$_.pos)==-1){$_.bit=$bs($g($_.cws,~~($_.num/8)),-(7-$_.num%8))&1;$p($_.masklayers,$_.pos,$g($_.masklayers,$_.pos)^$_.bit*255);$_.num=$_.num+1}if($_.col==1){$_.col=0;$_.posx=$_.posx-1}else{$_.col=1;$_.posx=$_.posx+1;$_.posy=$f($_.posy+$_.dir);if($_.posy<0||$_.posy>=$_.rows){$_.dir=$_.dir*-1;$_.posy=$f($_.posy+$_.dir);$_.posx=$_.posx-2;if($eq($_.format,"full")&&$_.posx==6){$_.posx=$_.posx-1}}}}$_.evalfulln1n3=function(){var _W7=$k[--$j];$_.scrle=_W7;$k[$j++]="scr1";$k[$j++]=0;$F($_.scrle,function(){var _W9=$k[$j-1];if(_W9>=5){var _WA=$k[--$j];var _WB=$k[--$j];var _WC=$f(_WB+_WA)-2;$k[$j++]=_WC;$k[$j++]=_WC}$j--});var _WD=$k[--$j];var _WE=$k[--$j];$_[_WE]=_WD;$_.scr3=0;for(var _WH=3,_WG=$_.scrle.length-3;_WH<=_WG;_WH+=2){$_.j=_WH;if($g($_.scrle,$_.j)%3==0){$_.fact=~~($g($_.scrle,$_.j)/3);var _WQ=$G($_.scrle,$_.j-2,5);for(var _WR=0,_WS=_WQ.length;_WR<_WS;_WR++){$k[$j++]=$g(_WQ,_WR)==$_.fact}var _WV=$k[--$j];var _WW=$k[--$j];$j--;var _WY=$an(_WW,_WV);var _WZ=$k[--$j];var _Wa=$k[--$j];if(_Wa&&(_WZ&&_WY)){if($_.j==3||$_.j+4>=$_.scrle.length){$_.scr3=$_.scr3+40}else{if($g($_.scrle,$_.j-3)>=4||$g($_.scrle,$_.j+3)>=4){$_.scr3=$_.scr3+40}}}}}$k[$j++]=$_.scr1;$k[$j++]=$_.scr3};$_.evalfull=function(){var _Wo=$k[--$j];$_.sym=_Wo;$_.n1=0;$_.n2=0;$_.n3=0;$_.rle=$a($_.cols+1);$_.lastpairs=$a($_.cols);$_.thispairs=$a($_.cols);$_.colsadd1=$_.cols+1;$_.earlyexit=false;for(var _Wy=0,_Wx=$_.cols-1;_Wy<=_Wx;_Wy+=1){$_.i=_Wy;$k[$j++]=Infinity;var _X0=$_.cols;$k[$j++]=0;$k[$j++]=0;for(var _X2=$_.i,_X3=_X0,_X1=_X0*_X0-1;_X3<0?_X2>=_X1:_X2<=_X1;_X2+=_X3){var _X5=$g($_.sym,_X2);var _X6=$k[--$j];$k[$j++]=_X5;if($eq(_X6,_X5)){var _X7=$k[--$j];$k[$j-1]+=1;$k[$j++]=_X7}else{var _X9=$k[--$j];$k[$j++]=1;$k[$j++]=_X9}}$j--;var _XB=$m()+2;$as($G($_.rle,0,_XB-2));$_.evalfulln1n3();var _XE=$k[--$j];$_.n3=$f(_XE+$_.n3);var _XG=$k[--$j];$_.n1=$f(_XG+$_.n1);$j--;$_.symrow=$G($_.sym,$_.i*$_.cols,$_.cols);$k[$j++]=Infinity;var _XM=$_.symrow;$k[$j++]=0;$k[$j++]=0;for(var _XN=0,_XO=_XM.length;_XN<_XO;_XN++){var _XP=$g(_XM,_XN);var _XQ=$k[--$j];$k[$j++]=_XP;if($eq(_XQ,_XP)){var _XR=$k[--$j];$k[$j-1]+=1;$k[$j++]=_XR}else{var _XT=$k[--$j];$k[$j++]=1;$k[$j++]=_XT}}$j--;var _XV=$m()+2;$as($G($_.rle,0,_XV-2));$_.evalfulln1n3();var _XY=$k[--$j];$_.n3=$f(_XY+$_.n3);var _Xa=$k[--$j];$_.n1=$f(_Xa+$_.n1);$j--;var _Xb=$_.thispairs;$_.thispairs=$_.lastpairs;$_.lastpairs=_Xb;var _Xf=$g($_.symrow,0)==1?0:1;var _Xg=$_.symrow;$k[$j++]=_Xf;for(var _Xh=0,_Xi=_Xg.length;_Xh<_Xi;_Xh++){var _Xj=$g(_Xg,_Xh);var _Xk=$k[--$j];$k[$j++]=$f(_Xk+_Xj);$k[$j++]=_Xj}$j--;$as($_.thispairs);$j--;if($_.i>0){$k[$j++]=Infinity;$q($_.lastpairs);$q($_.thispairs);$k[$j++]=$_.n2;for(var _Xr=0,_Xs=$_.cols;_Xr<_Xs;_Xr++){var _Xt=$k[--$j];var _Xu=$k[--$j];$k[$j++]=_Xt;$k[$j++]=_Xu;var _Xw=$k[$j-1-$_.colsadd1];var _Xx=$k[--$j];if(($f(_Xx+_Xw)&3)==0){$k[$j-1]+=3}}var _Xz=$k[--$j];$_.n2=_Xz;$l()}if($f($_.n1+$_.n2+$_.n3)>=$_.bestscore){$_.earlyexit=true;break}}if(!$_.earlyexit){$k[$j++]="dark";var _Y8=0;$F($_.sym,function(){var _Y6=$k[--$j];_Y8=$f(_Y8+_Y6)});var _Y9=$k[--$j];$_[_Y9]=_Y8;var _YB=$_.cols;$_.n4=~~($abs($_.dark*100/(_YB*_YB)-50)/5)*10;$k[$j++]=$f($_.n1+$_.n2+$_.n3+$_.n4)}else{$k[$j++]=999999999}};$_.evalmicro=function(){var _YG=$k[--$j];$_.sym=_YG;$_.dkrhs=0;$_.dkbot=0;for(var _YJ=1,_YI=$_.cols-1;_YJ<=_YI;_YJ+=1){$_.i=_YJ;$k[$j++]="dkrhs";$k[$j++]=$_.dkrhs;$k[$j++]=$_.sym;$k[$j++]=$_.cols-1;$k[$j++]=$_.i;$_.qmv();var _YO=$k[--$j];var _YP=$k[--$j];var _YR=$k[--$j];var _YS=$k[--$j];$_[_YS]=$f(_YR+$g(_YP,_YO));$k[$j++]="dkbot";$k[$j++]=$_.dkbot;$k[$j++]=$_.sym;$k[$j++]=$_.i;$k[$j++]=$_.cols-1;$_.qmv();var _YX=$k[--$j];var _YY=$k[--$j];var _Ya=$k[--$j];var _Yb=$k[--$j];$_[_Yb]=$f(_Ya+$g(_YY,_YX))}if($_.dkrhs<=$_.dkbot){$k[$j++]=-($_.dkrhs*16+$_.dkbot)}else{$k[$j++]=-($_.dkbot*16+$_.dkrhs)}};$_.bestscore=999999999;for(var _Yk=0,_Yj=$_.nmasks-1;_Yk<=_Yj;_Yk+=1){$_.m=_Yk;$_.maskbit=$g($_.maskbits,$_.m);$_.masksym=$a($_.rows*$_.cols);for(var _Yu=0,_Yt=$_.rows*$_.cols-1;_Yu<=_Yt;_Yu+=1){$_.i=_Yu;$p($_.masksym,$_.i,$bs($g($_.masklayers,$_.i),-$_.maskbit)&1)}if($_.nmasks!=1){$k[$j++]="score";$k[$j++]=$_.masksym;if($eq($_.format,"full")){$_.evalfull()}else{$_.evalmicro()}var _Z4=$k[--$j];var _Z5=$k[--$j];$_[_Z5]=_Z4;if($_.score<$_.bestscore){$_.bestsym=$_.masksym;$_.bestmaskval=$_.m;$_.bestscore=$_.score}}else{$_.bestsym=$_.masksym}}$_.pixs=$_.bestsym;if($eq($_.format,"full")){$k[$j++]=$_.pixs;$k[$j++]=8;$k[$j++]=$_.cols-8;$_.qmv();var _ZG=$k[--$j];var _ZH=$k[--$j];$p(_ZH,_ZG,1)}if($eq($_.format,"full")){$_.ecid=$g($_.qrcode_ecidfull,$_.eclval);$_.fmtval=$g($_.fmtvalsfull,$_.ecid*8+$_.bestmaskval);for(var _ZR=0,_ZQ=$_.formatmap.length-1;_ZR<=_ZQ;_ZR+=1){$_.i=_ZR;$F($g($_.formatmap,$_.i),function(){var _ZW=$k[--$j];$k[$j++]=$_.pixs;$q(_ZW);$_.qmv();var _ZZ=$k[--$j];var _Za=$k[--$j];$p(_Za,_ZZ,$bs($_.fmtval,-(14-$_.i))&1)})}}if($eq($_.format,"micro")){$_.symid=$g($g($_.qrcode_ecidmicrosym,~~(($_.cols-11)/2)),$_.eclval);$_.fmtval=$g($_.fmtvalsmicro,$_.symid*4+$_.bestmaskval);for(var _Zm=0,_Zl=$_.formatmap.length-1;_Zm<=_Zl;_Zm+=1){$_.i=_Zm;var _Zr=$g($g($_.formatmap,$_.i),0);$k[$j++]=$_.pixs;$q(_Zr);$_.qmv();var _Zu=$k[--$j];var _Zv=$k[--$j];$p(_Zv,_Zu,$bs($_.fmtval,-(14-$_.i))&1)}}if($eq($_.format,"rmqr")){$_.fmtvalu=$g($_.qrcode_ecidrmqr,$_.eclval)*32+$_.verind;$_.fmtval1=$g($_.fmtvalsrmqr1,$_.fmtvalu);$_.fmtval2=$g($_.fmtvalsrmqr2,$_.fmtvalu);for(var _a8=0,_a7=$_.formatmap.length-1;_a8<=_a7;_a8+=1){$_.i=_a8;var _aD=$g($g($_.formatmap,$_.i),0);$k[$j++]=$_.pixs;$q(_aD);$_.qmv();var _aG=$k[--$j];var _aH=$k[--$j];$p(_aH,_aG,$bs($_.fmtval1,-(17-$_.i))&1);var _aM=$g($g($_.formatmap,$_.i),1);$k[$j++]=$_.pixs;$q(_aM);$_.qmv();var _aP=$k[--$j];var _aQ=$k[--$j];$p(_aQ,_aP,$bs($_.fmtval2,-(17-$_.i))&1)}}if($eq($_.format,"full")&&$_.cols>=45){$_.verval=$g($_.vervals,~~(($_.cols-17)/4)-7);for(var _aY=0,_aX=$_.versionmap.length-1;_aY<=_aX;_aY+=1){$_.i=_aY;$F($g($_.versionmap,$_.i),function(){var _ad=$k[--$j];$k[$j++]=$_.pixs;$q(_ad);$_.qmv();var _ag=$k[--$j];var _ah=$k[--$j];$p(_ah,_ag,$bs($_.verval,-(17-$_.i))&1)})}}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renmatrix";$k[$j++]="pixs";$k[$j++]=$_.pixs;$k[$j++]="pixx";$k[$j++]=$_.cols;$k[$j++]="pixy";$k[$j++]=$_.rows;$k[$j++]="height";$k[$j++]=$_.rows*$_.modunit/72;$k[$j++]="width";$k[$j++]=$_.cols*$_.modunit/72;$k[$j++]="borderleft";if($eq($_.format,"full")){$k[$j++]=4}else{$k[$j++]=2}$k[$j++]="borderright";if($eq($_.format,"full")){$k[$j++]=4}else{$k[$j++]=2}$k[$j++]="bordertop";if($eq($_.format,"full")){$k[$j++]=4}else{$k[$j++]=2}$k[$j++]="borderbottom";if($eq($_.format,"full")){$k[$j++]=4}else{$k[$j++]=2}$k[$j++]="opt";$k[$j++]=$_.options;var _au=$d();$k[$j++]=_au;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_swissqrcode(){var $__=$_;$_=Object.assign({},$_,bwipp_swissqrcode.globals);$_.dontdraw=false;$_.parse=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _7=$k[--$j];$_.barcode=_7;$_.barlen=$_.barcode.length;$del($_.options,"parse");if($_.barcode.length>997){$k[$j++]="bwipp.swissqrcodeBadLength#28091";$k[$j++]="Swiss QR Code input must not exceed 997 digits";bwipp_raiseerror()}$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _D=$k[--$j];$_.args=_D;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){$$.save();var _I=$$.currpos();$$.translate(_I.x,_I.y);var _J=72/25.4;$$.scale(_J,_J);$$.save();$$.newpath();$$.moveto(0,0);$$.lineto(46,0);$$.lineto(46,46);$$.lineto(0,46);$$.closepath();$$.moveto(19.5,19.5);$$.lineto(19.5,26.5);$$.lineto(26.5,26.5);$$.lineto(26.5,19.5);$$.closepath();$$.clip();$$.save();$$.moveto(0,0);var _M=46/$g($_.args,"pixx")/2;$$.scale(_M,_M);bwipp_renmatrix();$$.restore();$$.restore();$$.translate(19.5,19.5);var _N=7/83;$$.scale(_N,_N);$$.newpath();$$.moveto(6,6);$$.lineto(6,77);$$.lineto(77,77);$$.lineto(77,6);$$.closepath();$$.moveto(49,18);$$.lineto(49,34);$$.lineto(65,34);$$.lineto(65,49);$$.lineto(49,49);$$.lineto(49,65);$$.lineto(34,65);$$.lineto(34,49);$$.lineto(18,49);$$.lineto(18,34);$$.lineto(34,34);$$.lineto(34,18);$$.closepath();$$.setrgbcolor(0,0,0);$$.fill();$$.restore()}$_=$__}function bwipp_microqrcode(){var $__=$_;$_=Object.assign({},$_,bwipp_microqrcode.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","micro");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_rectangularmicroqrcode(){var $__=$_;$_=Object.assign({},$_,bwipp_rectangularmicroqrcode.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","rmqr");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_maxicode(){if(!bwipp_maxicode.globals){var $__=$_;$_=bwipp_maxicode.globals={};$_.maxicode_eci=-1;$_.maxicode_pad=-2;$_.maxicode_ns=-3;$_.maxicode_la=-4;$_.maxicode_lb=-5;$_.maxicode_sa=-6;$_.maxicode_sb=-7;$_.maxicode_sc=-8;$_.maxicode_sd=-9;$_.maxicode_se=-10;$_.maxicode_sa2=-11;$_.maxicode_sa3=-12;$_.maxicode_lkc=-13;$_.maxicode_lkd=-14;$_.maxicode_lke=-15;$_.maxicode_pd2=-16;$_.maxicode_pd3=-17;$_.eci=$_.maxicode_eci;$_.pad=$_.maxicode_pad;$_.ns=$_.maxicode_ns;$_.la=$_.maxicode_la;$_.lb=$_.maxicode_lb;$_.sa=$_.maxicode_sa;$_.sb=$_.maxicode_sb;$_.sc=$_.maxicode_sc;$_.sd=$_.maxicode_sd;$_.se=$_.maxicode_se;$_.sa2=$_.maxicode_sa2;$_.sa3=$_.maxicode_sa3;$_.lkc=$_.maxicode_lkc;$_.lkd=$_.maxicode_lkd;$_.lke=$_.maxicode_lke;$_.pd2=$_.maxicode_pd2;$_.pd3=$_.maxicode_pd3;$_.maxicode_charmaps=$a([$a([13,"`",192,224,0]),$a(["A","a",193,225,1]),$a(["B","b",194,226,2]),$a(["C","c",195,227,3]),$a(["D","d",196,228,4]),$a(["E","e",197,229,5]),$a(["F","f",198,230,6]),$a(["G","g",199,231,7]),$a(["H","h",200,232,8]),$a(["I","i",201,233,9]),$a(["J","j",202,234,10]),$a(["K","k",203,235,11]),$a(["L","l",204,236,12]),$a(["M","m",205,237,13]),$a(["N","n",206,238,14]),$a(["O","o",207,239,15]),$a(["P","p",208,240,16]),$a(["Q","q",209,241,17]),$a(["R","r",210,242,18]),$a(["S","s",211,243,19]),$a(["T","t",212,244,20]),$a(["U","u",213,245,21]),$a(["V","v",214,246,22]),$a(["W","w",215,247,23]),$a(["X","x",216,248,24]),$a(["Y","y",217,249,25]),$a(["Z","z",218,250,26]),$a([$_.eci,$_.eci,$_.eci,$_.eci,$_.eci]),$a([28,28,28,28,$_.pad]),$a([29,29,29,29,$_.pd2]),$a([30,30,30,30,27]),$a([$_.ns,$_.ns,$_.ns,$_.ns,$_.ns]),$a([" ","{",219,251,28]),$a([$_.pad,$_.pad,220,252,29]),$a(['"',"}",221,253,30]),$a(["#","~",222,254,31]),$a(["$",127,223,255,159]),$a(["%",";",170,161,160]),$a(["&","<",172,168,162]),$a(["'","=",177,171,163]),$a([40,">",178,175,164]),$a([41,"?",179,176,165]),$a(["*","[",181,180,166]),$a(["+",92,185,183,167]),$a([",","]",186,184,169]),$a(["-","^",188,187,173]),$a([".","_",189,191,174]),$a(["/"," ",190,138,182]),$a(["0",",",128,139,149]),$a(["1",".",129,140,150]),$a(["2","/",130,141,151]),$a(["3",":",131,142,152]),$a(["4","@",132,143,153]),$a(["5","!",133,144,154]),$a(["6","|",134,145,155]),$a(["7",$_.pd2,135,146,156]),$a(["8",$_.sa2,136,147,157]),$a(["9",$_.sa3,137,148,158]),$a([":",$_.pd3,$_.la,$_.la,$_.la]),$a([$_.sb,$_.sa," "," "," "]),$a([$_.sc,$_.sc,$_.lkc,$_.sc,$_.sc]),$a([$_.sd,$_.sd,$_.sd,$_.lkd,$_.sd]),$a([$_.se,$_.se,$_.se,$_.se,$_.lke]),$a([$_.lb,$_.la,$_.lb,$_.lb,$_.lb])]);$_.maxicode_modmap=$a([469,529,286,316,347,346,673,672,703,702,647,676,283,282,313,312,370,610,618,379,378,409,408,439,705,704,559,589,588,619,458,518,640,701,675,674,285,284,315,314,310,340,531,289,288,319,349,348,456,486,517,516,471,470,369,368,399,398,429,428,549,548,579,578,609,608,649,648,679,678,709,708,639,638,669,668,699,698,279,278,309,308,339,338,381,380,411,410,441,440,561,560,591,590,621,620,547,546,577,576,607,606,367,366,397,396,427,426,291,290,321,320,351,350,651,650,681,680,711,710,1,0,31,30,61,60,3,2,33,32,63,62,5,4,35,34,65,64,7,6,37,36,67,66,9,8,39,38,69,68,11,10,41,40,71,70,13,12,43,42,73,72,15,14,45,44,75,74,17,16,47,46,77,76,19,18,49,48,79,78,21,20,51,50,81,80,23,22,53,52,83,82,25,24,55,54,85,84,27,26,57,56,87,86,117,116,147,146,177,176,115,114,145,144,175,174,113,112,143,142,173,172,111,110,141,140,171,170,109,108,139,138,169,168,107,106,137,136,167,166,105,104,135,134,165,164,103,102,133,132,163,162,101,100,131,130,161,160,99,98,129,128,159,158,97,96,127,126,157,156,95,94,125,124,155,154,93,92,123,122,153,152,91,90,121,120,151,150,181,180,211,210,241,240,183,182,213,212,243,242,185,184,215,214,245,244,187,186,217,216,247,246,189,188,219,218,249,248,191,190,221,220,251,250,193,192,223,222,253,252,195,194,225,224,255,254,197,196,227,226,257,256,199,198,229,228,259,258,201,200,231,230,261,260,203,202,233,232,263,262,205,204,235,234,265,264,207,206,237,236,267,266,297,296,327,326,357,356,295,294,325,324,355,354,293,292,323,322,353,352,277,276,307,306,337,336,275,274,305,304,335,334,273,272,303,302,333,332,271,270,301,300,331,330,361,360,391,390,421,420,363,362,393,392,423,422,365,364,395,394,425,424,383,382,413,412,443,442,385,384,415,414,445,444,387,386,417,416,447,446,477,476,507,506,537,536,475,474,505,504,535,534,473,472,503,502,533,532,455,454,485,484,515,514,453,452,483,482,513,512,451,450,481,480,511,510,541,540,571,570,601,600,543,542,573,572,603,602,545,544,575,574,605,604,563,562,593,592,623,622,565,564,595,594,625,624,567,566,597,596,627,626,657,656,687,686,717,716,655,654,685,684,715,714,653,652,683,682,713,712,637,636,667,666,697,696,635,634,665,664,695,694,633,632,663,662,693,692,631,630,661,660,691,690,721,720,751,750,781,780,723,722,753,752,783,782,725,724,755,754,785,784,727,726,757,756,787,786,729,728,759,758,789,788,731,730,761,760,791,790,733,732,763,762,793,792,735,734,765,764,795,794,737,736,767,766,797,796,739,738,769,768,799,798,741,740,771,770,801,800,743,742,773,772,803,802,745,744,775,774,805,804,747,746,777,776,807,806,837,836,867,866,897,896,835,834,865,864,895,894,833,832,863,862,893,892,831,830,861,860,891,890,829,828,859,858,889,888,827,826,857,856,887,886,825,824,855,854,885,884,823,822,853,852,883,882,821,820,851,850,881,880,819,818,849,848,879,878,817,816,847,846,877,876,815,814,845,844,875,874,813,812,843,842,873,872,811,810,841,840,871,870,901,900,931,930,961,960,903,902,933,932,963,962,905,904,935,934,965,964,907,906,937,936,967,966,909,908,939,938,969,968,911,910,941,940,971,970,913,912,943,942,973,972,915,914,945,944,975,974,917,916,947,946,977,976,919,918,949,948,979,978,921,920,951,950,981,980,923,922,953,952,983,982,925,924,955,954,985,984,927,926,957,956,987,986,58,89,88,118,149,148,178,209,208,238,269,268,298,329,328,358,389,388,418,449,448,478,509,508,538,569,568,598,629,628,658,689,688,718,749,748,778,809,808,838,869,868,898,929,928,958,989,988]);$_.maxicode_latchseq=$a([$a([$a([]),$a([63]),$a([58]),$a([58]),$a([58])]),$a([$a([63]),$a([]),$a([63]),$a([63]),$a([63])]),$a([$a([60,60]),$a([60,60]),$a([]),$a([60,60]),$a([60,60])]),$a([$a([61,61]),$a([61,61]),$a([61,61]),$a([]),$a([61,61])]),$a([$a([62,62]),$a([62,62]),$a([62,62]),$a([62,62]),$a([])])]);$_.maxicode_latchlen=$a([$a([0,1,1,1,1]),$a([1,0,1,1,1]),$a([2,2,0,2,2]),$a([2,2,2,0,2]),$a([2,2,2,2,0])]);$_.maxicode_pad_code=$a([33,33,0,0,28]);$_.maxicode_max_int=2147483647;$_.maxicode_rsprod=function(){var _2N=$k[$j-1];var _2O=$k[$j-2];if(_2N!=0&&_2O!=0){var _2Q=$k[--$j];var _2S=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_2Q)+$g($_.rslog,_2S))%63)}else{$j-=2;$k[$j++]=0}};$_.maxicode_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _2Y=0,_2Z=$_.k;_2Y<_2Z;_2Y++){$k[$j++]=0}$_.coeffs=$a();for(var _2c=1,_2b=$_.k;_2c<=_2b;_2c+=1){var _2d=$_.coeffs;$p(_2d,_2c,$g(_2d,_2c-1));$k[$j++]=$g($_.rsalog,_2c);for(var _2h=_2c-1;_2h>=1;_2h-=1){var _2i=$_.coeffs;var _2k=$k[$j-1];$k[$j++]=_2i;$k[$j++]=_2h;$k[$j++]=$g(_2i,_2h);$k[$j++]=_2k;$_.maxicode_rsprod();var _2m=$k[--$j];var _2n=$k[--$j];var _2p=$k[--$j];$p(_2p,_2n,$xo(_2m,$g($_.coeffs,_2n-1)))}var _2q=$_.coeffs;var _2s=$k[$j-1];$k[$j++]=_2q;$k[$j++]=0;$k[$j++]=$g(_2q,0);$k[$j++]=_2s;$_.maxicode_rsprod();var _2t=$k[--$j];var _2u=$k[--$j];var _2v=$k[--$j];$p(_2v,_2u,_2t);$j--}$k[$j++]=$G($_.coeffs,0,$_.k)};$_.maxicode_coeffscachemax=3;$_.maxicode_coeffscachelimit=58;$k[$j++]=$_.maxicode_coeffscachemax;$k[$j++]=$_.maxicode_coeffscachelimit;bwipp_fifocache();var _31=$k[--$j];$_.maxicode_coeffscache=_31;$_.maxicode_coeffscachefetch=function(){var _32=$k[--$j];$_.k=_32;var _34=$g($_.maxicode_coeffscache,"fetch");$k[$j++]=$_.k;$k[$j++]=function(){$_.maxicode_gencoeffs()};$k[$j++]=function(){var _35=$k[--$j];$k[$j++]=_35.length};if(_34()===true){return true}};$_.charvals=$a([new Map,new Map,new Map,new Map,new Map]);for(var _37=0,_36=$_.maxicode_charmaps.length-1;_37<=_36;_37+=1){$_.i=_37;$_.encs=$g($_.maxicode_charmaps,$_.i);for(var _3A=0;_3A<=4;_3A+=1){$_.j=_3A;var _3D=$g($_.encs,$_.j);var _3E=$t(_3D);if($eq(_3E,"stringtype")){_3D=$g(_3D,0)}$p($g($_.charvals,$_.j),_3D,$_.i)}}$_.seta=$g($_.charvals,0);$_.setb=$g($_.charvals,1);$_.setc=$g($_.charvals,2);$_.setd=$g($_.charvals,3);$_.sete=$g($_.charvals,4);$_.charvals=$_.charvals;$k[$j++]=Infinity;$k[$j++]=1;for(var _3X=0;_3X<63;_3X++){var _3Y=$k[$j-1];var _3Z=_3Y*2;$k[$j++]=_3Z;if(_3Z>=64){var _3a=$k[--$j];$k[$j++]=_3a^67}}var _3b=$a();$_.rsalog=_3b;$_.rslog=$a(64);for(var _3d=1;_3d<=63;_3d+=1){$p($_.rslog,$g($_.rsalog,_3d),_3d)}$_.rslog=$_.rslog;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_maxicode.globals);$_.dontdraw=false;$_.modunit=2;$_.mode=-1;$_.sam=-1;$_.parse=false;$_.parsefnc=false;$_.legacyencoder=false;bwipp_processoptions();var _3i=$k[--$j];$_.options=_3i;var _3j=$k[--$j];$_.barcode=_3j;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.maxicodeEmptyData#28653";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>1e3){$k[$j++]="bwipp.maxicodeinputTooLong#28658";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.mode!=-1&&($_.mode<2||$_.mode>6)){$k[$j++]="bwipp.maxicodeBadMode#28662";$k[$j++]="Mode must be 2 to 6";bwipp_raiseerror()}if($_.sam!=-1){$k[$j++]=true;for(var _3s=0;_3s<1;_3s++){var _3t=$_.sam;if(_3t<12||_3t>88){$k[$j-1]=false;break}var _3v=$_.sam%10;if(_3v<2||_3v>8){$k[$j-1]=false;break}if(~~($_.sam/10)>$_.sam%10){$k[$j-1]=false;break}}var _3y=$k[--$j];if(!_3y){$k[$j++]="bwipp.maxicodeBadSAM#28673";$k[$j++]='SAM must be formatted as "NM" for Nth of M symbols, from 2 to 8 symbols';bwipp_raiseerror()}}$_.encoding="new";if($_.legacyencoder){$_.encoding="legacy"}$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _44=$k[--$j];$_.msg=_44;$_.msglen=$_.msg.length;if($_.mode==2||$_.mode==3){$_.barcode=$s($_.msglen);$_.barlen=$_.msglen;for(var _4D=0,_4C=$_.msglen-1;_4D<=_4C;_4D+=1){$_.i=_4D;if($g($_.msg,$_.i)<0){$_.barlen=$_.i;break}$p($_.barcode,$_.i,$g($_.msg,$_.i))}$_.difflen=$_.msglen-$_.barlen;$_.fid="";if($_.barlen>=9){var _4Q=$_.barcode;var _4S=$g(_4Q,7);var _4T=$g(_4Q,8);if($eq($G(_4Q,0,7),"[)>01")&&(_4S>=48&&_4S<=57&&(_4T>=48&&_4T<=57))){$_.fid=$G($_.barcode,0,9);$_.barcode=$G($_.barcode,9,$_.barlen-9)}}$X($_.barcode,"");var _4a=$k[--$j];if(_4a){var _4b=$k[--$j];$_.pcode=_4b;$j--;if($_.mode==2){$k[$j++]=true;for(var _4d=0;_4d<1;_4d++){var _4f=$_.pcode.length;if(_4f>9||_4f==0){$k[$j-1]=false;break}$F($_.pcode,function(){var _4h=$k[--$j];if(_4h<48||_4h>57){$k[$j-1]=false;return true}})}var _4i=$k[--$j];if(!_4i){$k[$j-1]="bwipp.maxicodeBadMode2PostCode#28739";$k[$j++]="A mode 2 postcode must not be empty or exceed 9 digits";bwipp_raiseerror()}}else{$k[$j++]=true;for(var _4j=0;_4j<1;_4j++){var _4l=$_.pcode.length;if(_4l>6||_4l==0){$k[$j-1]=false;break}$F($_.pcode,function(){var _4n=$k[--$j];if(!(_4n==32||(_4n>=34&&_4n<=58||_4n>=65&&_4n<=90))){$k[$j-1]=false;return true}})}var _4o=$k[--$j];if(!_4o){$k[$j-1]="bwipp.maxicodeBadMode3PostCode#28753";$k[$j++]="A mode 3 postcode must not be empty or exceed 6 characters";bwipp_raiseerror()}}}else{$k[$j-1]="bwipp.maxicodeExpectedPostCode#28757";$k[$j++]="Expected postcode followed by group separator character";bwipp_raiseerror()}var _4p=$k[--$j];$X(_4p,"");var _4q=$k[--$j];if(_4q){var _4r=$k[--$j];$_.ccode=_4r;$k[$j-1]=true;for(var _4s=0;_4s<1;_4s++){if($_.ccode.length!=3){$k[$j-1]=false;break}$F($_.ccode,function(){var _4v=$k[--$j];if(_4v<48||_4v>57){$k[$j-1]=false;return true}})}var _4w=$k[--$j];if(!_4w){$k[$j-1]="bwipp.maxicodeBadCountryCode#28767";$k[$j++]="Country code must be three digits";bwipp_raiseerror()}}else{$k[$j-1]="bwipp.maxicodeExpectedCountryCode#28770";$k[$j++]="Expected country code followed by group separator character";bwipp_raiseerror()}var _4x=$k[--$j];$X(_4x,"");var _4y=$k[--$j];if(_4y){var _4z=$k[--$j];$_.scode=_4z;$k[$j-1]=true;for(var _50=0;_50<1;_50++){if($_.scode.length!=3){$k[$j-1]=false;break}$F($_.scode,function(){var _53=$k[--$j];if(_53<48||_53>57){$k[$j-1]=false;return true}})}var _54=$k[--$j];if(!_54){$k[$j-1]="bwipp.maxicodeBadServiceClass#28780";$k[$j++]="Service class must be three digits";bwipp_raiseerror()}}else{$k[$j-1]="bwipp.maxicodeExpectedServiceClass#28783";$k[$j++]="Expected service class followed by group separator character";bwipp_raiseerror()}var _55=$k[--$j];$_.barcode=_55;var _58=$s($_.barcode.length+$_.fid.length);$P(_58,0,$_.fid);$P(_58,$_.fid.length,$_.barcode);$_.barcode=_58;$_.barlen=$_.barcode.length;$k[$j++]=Infinity;var _5D=$_.barcode;for(var _5E=0,_5F=_5D.length;_5E<_5F;_5E++){$k[$j++]=$g(_5D,_5E)}$q($G($_.msg,$_.msglen-$_.difflen,$_.difflen));$_.msg=$a();$_.msglen=$_.msg.length}var _5Q=$_.mode==5?77:$_.mode<=3?84:93;$_.maxlen=_5Q;if($eq($_.encoding,"legacy")){$k[$j++]=Infinity;for(var _5U=0,_5V=$_.msglen+1;_5U<_5V;_5U++){$k[$j++]=0}$_.nseq=$a();for(var _5X=$_.msglen-1;_5X>=0;_5X-=1){$_.i=_5X;var _5a=$g($_.msg,$_.i);if(_5a>=48&&_5a<=57){$p($_.nseq,$_.i,$g($_.nseq,$_.i+1)+1)}else{$p($_.nseq,$_.i,0)}}$_.nseq=$G($_.nseq,0,$_.msglen);$_.prefixinset=function(){$k[$j++]=0;for(;;){var _5l=$k[$j-1];var _5m=$k[$j-2];if(_5l>=_5m.length){break}var _5n=$k[$j-1];var _5o=$k[$j-2];var _5q=$k[$j-3];var _5r=$has(_5q,$g(_5o,_5n));if(_5r){$k[$j-1]+=1}else{break}}var _5t=$k[--$j];$j--;$k[$j-1]=_5t};$_.enc=function(){var _5x=$k[--$j];var _5y=$k[--$j];$p($_.out,$_.j,$g(_5x,_5y));$_.j=$_.j+1};$_.out=$a(144);$_.i=0;$_.j=0;$_.cset="seta";for(;;){if($_.i==$_.msglen){if($ne($_.cset,"seta")&&$ne($_.cset,"setb")&&$_.out.length<$_.maxlen){var _6B=$_[$_.cset];$k[$j++]=$_.maxicode_la;$k[$j++]=_6B;$_.enc();$_.cset="seta"}break}for(;;){if($g($_.msg,$_.i)<=-1e6){var _6G=$_[$_.cset];$k[$j++]=$_.maxicode_eci;$k[$j++]=_6G;$_.enc();var _6K=-$g($_.msg,$_.i)-1e6;$k[$j++]=_6K;if(_6K<=31){var _6L=$k[--$j];var _6M=$a(1);$k[$j++]=_6L&63;$as(_6M)}else{var _6N=$k[$j-1];if(_6N<=1023){var _6O=$k[--$j];var _6P=$a(2);$k[$j++]=$flr(_6O/64)&31|32;$k[$j++]=_6O&63;$as(_6P)}else{var _6Q=$k[$j-1];if(_6Q<=32767){var _6R=$k[--$j];var _6S=$a(3);$k[$j++]=$flr(_6R/4096)&47|48;$k[$j++]=$flr(_6R/64)&63;$k[$j++]=_6R&63;$as(_6S)}else{var _6T=$k[--$j];var _6U=$a(4);$k[$j++]=$flr(_6T/262144)&55|56;$k[$j++]=$flr(_6T/4096)&63;$k[$j++]=$flr(_6T/64)&63;$k[$j++]=_6T&63;$as(_6U)}}}var _6V=$k[--$j];$P($_.out,$_.j,_6V);$_.j=_6V.length+$_.j;$_.i=$_.i+1;break}if($g($_.nseq,$_.i)>=9){var _6f=$G($_.msg,$_.i,9);var _6k=0;for(var _6g=0,_6h=_6f.length;_6g<_6h;_6g++){_6k=$f(_6k+($g(_6f,_6g)-48))*10}$k[$j++]=~~(_6k/10);for(var _6l=0;_6l<4;_6l++){var _6m=$k[--$j];$k[$j++]=_6m&63;$k[$j++]=$flr(_6m/64)}var _6o=$_[$_.cset];$k[$j++]=$g(_6o,$_.maxicode_ns);for(var _6q=0;_6q<=10;_6q+=2){var _6r=$k[$j-1-_6q];$k[$j++]=_6r}$as($a(6));$r(7,1);for(var _6t=0;_6t<6;_6t++){$j--}var _6v=$k[--$j];$P($_.out,$_.j,_6v);$_.i=$_.i+9;$_.j=$_.j+6;break}$_.char1=$g($_.msg,$_.i);var _77=$_.i+1<$_.msglen?$g($_.msg,$_.i+1):-99;$_.char2=_77;var _7E=$_.i+2<$_.msglen?$g($_.msg,$_.i+2):-99;$_.char3=_7E;var _7H=$_[$_.cset];if($has(_7H,$_.char1)){var _7M=$_[$_.cset];$k[$j++]=$_.char1;$k[$j++]=_7M;$_.enc();$_.i=$_.i+1;break}if($eq($_.cset,"seta")&&$has($_.setb,$_.char1)){if($has($_.setb,$_.char2)){$k[$j++]=$_.maxicode_lb;$k[$j++]=$_.seta;$_.enc();$_.cset="setb"}else{$k[$j++]=$_.maxicode_sb;$k[$j++]=$_.seta;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.setb;$_.enc();$_.i=$_.i+1}break}if($eq($_.cset,"setb")&&$has($_.seta,$_.char1)){var _7e=$_.seta;var _7f=$_.msg;var _7g=$_.i;var _7h=$_.msglen;var _7i=$_.i;var _7j=_7h-_7i;var _7k=4;if(4>_7h-_7i){var _=_7j;_7j=_7k;_7k=_}$k[$j++]="p";$k[$j++]=_7e;$k[$j++]=$G(_7f,_7g,_7k);$_.prefixinset();var _7m=$k[--$j];var _7n=$k[--$j];$_[_7n]=_7m;if($_.p==1){$k[$j++]=$_.maxicode_sa;$k[$j++]=$_.setb;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.seta;$_.enc();$_.i=$_.i+1}if($_.p==2){$k[$j++]=$_.maxicode_sa2;$k[$j++]=$_.setb;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.seta;$_.enc();$k[$j++]=$_.char2;$k[$j++]=$_.seta;$_.enc();$_.i=$_.i+2}if($_.p==3){$k[$j++]=$_.maxicode_sa3;$k[$j++]=$_.setb;$_.enc();$k[$j++]=$_.char1;$k[$j++]=$_.seta;$_.enc();$k[$j++]=$_.char2;$k[$j++]=$_.seta;$_.enc();$k[$j++]=$_.char3;$k[$j++]=$_.seta;$_.enc();$_.i=$_.i+3}if($_.p>=4){$k[$j++]=$_.maxicode_la;$k[$j++]=$_.setb;$_.enc();$_.cset="seta"}break}if($has($_.seta,$_.char1)){var _8F=$_[$_.cset];$k[$j++]=$_.maxicode_la;$k[$j++]=_8F;$_.enc();$_.cset="seta";break}if($has($_.setb,$_.char1)){var _8K=$_[$_.cset];$k[$j++]=$_.maxicode_lb;$k[$j++]=_8K;$_.enc();$_.cset="setb";break}if($has($_.setc,$_.char1)){$_.setx="setc";$_.sx=$_.maxicode_sc;$_.lkx=$_.maxicode_lkc}if($has($_.setd,$_.char1)){$_.setx="setd";$_.sx=$_.maxicode_sd;$_.lkx=$_.maxicode_lkd}if($has($_.sete,$_.char1)){$_.setx="sete";$_.sx=$_.maxicode_se;$_.lkx=$_.maxicode_lke}var _8V=$_[$_.setx];var _8W=$_.msg;var _8X=$_.i;var _8Y=$_.msglen;var _8Z=$_.i;var _8a=_8Y-_8Z;var _8b=4;if(4>_8Y-_8Z){var _=_8a;_8a=_8b;_8b=_}$k[$j++]="p";$k[$j++]=_8V;$k[$j++]=$G(_8W,_8X,_8b);$_.prefixinset();var _8d=$k[--$j];var _8e=$k[--$j];$_[_8e]=_8d;if($_.p==1){var _8i=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_8i;$_.enc();var _8l=$_[$_.setx];$k[$j++]=$_.char1;$k[$j++]=_8l;$_.enc();$_.i=$_.i+1}if($_.p==2){var _8q=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_8q;$_.enc();var _8t=$_[$_.setx];$k[$j++]=$_.char1;$k[$j++]=_8t;$_.enc();var _8w=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_8w;$_.enc();var _8z=$_[$_.setx];$k[$j++]=$_.char2;$k[$j++]=_8z;$_.enc();$_.i=$_.i+2}if($_.p==3){var _94=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_94;$_.enc();var _97=$_[$_.setx];$k[$j++]=$_.char1;$k[$j++]=_97;$_.enc();var _9A=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_9A;$_.enc();var _9D=$_[$_.setx];$k[$j++]=$_.char2;$k[$j++]=_9D;$_.enc();var _9G=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_9G;$_.enc();var _9J=$_[$_.setx];$k[$j++]=$_.char3;$k[$j++]=_9J;$_.enc();$_.i=$_.i+3}if($_.p>=4){var _9O=$_[$_.cset];$k[$j++]=$_.sx;$k[$j++]=_9O;$_.enc();var _9R=$_[$_.setx];$k[$j++]=$_.lkx;$k[$j++]=_9R;$_.enc();$_.cset=$_.setx}break}}$_.encmsg=$G($_.out,0,$_.j);var _9X=$_[$_.cset];$_.padval=$g(_9X,$_.maxicode_pad)}if($eq($_.encoding,"new")){$_.haveb=false;$_.havec=false;$_.haved=false;$_.havee=false;$_.havei=false;for(var _9c=0,_9b=$_.msglen-1;_9c<=_9b;_9c+=1){$_.c=$g($_.msg,_9c);if($_.c<=-1e6){$_.havei=true}else{if(($_.c<28||$_.c>30)&&$_.c!=32){if($has($_.setb,$_.c)){$_.haveb=true}if($has($_.setc,$_.c)){$_.havec=true}if($has($_.setd,$_.c)){$_.haved=true}if($has($_.sete,$_.c)){$_.havee=true}}}}$k[$j++]=Infinity;$k[$j++]=0;if($_.haveb){$k[$j++]=1}if($_.havee){$k[$j++]=4}if($_.havec){$k[$j++]=2}if($_.haved){$k[$j++]=3}$_.priority=$a();$_.priority_rest=$G($_.priority,1,$_.priority.length-1);$_.latch_sequence=$_.maxicode_latchseq;$_.latch_length=$_.maxicode_latchlen;$k[$j++]=Infinity;for(var _A2=0;_A2<16;_A2++){$k[$j++]=$a([0,0,0,0,0])}$_.best_length=$a();$k[$j++]=Infinity;for(var _A4=0;_A4<16;_A4++){$k[$j++]=$a([0,0,0,0,0])}$_.best_origin=$a();$k[$j++]=Infinity;for(var _A7=0,_A8=$_.msglen;_A7<_A8;_A7++){var _AA=[];for(var _A9=0;_A9<5;_A9++){_AA[_A9]=0}_AA=$a(_AA);$k[$j++]=_AA}$_.prior_code_set=$a();$k[$j++]=Infinity;for(var _AC=0,_AD=$_.msglen;_AC<_AD;_AC++){var _AF=[];for(var _AE=0;_AE<5;_AE++){_AF[_AE]=0}_AF=$a(_AF);$k[$j++]=_AF}$_.path_op=$a();$_.out_eci=function(){var _AH=-$_.c-1e6;$k[$j++]=_AH;if(_AH<1024){var _AI=$k[--$j];$k[$j++]=_AI<32?2:3}else{var _AK=$k[--$j];$k[$j++]=_AK<32768?4:5}};$_.enc_eci=function(){var _AN=-$_.c-1e6;$k[$j++]=_AN;if(_AN>=32){var _AO=$k[$j-1];if(_AO<1024){var _AP=$k[--$j];$k[$j++]=$flr(_AP/64)|32;$k[$j++]=_AP&63}else{var _AQ=$k[$j-1];if(_AQ<32768){var _AR=$k[--$j];$k[$j++]=$flr(_AR/4096)|48;$k[$j++]=$flr(_AR/64)&63;$k[$j++]=_AR&63}else{var _AS=$k[--$j];$k[$j++]=$flr(_AS/262144)|56;$k[$j++]=$flr(_AS/4096)&63;$k[$j++]=$flr(_AS/64)&63;$k[$j++]=_AS&63}}}};$_.enc_ns=function(){var _AV=$G($_.msg,$_.n,9);var _Aa=0;for(var _AW=0,_AX=_AV.length;_AW<_AX;_AW++){_Aa=$f($g(_AV,_AW)-48+_Aa*10)}$k[$j++]=$flr(_Aa/16777216);$k[$j++]=$flr(_Aa/262144)&63;$k[$j++]=$flr(_Aa/4096)&63;$k[$j++]=$flr(_Aa/64)&63;$k[$j++]=_Aa&63};$_.enc_sha2=function(){var _Ai=$g($_.seta,$g($_.msg,$_.n+1));$k[$j++]=$g($_.seta,$_.c);$k[$j++]=_Ai};$_.enc_sha3=function(){var _Aq=$g($_.seta,$g($_.msg,$_.n+1));var _Av=$g($_.seta,$g($_.msg,$_.n+2));$k[$j++]=$g($_.seta,$_.c);$k[$j++]=_Aq;$k[$j++]=_Av};$k[$j++]=Infinity;if($_.havei){var _Ay=new Map([["can",function(){$k[$j++]=$_.c<=-1e6}],["intake",1],["output",function(){$_.out_eci()}],["sets",31],["enc",function(){$k[$j++]=27;$_.enc_eci()}]]);$k[$j++]=_Ay}var _B0=new Map([["can",function(){$k[$j++]=$_.digits>=9}],["intake",9],["output",function(){$k[$j++]=6}],["sets",31],["enc",function(){$k[$j++]=31;$_.enc_ns()}]]);var _B7=new Map([["can",function(){$k[$j++]=$has($_.seta,$_.c)}],["intake",1],["output",function(){$k[$j++]=1}],["sets",1],["enc",function(){$k[$j++]=$g($_.seta,$_.c)}]]);$k[$j++]=_B0;$k[$j++]=_B7;if($_.haveb){var _BF=new Map([["can",function(){$k[$j++]=$has($_.setb,$_.c)}],["intake",1],["output",function(){$k[$j++]=1}],["sets",2],["enc",function(){$k[$j++]=$g($_.setb,$_.c)}]]);$k[$j++]=_BF}if($_.havec){var _BN=new Map([["can",function(){$k[$j++]=$has($_.setc,$_.c)}],["intake",1],["output",function(){$k[$j++]=1}],["sets",4],["enc",function(){$k[$j++]=$g($_.setc,$_.c)}]]);$k[$j++]=_BN}if($_.haved){var _BV=new Map([["can",function(){$k[$j++]=$has($_.setd,$_.c)}],["intake",1],["output",function(){$k[$j++]=1}],["sets",8],["enc",function(){$k[$j++]=$g($_.setd,$_.c)}]]);$k[$j++]=_BV}if($_.havee){var _Bd=new Map([["can",function(){$k[$j++]=$has($_.sete,$_.c)}],["intake",1],["output",function(){$k[$j++]=1}],["sets",16],["enc",function(){$k[$j++]=$g($_.sete,$_.c)}]]);$k[$j++]=_Bd}var _Bi=new Map([["can",function(){$k[$j++]=$_.num_a>=1}],["intake",1],["output",function(){$k[$j++]=2}],["sets",2],["enc",function(){$k[$j++]=59;$k[$j++]=$g($_.seta,$_.c)}]]);var _Bk=new Map([["can",function(){$k[$j++]=$_.num_a>=2}],["intake",2],["output",function(){$k[$j++]=3}],["sets",2],["enc",function(){$k[$j++]=56;$_.enc_sha2()}]]);var _Bm=new Map([["can",function(){$k[$j++]=$_.num_a>=3}],["intake",3],["output",function(){$k[$j++]=4}],["sets",2],["enc",function(){$k[$j++]=57;$_.enc_sha3()}]]);$k[$j++]=_Bi;$k[$j++]=_Bk;$k[$j++]=_Bm;if($_.haveb){var _Bu=new Map([["can",function(){$k[$j++]=$has($_.setb,$_.c)}],["intake",1],["output",function(){$k[$j++]=2}],["sets",1],["enc",function(){$k[$j++]=59;$k[$j++]=$g($_.setb,$_.c)}]]);$k[$j++]=_Bu}if($_.havec){var _C2=new Map([["can",function(){$k[$j++]=$has($_.setc,$_.c)}],["intake",1],["output",function(){$k[$j++]=2}],["sets",27],["enc",function(){$k[$j++]=60;$k[$j++]=$g($_.setc,$_.c)}]]);$k[$j++]=_C2}if($_.haved){var _CA=new Map([["can",function(){$k[$j++]=$has($_.setd,$_.c)}],["intake",1],["output",function(){$k[$j++]=2}],["sets",23],["enc",function(){$k[$j++]=61;$k[$j++]=$g($_.setd,$_.c)}]]);$k[$j++]=_CA}if($_.havee){var _CI=new Map([["can",function(){$k[$j++]=$has($_.sete,$_.c)}],["intake",1],["output",function(){$k[$j++]=2}],["sets",15],["enc",function(){$k[$j++]=62;$k[$j++]=$g($_.sete,$_.c)}]]);$k[$j++]=_CI}$_.op_tab=$a();var _CJ=$_.op_tab;$k[$j++]=0;for(var _CK=0,_CL=_CJ.length;_CK<_CL;_CK++){var _CN=$k[--$j];$p($g(_CJ,_CK),"idx",_CN);$k[$j++]=_CN+1}$k[$j-1]=Infinity;var _CO=$a([1,2,4,8,16]);for(var _CP=0,_CQ=_CO.length;_CP<_CQ;_CP++){$_.n=$g(_CO,_CP);$k[$j++]=Infinity;var _CS=$_.op_tab;for(var _CT=0,_CU=_CS.length;_CT<_CU;_CT++){var _CV=$g(_CS,_CT);$k[$j++]=_CV;if($an($g(_CV,"sets"),$_.n)==0){$j--}}var _CY=$a();$k[$j++]=_CY}$_.code_set_operations=$a();$_.get_best_length=function(){$_.latch_length_s=$g($_.latch_length,$_.state);$k[$j++]=$_.maxicode_max_int;$F($g($_.code_set_operations,$_.state),function(){var _Cf=$k[--$j];$_.op=_Cf;if($g($_.op,"can")()===true){return true}var _Ci=$k[--$j];if(_Ci){$_.m=$f($_.n-$g($_.op,"intake"))&15;$_.org=$g($g($_.best_origin,$_.m),$_.state);$k[$j++]=$f($g($g($_.best_length,$_.m),$_.org)+$g($_.latch_length_s,$_.org));if($g($_.op,"output")()===true){return true}var _D1=$k[--$j];var _D2=$k[--$j];var _D3=$k[$j-1];$k[$j++]=$f(_D2+_D1);if(_D3>$f(_D2+_D1)){var _D4=$k[--$j];var _D5=$k[--$j];$p($_.path_op_0,$_.state,$g($_.op,"idx"));$p($_.prior_code_set_0,$_.state,$_.org);$k[$j++]=_D4;$k[$j++]=_D5}$j--}})};$_.get_best_origin=function(){$_.latch_length_s=$g($_.latch_length,$_.state);$_.orglen=$f($g($_.best_length_0,0)+$g($_.latch_length_s,0));var _DK=$_.priority_rest;$k[$j++]=0;for(var _DL=0,_DM=_DK.length;_DL<_DM;_DL++){$_.p=$g(_DK,_DL);var _DU=$f($g($_.best_length_0,$_.p)+$g($_.latch_length_s,$_.p));$k[$j++]=_DU;if(_DU<$_.orglen){var _DW=$k[--$j];$_.orglen=_DW;$k[$j-1]=$_.p}else{$j--}}};$_.digits=0;$_.num_a=0;for(var _Da=0,_DZ=$_.msglen-1;_Da<=_DZ;_Da+=1){$_.n=_Da;$_.c=$g($_.msg,$_.n);var _Dh=$_.c>=48&&$_.c<58?$_.digits+1:0;$_.digits=_Dh;var _Dl=$has($_.seta,$_.c);var _Dn=_Dl?$_.num_a+1:0;$_.num_a=_Dn;$_.path_op_0=$g($_.path_op,$_.n);$_.prior_code_set_0=$g($_.prior_code_set,$_.n);$_.best_length_0=$g($_.best_length,$_.n&15);$_.best_origin_0=$g($_.best_origin,$_.n&15);var _E1=$_.priority;for(var _E2=0,_E3=_E1.length;_E2<_E3;_E2++){$_.state=$g(_E1,_E2);$k[$j++]=$_.best_length_0;$k[$j++]=$_.state;$_.get_best_length();var _E7=$k[--$j];var _E8=$k[--$j];var _E9=$k[--$j];$p(_E9,_E8,_E7)}var _EA=$_.priority;for(var _EB=0,_EC=_EA.length;_EB<_EC;_EB++){$_.state=$g(_EA,_EB);$k[$j++]=$_.best_origin_0;$k[$j++]=$_.state;$_.get_best_origin();var _EG=$k[--$j];var _EH=$k[--$j];var _EI=$k[--$j];$p(_EI,_EH,_EG)}}$_.n=$_.msglen;var _EK=$_.priority;$k[$j++]=0;$k[$j++]=$_.maxicode_max_int;for(var _EL=0,_EM=_EK.length;_EL<_EM;_EL++){var _EN=$g(_EK,_EL);var _EP=$g($_.best_length_0,_EN);var _EQ=$k[$j-1];$k[$j++]=_EN;$k[$j++]=_EP;if($lt(_EP,_EQ)){$r(4,2)}$j-=2}var _ER=$k[--$j];$_.j=_ER;var _ES=$k[--$j];$_.state=_ES;var _EW=$g($_.maxicode_pad_code,$_.state)==0?0:$_.state;$_.final_code_set=_EW;if($g($_.maxicode_pad_code,$_.state)==0&&$lt($_.j,$_.maxlen)){var _Ed=$a($_.j+1);$p(_Ed,$_.j,58);$k[$j++]=_Ed}else{$k[$j++]=$a($_.j)}$_.padval=$g($_.maxicode_pad_code,$_.final_code_set);$_.len=$_.j;for(;;){if($_.n<=0){break}$_.pcs=$g($g($_.prior_code_set,$_.n-1),$_.state);$_.op_idx=$g($g($_.path_op,$_.n-1),$_.state);$_.op=$g($_.op_tab,$_.op_idx);$_.n=$f($_.n-$g($_.op,"intake"));$_.c=$g($_.msg,$_.n);$_.enc=$g($_.op,"enc");$k[$j++]=Infinity;if($_.enc()===true){break}$_.output=$a();$_.latch=$g($g($_.latch_sequence,$_.state),$_.pcs);$_.len=$f($_.len-$_.latch.length-$_.output.length);var _FF=$k[--$j];var _FG=$_.len;var _FH=$_.latch;$P(_FF,_FG,_FH);$P(_FF,$f(_FG+_FH.length),$_.output);$_.state=$_.pcs;$k[$j++]=_FF}var _FK=$k[--$j];$_.encmsg=_FK}var _FS=$_.sam!=-1?$a([$g($_.seta,$_.maxicode_pad),(~~($_.sam/10)-1)*8+($_.sam%10-1)]):$a([]);$_.sami=_FS;$k[$j++]=Infinity;$q($_.sami);$q($_.encmsg);$_.encmsg=$a();if($_.mode==2||$_.mode==3){if($_.encmsg.length>84){$k[$j++]="bwipp.maxicodeMode23TooLong#29240";$k[$j++]="The secondary message is too long";bwipp_raiseerror()}var _Fa=$Z($s(4),"0000");var _Fd=$R($s(4),~~$_.mode,2);$P(_Fa,4-_Fd.length,_Fd);$_.mdb=_Fa;var _Ff=$Z($s(10),"0000000000");var _Fi=$R($s(10),$i($_.ccode),2);$P(_Ff,10-_Fi.length,_Fi);$_.ccb=_Ff;var _Fk=$Z($s(10),"0000000000");var _Fn=$R($s(10),$i($_.scode),2);$P(_Fk,10-_Fn.length,_Fn);$_.scb=_Fk;$_.pcb=$Z($s(36),"000000000000000000000000000000000000");if($_.mode==2){if($eq($_.ccode,"840")&&$_.pcode.length==5){var _Fu=$Z($s(9)," 0000");$P(_Fu,0,$_.pcode);$_.pcode=_Fu}var _Fz=$R($s(6),$_.pcode.length,2);$P($_.pcb,6-_Fz.length,_Fz);var _G3=$R($s(30),$i($_.pcode),2);$P($_.pcb,36-_G3.length,_G3)}else{$k[$j++]=Infinity;var _G5=$Z($s(6)," ");var _GB=0;var _GA=$_.pcode.length>6?$G($_.pcode,0,6):$_.pcode;$P(_G5,_GB,_GA);$F(_G5,function(){var _GF=$k[--$j];$k[$j++]=$g($_.seta,_GF)});$_.pccw=$a();for(var _GH=0;_GH<=5;_GH+=1){$_.i=_GH;var _GN=$R($s(6),$g($_.pccw,$_.i),2);$P($_.pcb,6*$_.i+6-_GN.length,_GN)}}$_.scm=$s(60);$P($_.scm,2,$_.mdb);$P($_.scm,38,$G($_.pcb,0,4));$P($_.scm,30,$G($_.pcb,4,6));$P($_.scm,24,$G($_.pcb,10,6));$P($_.scm,18,$G($_.pcb,16,6));$P($_.scm,12,$G($_.pcb,22,6));$P($_.scm,6,$G($_.pcb,28,6));$P($_.scm,0,$G($_.pcb,34,2));$P($_.scm,52,$G($_.ccb,0,2));$P($_.scm,42,$G($_.ccb,2,6));$P($_.scm,36,$G($_.ccb,8,2));$P($_.scm,54,$G($_.scb,0,6));$P($_.scm,48,$G($_.scb,6,4));$_.pri=$a([0,0,0,0,0,0,0,0,0,0]);for(var _H2=0;_H2<=59;_H2+=1){$_.i=_H2;$_.ps=~~($_.i/6);$_.ep=$pow(2,5-$_.i%6)*($g($_.scm,$_.i)-48);$p($_.pri,$_.ps,$f($g($_.pri,$_.ps)+$_.ep))}$k[$j++]=Infinity;for(var _HE=0;_HE<84;_HE++){$k[$j++]=$_.padval}$_.sec=$a();$P($_.sec,0,$_.encmsg)}if($_.mode==4||$_.mode==5||$_.mode==6||$_.mode==-1){if($_.mode==-1){var _HO=$_.encmsg.length<=77?5:4;$_.mode=_HO}$k[$j++]=Infinity;var _HQ=$_.mode==5?78:94;for(var _HR=0,_HS=_HQ;_HR<_HS;_HR++){$k[$j++]=$_.padval}$_.cws=$a();if($_.encmsg.length>$_.cws.length-1){$k[$j++]="bwipp.maxicodeMode56TooLong#29325";$k[$j++]="The message is too long";bwipp_raiseerror()}$p($_.cws,0,$_.mode);$P($_.cws,1,$_.encmsg);$_.pri=$G($_.cws,0,10);$_.sec=$G($_.cws,10,$_.cws.length-10)}$_.rscodes=function(){var _Hf=$k[--$j];$_.rsnum=_Hf;var _Hg=$k[--$j];$_.cwb=_Hg;$k[$j++]="coeffs";$k[$j++]=$_.rsnum;$_.maxicode_coeffscachefetch();var _Hi=$k[--$j];var _Hj=$k[--$j];$_[_Hj]=_Hi;$_.lfsr=$a($_.rsnum);var _Hm=$_.cwb;var _Hn=$_.coeffs;var _Ho=$_.rsnum;var _Hp=$_.lfsr;$k[$j++]=function(){var _Hr=$k[--$j];$k[$j++]=$g($_.cwb,_Hr)};$k[$j++]=_Hm.length;$k[$j++]=_Hn;$k[$j++]=_Ho;$k[$j++]=_Hp;$k[$j++]=$_.maxicode_rsprod;bwipp_rsecbinary();$k[$j++]=$_.lfsr};$k[$j++]=Infinity;for(var _Hw=0,_Hv=$_.sec.length-1;_Hw<=_Hv;_Hw+=2){$k[$j++]=$g($_.sec,_Hw)}$_.seco=$a();$k[$j++]=Infinity;for(var _I1=1,_I0=$_.sec.length-1;_I1<=_I0;_I1+=2){$k[$j++]=$g($_.sec,_I1)}$_.sece=$a();var _I5=$_.sec.length==84?20:28;$_.scodes=_I5;$k[$j++]="secochk";$k[$j++]=$_.seco;$k[$j++]=$_.scodes;$_.rscodes();var _I8=$k[--$j];var _I9=$k[--$j];$_[_I9]=_I8;$k[$j++]="secechk";$k[$j++]=$_.sece;$k[$j++]=$_.scodes;$_.rscodes();var _IC=$k[--$j];var _ID=$k[--$j];$_[_ID]=_IC;$k[$j++]=Infinity;for(var _IG=0,_IF=$_.scodes-1;_IG<=_IF;_IG+=1){$k[$j++]=$g($_.secochk,_IG);$k[$j++]=$g($_.secechk,_IG)}$_.secchk=$a();$k[$j++]="prichk";$k[$j++]=$_.pri;$k[$j++]=10;$_.rscodes();var _IM=$k[--$j];var _IN=$k[--$j];$_[_IN]=_IM;$k[$j++]=Infinity;$q($_.pri);$q($_.prichk);$q($_.sec);$q($_.secchk);$_.codewords=$a();if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#29396";$k[$j++]=$_.codewords;bwipp_raiseerror()}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#29400";$k[$j++]=Infinity;$q($_.prichk);$q($_.secchk);var _IZ=$a();$k[$j++]=_IZ;bwipp_raiseerror()}$k[$j++]=Infinity;for(var _Ia=0;_Ia<864;_Ia++){$k[$j++]=0}$_.mods=$a();for(var _Ib=0;_Ib<=143;_Ib+=1){$_.i=_Ib;$k[$j++]=Infinity;var _Ig=$R($s(6),$g($_.codewords,$_.i),2);for(var _Ih=0,_Ii=_Ig.length;_Ih<_Ii;_Ih++){$k[$j++]=$g(_Ig,_Ih)-48}$_.cw=$a();$P($_.mods,6*$_.i+(6-$_.cw.length),$_.cw)}$_.pixs=$a(864);$_.j=0;for(var _Ir=0,_Iq=$_.mods.length-1;_Ir<=_Iq;_Ir+=1){$_.i=_Ir;if($g($_.mods,$_.i)==1){$p($_.pixs,$_.j,$g($_.maxicode_modmap,$_.i));$_.j=$_.j+1}}$k[$j++]=Infinity;$q($G($_.pixs,0,$_.j));$k[$j++]=28;$k[$j++]=29;$k[$j++]=280;$k[$j++]=281;$k[$j++]=311;$k[$j++]=457;$k[$j++]=488;$k[$j++]=500;$k[$j++]=530;$k[$j++]=670;$k[$j++]=700;$k[$j++]=677;$k[$j++]=707;$_.pixs=$a();$k[$j++]=new Map([["ren","renmaximatrix"],["pixs",$_.pixs],["borderleft",1],["borderright",1],["bordertop",1],["borderbottom",1],["opt",$_.options]]);if($_._render){bwipp_renmaximatrix()}$_=$__}function bwipp_azteccode(){if(!bwipp_azteccode.globals){var $__=$_;$_=bwipp_azteccode.globals={};$_.azteccode_u=0;$_.azteccode_l=1;$_.azteccode_m=2;$_.azteccode_p=3;$_.azteccode_d=4;$_.azteccode_b=5;$_.azteccode_lu=-2;$_.azteccode_ll=-3;$_.azteccode_lm=-4;$_.azteccode_lp=-5;$_.azteccode_ld=-6;$_.azteccode_su=-7;$_.azteccode_sp=-8;$_.azteccode_sb=-9;$_.azteccode_fl=-10;$_.azteccode_p2=-11;$_.azteccode_p3=-12;$_.azteccode_p4=-13;$_.azteccode_p5=-14;$_.lu=$_.azteccode_lu;$_.ll=$_.azteccode_ll;$_.lm=$_.azteccode_lm;$_.lp=$_.azteccode_lp;$_.ld=$_.azteccode_ld;$_.su=$_.azteccode_su;$_.sp=$_.azteccode_sp;$_.sb=$_.azteccode_sb;$_.fl=$_.azteccode_fl;$_.p2=$_.azteccode_p2;$_.p3=$_.azteccode_p3;$_.p4=$_.azteccode_p4;$_.p5=$_.azteccode_p5;$_.azteccode_charmaps=$a([$a([$_.sp,$_.sp,$_.sp,$_.fl,$_.sp]),$a([32,32,32,13,32]),$a(["A","a",1,$_.p2,"0"]),$a(["B","b",2,$_.p3,"1"]),$a(["C","c",3,$_.p4,"2"]),$a(["D","d",4,$_.p5,"3"]),$a(["E","e",5,"!","4"]),$a(["F","f",6,'"',"5"]),$a(["G","g",7,"#","6"]),$a(["H","h",8,"$","7"]),$a(["I","i",9,"%","8"]),$a(["J","j",10,"&","9"]),$a(["K","k",11,"'",","]),$a(["L","l",12,40,"."]),$a(["M","m",13,41,$_.lu]),$a(["N","n",27,"*",$_.su]),$a(["O","o",28,"+",-99]),$a(["P","p",29,",",-99]),$a(["Q","q",30,"-",-99]),$a(["R","r",31,".",-99]),$a(["S","s","@","/",-99]),$a(["T","t",92,":",-99]),$a(["U","u","^",";",-99]),$a(["V","v","_","<",-99]),$a(["W","w","`","=",-99]),$a(["X","x","|",">",-99]),$a(["Y","y","~","?",-99]),$a(["Z","z",127,"[",-99]),$a([$_.ll,$_.su,$_.ll,"]",-99]),$a([$_.lm,$_.lm,$_.lu,"{",-99]),$a([$_.ld,$_.ld,$_.lp,"}",-99]),$a([$_.sb,$_.sb,$_.sb,$_.lu,-99])]);var _1C=new Map([["\r\n",$_.p2],[". ",$_.p3],[", ",$_.p4],[": ",$_.p5]]);$_.azteccode_pcomp=_1C;$_.azteccode_latlen=$a([$a([0,5,5,10,5,10]),$a([9,0,5,10,5,10]),$a([5,5,0,5,10,10]),$a([5,10,10,0,10,15]),$a([4,9,9,14,0,14]),$a([0,0,0,0,0,0])]);$_.azteccode_latseq=$a([$a([$a([]),$a([$_.ll]),$a([$_.lm]),$a([$_.lm,$_.lp]),$a([$_.ld]),$a([$_.sb])]),$a([$a([$_.ld,$_.lu]),$a([]),$a([$_.lm]),$a([$_.lm,$_.lp]),$a([$_.ld]),$a([$_.sb])]),$a([$a([$_.lu]),$a([$_.ll]),$a([]),$a([$_.lp]),$a([$_.lu,$_.ld]),$a([$_.sb])]),$a([$a([$_.lu]),$a([$_.lu,$_.ll]),$a([$_.lu,$_.lm]),$a([]),$a([$_.lu,$_.ld]),$a([$_.lu,$_.sb])]),$a([$a([$_.lu]),$a([$_.lu,$_.ll]),$a([$_.lu,$_.lm]),$a([$_.lu,$_.lm,$_.lp]),$a([]),$a([$_.lu,$_.sb])]),$a([$a([$_.lu]),$a([$_.ll]),$a([$_.lm]),$a([]),$a([]),$a([])])]);$_.azteccode_e=1e6;$_.e=$_.azteccode_e;$_.azteccode_shftlen=$a([$a([$_.e,$_.e,$_.e,5,$_.e]),$a([5,$_.e,$_.e,5,$_.e]),$a([$_.e,$_.e,$_.e,5,$_.e]),$a([$_.e,$_.e,$_.e,$_.e,$_.e]),$a([4,$_.e,$_.e,4,$_.e])]);$_.azteccode_metrics=$a([$a(["rune",0,0,0,6]),$a(["compact",1,1,17,6]),$a(["full",1,1,21,6]),$a(["compact",2,0,40,6]),$a(["full",2,1,48,6]),$a(["compact",3,0,51,8]),$a(["full",3,1,60,8]),$a(["compact",4,0,76,8]),$a(["full",4,1,88,8]),$a(["full",5,1,120,8]),$a(["full",6,1,156,8]),$a(["full",7,1,196,8]),$a(["full",8,1,240,8]),$a(["full",9,1,230,10]),$a(["full",10,1,272,10]),$a(["full",11,1,316,10]),$a(["full",12,1,364,10]),$a(["full",13,1,416,10]),$a(["full",14,1,470,10]),$a(["full",15,1,528,10]),$a(["full",16,1,588,10]),$a(["full",17,1,652,10]),$a(["full",18,1,720,10]),$a(["full",19,1,790,10]),$a(["full",20,1,864,10]),$a(["full",21,1,940,10]),$a(["full",22,1,1020,10]),$a(["full",23,0,920,12]),$a(["full",24,0,992,12]),$a(["full",25,0,1066,12]),$a(["full",26,0,1144,12]),$a(["full",27,0,1224,12]),$a(["full",28,0,1306,12]),$a(["full",29,0,1392,12]),$a(["full",30,0,1480,12]),$a(["full",31,0,1570,12]),$a(["full",32,0,1664,12])]);$_.azteccode_rsparams=$a([$a([]),$a([]),$a([]),$a([]),$a([16,19]),$a([]),$a([64,67]),$a([]),$a([256,301]),$a([]),$a([1024,1033]),$a([]),$a([4096,4201])]);$_.azteccode_modemapfull=$a([$a([-5,7]),$a([-4,7]),$a([-3,7]),$a([-2,7]),$a([-1,7]),$a([1,7]),$a([2,7]),$a([3,7]),$a([4,7]),$a([5,7]),$a([7,5]),$a([7,4]),$a([7,3]),$a([7,2]),$a([7,1]),$a([7,-1]),$a([7,-2]),$a([7,-3]),$a([7,-4]),$a([7,-5]),$a([5,-7]),$a([4,-7]),$a([3,-7]),$a([2,-7]),$a([1,-7]),$a([-1,-7]),$a([-2,-7]),$a([-3,-7]),$a([-4,-7]),$a([-5,-7]),$a([-7,-5]),$a([-7,-4]),$a([-7,-3]),$a([-7,-2]),$a([-7,-1]),$a([-7,1]),$a([-7,2]),$a([-7,3]),$a([-7,4]),$a([-7,5])]);$_.azteccode_modemapcompact=$a([$a([-3,5]),$a([-2,5]),$a([-1,5]),$a([0,5]),$a([1,5]),$a([2,5]),$a([3,5]),$a([5,3]),$a([5,2]),$a([5,1]),$a([5,0]),$a([5,-1]),$a([5,-2]),$a([5,-3]),$a([3,-5]),$a([2,-5]),$a([1,-5]),$a([0,-5]),$a([-1,-5]),$a([-2,-5]),$a([-3,-5]),$a([-5,-3]),$a([-5,-2]),$a([-5,-1]),$a([-5,0]),$a([-5,1]),$a([-5,2]),$a([-5,3])]);$_.azteccode_encfuncs=$a(["encu","encl","encm","encp","encd"]);$_.azteccode_states=$a([$_.azteccode_u,$_.azteccode_l,$_.azteccode_m,$_.azteccode_p,$_.azteccode_d,$_.azteccode_b]);$_.azteccode_charsizes=$a([5,5,5,5,4,8]);$_.azteccode_coeffscachemax=551;$_.azteccode_coeffscachelimit=6e3;$_.azteccode_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _58=0,_59=$_.rsnc;_58<_59;_58++){$k[$j++]=0}$_.coeffs=$a();for(var _5C=1,_5B=$_.rsnc;_5C<=_5B;_5C+=1){var _5D=$_.coeffs;$p(_5D,_5C,$g(_5D,_5C-1));$k[$j++]=$g($_.rsalog,_5C);for(var _5H=_5C-1;_5H>=1;_5H-=1){var _5I=$_.coeffs;var _5K=$k[$j-1];$k[$j++]=_5I;$k[$j++]=_5H;$k[$j++]=$g(_5I,_5H);$k[$j++]=_5K;$_.rsprod();var _5M=$k[--$j];var _5N=$k[--$j];var _5P=$k[--$j];$p(_5P,_5N,$xo(_5M,$g($_.coeffs,_5N-1)))}var _5Q=$_.coeffs;var _5S=$k[$j-1];$k[$j++]=_5Q;$k[$j++]=0;$k[$j++]=$g(_5Q,0);$k[$j++]=_5S;$_.rsprod();var _5T=$k[--$j];var _5U=$k[--$j];var _5V=$k[--$j];$p(_5V,_5U,_5T);$j--}$k[$j++]=$_.coeffs};$k[$j++]=$_.azteccode_coeffscachemax;$k[$j++]=$_.azteccode_coeffscachelimit;bwipp_fifocache();var _5Z=$k[--$j];$_.azteccode_coeffscache=_5Z;$_.azteccode_coeffscachefetch=function(){var _5a=$k[--$j];var _5b=$k[--$j];var _5c=$g($_.azteccode_coeffscache,"fetch");$k[$j++]=$f(_5b+_5a*1e5);$k[$j++]=function(){$_.azteccode_gencoeffs()};$k[$j++]=function(){var _5d=$k[--$j];$k[$j++]=_5d.length};if(_5c()===true){return true}};$_.charvals=$a([new Map,new Map,new Map,new Map,new Map]);for(var _5f=0,_5e=$_.azteccode_charmaps.length-1;_5f<=_5e;_5f+=1){$_.i=_5f;$_.encs=$g($_.azteccode_charmaps,$_.i);for(var _5i=0;_5i<=4;_5i+=1){$_.j=_5i;var _5l=$g($_.encs,$_.j);var _5m=$t(_5l);if($eq(_5m,"stringtype")){_5l=$g(_5l,0)}$p($g($_.charvals,$_.j),_5l,$_.i)}}$_.charvals=$_.charvals;$k[$j++]=Infinity;for(var _5v=0,_5w=$_.azteccode_rsparams.length;_5v<_5w;_5v++){var _5x=$g($_.azteccode_rsparams,_5v);$k[$j++]=_5x;if(_5x.length!=0){var _5y=$k[--$j];$q(_5y);var _5z=$k[--$j];$_.rspm=_5z;var _60=$k[--$j];$_.rsgf=_60;$k[$j++]=Infinity;$k[$j++]=1;for(var _62=0,_63=$_.rsgf-1;_62<_63;_62++){var _64=$k[$j-1];var _65=_64*2;$k[$j++]=_65;if(_65>=$_.rsgf){var _68=$k[--$j];$k[$j++]=$xo(_68,$_.rspm)}}$_.rsalog=$a();$_.rslog=$a($_.rsgf);for(var _6D=1,_6C=$_.rsgf-1;_6D<=_6C;_6D+=1){$p($_.rslog,$g($_.rsalog,_6D),_6D)}$k[$j++]=$a([$_.rslog,$_.rsalog])}else{$k[$j-1]=$a([])}}var _6L=$a();$_.rstables=_6L;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_azteccode.globals);$_.dontdraw=false;$_.format="full";$_.readerinit=false;$_.layers=-1;$_.eclevel=23;$_.ecaddchars=3;$_.raw=false;$_.parse=false;$_.parsefnc=false;bwipp_processoptions();var _6M=$k[--$j];$_.options=_6M;var _6N=$k[--$j];$_.barcode=_6N;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.barcode.length==0){$k[$j++]="bwipp.aztecEmptyData#29798";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>2e4){$k[$j++]="bwipp.azteccodeinputTooLong#29802";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($_.eclevel<5||$_.eclevel>95){$k[$j++]="bwipp.aztecInvalidEClevel#29806";$k[$j++]="The EC percentage must be from 5 to 95";bwipp_raiseerror()}if($_.ecaddchars<3){$k[$j++]="bwipp.aztecInvalidECaddChars#29810";$k[$j++]="The number of additional EC codewords must be 3 or more";bwipp_raiseerror()}if($ne($_.format,"full")&&($ne($_.format,"compact")&&$ne($_.format,"rune"))){$k[$j++]="bwipp.aztecInvalidFormat#29814";$k[$j++]="The format must be either full, compact or rune";bwipp_raiseerror()}if($eq($_.format,"full")){if($_.readerinit&&($_.layers<1||$_.layers>22)){$k[$j++]="bwipp.aztecFullInitInvalidLayers#29819";$k[$j++]="Full-range symbols for reader programming must specify from 1 to 22 layers";bwipp_raiseerror()}if($_.layers!=-1&&($_.layers<1||$_.layers>32)){$k[$j++]="bwipp.aztecFullInvalidLayers#29822";$k[$j++]="Layers for full-range symbols must be from 1 to 32";bwipp_raiseerror()}}if($eq($_.format,"compact")){if($_.readerinit){if($_.layers!=-1&&$_.layers!=1){$k[$j++]="bwipp.aztecCompactInitInvalidLayers#29829";$k[$j++]="Compact symbols for reader programming must have 1 layer";bwipp_raiseerror()}$_.layers=1}if($_.layers!=-1&&($_.layers<1||$_.layers>4)){$k[$j++]="bwipp.aztecCompactInvalidLayers#29834";$k[$j++]="Layers for compact symbols must be from 1 to 4";bwipp_raiseerror()}}if($eq($_.format,"rune")){if($_.layers!=-1){$k[$j++]="bwipp.aztecRuneInvalidLayers#29840";$k[$j++]="It is not valid to specify layers for runes";bwipp_raiseerror()}if($_.readerinit){$k[$j++]="bwipp.aztecRuneReaderInit#29843";$k[$j++]="Reader initialisation is not compactible with Aztec Runes";bwipp_raiseerror()}if($_.barcode.length==0){$k[$j++]="bwipp.aztecRuneNotNumeric#29846";$k[$j++]="Aztec runes must be numeric";bwipp_raiseerror()}$F($_.barcode,function(){var _6r=$k[--$j];if(_6r<48||_6r>57){$k[$j++]="bwipp.aztecRuneNotNumeric#29850";$k[$j++]="Aztec runes must be numeric";bwipp_raiseerror()}});if($_.barcode.length>3){$k[$j++]="bwipp.aztecRuneInvalid#29854";$k[$j++]="Aztec runes must be 0 to 255";bwipp_raiseerror()}var _6u=$i($_.barcode);if(_6u<0||_6u>255){$k[$j++]="bwipp.aztecRuneInvalid#29857";$k[$j++]="Aztec runes must be 0 to 255";bwipp_raiseerror()}}$_.fn1=-1;$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true],["FNC1",$_.fn1]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _70=$k[--$j];$_.msg=_70;$_.msglen=$_.msg.length;$_.msgbits="";if($ne($_.format,"rune")&&$_.raw){$_.msgbits=$_.barcode}if($ne($_.format,"rune")&&!$_.raw){$_.charsize=function(){var _77=$k[$j-1];if(_77>=0){$j--;var _78=$k[--$j];$k[$j++]=$g($_.azteccode_charsizes,_78)}else{var _7A=$k[--$j];$k[$j-1]=_7A;var _7C=$k[$j-1];if(_7C==$_.fn1){$k[$j-1]=8}else{var _7E=$k[--$j];var _7F=-_7E-1e6;if(_7F==0){_7F=1}$k[$j++]=(~~($log(_7F)/$log(10))+1)*4+8}}};$_.e=$_.azteccode_e;$_.maxseqlen=$_.msglen*4;$k[$j++]=Infinity;for(var _7I=0;_7I<6;_7I++){$k[$j++]=$_.maxseqlen;try{var _7K=$k[--$j];$k[$j++]=$a(_7K);var _7M=false}catch(e){$k[$j++]=true}if(_7M){$k[$j-1]="bwipp.azteccodeInputTooLarge#29911";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}}$_.seq0=$a();$k[$j++]=Infinity;for(var _7N=0;_7N<6;_7N++){$k[$j++]=$_.maxseqlen;try{var _7P=$k[--$j];$k[$j++]=$a(_7P);var _7R=false}catch(e){$k[$j++]=true}if(_7R){$k[$j-1]="bwipp.azteccodeInputTooLarge#29914";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}}$_.seq1=$a();$_.len0=$a(6);for(var _7T=0;_7T<=5;_7T+=1){$p($_.len0,_7T,0)}$_.len1=$a(6);$_.curseq=$_.seq0;$_.curseqlen=$_.len0;$_.nxtseq=$_.seq1;$_.nxtseqlen=$_.len1;$_.curlen=$a([0,$_.e,$_.e,$_.e,$_.e,$_.e]);$_.backto=$_.azteccode_u;$_.lastchar="";$F($_.msg,function(){var _7g=$k[--$j];$_.char=_7g;for(;;){$_.imp=false;for(var _7h=0,_7i=$_.azteccode_states.length;_7h<_7i;_7h++){$_.x=$g($_.azteccode_states,_7h);for(var _7k=0,_7l=$_.azteccode_states.length;_7k<_7l;_7k++){$_.y=$g($_.azteccode_states,_7k);if($_.x!=$_.azteccode_b||$_.y==$_.backto){$_.cost=$f($g($_.curlen,$_.x)+$g($g($_.azteccode_latlen,$_.x),$_.y));if($_.cost<$g($_.curlen,$_.y)){$p($_.curlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.curseq,$_.y),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$F($g($g($_.azteccode_latseq,$_.x),$_.y),function(){$k[$j++]=$g($_.curseq,$_.y);$k[$j++]=$_.srclen;var _8O=$k[$j-3];var _8P=$k[$j-1];var _8Q=$k[$j-2];$j-=3;$p(_8Q,_8P,_8O);$_.srclen=$_.srclen+1});$p($_.curseqlen,$_.y,$_.srclen);if($_.y==$_.azteccode_b){var _8Z=$_.x==$_.azteccode_p||$_.x==$_.azteccode_d?$_.azteccode_u:$_.x;$_.backto=_8Z}$_.imp=true}}}}if(!$_.imp){break}}$_.nxtlen=$a([$_.e,$_.e,$_.e,$_.e,$_.e,$_.e]);for(var _8i=0;_8i<=5;_8i+=1){$p($_.nxtseqlen,_8i,0)}for(var _8k=0,_8l=$_.azteccode_states.length;_8k<_8l;_8k++){$_.x=$g($_.azteccode_states,_8k);for(;;){if($_.char>=0){if($_.x!=$_.azteccode_b){if(!$has($g($_.charvals,$_.x),$_.char)){break}}}else{if($_.x!=$_.azteccode_p){break}}$k[$j++]="cost";$k[$j++]=$g($_.curlen,$_.x);$k[$j++]=$_.x;$k[$j++]=$_.char;$_.charsize();var _90=$k[--$j];var _91=$k[--$j];var _92=$k[--$j];$_[_92]=$f(_91+_90);if($_.cost<$g($_.nxtlen,$_.x)){$p($_.nxtlen,$_.x,$_.cost);$_.srclen=$g($_.curseqlen,$_.x);if($_.srclen>0){$P($g($_.nxtseq,$_.x),0,$G($g($_.curseq,$_.x),0,$_.srclen))}$p($g($_.nxtseq,$_.x),$_.srclen,$_.char);$p($_.nxtseqlen,$_.x,$_.srclen+1)}if($_.x==$_.azteccode_b){break}for(var _9V=0,_9W=$_.azteccode_states.length;_9V<_9W;_9V++){$_.y=$g($_.azteccode_states,_9V);if($_.y==$_.azteccode_b){break}if($ne($_.x,$_.y)){var _9h=$g($g($_.azteccode_shftlen,$_.y),$_.x);$k[$j++]="cost";$k[$j++]=$f($g($_.curlen,$_.y)+_9h);$k[$j++]=$_.x;$k[$j++]=$_.char;$_.charsize();var _9k=$k[--$j];var _9l=$k[--$j];var _9m=$k[--$j];$_[_9m]=$f(_9l+_9k);if($_.cost<$g($_.nxtlen,$_.y)){$p($_.nxtlen,$_.y,$_.cost);$_.srclen=$g($_.curseqlen,$_.y);if($_.srclen>0){$P($g($_.nxtseq,$_.y),0,$G($g($_.curseq,$_.y),0,$_.srclen))}var _AD=$g($_.nxtseq,$_.y);var _AC=$_.srclen;var _AB=$_.x==$_.azteccode_u?$_.azteccode_su:$_.azteccode_sp;$p(_AD,_AC,_AB);$p($g($_.nxtseq,$_.y),$_.srclen+1,$_.char);$p($_.nxtseqlen,$_.y,$_.srclen+2)}}}break}}if($_.lastchar.length!=0&&$_.char>=0){var _AO=$s(2);$p(_AO,0,$_.lastchar);$p(_AO,1,$_.char);$_.pchars=_AO;if($has($_.azteccode_pcomp,$_.pchars)){for(var _AT=0,_AU=$_.azteccode_states.length;_AT<_AU;_AT++){$_.i=$g($_.azteccode_states,_AT);if($_.i==$_.azteccode_b){break}$_.inP=true;if($_.i==$_.azteccode_m){if($_.lastchar==13){$_.inP=false}}else{if($_.i==$_.azteccode_d){if($_.lastchar==44||$_.lastchar==46){$_.inP=false}}}$_.curseqilen=$g($_.curseqlen,$_.i);if($_.inP&&$lt($g($_.curlen,$_.i),$g($_.nxtlen,$_.i))){$_.lastld=false;$_.lastsp=false;$_.lastidx=-1;for(var _An=$_.curseqilen-1;_An>=0;_An-=1){$_.idx=_An;$_.ch=$g($g($_.curseq,$_.i),$_.idx);if($_.lastidx==-1){if($eq($_.ch,$_.lastchar)){$_.lastidx=$_.idx;if($_.idx>0){if($g($g($_.curseq,$_.i),$_.idx-1)==$_.azteccode_sp){$_.lastsp=true}}}}else{if($_.ch==$_.azteccode_sb){$_.lastidx=-1;break}if($_.ch<0&&$_.ch>=$_.azteccode_ld){if($_.i==$_.azteccode_p){if($_.ch==$_.azteccode_ld){$_.lastld=true}}else{if($_.ch!=$_.azteccode_lp){$_.inP=$_.lastsp}}break}}}if($_.inP&&$_.lastidx>=0){$p($_.nxtlen,$_.i,$g($_.curlen,$_.i));if($_.lastidx<$_.curseqilen-1){if($_.i==$_.azteccode_p){if($_.lastld){$p($_.nxtlen,$_.i,$g($_.nxtlen,$_.i)+1)}$_.srclen=$_.curseqilen;$P($g($_.nxtseq,$_.i),0,$G($g($_.curseq,$_.i),0,$_.lastidx));$P($g($_.nxtseq,$_.i),$_.lastidx,$G($g($_.curseq,$_.i),$_.lastidx+1,$f($_.srclen-$_.lastidx)-1));$p($g($_.nxtseq,$_.i),$_.srclen-1,$g($_.azteccode_pcomp,$_.pchars));$p($_.nxtseqlen,$_.i,$_.srclen)}else{if($_.curseqilen>0){$P($g($_.nxtseq,$_.i),0,$G($g($_.curseq,$_.i),0,$_.curseqilen))}$p($g($_.nxtseq,$_.i),$_.lastidx,$g($_.azteccode_pcomp,$_.pchars));$p($_.nxtseqlen,$_.i,$_.curseqilen)}}else{$_.srclen=$_.curseqilen-1;if($_.srclen>0){$P($g($_.nxtseq,$_.i),0,$G($g($_.curseq,$_.i),0,$_.srclen))}$p($g($_.nxtseq,$_.i),$_.srclen,$g($_.azteccode_pcomp,$_.pchars));$p($_.nxtseqlen,$_.i,$_.srclen+1)}}}}}}if($g($_.nxtseqlen,$_.azteccode_b)>0){$_.numbytes=0;for(var _CZ=0,_CY=$g($_.nxtseqlen,$_.azteccode_b)-1;_CZ<=_CY;_CZ+=1){var _Ce=$g($g($_.nxtseq,$_.azteccode_b),_CZ)==$_.azteccode_sb?0:$_.numbytes+1;$_.numbytes=_Ce}if($_.numbytes==32){$p($_.nxtlen,$_.azteccode_b,$g($_.nxtlen,$_.azteccode_b)+11)}}$_.curlen=$_.nxtlen;var _Ck=$_.curseq;$_.curseq=$_.nxtseq;$_.nxtseq=_Ck;var _Cm=$_.curseqlen;$_.curseqlen=$_.nxtseqlen;$_.nxtseqlen=_Cm;var _Cq=$_.char>=0?$_.char:"";$_.lastchar=_Cq});$_.minseq=$_.azteccode_e;for(var _Cs=0,_Ct=$_.azteccode_states.length;_Cs<_Ct;_Cs++){$_.i=$g($_.azteccode_states,_Cs);if($g($_.curlen,$_.i)<$_.minseq){$_.minseq=$g($_.curlen,$_.i);$_.seq=$G($g($_.curseq,$_.i),0,$g($_.curseqlen,$_.i))}}$_.tobin=function(){var _D9=$k[--$j];var _DA=$s(_D9);$k[$j++]=_DA;for(var _DC=0,_DB=_DA.length-1;_DC<=_DB;_DC+=1){var _DD=$k[$j-1];$p(_DD,_DC,48)}var _DE=$k[$j-1];$k[$j++]=_DE;var _DF=$k[$j-3];var _DG=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _DI=$R($s(_DG.length),_DF,2);$P(_DG,_DG.length-_DI.length,_DI)};$_.encu=function(){var _DL=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.azteccode_u),_DL);$k[$j++]=5;$_.tobin()};$_.encl=function(){var _DP=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.azteccode_l),_DP);$k[$j++]=5;$_.tobin()};$_.encm=function(){var _DT=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.azteccode_m),_DT);$k[$j++]=5;$_.tobin()};$_.encd=function(){var _DX=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.azteccode_d),_DX);$k[$j++]=4;$_.tobin()};$_.encp=function(){var _DZ=$k[$j-1];if(_DZ==$_.fn1){$k[$j-1]="00000000"}else{var _Db=$k[$j-1];if(_Db<=-1e6){var _Dc=$k[--$j];var _Dd=-_Dc-1e6;$k[$j++]=_Dd;if(_Dd==0){_Dd=1}var _Df=~~($log(_Dd)/$log(10));var _Dg=$s((_Df+1)*4+8);$P(_Dg,0,"00000");$k[$j++]=_Df;$k[$j++]=_Dg;$k[$j++]=_Dg;$k[$j++]=_Df+1;$k[$j++]=3;$_.tobin();var _Dh=$k[--$j];var _Di=$k[--$j];$P(_Di,5,_Dh);$r(3,1);$k[$j++]=-1;$k[$j++]=0;if($j<3)throw"--stack-underflow--";$j-=3;for(var _Dm=$k[$j],_Dn=$k[$j+1],_Dl=$k[$j+2];_Dn<0?_Dm>=_Dl:_Dm<=_Dl;_Dm+=_Dn){var _Do=$k[--$j];var _Dp=$k[$j-1];$k[$j++]=~~(_Do/10);$k[$j++]=_Dp;$k[$j++]=_Dm*4+8;$k[$j++]=_Do%10+2;$k[$j++]=4;$_.tobin();var _Dq=$k[--$j];var _Dr=$k[--$j];var _Ds=$k[--$j];$P(_Ds,_Dr,_Dq)}$j--}else{var _Dv=$k[--$j];$k[$j++]=$g($g($_.charvals,$_.azteccode_p),_Dv);$k[$j++]=5;$_.tobin()}}};$_.addtomsgbits=function(){var _Dx=$k[--$j];$_.v=_Dx;if($_.j+$_.v.length>$_.msgbits.length){$k[$j++]="bwipp.aztecNoValidSymbol#30180";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$P($_.msgbits,$_.j,$_.v);$_.j=$_.j+$_.v.length};$_.state=$_.azteccode_u;$k[$j++]=$_.minseq;try{var _E7=$k[--$j];$k[$j++]=$s(_E7);var _E9=false}catch(e){$k[$j++]=true}if(_E9){$k[$j-1]="bwipp.azteccodeInputTooLarge#30191";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _EA=$k[--$j];$_.msgbits=_EA;$_.i=0;$_.j=0;for(;;){if($_.i>=$_.seq.length){break}if($_.state!=$_.azteccode_b){$_.char=$g($_.seq,$_.i);var _EK=$_[$g($_.azteccode_encfuncs,$_.state)];$k[$j++]=$_.char;if(_EK()===true){break}$_.addtomsgbits();$_.i=$_.i+1;if($_.char==$_.azteccode_su||$_.char==$_.azteccode_sp){$k[$j++]=$g($_.seq,$_.i);if($_.char==$_.azteccode_su){$_.encu()}else{$_.encp()}$_.addtomsgbits();$_.i=$_.i+1}if($_.char==$_.azteccode_lu){$_.state=$_.azteccode_u}if($_.char==$_.azteccode_ll){$_.state=$_.azteccode_l}if($_.char==$_.azteccode_lm){$_.state=$_.azteccode_m}if($_.char==$_.azteccode_lp){$_.state=$_.azteccode_p}if($_.char==$_.azteccode_ld){$_.state=$_.azteccode_d}if($_.char==$_.azteccode_sb){$_.state=$_.azteccode_b}}else{$_.numbytes=0;for(;;){if($_.i+$_.numbytes>=$_.seq.length){break}if($g($_.seq,$_.i+$_.numbytes)<0){break}if($_.numbytes==2078){break}$_.numbytes=$_.numbytes+1}if($_.numbytes<=31){$k[$j++]=$_.numbytes;$k[$j++]=5;$_.tobin();$_.addtomsgbits()}else{$k[$j++]=0;$k[$j++]=5;$_.tobin();$_.addtomsgbits();$k[$j++]=$_.numbytes-31;$k[$j++]=11;$_.tobin();$_.addtomsgbits()}for(var _Em=0,_En=$_.numbytes;_Em<_En;_Em++){$k[$j++]=$g($_.seq,$_.i);$k[$j++]=8;$_.tobin();$_.addtomsgbits();$_.i=$_.i+1}if($_.i<$_.seq.length){$_.char=$g($_.seq,$_.i);$_.i=$_.i+1;if($_.char==$_.azteccode_lu){$_.state=$_.azteccode_u}if($_.char==$_.azteccode_ll){$_.state=$_.azteccode_l}if($_.char==$_.azteccode_lm){$_.state=$_.azteccode_m}}}}$_.msgbits=$G($_.msgbits,0,$_.j)}if($has($_.options,"debugbits")){$k[$j++]="bwipp.debugbits#30260";$k[$j++]=$_.msgbits;bwipp_raiseerror()}for(var _F7=0,_F8=$_.azteccode_metrics.length;_F7<_F8;_F7++){$_.m=$g($_.azteccode_metrics,_F7);$_.frmt=$g($_.m,0);$_.mlyr=$g($_.m,1);$_.icap=$g($_.m,2);$_.ncws=$g($_.m,3);$_.bpcw=$g($_.m,4);$_.numecw=$ceil($f($_.ncws*$_.eclevel/100+$_.ecaddchars));if($_.msgbits.length==0){$_.numecw=0}$_.numdcw=$f($_.ncws-$_.numecw);$_.okay=true;if($ne($_.format,$_.frmt)){$_.okay=false}if($_.readerinit&&$_.icap!=1){$_.okay=false}if($_.layers!=-1&&$_.layers!=$_.mlyr){$_.okay=false}if($ceil($_.msgbits.length/$_.bpcw)>$_.numdcw){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.aztecNoValidSymbol#30284";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$_.layers=$_.mlyr;$_.allzero=function(){var _Fd=$k[--$j];$k[$j++]=$eq(_Fd,$G("000000000000",0,_Fd.length))};$_.allones=function(){var _Ff=$k[--$j];$k[$j++]=$eq(_Ff,$G("111111111111",0,_Ff.length))};$_.cws=$a($_.ncws);$_.m=0;$_.c=0;for(;;){if($_.msgbits.length<=$_.m){break}if($_.msgbits.length-$_.m>=$_.bpcw){$_.cwb=$G($_.msgbits,$_.m,$_.bpcw-1);$_.cwf=$G($_.msgbits,$f($_.m+$_.bpcw)-1,1);$k[$j++]=$_.cwb;$_.allzero();var _Fx=$k[--$j];if(_Fx){$_.cwf="1";$_.m=$_.m-1}$k[$j++]=$_.cwb;$_.allones();var _G0=$k[--$j];if(_G0){$_.cwf="0";$_.m=$_.m-1}var _G2=$s(12);$P(_G2,0,$_.cwb);$P(_G2,$_.bpcw-1,$_.cwf);$_.cwb=$G(_G2,0,$_.bpcw)}else{$_.cwb=$G($_.msgbits,$_.m,$_.msgbits.length-$_.m);var _GE=$Z($s(12),"111111111111");$P(_GE,0,$_.cwb);$_.cwb=$G(_GE,0,$_.bpcw);$k[$j++]=$_.cwb;$_.allones();var _GJ=$k[--$j];if(_GJ){$P($_.cwb,$_.cwb.length-1,"0")}}$_.cw=0;for(var _GO=0,_GN=$_.bpcw-1;_GO<=_GN;_GO+=1){$_.i=_GO;$_.cw=$f($_.cw+$pow(2,$f($_.bpcw-$_.i)-1)*($g($_.cwb,$_.i)-48))}$p($_.cws,$_.c,$_.cw);$_.m=$f($_.m+$_.bpcw);$_.c=$_.c+1}$_.cws=$G($_.cws,0,$_.c);if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#30327";$k[$j++]=$_.cws;bwipp_raiseerror()}$_.rscodes=function(){var _Gh=$k[--$j];$_.rsbt=_Gh;var _Gi=$k[--$j];$_.rsnc=_Gi;var _Gj=$k[--$j];$_.rscws=_Gj;$q($g($_.azteccode_rsparams,$_.rsbt));var _Gm=$k[--$j];$_.rspm=_Gm;var _Gn=$k[--$j];$_.rsgf_1=_Gn-1;$q($g($_.rstables,$_.rsbt));var _Gr=$k[--$j];$_.rsalog=_Gr;var _Gs=$k[--$j];$_.rslog=_Gs;$_.rsprod=function(){var _Gt=$k[$j-1];if(_Gt!=0){var _Gv=$k[$j-2];if(_Gv!=0){var _Gx=$k[--$j];var _Gz=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_Gx)+$g($_.rslog,_Gz))%$_.rsgf_1)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$k[$j++]="coeffs";$k[$j++]=$_.rsnc;$k[$j++]=$_.rsbt;$_.azteccode_coeffscachefetch();var _H7=$k[--$j];var _H8=$k[--$j];$_[_H8]=_H7;$_.lfsr=$a($_.rsnc);var _HB=$_.rscws;var _HC=$_.coeffs;var _HD=$_.rsnc;var _HE=$_.lfsr;$k[$j++]=function(){var _HG=$k[--$j];$k[$j++]=$g($_.rscws,_HG)};$k[$j++]=_HB.length;$k[$j++]=_HC;$k[$j++]=_HD;$k[$j++]=_HE;$k[$j++]=$_.rsprod;bwipp_rsecbinary();$k[$j++]=$_.lfsr};if($eq($_.format,"full")){$_.mode=($_.layers-1)*2048+($_.cws.length-1);if($_.readerinit){$_.mode=$_.mode|1024}$_.mode=$a([$flr(($_.mode&61440)/4096),$flr(($_.mode&3840)/256),$flr(($_.mode&240)/16),$_.mode&15]);$k[$j++]=Infinity;$q($_.mode);$k[$j++]=$_.mode;$k[$j++]=6;$k[$j++]=4;$_.rscodes();var _HU=$k[--$j];$q(_HU);$_.mode=$a()}if($eq($_.format,"compact")){$_.mode=($_.layers-1)*64+($_.cws.length-1);if($_.readerinit){$_.mode=$_.mode|32}$_.mode=$a([$flr(($_.mode&240)/16),$_.mode&15]);$k[$j++]=Infinity;$q($_.mode);$k[$j++]=$_.mode;$k[$j++]=5;$k[$j++]=4;$_.rscodes();var _He=$k[--$j];$q(_He);$_.mode=$a()}if($eq($_.format,"rune")){$_.mode=$i($_.barcode);$_.mode=$a([$flr(($_.mode&240)/16),$_.mode&15]);$k[$j++]=Infinity;$q($_.mode);$k[$j++]=$_.mode;$k[$j++]=5;$k[$j++]=4;$_.rscodes();var _Hl=$k[--$j];$q(_Hl);$_.mode=$a();$k[$j++]=Infinity;var _Hm=$_.mode;for(var _Hn=0,_Ho=_Hm.length;_Hn<_Ho;_Hn++){$k[$j++]=$g(_Hm,_Hn)^10}$_.mode=$a()}$_.modebits=$s($_.mode.length*4);for(var _Hu=0,_Ht=$_.modebits.length-1;_Hu<=_Ht;_Hu+=1){$P($_.modebits,_Hu,"0")}for(var _Hy=0,_Hx=$_.mode.length-1;_Hy<=_Hx;_Hy+=1){$_.i=_Hy;var _I4=$R($s(4),$g($_.mode,$_.i),2);$P($_.modebits,4-_I4.length+4*$_.i,_I4)}$k[$j++]="ecws";$k[$j++]=$_.cws;$k[$j++]=$f($_.ncws-$_.cws.length);$k[$j++]=$_.bpcw;$_.rscodes();var _IA=$k[--$j];var _IB=$k[--$j];$_[_IB]=_IA;if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#30416";$k[$j++]=$_.ecws;bwipp_raiseerror()}$k[$j++]=Infinity;$q($_.cws);$q($_.ecws);$_.cws=$a();if($eq($_.format,"full")){$_.databits=$s($f($_.layers*$_.layers*16+$_.layers*112))}else{$_.databits=$s($f($_.layers*$_.layers*16+$_.layers*88))}for(var _IS=0,_IR=$_.databits.length-1;_IS<=_IR;_IS+=1){$P($_.databits,_IS,"0")}for(var _IW=0,_IV=$_.ncws-1;_IW<=_IV;_IW+=1){$_.i=_IW;var _Id=$R($s($_.bpcw),$g($_.cws,$_.i),2);$P($_.databits,$f($_.bpcw-_Id.length+$_.bpcw*$_.i+($_.databits.length-$_.ncws*$_.bpcw)),_Id)}$_.cmv=function(){var _Il=$k[--$j];var _Im=$k[--$j];$k[$j++]=$f(_Im-_Il*$_.size+$_.mid)};$_.lmv=function(){var _Io=$k[--$j];$_.lbit=_Io;var _Ip=$k[--$j];$_.llyr=_Ip;$_.lwid=$f($_.fw+$_.llyr*4);$_.ldir=~~(~~($_.lbit/2)/$_.lwid);if($_.ldir==0){$k[$j++]=$f(-~~(($_.lwid-1)/2)+1+~~($_.lbit/2)%$_.lwid);$k[$j++]=$f(~~(($_.fw-1)/2)+$_.llyr*2+$_.lbit%2);$_.cmv()}if($_.ldir==1){$k[$j++]=$f(~~($_.fw/2)+$_.llyr*2+$_.lbit%2);$k[$j++]=$f(~~(($_.lwid-1)/2)-1-~~($_.lbit/2)%$_.lwid);$_.cmv()}if($_.ldir==2){$k[$j++]=-$f(-~~($_.lwid/2)+1+~~($_.lbit/2)%$_.lwid);$k[$j++]=-$f(~~($_.fw/2)+$_.llyr*2+$_.lbit%2);$_.cmv()}if($_.ldir==3){$k[$j++]=-$f(~~(($_.fw-1)/2)+$_.llyr*2+$_.lbit%2);$k[$j++]=-$f(~~($_.lwid/2)-1-~~($_.lbit/2)%$_.lwid);$_.cmv()}};if($eq($_.format,"full")){$_.fw=12}else{$_.fw=9}$_.size=$f($_.fw+$_.layers*4)+2;$k[$j++]=Infinity;for(var _JR=0,_JS=$_.size*$_.size;_JR<_JS;_JR++){$k[$j++]=-1}$_.pixs=$a();$_.mid=$f(~~(($_.size-1)/2)*$_.size+~~(($_.size-1)/2));$_.i=0;for(var _JY=1,_JX=$_.layers;_JY<=_JX;_JY+=1){$_.layer=_JY;for(var _Jc=0,_Jb=($_.fw+$_.layer*4)*8-1;_Jc<=_Jb;_Jc+=1){$_.pos=_Jc;$k[$j++]=$_.pixs;$k[$j++]=$_.layer;$k[$j++]=$_.pos;$_.lmv();var _Jj=$g($_.databits,$_.databits.length-$_.i-1);var _Jk=$k[--$j];var _Jl=$k[--$j];$p(_Jl,_Jk,_Jj-48);$_.i=$_.i+1}}if($eq($_.format,"full")){$_.fw=13;$_.size=$f($_.fw+$_.layers*4+2+~~(($_.layers+10.5)/7.5-1)*2);$_.mid=~~($_.size*$_.size/2);$k[$j++]=Infinity;for(var _Jv=0,_Jw=$_.size*$_.size;_Jv<_Jw;_Jv++){$k[$j++]=-2}$_.npixs=$a();for(var _Jz=0,_Jy=~~($_.size/2);_Jz<=_Jy;_Jz+=16){$_.i=_Jz;for(var _K2=0,_K1=$_.size-1;_K2<=_K1;_K2+=1){$_.j=_K2;$k[$j++]=$_.npixs;$k[$j++]=-~~($_.size/2)+$_.j;$k[$j++]=$_.i;$_.cmv();var _KB=$k[--$j];var _KC=$k[--$j];$P(_KC,_KB,$a([(~~($_.size/2)+$_.j+$_.i+1)%2]));$k[$j++]=$_.npixs;$k[$j++]=-~~($_.size/2)+$_.j;$k[$j++]=-$_.i;$_.cmv();var _KL=$k[--$j];var _KM=$k[--$j];$P(_KM,_KL,$a([(~~($_.size/2)+$_.j+$_.i+1)%2]));$k[$j++]=$_.npixs;$k[$j++]=$_.i;$k[$j++]=-~~($_.size/2)+$_.j;$_.cmv();var _KV=$k[--$j];var _KW=$k[--$j];$P(_KW,_KV,$a([(~~($_.size/2)+$_.j+$_.i+1)%2]));$k[$j++]=$_.npixs;$k[$j++]=-$_.i;$k[$j++]=-~~($_.size/2)+$_.j;$_.cmv();var _Kf=$k[--$j];var _Kg=$k[--$j];$P(_Kg,_Kf,$a([(~~($_.size/2)+$_.j+$_.i+1)%2]))}}$_.j=0;for(var _Kj=0,_Ki=$_.npixs.length-1;_Kj<=_Ki;_Kj+=1){$_.i=_Kj;if($g($_.npixs,$_.i)==-2){$p($_.npixs,$_.i,$g($_.pixs,$_.j));$_.j=$_.j+1}}$_.pixs=$_.npixs}$_.fw=~~($_.fw/2);for(var _Ky=-$_.fw,_Kx=$_.fw;_Ky<=_Kx;_Ky+=1){$_.i=_Ky;for(var _L2=-$_.fw,_L1=$_.fw;_L2<=_L1;_L2+=1){$_.j=_L2;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.j;$_.cmv();var _LA=$abs($_.i)>$abs($_.j)?$abs($_.i):$abs($_.j);var _LB=$k[--$j];var _LC=$k[--$j];$p(_LC,_LB,(_LA+1)%2)}}var _Ln=$a([$a([-($_.fw+1),$_.fw,1]),$a([-($_.fw+1),$_.fw+1,1]),$a([-$_.fw,$_.fw+1,1]),$a([$_.fw+1,$_.fw+1,1]),$a([$_.fw+1,$_.fw,1]),$a([$_.fw+1,-$_.fw,1]),$a([$_.fw,$_.fw+1,0]),$a([$_.fw+1,-($_.fw+1),0]),$a([$_.fw,-($_.fw+1),0]),$a([-$_.fw,-($_.fw+1),0]),$a([-($_.fw+1),-($_.fw+1),0]),$a([-($_.fw+1),-$_.fw,0])]);for(var _Lo=0,_Lp=_Ln.length;_Lo<_Lp;_Lo++){$k[$j++]=$_.pixs;$q($g(_Ln,_Lo));$r(3,1);$_.cmv();var _Ls=$k[--$j];var _Lt=$k[--$j];var _Lu=$k[--$j];$p(_Lu,_Ls,_Lt)}var _Lw=$eq($_.format,"full")?$_.azteccode_modemapfull:$_.azteccode_modemapcompact;$_.modemap=_Lw;for(var _M0=0,_Lz=$_.modemap.length-1;_M0<=_Lz;_M0+=1){$k[$j++]=_M0;$k[$j++]=$_.pixs;$q($g($_.modemap,_M0));$_.cmv();var _M5=$k[--$j];var _M6=$k[--$j];var _M7=$k[--$j];$p(_M6,_M5,$g($_.modebits,_M7)-48)}$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.size],["pixy",$_.size],["height",$_.size*$_.modunit/72],["width",$_.size*$_.modunit/72],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_azteccodecompact(){var $__=$_;$_=Object.assign({},$_,bwipp_azteccodecompact.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","compact");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_azteccode();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_aztecrune(){var $__=$_;$_=Object.assign({},$_,bwipp_aztecrune.globals);$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$p($_.options,"format","rune");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_azteccode();var _7=$k[--$j];$_.args=_7;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_codeone(){if(!bwipp_codeone.globals){var $__=$_;$_=bwipp_codeone.globals={};$k[$j++]=Infinity;var _0=$a(["T-16","T-32","T-48","S-10","S-20","S-30","A","B","C","D","E","F","G","H"]);for(var _1=0,_2=_0.length;_1<_2;_1++){var _3=$g(_0,_1);$k[$j++]=_3;$k[$j++]=_3}var _4=$d();$_.codeone_versionopts=_4;$_.codeone_stypevals=$a(["1","1010","1100100","1111101000","10011100010000","11000011010100000","11110100001001000000","100110001001011010000000","101111101011110000100000000","111011100110101100101000000000","1001010100000010111110010000000000","1011101001000011101101110100000000000","1110100011010100101001010001000000000000","10010001100001001110011100101010000000000000","10110101111001100010000011110100100000000000000","11100011010111111010100100110001101000000000000000","100011100001101111001001101111110000010000000000000000","101100011010001010111100001011101100010100000000000000000"]);$_.codeone_stypemetrics=$a([$a(["S-10",8,11,10,4,4,1,99,99,99]),$a(["S-20",8,21,20,8,8,1,99,99,99]),$a(["S-30",8,31,30,12,12,1,99,99,99])]);$_.codeone_nonstypemetrics=$a([$a(["A",16,18,16,10,10,1,4,99,6]),$a(["B",22,22,20,19,16,1,4,99,8]),$a(["C",28,32,28,44,26,1,4,22,11]),$a(["D",40,42,36,91,44,1,4,16,16]),$a(["E",52,54,48,182,70,1,4,22,22]),$a(["F",70,76,68,370,140,2,4,22,31]),$a(["G",104,98,88,732,280,4,6,21,47]),$a(["H",148,134,120,1480,560,8,6,20,69]),$a(["T-16",16,17,16,10,10,1,99,99,99]),$a(["T-32",16,33,32,24,16,1,99,99,99]),$a(["T-48",16,49,48,38,22,1,99,99,99])]);$_.codeone_fnc1=-1;$_.codeone_fnc3=-2;$_.codeone_lc=-5;$_.codeone_lb=-6;$_.codeone_lx=-7;$_.codeone_lt=-8;$_.codeone_ld=-9;$_.codeone_unl=-10;$_.codeone_fnc2=-11;$_.codeone_fnc4=-12;$_.codeone_sft1=-13;$_.codeone_sft2=-14;$_.codeone_sft3=-15;$_.codeone_eci=-16;$_.codeone_pad=-17;$_.codeone_fnc1ld=-18;$_.codeone_unlcw=255;$_.codeone_a=0;$_.codeone_c=1;$_.codeone_t=2;$_.codeone_x=3;$_.codeone_d=4;$_.codeone_b=5;$_.codeone_encfuncs=$a(["encA","encCTX","encCTX","encCTX","encD","encB"]);var _N=new Map([["A","121343"],["B","12134343"],["C","12121343"],["D","1213434343"],["E","1212134343"],["F","1212121343"],["G","121213434343"],["H","121212134343"],["S","56661278"],["T","5666666666127878"]]);$_.codeone_cpatmap=_N;var _11=new Map([["A",$a([$a([12,5])])],["B",$a([$a([16,7])])],["C",$a([$a([26,12])])],["D",$a([])],["E",$a([$a([26,23])])],["F",$a([$a([26,32]),$a([70,32]),$a([26,34]),$a([70,34])])],["G",$a([$a([27,48]),$a([69,48])])],["H",$a([$a([26,70]),$a([66,70]),$a([106,70]),$a([26,72]),$a([66,72]),$a([106,72])])],["S-10",$a([])],["S-20",$a([$a([10,4])])],["S-30",$a([$a([15,4]),$a([15,6])])],["T-16",$a([$a([8,10])])],["T-32",$a([$a([16,10]),$a([16,12])])],["T-48",$a([$a([24,10]),$a([24,12]),$a([24,14])])]]);$_.codeone_blackdotmap=_11;$_.codeone_rsparams=$a([$a([]),$a([]),$a([]),$a([]),$a([]),$a([32,37]),$a([]),$a([]),$a([256,301])]);$k[$j++]=Infinity;for(var _1C=0;_1C<=128;_1C+=1){$k[$j++]=_1C;$k[$j++]=_1C+1}$k[$j++]=$_.codeone_pad;$k[$j++]=129;for(var _1D=0;_1D<=99;_1D+=1){var _1F=$R($s(2),_1D,10);var _1H=$Z($s(2),"00");$P(_1H,2-_1F.length,_1F);$k[$j++]=_1H;$k[$j++]=_1D+130}var _1I=$a([$_.codeone_lc,$_.codeone_lb,$_.codeone_fnc1,$_.codeone_fnc2,$_.codeone_fnc3,$_.codeone_fnc4,$_.codeone_fnc1ld]);$k[$j++]=229;for(var _1J=0,_1K=_1I.length;_1J<_1K;_1J++){var _1M=$k[--$j];var _1N=_1M+1;$k[$j++]=$g(_1I,_1J);$k[$j++]=_1N;$k[$j++]=_1N}$k[$j-1]=$_.codeone_lx;$k[$j++]=238;$k[$j++]=$_.codeone_lt;$k[$j++]=239;$_.avals=$d();$k[$j++]=Infinity;var _1O=$_.avals;for(var _1T=_1O.size,_1S=_1O.keys(),_1R=0;_1R<_1T;_1R++){var _1P=_1S.next().value;var _1Q=_1O.get(_1P);$k[$j++]=_1P;$k[$j++]=Infinity;$k[$j++]=_1Q;var _1W=$a();$k[$j++]=_1W}$_.avals=$d();$k[$j++]=Infinity;$k[$j++]=$_.codeone_sft1;$k[$j++]=0;$k[$j++]=$_.codeone_sft2;$k[$j++]=1;$k[$j++]=$_.codeone_sft3;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _1X=48;_1X<=57;_1X+=1){$k[$j++]=_1X;$k[$j++]=_1X-44}for(var _1Y=65;_1Y<=90;_1Y+=1){$k[$j++]=_1Y;$k[$j++]=_1Y-51}var _1Z=$d();$_.cnvals=_1Z;$k[$j++]=Infinity;for(var _1a=0;_1a<=31;_1a+=1){$k[$j++]=_1a;$k[$j++]=_1a}var _1b=$d();$_.c1vals=_1b;$k[$j++]=Infinity;for(var _1c=33;_1c<=47;_1c+=1){$k[$j++]=_1c;$k[$j++]=_1c-33}for(var _1d=58;_1d<=64;_1d+=1){$k[$j++]=_1d;$k[$j++]=_1d-43}for(var _1e=91;_1e<=95;_1e+=1){$k[$j++]=_1e;$k[$j++]=_1e-69}$k[$j++]=$_.codeone_fnc1;$k[$j++]=27;$k[$j++]=$_.codeone_fnc2;$k[$j++]=28;$k[$j++]=$_.codeone_fnc3;$k[$j++]=29;$k[$j++]=$_.codeone_fnc4;$k[$j++]=30;$k[$j++]=$_.codeone_pad;$k[$j++]=31;var _1f=$d();$_.c2vals=_1f;$k[$j++]=Infinity;for(var _1g=96;_1g<=127;_1g+=1){$k[$j++]=_1g;$k[$j++]=_1g-96}var _1h=$d();$_.c3vals=_1h;$k[$j++]=Infinity;var _1i=$_.cnvals;for(var _1n=_1i.size,_1m=_1i.keys(),_1l=0;_1l<_1n;_1l++){var _1j=_1m.next().value;var _1k=_1i.get(_1j);$k[$j++]=_1j;$k[$j++]=Infinity;$k[$j++]=_1k;var _1q=$a();$k[$j++]=_1q}var _1r=$_.c1vals;for(var _1w=_1r.size,_1v=_1r.keys(),_1u=0;_1u<_1w;_1u++){var _1s=_1v.next().value;var _1t=_1r.get(_1s);$k[$j++]=_1s;$k[$j++]=Infinity;$k[$j++]=$g($_.cnvals,$_.codeone_sft1);$k[$j++]=_1t;var _21=$a();$k[$j++]=_21}var _22=$_.c2vals;for(var _27=_22.size,_26=_22.keys(),_25=0;_25<_27;_25++){var _23=_26.next().value;var _24=_22.get(_23);$k[$j++]=_23;$k[$j++]=Infinity;$k[$j++]=$g($_.cnvals,$_.codeone_sft2);$k[$j++]=_24;var _2C=$a();$k[$j++]=_2C}var _2D=$_.c3vals;for(var _2I=_2D.size,_2H=_2D.keys(),_2G=0;_2G<_2I;_2G++){var _2E=_2H.next().value;var _2F=_2D.get(_2E);$k[$j++]=_2E;$k[$j++]=Infinity;$k[$j++]=$g($_.cnvals,$_.codeone_sft3);$k[$j++]=_2F;var _2N=$a();$k[$j++]=_2N}$_.cvals=$d();$k[$j++]=Infinity;$k[$j++]=$_.codeone_sft1;$k[$j++]=0;$k[$j++]=$_.codeone_sft2;$k[$j++]=1;$k[$j++]=$_.codeone_sft3;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _2O=48;_2O<=57;_2O+=1){$k[$j++]=_2O;$k[$j++]=_2O-44}for(var _2P=97;_2P<=122;_2P+=1){$k[$j++]=_2P;$k[$j++]=_2P-83}var _2Q=$d();$_.tnvals=_2Q;$k[$j++]=Infinity;for(var _2R=0;_2R<=31;_2R+=1){$k[$j++]=_2R;$k[$j++]=_2R}var _2S=$d();$_.t1vals=_2S;$k[$j++]=Infinity;for(var _2T=33;_2T<=47;_2T+=1){$k[$j++]=_2T;$k[$j++]=_2T-33}for(var _2U=58;_2U<=64;_2U+=1){$k[$j++]=_2U;$k[$j++]=_2U-43}for(var _2V=91;_2V<=95;_2V+=1){$k[$j++]=_2V;$k[$j++]=_2V-69}$k[$j++]=$_.codeone_fnc1;$k[$j++]=27;$k[$j++]=$_.codeone_fnc2;$k[$j++]=28;$k[$j++]=$_.codeone_fnc3;$k[$j++]=29;$k[$j++]=$_.codeone_fnc4;$k[$j++]=30;$k[$j++]=$_.codeone_pad;$k[$j++]=31;var _2W=$d();$_.t2vals=_2W;$k[$j++]=Infinity;$k[$j++]=96;$k[$j++]=0;for(var _2X=65;_2X<=90;_2X+=1){$k[$j++]=_2X;$k[$j++]=_2X-64}for(var _2Y=123;_2Y<=127;_2Y+=1){$k[$j++]=_2Y;$k[$j++]=_2Y-96}var _2Z=$d();$_.t3vals=_2Z;$k[$j++]=Infinity;var _2a=$_.tnvals;for(var _2f=_2a.size,_2e=_2a.keys(),_2d=0;_2d<_2f;_2d++){var _2b=_2e.next().value;var _2c=_2a.get(_2b);$k[$j++]=_2b;$k[$j++]=Infinity;$k[$j++]=_2c;var _2i=$a();$k[$j++]=_2i}var _2j=$_.t1vals;for(var _2o=_2j.size,_2n=_2j.keys(),_2m=0;_2m<_2o;_2m++){var _2k=_2n.next().value;var _2l=_2j.get(_2k);$k[$j++]=_2k;$k[$j++]=Infinity;$k[$j++]=$g($_.tnvals,$_.codeone_sft1);$k[$j++]=_2l;var _2t=$a();$k[$j++]=_2t}var _2u=$_.t2vals;for(var _2z=_2u.size,_2y=_2u.keys(),_2x=0;_2x<_2z;_2x++){var _2v=_2y.next().value;var _2w=_2u.get(_2v);$k[$j++]=_2v;$k[$j++]=Infinity;$k[$j++]=$g($_.tnvals,$_.codeone_sft2);$k[$j++]=_2w;var _34=$a();$k[$j++]=_34}var _35=$_.t3vals;for(var _3A=_35.size,_39=_35.keys(),_38=0;_38<_3A;_38++){var _36=_39.next().value;var _37=_35.get(_36);$k[$j++]=_36;$k[$j++]=Infinity;$k[$j++]=$g($_.tnvals,$_.codeone_sft3);$k[$j++]=_37;var _3F=$a();$k[$j++]=_3F}$_.tvals=$d();for(var _3G=128;_3G<=255;_3G+=1){$_.i=_3G;var _3Q=$_.avals;var _3P=$_.i;$k[$j++]=Infinity;$q($g($_.avals,$_.codeone_fnc4));$q($g($_.avals,$_.i-128));var _3O=$a();$p(_3Q,_3P,_3O);var _3a=$_.cvals;var _3Z=$_.i;$k[$j++]=Infinity;$q($g($_.cvals,$_.codeone_fnc4));$q($g($_.cvals,$_.i-128));var _3Y=$a();$p(_3a,_3Z,_3Y);var _3k=$_.tvals;var _3j=$_.i;$k[$j++]=Infinity;$q($g($_.tvals,$_.codeone_fnc4));$q($g($_.tvals,$_.i-128));var _3i=$a();$p(_3k,_3j,_3i)}$_.avals=$_.avals;$_.cvals=$_.cvals;$_.tvals=$_.tvals;$k[$j++]=Infinity;$k[$j++]=13;$k[$j++]=0;$k[$j++]=42;$k[$j++]=1;$k[$j++]=62;$k[$j++]=2;$k[$j++]=32;$k[$j++]=3;for(var _3o=48;_3o<=57;_3o+=1){$k[$j++]=_3o;$k[$j++]=_3o-44}for(var _3p=65;_3p<=90;_3p+=1){$k[$j++]=_3p;$k[$j++]=_3p-51}var _3q=$d();$_.xvals=_3q;$k[$j++]=Infinity;var _3r=$_.xvals;for(var _3w=_3r.size,_3v=_3r.keys(),_3u=0;_3u<_3w;_3u++){var _3s=_3v.next().value;var _3t=_3r.get(_3s);$k[$j++]=_3s;$k[$j++]=Infinity;$k[$j++]=_3t;var _3z=$a();$k[$j++]=_3z}var _40=$d();$_.xvals=_40;$k[$j++]=Infinity;for(var _41=0;_41<=255;_41+=1){$k[$j++]=_41;$k[$j++]=_41}var _42=$d();$_.bvals=_42;$k[$j++]=Infinity;var _43=$_.bvals;for(var _48=_43.size,_47=_43.keys(),_46=0;_46<_48;_46++){var _44=_47.next().value;var _45=_43.get(_44);$k[$j++]=_44;$k[$j++]=Infinity;$k[$j++]=_45;var _4B=$a();$k[$j++]=_4B}var _4C=$d();$_.bvals=_4C;$_.encvals=$a([$_.avals,$_.cvals,$_.tvals,$_.xvals,-1,$_.bvals]);$k[$j++]=Infinity;for(var _4J=0,_4K=$_.codeone_rsparams.length;_4J<_4K;_4J++){var _4L=$g($_.codeone_rsparams,_4J);$k[$j++]=_4L;if(_4L.length!=0){var _4M=$k[--$j];$q(_4M);var _4N=$k[--$j];$_.rspm=_4N;var _4O=$k[--$j];$_.rsgf=_4O;$k[$j++]=Infinity;$k[$j++]=1;for(var _4Q=0,_4R=$_.rsgf-1;_4Q<_4R;_4Q++){var _4S=$k[$j-1];var _4T=_4S*2;$k[$j++]=_4T;if(_4T>=$_.rsgf){var _4W=$k[--$j];$k[$j++]=$xo(_4W,$_.rspm)}}$_.rsalog=$a();$_.rslog=$a($_.rsgf);for(var _4b=1,_4a=$_.rsgf-1;_4b<=_4a;_4b+=1){$p($_.rslog,$g($_.rsalog,_4b),_4b)}$k[$j++]=$a([$_.rslog,$_.rsalog])}else{$k[$j-1]=$a([])}}var _4j=$a();$_.rstables=_4j;$_.codeone_rsprod=function(){var _4k=$k[$j-1];if(_4k!=0){var _4m=$k[$j-2];if(_4m!=0){var _4o=$k[--$j];var _4q=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_4o)+$g($_.rslog,_4q))%$_.gf_1)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.codeone_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _4x=0,_4y=$_.ecpb;_4x<_4y;_4x++){$k[$j++]=0}$_.coeffs=$a();for(var _51=0,_50=$_.ecpb-1;_51<=_50;_51+=1){var _54=$_.coeffs;$p(_54,_51+1,$g(_54,_51+1-1));$k[$j++]=$g($_.rsalog,_51);for(var _56=_51;_56>=1;_56-=1){var _57=$_.coeffs;var _59=$k[$j-1];$k[$j++]=_57;$k[$j++]=_56;$k[$j++]=$g(_57,_56);$k[$j++]=_59;$_.codeone_rsprod();var _5B=$k[--$j];var _5C=$k[--$j];var _5E=$k[--$j];$p(_5E,_5C,$xo(_5B,$g($_.coeffs,_5C-1)))}var _5F=$_.coeffs;var _5H=$k[$j-1];$k[$j++]=_5F;$k[$j++]=0;$k[$j++]=$g(_5F,0);$k[$j++]=_5H;$_.codeone_rsprod();var _5I=$k[--$j];var _5J=$k[--$j];var _5K=$k[--$j];$p(_5K,_5J,_5I);$j--}$k[$j++]=$G($_.coeffs,0,$_.coeffs.length-1)};$_.codeone_coeffscachemax=9;$_.codeone_coeffscachelimit=212;$k[$j++]=$_.codeone_coeffscachemax;$k[$j++]=$_.codeone_coeffscachelimit;bwipp_fifocache();var _5Q=$k[--$j];$_.codeone_coeffscache=_5Q;$_.codeone_coeffscachefetch=function(){var _5R=$k[--$j];$_.rsbt=_5R;var _5S=$k[--$j];$_.ecpb=_5S;$_.rslog=$g($g($_.rstables,$_.rsbt),0);$_.rsalog=$g($g($_.rstables,$_.rsbt),1);$_.gf=$_.rsalog.length;$_.gf_1=$_.gf-1;var _5f=$g($_.codeone_coeffscache,"fetch");$k[$j++]=$f($_.rsbt*1e4+$_.ecpb);$k[$j++]=function(){$_.codeone_gencoeffs()};$k[$j++]=function(){var _5g=$k[--$j];$k[$j++]=_5g.length};if(_5f()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_codeone.globals);$_.dontdraw=false;$_.version="unset";$_.parse=false;$_.parsefnc=false;bwipp_processoptions();var _5h=$k[--$j];$_.options=_5h;var _5i=$k[--$j];$_.barcode=_5i;if($_.barcode.length>4e3){$k[$j++]="bwipp.codeoneinputTooLong#31085";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($ne($_.version,"unset")){if(!$has($_.codeone_versionopts,$_.version)){$k[$j++]="bwipp.codeoneBadVersion#31112";$k[$j++]="version must be A to H, T-16, T-32, T-48, S-10, S-20 or S-30";bwipp_raiseerror()}}$_.stype=$eq($G($_.version,0,1),"S");$_.ttype=$eq($G($_.version,0,1),"T");if($_.stype){$F($_.barcode,function(){var _5v=$k[--$j];if(_5v<48||_5v>57){$k[$j++]="bwipp.codeoneStypeNonDigit#31127";$k[$j++]="S-Type symbols can only contain digits";bwipp_raiseerror()}});$_.barlen=$_.barcode.length;if($_.barlen>18){$k[$j++]="bwipp.codeoneStypeTooLong#31133";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$_.normalize=function(){var _5y=$k[--$j];$_.base=_5y;var _5z=$k[--$j];$_.num=_5z;for(var _61=$_.num.length-1;_61>=1;_61-=1){$_.i=_61;var _62=$_.num;var _63=$_.i;$p(_62,_63-1,$f($g(_62,_63-1)+~~($g($_.num,$_.i)/$_.base)));$p($_.num,$_.i,$g($_.num,$_.i)%$_.base)}if($ge($g($_.num,0),$_.base)){$k[$j++]=Infinity;$k[$j++]=$g($_.num,0);for(;;){var _6K=$k[$j-1];if($lt(_6K,$_.base)){break}var _6M=$k[--$j];$k[$j++]=_6M%$_.base;$k[$j++]=~~(_6M/$_.base)}$_.extcnt=$m()-1;$as($a($m()));var _6S=$k[--$j];$_.extdigits=_6S;$k[$j-1]=Infinity;for(var _6U=$_.extcnt;_6U>=0;_6U-=1){$k[$j++]=$g($_.extdigits,_6U)}$q($G($_.num,1,$_.num.length-1));$_.num=$a()}$k[$j++]=0;for(;;){var _6a=$k[$j-1];if(_6a>=$_.num.length){break}var _6d=$k[$j-1];if($g($_.num,_6d)!=0){break}$k[$j-1]+=1}var _6g=$k[$j-1];if(_6g>=$_.num.length){$k[$j-1]=$a([0])}else{var _6k=$k[--$j];$k[$j++]=$G($_.num,_6k,$f($_.num.length-_6k))}};$_.bigadd=function(){var _6n=$k[--$j];var _6o=$k[--$j];$_.offset=$abs(_6n.length-_6o.length);if(_6n.length<_6o.length){var _=_6n;_6n=_6o;_6o=_}$_.a=_6n;$_.b=_6o;for(var _6r=0,_6q=$_.b.length-1;_6r<=_6q;_6r+=1){var _6s=$_.a;var _6t=$_.offset;$p(_6s,_6r+_6t,$f($g(_6s,_6r+_6t)+$g($_.b,_6r)))}$k[$j++]=$_.a};$_.barlen=$_.barcode.length;$_.v=$a([1]);for(var _71=0,_70=$_.barlen-1;_71<=_70;_71+=1){$_.i=_71;$k[$j++]=Infinity;$F($g($_.codeone_stypevals,$_.i),function(){var _74=$k[--$j];$k[$j++]=(_74-48)*($g($_.barcode,$_.barlen-$_.i-1)-48)});var _79=$a();$k[$j++]=_79;$k[$j++]=$_.v;$_.bigadd();var _7B=$k[--$j];$_.v=_7B}$k[$j++]="v";$k[$j++]=$_.v;$k[$j++]=2;$_.normalize();var _7D=$k[--$j];var _7E=$k[--$j];$_[_7E]=_7D;$k[$j++]=Infinity;for(var _7G=0,_7H=(5-$_.v.length%5)%5;_7G<_7H;_7G++){$k[$j++]=0}$q($_.v);$_.v=$a();$_.cws=$a(~~($_.v.length/5));for(var _7N=0,_7M=$_.cws.length-1;_7N<=_7M;_7N+=1){$_.i=_7N;var _7Q=$G($_.v,$_.i*5,5);var _7V=0;for(var _7R=0,_7S=_7Q.length;_7R<_7S;_7R++){_7V=$f(_7V+$g(_7Q,_7R))*2}$p($_.cws,$_.i,~~(_7V/2))}$_.metrics=$_.codeone_stypemetrics}else{$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true],["FNC1",$_.codeone_fnc1],["FNC3",$_.codeone_fnc3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _7c=$k[--$j];$_.msg=_7c;$_.msglen=$_.msg.length;$_.eciesc=92;$k[$j++]="numecis";$k[$j++]=0;$F($_.msg,function(){var _7f=$k[--$j];if(_7f<=-1e6){$k[$j-1]+=1}});var _7h=$k[--$j];var _7i=$k[--$j];$_[_7i]=_7h;if($_.numecis>0){$_.msgtmp=$a($f($_.msg.length*2+$_.numecis*6)+2);$p($_.msgtmp,0,$_.codeone_pad);$p($_.msgtmp,1,$_.eciesc);$_.j=2;for(var _7s=0,_7r=$_.msg.length-1;_7s<=_7r;_7s+=1){var _7u=$g($_.msg,_7s);$k[$j++]=_7u;if(_7u<=-1e6){var _7v=$k[--$j];var _7y=$G($R($s(7),-_7v,10),1,6);for(var _7z=0,_80=_7y.length;_7z<_80;_7z++){$k[$j++]=$g(_7y,_7z)}$as($a(6));var _84=$k[--$j];$P($_.msgtmp,$_.j+1,_84);$p($_.msgtmp,$_.j,$_.eciesc);$_.j=$_.j+7}else{var _8A=$k[$j-1];if(_8A!=$_.eciesc){var _8D=$k[--$j];$p($_.msgtmp,$_.j,_8D);$_.j=$_.j+1}else{$j--;$p($_.msgtmp,$_.j,$_.eciesc);$p($_.msgtmp,$_.j+1,$_.eciesc);$_.j=$_.j+2}}}$_.msg=$G($_.msgtmp,0,$_.j);$_.msglen=$_.msg.length}$_.metrics=$_.codeone_nonstypemetrics;$k[$j++]=Infinity;var _8R=$_.metrics;for(var _8S=0,_8T=_8R.length;_8S<_8T;_8S++){$_.m=$g(_8R,_8S);$_.vers=$g($_.m,0);$_.dcws=$g($_.m,4);$_.okay=true;if($eq($_.version,"unset")){if($_.vers.length!=1){$_.okay=false}}else{if($ne($_.version,$_.vers)){$_.okay=false}}if($_.okay){$k[$j++]=$_.dcws}}$as($a($m()));var _8h=$k[--$j];$_.fullcws=_8h;$k[$j-1]=Infinity;for(var _8i=0;_8i<1480;_8i++){$k[$j++]=1e4}$_.numremcws=$a();$F($_.fullcws,function(){var _8l=$k[--$j];$p($_.numremcws,_8l-1,1)});for(var _8m=1478;_8m>=0;_8m-=1){$_.i=_8m;if($g($_.numremcws,$_.i)!=1){$p($_.numremcws,$_.i,$g($_.numremcws,$_.i+1)+1)}}$_.getnumremcws=function(){var _8v=$k[$j-1];if(_8v>=$_.numremcws.length){$k[$j-1]="bwipp.codeoneTooLong#31309";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}var _8y=$k[--$j];$k[$j++]=$g($_.numremcws,_8y)};$k[$j++]=Infinity;for(var _91=0,_92=$_.msglen;_91<_92;_91++){$k[$j++]=0}$k[$j++]=0;$_.numD=$a();$k[$j++]=Infinity;for(var _94=0,_95=$_.msglen;_94<_95;_94++){$k[$j++]=0}$k[$j++]=9999;$_.nextXterm=$a();$k[$j++]=Infinity;for(var _97=0,_98=$_.msglen;_97<_98;_97++){$k[$j++]=0}$k[$j++]=9999;$_.nextNonX=$a();for(var _9A=$_.msglen-1;_9A>=0;_9A-=1){$_.i=_9A;$_.barchar=$g($_.msg,$_.i);if($_.barchar>=48&&$_.barchar<=57){$p($_.numD,$_.i,$g($_.numD,$_.i+1)+1)}if($_.barchar==13||$_.barchar==42||$_.barchar==62){$p($_.nextXterm,$_.i,0)}else{$p($_.nextXterm,$_.i,$g($_.nextXterm,$_.i+1)+1)}if(!$has($_.xvals,$_.barchar)){$p($_.nextNonX,$_.i,0)}else{$p($_.nextNonX,$_.i,$g($_.nextNonX,$_.i+1)+1)}}$k[$j++]=Infinity;var _9f=$_.nextXterm;for(var _9g=0,_9h=_9f.length;_9g<_9h;_9g++){var _9i=$g(_9f,_9g);$k[$j++]=_9i;if(_9i>1e4){$k[$j-1]=1e4}}$_.nextXterm=$a();$k[$j++]=Infinity;var _9j=$_.nextNonX;for(var _9k=0,_9l=_9j.length;_9k<_9l;_9k++){var _9m=$g(_9j,_9k);$k[$j++]=_9m;if(_9m>1e4){$k[$j-1]=1e4}}$_.nextNonX=$a();$_.isD=function(){$k[$j++]=$_.char>=48&&$_.char<=57};$_.isC=function(){$k[$j++]=$has($_.cnvals,$_.char)};$_.isT=function(){$k[$j++]=$has($_.tnvals,$_.char)};$_.isX=function(){$k[$j++]=$has($_.xvals,$_.char)};$_.isEA=function(){$k[$j++]=$_.char>127};$_.isFN=function(){$k[$j++]=$_.char<0};$_.XtermFirst=function(){var _A0=$k[--$j];$k[$j++]=$lt($g($_.nextXterm,_A0),$g($_.nextNonX,_A0))};$_.lookup=function(){$_.ac=1;$_.cc=2;$_.tc=2;$_.xc=2;$_.bc=3;if($_.mode==$_.codeone_a){$_.ac=0;$_.cc=1;$_.tc=1;$_.xc=1;$_.bc=2}if($_.mode==$_.codeone_c){$_.cc=0}if($_.mode==$_.codeone_t){$_.tc=0}if($_.mode==$_.codeone_x){$_.xc=0}if($_.mode==$_.codeone_b){$_.bc=0}for(var _AA=0;_AA<1;_AA++){$_.k=0;for(;;){if($_.i+$_.k==$_.msglen){var _AI=$a([$_.ac,$_.cc,$_.tc,$_.xc]);var _AO=true;for(var _AJ=0,_AK=_AI.length;_AJ<_AK;_AJ++){_AO=_AO&&$_.bc<=$ceil($g(_AI,_AJ))}if(_AO){$k[$j++]=$_.codeone_b;break}var _AT=$a([$_.cc,$_.tc,$_.xc,$_.bc]);var _AZ=true;for(var _AU=0,_AV=_AT.length;_AU<_AV;_AU++){_AZ=_AZ&&$_.ac<=$ceil($g(_AT,_AU))}if(_AZ){$k[$j++]=$_.codeone_a;break}var _Ac=$a([$_.tc,$_.xc]);var _Ai=true;for(var _Ad=0,_Ae=_Ac.length;_Ad<_Ae;_Ad++){_Ai=_Ai&&$ceil($_.cc)<=$ceil($g(_Ac,_Ad))}if(_Ai){$k[$j++]=$_.codeone_c;break}var _Ak=$a([$_.xc]);var _Aq=true;for(var _Al=0,_Am=_Ak.length;_Al<_Am;_Al++){_Aq=_Aq&&$ceil($_.tc)<=$ceil($g(_Ak,_Al))}if(_Aq){$k[$j++]=$_.codeone_t;break}$k[$j++]=$_.codeone_x;break}$_.char=$g($_.msg,$_.i+$_.k);$k[$j++]="ac";$k[$j++]=$_.ac;$_.isD();var _Aw=$k[--$j];if(_Aw){var _Ax=$k[--$j];$k[$j++]=$f(_Ax+1/2)}else{$_.isEA();var _Ay=$k[--$j];if(_Ay){var _Az=$k[--$j];$k[$j++]=$ceil(_Az)+2}else{var _B0=$k[--$j];$k[$j++]=$ceil(_B0)+1}}var _B1=$k[--$j];var _B2=$k[--$j];$_[_B2]=_B1;$k[$j++]="cc";$k[$j++]=$_.cc;$_.isC();var _B4=$k[--$j];if(_B4){var _B5=$k[--$j];$k[$j++]=$f(_B5+.6666667)}else{$_.isEA();var _B6=$k[--$j];if(_B6){var _B7=$k[--$j];$k[$j++]=$f(_B7+2.6666667)}else{var _B8=$k[--$j];$k[$j++]=$f(_B8+1.3333334)}}var _B9=$k[--$j];var _BA=$k[--$j];$_[_BA]=_B9;$k[$j++]="tc";$k[$j++]=$_.tc;$_.isT();var _BC=$k[--$j];if(_BC){var _BD=$k[--$j];$k[$j++]=$f(_BD+.6666667)}else{$_.isEA();var _BE=$k[--$j];if(_BE){var _BF=$k[--$j];$k[$j++]=$f(_BF+2.6666667)}else{var _BG=$k[--$j];$k[$j++]=$f(_BG+1.3333334)}}var _BH=$k[--$j];var _BI=$k[--$j];$_[_BI]=_BH;$k[$j++]="xc";$k[$j++]=$_.xc;$_.isX();var _BK=$k[--$j];if(_BK){var _BL=$k[--$j];$k[$j++]=$f(_BL+.6666667)}else{$_.isEA();var _BM=$k[--$j];if(_BM){var _BN=$k[--$j];$k[$j++]=$f(_BN+4.3333334)}else{var _BO=$k[--$j];$k[$j++]=$f(_BO+3.3333334)}}var _BP=$k[--$j];var _BQ=$k[--$j];$_[_BQ]=_BP;$k[$j++]="bc";$k[$j++]=$_.bc;$_.isFN();var _BS=$k[--$j];if(_BS){$k[$j-1]+=3}else{$k[$j-1]+=1}var _BV=$k[--$j];var _BW=$k[--$j];$_[_BW]=_BV;if($_.k>=3){var _Bc=$a([$_.ac,$_.cc,$_.tc,$_.xc]);var _Bi=true;for(var _Bd=0,_Be=_Bc.length;_Bd<_Be;_Bd++){_Bi=_Bi&&$_.bc+1<=$ceil($g(_Bc,_Bd))}if(_Bi){$k[$j++]=$_.codeone_b;break}var _Bn=$a([$_.cc,$_.tc,$_.xc,$_.bc]);var _Bt=true;for(var _Bo=0,_Bp=_Bn.length;_Bo<_Bp;_Bo++){_Bt=_Bt&&$_.ac+1<=$ceil($g(_Bn,_Bo))}if(_Bt){$k[$j++]=$_.codeone_a;break}var _By=$a([$_.ac,$_.cc,$_.xc,$_.bc]);var _C4=true;for(var _Bz=0,_C0=_By.length;_Bz<_C0;_Bz++){_C4=_C4&&$ceil($_.tc)+1<=$ceil($g(_By,_Bz))}if(_C4){$k[$j++]=$_.codeone_t;break}var _C7=$a([$_.ac,$_.tc]);var _CD=true;for(var _C8=0,_C9=_C7.length;_C8<_C9;_C8++){_CD=_CD&&$ceil($_.cc)+1<=$ceil($g(_C7,_C8))}if(_CD){if($ceil($_.cc)<$ceil($_.xc)){$k[$j++]=$_.codeone_c;break}if($_.cc==$_.xc){$k[$j++]=$_.i+$_.k+1;$_.XtermFirst();var _CK=$k[--$j];if(_CK){$k[$j++]=$_.codeone_x;break}else{$k[$j++]=$_.codeone_c;break}}}var _CP=$a([$_.ac,$_.cc,$_.tc,$_.bc]);var _CV=true;for(var _CQ=0,_CR=_CP.length;_CQ<_CR;_CQ++){_CV=_CV&&$ceil($_.xc)+1<=$ceil($g(_CP,_CQ))}if(_CV){$k[$j++]=$_.codeone_x;break}}$_.k=$_.k+1}}};$_.addtocws=function(){var _CX=$k[$j-1];if(_CX.length+$_.j>1480){$k[$j-1]="bwipp.codeoneTooLong#31384";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}var _CZ=$k[--$j];$P($_.cws,$_.j,_CZ);$_.j=_CZ.length+$_.j};$_.tobin=function(){var _Cd=$k[--$j];var _Ce=$s(_Cd);$k[$j++]=_Ce;for(var _Cg=0,_Cf=_Ce.length-1;_Cg<=_Cf;_Cg+=1){var _Ch=$k[$j-1];$p(_Ch,_Cg,48)}var _Ci=$k[$j-1];$k[$j++]=_Ci;var _Cj=$k[$j-3];var _Ck=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _Cm=$R($s(_Ck.length),_Cj,2);$P(_Ck,_Ck.length-_Cm.length,_Cm);var _Co=$k[--$j];$k[$j++]=Infinity;$F(_Co,function(){$k[$j-1]-=48});var _Cq=$a();$k[$j++]=_Cq};$_.Dbitsbuf=$a(~~($_.msglen*10/3)+20);$_.Dbitslen=0;$_.appendbits=function(){var _Ct=$k[--$j];$_.apnd_n=_Ct;$as($a($_.apnd_n));$k[$j++]=$_.Dbitsbuf;$k[$j++]=$_.Dbitslen;var _Cy=$k[$j-3];var _Cz=$k[$j-1];var _D0=$k[$j-2];$j-=3;$P(_D0,_Cz,_Cy);$_.Dbitslen=$f($_.Dbitslen+$_.apnd_n)};$_.encA=function(){for(var _D3=0;_D3<1;_D3++){if($g($_.numD,$_.i)>=21){$p($_.Dbitsbuf,0,1);$p($_.Dbitsbuf,1,1);$p($_.Dbitsbuf,2,1);$p($_.Dbitsbuf,3,1);$_.Dbitslen=4;$_.mode=$_.codeone_d;break}var _DD=$g($_.numD,$_.i);if(_DD>=13&&$f(_DD+$_.i)==$_.msglen){$p($_.Dbitsbuf,0,1);$p($_.Dbitsbuf,1,1);$p($_.Dbitsbuf,2,1);$p($_.Dbitsbuf,3,1);$_.Dbitslen=4;$_.mode=$_.codeone_d;break}if($g($_.numD,$_.i)>=2){var _DN=$s(2);$p(_DN,0,$g($_.msg,$_.i));$p(_DN,1,$g($_.msg,$_.i+1));$k[$j++]=$g($_.avals,_DN);$_.addtocws();$_.i=$_.i+2;break}if($g($_.msg,$_.i)==$_.codeone_fnc1){if($g($_.numD,$_.i+1)>=15){$k[$j++]=$g($_.avals,$_.codeone_fnc1ld);$_.addtocws();$_.i=$_.i+1;$_.Dbitslen=0;$_.mode=$_.codeone_d;break}var _Di=$g($_.numD,$_.i+1);if(_Di>=7&&$f(_Di+$_.i)+1==$_.msglen){$k[$j++]=$g($_.avals,$_.codeone_fnc1ld);$_.addtocws();$_.i=$_.i+1;$_.Dbitslen=0;$_.mode=$_.codeone_d;break}}$k[$j++]="newmode";$_.lookup();var _Do=$k[--$j];var _Dp=$k[--$j];$_[_Dp]=_Do;if($_.newmode!=$_.mode){$k[$j++]=$g($_.avals,$g($a([-1,$_.codeone_lc,$_.codeone_lt,$_.codeone_lx,$_.codeone_ld,$_.codeone_lb]),$_.newmode));$_.addtocws();$_.mode=$_.newmode;break}$k[$j++]=$g($_.avals,$g($_.msg,$_.i));$_.addtocws();$_.i=$_.i+1;break}};$_.CTXvalstocws=function(){var _E4=$k[--$j];$_.in=_E4;$k[$j++]=Infinity;for(var _E7=0,_E6=$_.in.length-1;_E7<=_E6;_E7+=3){var _E9=$G($_.in,_E7,3);var _EE=0;for(var _EA=0,_EB=_E9.length;_EA<_EB;_EA++){_EE=$f(_EE+$g(_E9,_EA))*40}var _EF=~~(_EE/40)+1;$k[$j++]=~~(_EF/256);$k[$j++]=_EF%256}$as($a($m()));var _EI=$k[--$j];$k[$j-1]=_EI};$_.encCTX=function(){$_.p=0;$_.ctxvals=$a(2220);for(;;){if($_.i==$_.msglen){break}if($_.p%3==0){if($g($_.numD,$_.i)>=12){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws();$_.mode=$_.codeone_a;break}var _EX=$g($_.numD,$_.i);if(_EX>=8&&$f(_EX+$_.i)==$_.msglen){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws();$_.mode=$_.codeone_a;break}if($_.mode==$_.codeone_x){if(!$has($_.xvals,$g($_.msg,$_.i))){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$_.j;$_.getnumremcws();var _Eo=$k[--$j];if(_Eo!=1||$g($_.msg,$_.i)>127){$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws()}$_.mode=$_.codeone_a;break}if($_.i+1<$_.msglen){if(!$has($_.xvals,$g($_.msg,$_.i+1))){break}if($_.i+2<$_.msglen){if(!$has($_.xvals,$g($_.msg,$_.i+2))){break}}}}else{$_.lookup();var _F8=$k[--$j];if(_F8!=$_.mode){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws();$_.mode=$_.codeone_a;break}}if($_.msglen-$_.i<=3){$k[$j++]=$_.j+~~($_.p/3)*2;$_.getnumremcws();var _FH=$k[--$j];$_.remcws=_FH;$k[$j++]=Infinity;var _FM=$G($_.msg,$_.i,$_.msglen-$_.i);for(var _FN=0,_FO=_FM.length;_FN<_FO;_FN++){var _FP=$g(_FM,_FN);var _FT=$has($g($_.encvals,$_.mode),_FP);$k[$j++]=_FP;if(_FT){var _FX=$k[--$j];$q($g($g($_.encvals,$_.mode),_FX))}else{$k[$j-1]=-1;$k[$j++]=-1;$k[$j++]=-1;$k[$j++]=-1}}$_.remvals=$a();if($_.remcws==2&&$_.remvals.length==3){$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));$q($_.remvals);var _Ff=$a();$k[$j++]=_Ff;$_.CTXvalstocws();$_.addtocws();$_.mode=$_.codeone_a;$_.i=$_.msglen;break}if($_.remcws==2&&$_.remvals.length==2&&$_.mode!=$_.codeone_x){$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));$q($_.remvals);$q($g($g($_.encvals,$_.mode),$_.codeone_sft1));var _Fs=$a();$k[$j++]=_Fs;$_.CTXvalstocws();$_.addtocws();$_.mode=$_.codeone_a;$_.i=$_.msglen;break}if($_.remcws==2&&$_.remvals.length==1){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws();$k[$j++]=$g($_.avals,$g($_.msg,$_.i));$_.addtocws();$_.mode=$_.codeone_a;$_.i=$_.msglen;break}if($_.remcws==1&&$_.remvals.length==1){$k[$j++]=$G($_.ctxvals,0,$_.p);$_.CTXvalstocws();$_.addtocws();$k[$j++]=$g($_.avals,$g($_.msg,$_.i));$_.addtocws();$_.mode=$_.codeone_a;$_.i=$_.msglen;break}}}var _GN=$g($g($_.encvals,$_.mode),$g($_.msg,$_.i));$k[$j++]=_GN;if(_GN.length+$_.p>$_.ctxvals.length){$k[$j-1]="bwipp.codeoneTooLong#31568";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}var _GQ=$k[--$j];$P($_.ctxvals,$_.p,_GQ);$_.p=_GQ.length+$_.p;$_.i=$_.i+1}if($_.mode!=$_.codeone_a){for(;;){if($_.p%3==0){break}$_.i=$_.i-1;$_.p=$_.p-$g($g($_.encvals,$_.mode),$g($_.msg,$_.i)).length}$k[$j++]=Infinity;$q($G($_.ctxvals,0,$_.p));var _Gj=$a();$k[$j++]=_Gj;$_.CTXvalstocws();$_.addtocws();$k[$j++]=$a([$_.codeone_unlcw]);$_.addtocws();$_.mode=$_.codeone_a;if($_.i!=$_.msglen){if($g($_.numD,$_.i)>=2){var _Gq=$s(2);$p(_Gq,0,$g($_.msg,$_.i));$p(_Gq,1,$g($_.msg,$_.i+1));$k[$j++]=$g($_.avals,_Gq);$_.addtocws();$_.i=$_.i+2}else{$k[$j++]=$g($_.avals,$g($_.msg,$_.i));$_.addtocws();$_.i=$_.i+1}}}};$_.encD=function(){for(;;){if($g($_.numD,$_.i)<3){$_.Drem=(8-$_.Dbitslen%8)%8;$k[$j++]=$_.j+~~($_.Dbitslen/8);$_.getnumremcws();var _HC=$k[--$j];$_.remcws=_HC;$k[$j++]=$_.j+~~($_.Dbitslen/8)-1;$_.getnumremcws();var _HF=$k[--$j];if((_HF-1==0&&$_.Drem==0||$_.remcws==1&&$_.Drem!=0)&&$_.i==$_.msglen){if($_.Drem==4||$_.Drem==6){$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=4;$_.appendbits()}if($_.Drem==2||$_.Drem==6){$k[$j++]=0;$k[$j++]=1;$k[$j++]=2;$_.appendbits()}break}if(($_.i==$_.msglen-1&&$g($_.numD,$_.i)==1||$_.i==$_.msglen-2&&$g($_.numD,$_.i)==2)&&$_.remcws==1&&$_.Drem==0){break}if(!($_.i==$_.msglen-1&&$g($_.numD,$_.i)==1&&$_.remcws==1&&($_.Drem==4||$_.Drem==6))){$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=6;$_.appendbits();$_.Drem=(8-$_.Dbitslen%8)%8}if($_.Drem==4||$_.Drem==6){if($g($_.numD,$_.i)>=1){$k[$j++]=$g($_.msg,$_.i)-48+1;$k[$j++]=4;$_.tobin();var _Hs=$k[--$j];$q(_Hs);$k[$j++]=4;$_.appendbits();$_.i=$_.i+1}else{$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=4;$_.appendbits()}$_.Drem=$_.Drem-4}if($_.Drem==2){$k[$j++]=0;$k[$j++]=1;$k[$j++]=2;$_.appendbits();$_.Drem=0}break}var _Hy=$G($_.msg,$_.i,3);var _I3=0;for(var _Hz=0,_I0=_Hy.length;_Hz<_I0;_Hz++){_I3=$f(_I3+($g(_Hy,_Hz)-48))*10}$k[$j++]=~~(_I3/10)+1;$k[$j++]=10;$_.tobin();var _I4=$k[--$j];$q(_I4);$k[$j++]=10;$_.appendbits();$_.i=$_.i+3}$_.Dbits=$G($_.Dbitsbuf,0,$_.Dbitslen);$k[$j++]=Infinity;if($_.Dbitslen>0){for(var _IC=0,_IB=$_.Dbitslen-1;_IC<=_IB;_IC+=8){var _IE=$G($_.Dbits,_IC,8);var _IJ=0;for(var _IF=0,_IG=_IE.length;_IF<_IG;_IF++){_IJ=$f(_IJ+$g(_IE,_IF))*2}$k[$j++]=~~(_IJ/2)}}$as($a($m()));var _IM=$k[--$j];$k[$j-1]=_IM;$_.addtocws();$_.mode=$_.codeone_a};$_.encB=function(){$_.p=0;$_.bvals=$a(1480);for(;;){if($_.i==$_.msglen){break}if($g($_.msg,$_.i)<0){break}$_.lookup();var _IV=$k[--$j];if(_IV!=$_.mode){break}if($_.p>=$_.bvals.length){$k[$j++]="bwipp.codeoneTooLong#31690";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}$p($_.bvals,$_.p,$g($_.msg,$_.i));$_.p=$_.p+1;$_.i=$_.i+1}$k[$j++]=$_.j+$_.p;$_.getnumremcws();var _Ih=$k[--$j];$_.remcws=_Ih-1;$k[$j++]=Infinity;if($_.remcws==0&&$_.i==$_.msglen){$k[$j++]=0}else{if($_.p<250){$k[$j++]=$_.p}else{$k[$j++]=~~($_.p/250)+249;$k[$j++]=$_.p%250}}$q($G($_.bvals,0,$_.p));$_.bvals=$a();$k[$j++]=$_.bvals;$_.addtocws();$_.mode=$_.codeone_a};$_.cws=$a(1480);$_.mode=$_.codeone_a;$_.i=0;$_.j=0;for(;;){if($_.i>=$_.msglen){break}var _Iy=$_[$g($_.codeone_encfuncs,$_.mode)];if(_Iy()===true){break}}$_.cws=$G($_.cws,0,$_.j)}var _J2=$_.metrics;for(var _J3=0,_J4=_J2.length;_J3<_J4;_J3++){$_.m=$g(_J2,_J3);$_.vers=$g($_.m,0);$_.rows=$g($_.m,1);$_.cols=$g($_.m,2);$_.dcol=$g($_.m,3);$_.dcws=$g($_.m,4);$_.rscw=$g($_.m,5);$_.rsbl=$g($_.m,6);$_.riso=$g($_.m,7);$_.risi=$g($_.m,8);$_.risl=$g($_.m,9);$_.dcpb=~~($_.dcws/$_.rsbl);$_.ecpb=~~($_.rscw/$_.rsbl);$_.okay=true;if($ne($_.version,"unset")&&$ne($_.version,$_.vers)){$_.okay=false}if($_.cws.length>$_.dcws){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.codeoneNoValidSymbol#31747";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}if(!$_.stype){$k[$j++]=Infinity;$q($_.cws);for(var _Jf=0,_Jg=$f($_.dcws-$_.cws.length);_Jf<_Jg;_Jf++){$k[$j++]=129}$_.cws=$a()}else{$k[$j++]=Infinity;for(var _Jj=0,_Jk=$f($_.dcws-$_.cws.length);_Jj<_Jk;_Jj++){$k[$j++]=0}$q($_.cws);$_.cws=$a()}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#31761";$k[$j++]=$_.cws;bwipp_raiseerror()}var _Jq=$_.stype?5:8;$_.rsbt=_Jq;$k[$j++]="coeffs";$k[$j++]=$_.ecpb;$k[$j++]=$_.rsbt;$_.codeone_coeffscachefetch();var _Jt=$k[--$j];var _Ju=$k[--$j];$_[_Ju]=_Jt;$_.ecbs=$a($_.rsbl);for(var _Jz=0,_Jy=$_.rsbl-1;_Jz<=_Jy;_Jz+=1){$_.blk=_Jz;$_.lfsr=$a($_.ecpb);var _K4=$_.dcpb;var _K5=$_.coeffs;var _K6=$_.ecpb;var _K7=$_.lfsr;$k[$j++]=$_.ecbs;$k[$j++]=$_.blk;$k[$j++]=function(){var _K9=$k[--$j];$k[$j++]=$g($_.cws,$f(_K9*$_.rsbl+$_.blk))};$k[$j++]=_K4;$k[$j++]=_K5;$k[$j++]=_K6;$k[$j++]=_K7;$k[$j++]=$_.codeone_rsprod;bwipp_rsecbinary();var _KE=$k[--$j];var _KF=$k[--$j];$p(_KF,_KE,$_.lfsr)}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#31789";$k[$j++]=Infinity;var _KI=$_.ecbs;for(var _KJ=0,_KK=_KI.length;_KJ<_KK;_KJ++){$q($g(_KI,_KJ))}var _KM=$a();$k[$j++]=_KM;bwipp_raiseerror()}var _KP=$a($f($_.cws.length+$_.rscw));$P(_KP,0,$_.cws);$_.cws=_KP;for(var _KT=0,_KS=$_.rscw-1;_KT<=_KS;_KT+=1){$_.i=_KT;$p($_.cws,$f($_.dcws+$_.i),$g($g($_.ecbs,$_.i%$_.rsbl),~~($_.i/$_.rsbl)))}var _Kh=$_.stype?5:8;$_.mmat=$a($f($_.dcws+$_.rscw)*_Kh);$_.r=0;$_.c=0;var _Kk=$_.stype?2:1;for(var _Kn=0,_Ko=_Kk,_Km=$_.cws.length-1;_Ko<0?_Kn>=_Km:_Kn<=_Km;_Kn+=_Ko){$_.i=_Kn;if(!$_.stype){var _Kr=$Z($s(8),"00000000");var _Kw=$R($s(8),$g($_.cws,$_.i),2);$P(_Kr,8-_Kw.length,_Kw);$k[$j++]=Infinity;$F(_Kr,function(){$k[$j-1]-=48});var _L0=$a();$_.top=$G(_L0,0,4);$_.bot=$G(_L0,4,4)}else{var _L4=$Z($s(5),"00000");var _L9=$R($s(5),$g($_.cws,$_.i),2);$P(_L4,5-_L9.length,_L9);$k[$j++]=Infinity;$F(_L4,function(){$k[$j-1]-=48});var _LD=$a();$_.c1=_LD;var _LF=$Z($s(5),"00000");var _LK=$R($s(5),$g($_.cws,$_.i+1),2);$P(_LF,5-_LK.length,_LK);$k[$j++]=Infinity;$F(_LF,function(){$k[$j-1]-=48});var _LO=$a();$_.c2=_LO;$k[$j++]=Infinity;$q($G($_.c1,0,3));$q($G($_.c2,0,2));$_.top=$a();$k[$j++]=Infinity;$q($G($_.c1,3,2));$q($G($_.c2,2,3));$_.bot=$a()}$P($_.mmat,$f($_.r*$_.dcol+$_.c),$_.top);$P($_.mmat,$f(($_.r+1)*$_.dcol+$_.c),$_.bot);$_.c=$_.c+$_.top.length;if($_.c==$_.dcol){$_.c=0;$_.r=$_.r+2}}$_.mmv=function(){var _Ln=$k[--$j];var _Lo=$k[--$j];$k[$j++]=$f(_Lo+_Ln*$_.cols)};$k[$j++]=Infinity;for(var _Lr=0,_Ls=$_.rows*$_.cols;_Lr<_Ls;_Lr++){$k[$j++]=-1}$_.pixs=$a();$_.artifact=$a([function(){for(var _Lu=0,_Lv=$_.cols;_Lu<_Lv;_Lu++){$k[$j++]=0}},function(){for(var _Lx=0,_Ly=$_.cols;_Lx<_Ly;_Lx++){$k[$j++]=1}},function(){$k[$j++]=0;for(var _M0=0,_M1=$_.cols-2;_M0<_M1;_M0++){$k[$j++]=1}$k[$j++]=0},function(){$k[$j++]=0;$k[$j++]=1;for(var _M3=0,_M4=$_.cols-4;_M3<_M4;_M3++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0},function(){for(var _M6=0,_M7=~~(($_.cols-1)/2);_M6<_M7;_M6++){$k[$j++]=-1}$k[$j++]=1;for(var _M9=0,_MA=~~(($_.cols-1)/2);_M9<_MA;_M9++){$k[$j++]=-1}},function(){for(var _MC=0,_MD=~~(($_.cols-1)/2);_MC<_MD;_MC++){$k[$j++]=-1}$k[$j++]=0;for(var _MF=0,_MG=~~(($_.cols-1)/2);_MF<_MG;_MF++){$k[$j++]=-1}},function(){$k[$j++]=1;for(var _MI=0,_MJ=$_.cols-2;_MI<_MJ;_MI++){$k[$j++]=0}$k[$j++]=1},function(){$k[$j++]=1;$k[$j++]=0;for(var _ML=0,_MM=$_.cols-4;_ML<_MM;_ML++){$k[$j++]=1}$k[$j++]=0;$k[$j++]=1}]);$_.cpat=$g($_.codeone_cpatmap,$G($_.vers,0,1));$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=~~($f($_.rows-$_.cpat.length)/2);$_.mmv();$k[$j++]=Infinity;$F($_.cpat,function(){var _MV=$k[--$j];if($g($_.artifact,_MV-49)()===true){return true}});var _MX=$a();var _MY=$k[--$j];var _MZ=$k[--$j];$P(_MZ,_MY,_MX);for(var _Mc=0,_Mb=$_.risl-1;_Mc<=_Mb;_Mc+=1){$_.i=_Mc;for(var _Mh=$_.riso,_Mi=$_.risi,_Mg=$_.cols-1;_Mi<0?_Mh>=_Mg:_Mh<=_Mg;_Mh+=_Mi){$_.j=_Mh;var _Mk=$_.i%12==0?1:0;var _Ml=$a([1,_Mk]);$k[$j++]=_Ml;$k[$j++]=_Ml;$k[$j++]=$_.pixs;$k[$j++]=$_.j;$k[$j++]=$_.i;$_.mmv();var _Mp=$k[$j-3];var _Mq=$k[$j-1];var _Mr=$k[$j-2];$j-=3;$P(_Mr,_Mq,_Mp);if($_.i!=$_.risl-1){$k[$j++]=$_.pixs;$k[$j++]=$f($_.cols-$_.j)-2;$k[$j++]=$f($_.rows-$_.i)-1;$_.mmv();var _Mz=$k[$j-3];var _N0=$k[$j-1];var _N1=$k[$j-2];$j-=3;$P(_N1,_N0,_Mz)}else{$j--}}}$F($g($_.codeone_blackdotmap,$_.vers),function(){var _N5=$k[--$j];$k[$j++]=$_.pixs;$q(_N5);$_.mmv();var _N6=$k[--$j];var _N7=$k[--$j];$p(_N7,_N6,1)});$_.j=0;for(var _NA=0,_N9=$_.pixs.length-1;_NA<=_N9;_NA+=1){$_.i=_NA;if($g($_.pixs,$_.i)==-1){$p($_.pixs,$_.i,$g($_.mmat,$_.j));$_.j=$_.j+1}}$k[$j++]=Infinity;$k[$j++]="ren";$k[$j++]="renmatrix";$k[$j++]="pixs";$k[$j++]=$_.pixs;$k[$j++]="pixx";$k[$j++]=$_.cols;$k[$j++]="pixy";$k[$j++]=$_.rows;$k[$j++]="height";$k[$j++]=$_.rows*$_.modunit/72;$k[$j++]="width";$k[$j++]=$_.cols*$_.modunit/72;if($_.stype||$_.ttype){$k[$j++]="borderleft";$k[$j++]=1;$k[$j++]="borderright";$k[$j++]=1;$k[$j++]="bordertop";$k[$j++]=0;$k[$j++]="borderbottom";$k[$j++]=1}$k[$j++]="opt";$k[$j++]=$_.options;var _NU=$d();$k[$j++]=_NU;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hanxin(){if(!bwipp_hanxin.globals){var $__=$_;$_=bwipp_hanxin.globals={};$_.hanxin_noblk=$a([0,-1,-1]);$_.hanxin_metrics=$a([$a(["1",23,-1,0,205,$a([1,21,4]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,17,8]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,13,12]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,9,16]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["2",25,-1,0,301,$a([1,31,6]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,25,12]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,19,18]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,15,22]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["3",27,-1,0,405,$a([1,42,8]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,34,16]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,26,24]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,20,30]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["4",29,14,1,439,$a([1,46,8]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,38,16]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,30,24]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,22,32]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["5",31,16,1,555,$a([1,57,12]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,49,20]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,37,32]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,14,20]),$a([1,13,22]),$_.hanxin_noblk]),$a(["6",33,16,1,675,$a([1,70,14]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,58,26]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,24,20]),$a([1,22,18]),$_.hanxin_noblk,$a([1,16,24]),$a([1,18,26]),$_.hanxin_noblk]),$a(["7",35,17,1,805,$a([1,84,16]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,70,30]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,26,22]),$a([1,28,24]),$_.hanxin_noblk,$a([2,14,20]),$a([1,12,20]),$_.hanxin_noblk]),$a(["8",37,18,1,943,$a([1,99,18]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,40,18]),$a([1,41,18]),$_.hanxin_noblk,$a([1,31,26]),$a([1,32,28]),$_.hanxin_noblk,$a([2,16,24]),$a([1,15,22]),$_.hanxin_noblk]),$a(["9",39,19,1,1089,$a([1,114,22]),$_.hanxin_noblk,$_.hanxin_noblk,$a([2,48,20]),$_.hanxin_noblk,$_.hanxin_noblk,$a([2,24,20]),$a([1,26,22]),$_.hanxin_noblk,$a([2,18,28]),$a([1,18,26]),$_.hanxin_noblk]),$a(["10",41,20,1,1243,$a([1,131,24]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,52,22]),$a([1,57,24]),$_.hanxin_noblk,$a([2,27,24]),$a([1,29,24]),$_.hanxin_noblk,$a([2,21,32]),$a([1,19,30]),$_.hanxin_noblk]),$a(["11",43,14,2,1289,$a([1,135,26]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,56,24]),$a([1,57,24]),$_.hanxin_noblk,$a([2,28,24]),$a([1,31,26]),$_.hanxin_noblk,$a([2,22,32]),$a([1,21,32]),$_.hanxin_noblk]),$a(["12",45,15,2,1455,$a([1,153,28]),$_.hanxin_noblk,$_.hanxin_noblk,$a([1,62,26]),$a([1,65,28]),$_.hanxin_noblk,$a([2,32,28]),$a([1,33,28]),$_.hanxin_noblk,$a([3,17,26]),$a([1,22,30]),$_.hanxin_noblk]),$a(["13",47,16,2,1629,$a([1,86,16]),$a([1,85,16]),$_.hanxin_noblk,$a([1,71,30]),$a([1,72,30]),$_.hanxin_noblk,$a([2,37,32]),$a([1,35,30]),$_.hanxin_noblk,$a([3,20,30]),$a([1,21,32]),$_.hanxin_noblk]),$a(["14",49,16,2,1805,$a([1,94,18]),$a([1,95,18]),$_.hanxin_noblk,$a([2,51,22]),$a([1,55,24]),$_.hanxin_noblk,$a([3,30,26]),$a([1,31,26]),$_.hanxin_noblk,$a([4,18,28]),$a([1,17,24]),$_.hanxin_noblk]),$a(["15",51,17,2,1995,$a([1,104,20]),$a([1,105,20]),$_.hanxin_noblk,$a([2,57,24]),$a([1,61,26]),$_.hanxin_noblk,$a([3,33,28]),$a([1,36,30]),$_.hanxin_noblk,$a([4,20,30]),$a([1,19,30]),$_.hanxin_noblk]),$a(["16",53,17,2,2187,$a([1,115,22]),$a([1,114,22]),$_.hanxin_noblk,$a([2,65,28]),$a([1,61,26]),$_.hanxin_noblk,$a([3,38,32]),$a([1,33,30]),$_.hanxin_noblk,$a([5,19,28]),$a([1,14,24]),$_.hanxin_noblk]),$a(["17",55,18,2,2393,$a([1,126,24]),$a([1,125,24]),$_.hanxin_noblk,$a([2,70,30]),$a([1,69,30]),$_.hanxin_noblk,$a([4,33,28]),$a([1,29,26]),$_.hanxin_noblk,$a([5,20,30]),$a([1,19,30]),$_.hanxin_noblk]),$a(["18",57,19,2,2607,$a([1,136,26]),$a([1,137,26]),$_.hanxin_noblk,$a([3,56,24]),$a([1,59,26]),$_.hanxin_noblk,$a([5,35,30]),$_.hanxin_noblk,$_.hanxin_noblk,$a([6,18,28]),$a([1,21,28]),$_.hanxin_noblk]),$a(["19",59,20,2,2829,$a([1,148,28]),$a([1,149,28]),$_.hanxin_noblk,$a([3,61,26]),$a([1,64,28]),$_.hanxin_noblk,$a([7,24,20]),$a([1,23,22]),$_.hanxin_noblk,$a([6,20,30]),$a([1,21,32]),$_.hanxin_noblk]),$a(["20",61,20,2,3053,$a([3,107,20]),$_.hanxin_noblk,$_.hanxin_noblk,$a([3,65,28]),$a([1,72,30]),$_.hanxin_noblk,$a([7,26,22]),$a([1,23,22]),$_.hanxin_noblk,$a([7,19,28]),$a([1,20,32]),$_.hanxin_noblk]),$a(["21",63,21,2,3291,$a([3,115,22]),$_.hanxin_noblk,$_.hanxin_noblk,$a([4,56,24]),$a([1,63,28]),$_.hanxin_noblk,$a([7,28,24]),$a([1,25,22]),$_.hanxin_noblk,$a([8,18,28]),$a([1,21,22]),$_.hanxin_noblk]),$a(["22",65,16,3,3383,$a([2,116,22]),$a([1,122,24]),$_.hanxin_noblk,$a([4,56,24]),$a([1,72,30]),$_.hanxin_noblk,$a([7,28,24]),$a([1,32,26]),$_.hanxin_noblk,$a([8,18,28]),$a([1,24,30]),$_.hanxin_noblk]),$a(["23",67,17,3,3631,$a([3,127,24]),$_.hanxin_noblk,$_.hanxin_noblk,$a([5,51,22]),$a([1,62,26]),$_.hanxin_noblk,$a([7,30,26]),$a([1,35,26]),$_.hanxin_noblk,$a([8,20,30]),$a([1,21,32]),$_.hanxin_noblk]),$a(["24",69,17,3,3887,$a([2,135,26]),$a([1,137,26]),$_.hanxin_noblk,$a([5,56,24]),$a([1,59,26]),$_.hanxin_noblk,$a([7,33,28]),$a([1,30,28]),$_.hanxin_noblk,$a([11,16,24]),$a([1,19,26]),$_.hanxin_noblk]),$a(["25",71,18,3,4151,$a([3,105,20]),$a([1,121,22]),$_.hanxin_noblk,$a([5,61,26]),$a([1,57,26]),$_.hanxin_noblk,$a([9,28,24]),$a([1,28,22]),$_.hanxin_noblk,$a([10,19,28]),$a([1,18,30]),$_.hanxin_noblk]),$a(["26",73,18,3,4423,$a([2,157,30]),$a([1,150,28]),$_.hanxin_noblk,$a([5,65,28]),$a([1,61,26]),$_.hanxin_noblk,$a([8,33,28]),$a([1,34,30]),$_.hanxin_noblk,$a([10,19,28]),$a([2,15,26]),$_.hanxin_noblk]),$a(["27",75,19,3,4703,$a([3,126,24]),$a([1,115,22]),$_.hanxin_noblk,$a([7,51,22]),$a([1,54,22]),$_.hanxin_noblk,$a([8,35,30]),$a([1,37,30]),$_.hanxin_noblk,$a([15,15,22]),$a([1,10,22]),$_.hanxin_noblk]),$a(["28",77,19,3,4991,$a([4,105,20]),$a([1,103,20]),$_.hanxin_noblk,$a([7,56,24]),$a([1,45,18]),$_.hanxin_noblk,$a([10,31,26]),$a([1,27,26]),$_.hanxin_noblk,$a([10,17,26]),$a([3,20,28]),$a([1,21,28])]),$a(["29",79,20,3,5287,$a([3,139,26]),$a([1,137,28]),$_.hanxin_noblk,$a([6,66,28]),$a([1,66,30]),$_.hanxin_noblk,$a([9,36,30]),$a([1,34,32]),$_.hanxin_noblk,$a([13,19,28]),$a([1,17,32]),$_.hanxin_noblk]),$a(["30",81,20,3,5591,$a([6,84,16]),$a([1,82,16]),$_.hanxin_noblk,$a([6,70,30]),$a([1,68,30]),$_.hanxin_noblk,$a([7,35,30]),$a([3,33,28]),$a([1,32,28]),$a([13,20,30]),$a([1,20,28]),$_.hanxin_noblk]),$a(["31",83,21,3,5903,$a([5,105,20]),$a([1,94,18]),$_.hanxin_noblk,$a([6,74,32]),$a([1,71,30]),$_.hanxin_noblk,$a([11,33,28]),$a([1,34,32]),$_.hanxin_noblk,$a([13,19,28]),$a([3,16,26]),$_.hanxin_noblk]),$a(["32",85,17,4,6033,$a([4,127,24]),$a([1,126,24]),$_.hanxin_noblk,$a([7,66,28]),$a([1,66,30]),$_.hanxin_noblk,$a([12,30,24]),$a([1,24,28]),$a([1,24,30]),$a([15,19,28]),$a([1,17,32]),$_.hanxin_noblk]),$a(["33",87,17,4,6353,$a([7,84,16]),$a([1,78,16]),$_.hanxin_noblk,$a([7,70,30]),$a([1,66,28]),$_.hanxin_noblk,$a([12,33,28]),$a([1,32,30]),$_.hanxin_noblk,$a([14,21,32]),$a([1,24,28]),$_.hanxin_noblk]),$a(["34",89,18,4,6689,$a([5,117,22]),$a([1,117,24]),$_.hanxin_noblk,$a([8,66,28]),$a([1,58,26]),$_.hanxin_noblk,$a([11,38,32]),$a([1,34,32]),$_.hanxin_noblk,$a([15,20,30]),$a([2,17,26]),$_.hanxin_noblk]),$a(["35",91,18,4,7025,$a([4,148,28]),$a([1,146,28]),$_.hanxin_noblk,$a([8,68,30]),$a([1,70,24]),$_.hanxin_noblk,$a([10,36,32]),$a([3,38,28]),$_.hanxin_noblk,$a([16,19,28]),$a([3,16,26]),$_.hanxin_noblk]),$a(["36",93,19,4,7377,$a([4,126,24]),$a([2,135,26]),$_.hanxin_noblk,$a([8,70,28]),$a([2,43,26]),$_.hanxin_noblk,$a([13,32,28]),$a([2,41,30]),$_.hanxin_noblk,$a([17,19,28]),$a([3,15,26]),$_.hanxin_noblk]),$a(["37",95,19,4,7729,$a([5,136,26]),$a([1,132,24]),$_.hanxin_noblk,$a([5,67,30]),$a([4,68,28]),$a([1,69,28]),$a([14,35,30]),$a([1,32,24]),$_.hanxin_noblk,$a([18,18,26]),$a([3,16,28]),$a([1,14,28])]),$a(["38",97,19,4,8089,$a([3,142,26]),$a([3,141,28]),$_.hanxin_noblk,$a([8,70,30]),$a([1,73,32]),$a([1,74,32]),$a([12,34,30]),$a([3,34,26]),$a([1,35,28]),$a([18,21,32]),$a([1,27,30]),$_.hanxin_noblk]),$a(["39",99,20,4,8465,$a([5,116,22]),$a([2,103,20]),$a([1,102,20]),$a([9,74,32]),$a([1,74,30]),$_.hanxin_noblk,$a([14,34,28]),$a([2,32,32]),$a([1,32,30]),$a([19,21,32]),$a([1,25,26]),$_.hanxin_noblk]),$a(["40",101,20,4,8841,$a([7,116,22]),$a([1,117,22]),$_.hanxin_noblk,$a([11,65,28]),$a([1,58,24]),$_.hanxin_noblk,$a([15,38,32]),$a([1,27,28]),$_.hanxin_noblk,$a([20,20,30]),$a([1,20,32]),$a([1,21,32])]),$a(["41",103,17,5,9009,$a([6,136,26]),$a([1,130,24]),$_.hanxin_noblk,$a([11,66,28]),$a([1,62,30]),$_.hanxin_noblk,$a([14,34,28]),$a([3,34,32]),$a([1,30,30]),$a([18,20,30]),$a([3,20,28]),$a([2,15,26])]),$a(["42",105,17,5,9401,$a([5,105,20]),$a([2,115,22]),$a([2,116,22]),$a([10,75,32]),$a([1,73,32]),$_.hanxin_noblk,$a([16,38,32]),$a([1,27,28]),$_.hanxin_noblk,$a([22,19,28]),$a([2,16,30]),$a([1,19,30])]),$a(["43",107,18,5,9799,$a([6,147,28]),$a([1,146,28]),$_.hanxin_noblk,$a([11,66,28]),$a([2,65,30]),$_.hanxin_noblk,$a([18,33,28]),$a([2,33,30]),$_.hanxin_noblk,$a([22,21,32]),$a([1,28,30]),$_.hanxin_noblk]),$a(["44",109,18,5,10207,$a([6,116,22]),$a([3,125,24]),$_.hanxin_noblk,$a([11,75,32]),$a([1,68,30]),$_.hanxin_noblk,$a([13,35,28]),$a([6,34,32]),$a([1,30,30]),$a([23,21,32]),$a([1,26,30]),$_.hanxin_noblk]),$a(["45",111,18,5,10623,$a([7,105,20]),$a([4,95,18]),$_.hanxin_noblk,$a([12,67,28]),$a([1,63,30]),$a([1,62,32]),$a([21,31,26]),$a([2,33,32]),$_.hanxin_noblk,$a([23,21,32]),$a([2,24,30]),$_.hanxin_noblk]),$a(["46",113,19,5,11045,$a([10,116,22]),$_.hanxin_noblk,$_.hanxin_noblk,$a([12,74,32]),$a([1,78,30]),$_.hanxin_noblk,$a([18,37,32]),$a([1,39,30]),$a([1,41,28]),$a([25,21,32]),$a([1,27,28]),$_.hanxin_noblk]),$a(["47",115,19,5,11477,$a([5,126,24]),$a([4,115,22]),$a([1,114,22]),$a([12,67,28]),$a([2,66,32]),$a([1,68,30]),$a([21,35,30]),$a([1,39,30]),$_.hanxin_noblk,$a([26,21,32]),$a([1,28,28]),$_.hanxin_noblk]),$a(["48",117,19,5,11917,$a([9,126,24]),$a([1,117,22]),$_.hanxin_noblk,$a([13,75,32]),$a([1,68,30]),$_.hanxin_noblk,$a([20,35,30]),$a([3,35,28]),$_.hanxin_noblk,$a([27,21,32]),$a([1,28,30]),$_.hanxin_noblk]),$a(["49",119,17,6,12111,$a([9,126,24]),$a([1,137,26]),$_.hanxin_noblk,$a([13,71,30]),$a([2,68,32]),$_.hanxin_noblk,$a([20,37,32]),$a([1,39,28]),$a([1,38,28]),$a([24,20,32]),$a([5,25,28]),$_.hanxin_noblk]),$a(["50",121,17,6,12559,$a([8,147,28]),$a([1,141,28]),$_.hanxin_noblk,$a([10,73,32]),$a([4,74,30]),$a([1,73,30]),$a([16,36,32]),$a([6,39,30]),$a([1,37,30]),$a([27,21,32]),$a([3,20,26]),$_.hanxin_noblk]),$a(["51",123,18,6,13025,$a([9,137,26]),$a([1,135,26]),$_.hanxin_noblk,$a([12,70,30]),$a([4,75,32]),$_.hanxin_noblk,$a([24,35,30]),$a([1,40,28]),$_.hanxin_noblk,$a([23,20,32]),$a([8,24,30]),$_.hanxin_noblk]),$a(["52",125,18,6,13489,$a([14,95,18]),$a([1,86,18]),$_.hanxin_noblk,$a([13,73,32]),$a([3,77,30]),$_.hanxin_noblk,$a([24,35,30]),$a([2,35,28]),$_.hanxin_noblk,$a([26,21,32]),$a([5,21,30]),$a([1,23,30])]),$a(["53",127,18,6,13961,$a([9,147,28]),$a([1,142,28]),$_.hanxin_noblk,$a([10,73,30]),$a([6,70,32]),$a([1,71,32]),$a([25,35,30]),$a([2,34,26]),$_.hanxin_noblk,$a([29,21,32]),$a([4,22,30]),$_.hanxin_noblk]),$a(["54",129,18,6,14441,$a([11,126,24]),$a([1,131,24]),$_.hanxin_noblk,$a([16,74,32]),$a([1,79,30]),$_.hanxin_noblk,$a([25,38,32]),$a([1,25,30]),$_.hanxin_noblk,$a([33,21,32]),$a([1,28,28]),$_.hanxin_noblk]),$a(["55",131,19,6,14939,$a([14,105,20]),$a([1,99,18]),$_.hanxin_noblk,$a([19,65,28]),$a([1,72,28]),$_.hanxin_noblk,$a([24,37,32]),$a([2,40,30]),$a([1,41,30]),$a([31,21,32]),$a([4,24,32]),$_.hanxin_noblk]),$a(["56",133,19,6,15435,$a([10,147,28]),$a([1,151,28]),$_.hanxin_noblk,$a([15,71,30]),$a([3,71,32]),$a([1,73,32]),$a([24,37,32]),$a([3,38,30]),$a([1,39,30]),$a([36,19,30]),$a([3,29,26]),$_.hanxin_noblk]),$a(["57",135,19,6,15939,$a([15,105,20]),$a([1,99,18]),$_.hanxin_noblk,$a([19,70,30]),$a([1,64,28]),$_.hanxin_noblk,$a([27,38,32]),$a([2,25,26]),$_.hanxin_noblk,$a([38,20,30]),$a([2,18,28]),$_.hanxin_noblk]),$a(["58",137,17,7,16171,$a([14,105,20]),$a([1,113,22]),$a([1,114,22]),$a([17,67,30]),$a([3,92,32]),$_.hanxin_noblk,$a([30,35,30]),$a([1,41,30]),$_.hanxin_noblk,$a([36,21,32]),$a([1,26,30]),$a([1,27,30])]),$a(["59",139,17,7,16691,$a([11,146,28]),$a([1,146,26]),$_.hanxin_noblk,$a([20,70,30]),$a([1,60,26]),$_.hanxin_noblk,$a([29,38,32]),$a([1,24,32]),$_.hanxin_noblk,$a([40,20,30]),$a([2,17,26]),$_.hanxin_noblk]),$a(["60",141,18,7,17215,$a([3,137,26]),$a([1,136,26]),$a([10,126,24]),$a([22,65,28]),$a([1,75,30]),$_.hanxin_noblk,$a([30,37,32]),$a([1,51,30]),$_.hanxin_noblk,$a([42,20,30]),$a([1,21,30]),$_.hanxin_noblk]),$a(["61",143,18,7,17751,$a([12,126,24]),$a([2,118,22]),$a([1,116,22]),$a([19,74,32]),$a([1,74,30]),$a([1,72,28]),$a([30,38,32]),$a([2,29,30]),$_.hanxin_noblk,$a([39,20,32]),$a([2,37,26]),$a([1,38,26])]),$a(["62",145,18,7,18295,$a([12,126,24]),$a([3,136,26]),$_.hanxin_noblk,$a([21,70,30]),$a([2,65,28]),$_.hanxin_noblk,$a([34,35,30]),$a([1,44,32]),$_.hanxin_noblk,$a([42,20,30]),$a([2,19,28]),$a([2,18,28])]),$a(["63",147,18,7,18847,$a([12,126,24]),$a([3,117,22]),$a([1,116,22]),$a([25,61,26]),$a([2,62,28]),$_.hanxin_noblk,$a([34,35,30]),$a([1,40,32]),$a([1,41,32]),$a([45,20,30]),$a([1,20,32]),$a([1,21,32])]),$a(["64",149,19,7,19403,$a([15,105,20]),$a([2,115,22]),$a([2,116,22]),$a([25,65,28]),$a([1,72,28]),$_.hanxin_noblk,$a([18,35,30]),$a([17,37,32]),$a([1,50,32]),$a([42,20,30]),$a([6,19,28]),$a([1,15,28])]),$a(["65",151,19,7,19971,$a([19,105,20]),$a([1,101,20]),$_.hanxin_noblk,$a([33,51,22]),$a([1,65,22]),$_.hanxin_noblk,$a([40,33,28]),$a([1,28,28]),$_.hanxin_noblk,$a([49,20,30]),$a([1,18,28]),$_.hanxin_noblk]),$a(["66",153,17,8,20229,$a([18,105,20]),$a([2,117,22]),$_.hanxin_noblk,$a([26,65,28]),$a([1,80,30]),$_.hanxin_noblk,$a([35,35,30]),$a([3,35,28]),$a([1,36,28]),$a([52,18,28]),$a([2,38,30]),$_.hanxin_noblk]),$a(["67",155,17,8,20805,$a([26,84,16]),$_.hanxin_noblk,$_.hanxin_noblk,$a([26,70,30]),$_.hanxin_noblk,$_.hanxin_noblk,$a([45,31,26]),$a([1,9,26]),$_.hanxin_noblk,$a([52,20,30]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["68",157,17,8,21389,$a([16,126,24]),$a([1,114,22]),$a([1,115,22]),$a([23,70,30]),$a([3,65,28]),$a([1,66,28]),$a([40,35,30]),$a([1,43,30]),$_.hanxin_noblk,$a([46,20,30]),$a([7,19,28]),$a([1,16,28])]),$a(["69",159,18,8,21993,$a([19,116,22]),$a([1,105,22]),$_.hanxin_noblk,$a([20,70,30]),$a([7,66,28]),$a([1,63,28]),$a([40,35,30]),$a([1,42,32]),$a([1,43,32]),$a([54,20,30]),$a([1,19,30]),$_.hanxin_noblk]),$a(["70",161,18,8,22593,$a([17,126,24]),$a([2,115,22]),$_.hanxin_noblk,$a([24,70,30]),$a([4,74,32]),$_.hanxin_noblk,$a([48,31,26]),$a([2,18,26]),$_.hanxin_noblk,$a([54,19,28]),$a([6,15,26]),$a([1,14,26])]),$a(["71",163,18,8,23201,$a([29,84,16]),$_.hanxin_noblk,$_.hanxin_noblk,$a([29,70,30]),$_.hanxin_noblk,$_.hanxin_noblk,$a([6,34,30]),$a([3,36,30]),$a([38,33,28]),$a([58,20,30]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["72",165,18,8,23817,$a([16,147,28]),$a([1,149,28]),$_.hanxin_noblk,$a([31,66,28]),$a([1,37,26]),$_.hanxin_noblk,$a([48,33,28]),$a([1,23,26]),$_.hanxin_noblk,$a([53,20,30]),$a([6,19,28]),$a([1,17,28])]),$a(["73",167,19,8,24453,$a([20,115,22]),$a([2,134,24]),$_.hanxin_noblk,$a([29,66,28]),$a([2,56,26]),$a([2,57,26]),$a([45,36,30]),$a([2,15,28]),$_.hanxin_noblk,$a([59,20,30]),$a([2,21,32]),$_.hanxin_noblk]),$a(["74",169,19,8,25085,$a([17,147,28]),$a([1,134,26]),$_.hanxin_noblk,$a([26,70,30]),$a([5,75,32]),$_.hanxin_noblk,$a([47,35,30]),$a([1,48,32]),$_.hanxin_noblk,$a([64,18,28]),$a([2,33,30]),$a([1,35,30])]),$a(["75",171,17,9,25373,$a([22,115,22]),$a([1,133,24]),$_.hanxin_noblk,$a([33,65,28]),$a([1,74,28]),$_.hanxin_noblk,$a([43,36,30]),$a([5,27,28]),$a([1,30,28]),$a([57,20,30]),$a([5,21,32]),$a([1,24,32])]),$a(["76",173,17,9,26021,$a([18,136,26]),$a([2,142,26]),$_.hanxin_noblk,$a([33,66,28]),$a([2,49,26]),$_.hanxin_noblk,$a([48,35,30]),$a([2,38,28]),$_.hanxin_noblk,$a([64,20,30]),$a([1,20,32]),$_.hanxin_noblk]),$a(["77",175,17,9,26677,$a([19,126,24]),$a([2,135,26]),$a([1,136,26]),$a([32,66,28]),$a([2,55,26]),$a([2,56,26]),$a([49,36,30]),$a([2,18,32]),$_.hanxin_noblk,$a([65,18,28]),$a([5,27,30]),$a([1,29,30])]),$a(["78",177,18,9,27335,$a([20,137,26]),$a([1,130,26]),$_.hanxin_noblk,$a([30,75,32]),$a([2,71,32]),$_.hanxin_noblk,$a([46,35,30]),$a([6,39,32]),$_.hanxin_noblk,$a([3,12,30]),$a([70,19,28]),$_.hanxin_noblk]),$a(["79",179,18,9,28007,$a([20,147,28]),$_.hanxin_noblk,$_.hanxin_noblk,$a([35,70,30]),$_.hanxin_noblk,$_.hanxin_noblk,$a([49,35,30]),$a([5,35,28]),$_.hanxin_noblk,$a([70,20,30]),$_.hanxin_noblk,$_.hanxin_noblk]),$a(["80",181,18,9,28687,$a([21,136,26]),$a([1,155,28]),$_.hanxin_noblk,$a([34,70,30]),$a([1,64,28]),$a([1,65,28]),$a([54,35,30]),$a([1,45,30]),$_.hanxin_noblk,$a([68,20,30]),$a([3,18,28]),$a([1,19,28])]),$a(["81",183,18,9,29375,$a([19,126,24]),$a([5,115,22]),$a([1,114,22]),$a([33,70,30]),$a([3,65,28]),$a([1,64,28]),$a([52,35,30]),$a([3,41,32]),$a([1,40,32]),$a([67,20,30]),$a([5,21,32]),$a([1,24,32])]),$a(["82",185,18,9,30071,$a([2,150,28]),$a([21,136,26]),$_.hanxin_noblk,$a([32,70,30]),$a([6,65,28]),$_.hanxin_noblk,$a([52,38,32]),$a([2,27,32]),$_.hanxin_noblk,$a([73,20,30]),$a([2,22,32]),$_.hanxin_noblk]),$a(["83",187,17,10,30387,$a([21,126,24]),$a([4,136,26]),$_.hanxin_noblk,$a([30,74,32]),$a([6,73,30]),$_.hanxin_noblk,$a([54,35,30]),$a([4,40,32]),$_.hanxin_noblk,$a([75,20,30]),$a([1,20,28]),$_.hanxin_noblk]),$a(["84",189,17,10,31091,$a([30,105,20]),$a([1,114,22]),$_.hanxin_noblk,$a([3,45,22]),$a([55,47,20]),$_.hanxin_noblk,$a([2,26,26]),$a([62,33,28]),$_.hanxin_noblk,$a([79,18,28]),$a([4,33,30]),$_.hanxin_noblk])]);$_.hanxin_fpat=$a([$a([1,1,1,1,1,1,1,0]),$a([1,0,0,0,0,0,0,0]),$a([1,0,1,1,1,1,1,0]),$a([1,0,1,0,0,0,0,0]),$a([1,0,1,0,1,1,1,0]),$a([1,0,1,0,1,1,1,0]),$a([1,0,1,0,1,1,1,0]),$a([0,0,0,0,0,0,0,0])]);$_.hanxin_fpat2=$a([$a([1,1,1,0,1,0,1,0]),$a([1,1,1,0,1,0,1,0]),$a([1,1,1,0,1,0,1,0]),$a([0,0,0,0,1,0,1,0]),$a([1,1,1,1,1,0,1,0]),$a([0,0,0,0,0,0,1,0]),$a([1,1,1,1,1,1,1,0]),$a([0,0,0,0,0,0,0,0])]);var _Cq=$a([function(){$k[$j-1]=0;$k[$j++]=8},function(){var _Cp=$k[--$j];$k[$j++]=_Cp-1;$k[$j++]=_Cp-9}]);var _Cs=$a([function(){$k[$j-1]=1;$k[$j++]=8},function(){var _Cr=$k[--$j];$k[$j++]=_Cr-2;$k[$j++]=_Cr-9}]);var _Cu=$a([function(){$k[$j-1]=2;$k[$j++]=8},function(){var _Ct=$k[--$j];$k[$j++]=_Ct-3;$k[$j++]=_Ct-9}]);var _Cw=$a([function(){$k[$j-1]=3;$k[$j++]=8},function(){var _Cv=$k[--$j];$k[$j++]=_Cv-4;$k[$j++]=_Cv-9}]);var _Cy=$a([function(){$k[$j-1]=4;$k[$j++]=8},function(){var _Cx=$k[--$j];$k[$j++]=_Cx-5;$k[$j++]=_Cx-9}]);var _D0=$a([function(){$k[$j-1]=5;$k[$j++]=8},function(){var _Cz=$k[--$j];$k[$j++]=_Cz-6;$k[$j++]=_Cz-9}]);var _D2=$a([function(){$k[$j-1]=6;$k[$j++]=8},function(){var _D1=$k[--$j];$k[$j++]=_D1-7;$k[$j++]=_D1-9}]);var _D4=$a([function(){$k[$j-1]=7;$k[$j++]=8},function(){var _D3=$k[--$j];$k[$j++]=_D3-8;$k[$j++]=_D3-9}]);var _D6=$a([function(){$k[$j-1]=8;$k[$j++]=8},function(){var _D5=$k[--$j];$k[$j++]=_D5-9;$k[$j++]=_D5-9}]);var _D8=$a([function(){$k[$j-1]=8;$k[$j++]=7},function(){var _D7=$k[--$j];$k[$j++]=_D7-9;$k[$j++]=_D7-8}]);var _DA=$a([function(){$k[$j-1]=8;$k[$j++]=6},function(){var _D9=$k[--$j];$k[$j++]=_D9-9;$k[$j++]=_D9-7}]);var _DC=$a([function(){$k[$j-1]=8;$k[$j++]=5},function(){var _DB=$k[--$j];$k[$j++]=_DB-9;$k[$j++]=_DB-6}]);var _DE=$a([function(){$k[$j-1]=8;$k[$j++]=4},function(){var _DD=$k[--$j];$k[$j++]=_DD-9;$k[$j++]=_DD-5}]);var _DG=$a([function(){$k[$j-1]=8;$k[$j++]=3},function(){var _DF=$k[--$j];$k[$j++]=_DF-9;$k[$j++]=_DF-4}]);var _DI=$a([function(){$k[$j-1]=8;$k[$j++]=2},function(){var _DH=$k[--$j];$k[$j++]=_DH-9;$k[$j++]=_DH-3}]);var _DK=$a([function(){$k[$j-1]=8;$k[$j++]=1},function(){var _DJ=$k[--$j];$k[$j++]=_DJ-9;$k[$j++]=_DJ-2}]);var _DM=$a([function(){$k[$j-1]=8;$k[$j++]=0},function(){var _DL=$k[--$j];$k[$j++]=_DL-9;$k[$j++]=_DL-1}]);var _DP=$a([function(){$k[$j-1]-=9;$k[$j++]=0},function(){var _DO=$k[--$j];$k[$j++]=8;$k[$j++]=_DO-1}]);var _DS=$a([function(){$k[$j-1]-=9;$k[$j++]=1},function(){var _DR=$k[--$j];$k[$j++]=8;$k[$j++]=_DR-2}]);var _DV=$a([function(){$k[$j-1]-=9;$k[$j++]=2},function(){var _DU=$k[--$j];$k[$j++]=8;$k[$j++]=_DU-3}]);var _DY=$a([function(){$k[$j-1]-=9;$k[$j++]=3},function(){var _DX=$k[--$j];$k[$j++]=8;$k[$j++]=_DX-4}]);var _Db=$a([function(){$k[$j-1]-=9;$k[$j++]=4},function(){var _Da=$k[--$j];$k[$j++]=8;$k[$j++]=_Da-5}]);var _De=$a([function(){$k[$j-1]-=9;$k[$j++]=5},function(){var _Dd=$k[--$j];$k[$j++]=8;$k[$j++]=_Dd-6}]);var _Dh=$a([function(){$k[$j-1]-=9;$k[$j++]=6},function(){var _Dg=$k[--$j];$k[$j++]=8;$k[$j++]=_Dg-7}]);var _Dk=$a([function(){$k[$j-1]-=9;$k[$j++]=7},function(){var _Dj=$k[--$j];$k[$j++]=8;$k[$j++]=_Dj-8}]);var _Dn=$a([function(){$k[$j-1]-=9;$k[$j++]=8},function(){var _Dm=$k[--$j];$k[$j++]=8;$k[$j++]=_Dm-9}]);var _Dq=$a([function(){$k[$j-1]-=8;$k[$j++]=8},function(){var _Dp=$k[--$j];$k[$j++]=7;$k[$j++]=_Dp-9}]);var _Dt=$a([function(){$k[$j-1]-=7;$k[$j++]=8},function(){var _Ds=$k[--$j];$k[$j++]=6;$k[$j++]=_Ds-9}]);var _Dw=$a([function(){$k[$j-1]-=6;$k[$j++]=8},function(){var _Dv=$k[--$j];$k[$j++]=5;$k[$j++]=_Dv-9}]);var _Dz=$a([function(){$k[$j-1]-=5;$k[$j++]=8},function(){var _Dy=$k[--$j];$k[$j++]=4;$k[$j++]=_Dy-9}]);var _E2=$a([function(){$k[$j-1]-=4;$k[$j++]=8},function(){var _E1=$k[--$j];$k[$j++]=3;$k[$j++]=_E1-9}]);var _E5=$a([function(){$k[$j-1]-=3;$k[$j++]=8},function(){var _E4=$k[--$j];$k[$j++]=2;$k[$j++]=_E4-9}]);var _E8=$a([function(){$k[$j-1]-=2;$k[$j++]=8},function(){var _E7=$k[--$j];$k[$j++]=1;$k[$j++]=_E7-9}]);var _EB=$a([function(){$k[$j-1]-=1;$k[$j++]=8},function(){var _EA=$k[--$j];$k[$j++]=0;$k[$j++]=_EA-9}]);$_.hanxin_funmap=$a([_Cq,_Cs,_Cu,_Cw,_Cy,_D0,_D2,_D4,_D6,_D8,_DA,_DC,_DE,_DG,_DI,_DK,_DM,_DP,_DS,_DV,_DY,_Db,_De,_Dh,_Dk,_Dn,_Dq,_Dt,_Dw,_Dz,_E2,_E5,_E8,_EB]);$_.hanxin_rsparams=$a([$a([]),$a([]),$a([]),$a([]),$a([16,19]),$a([]),$a([]),$a([]),$a([256,355])]);var _ET=$a([function(){$j-=2;$k[$j++]=1},function(){var _EN=$k[--$j];var _EO=$k[--$j];$k[$j++]=$f(_EO+_EN)%2},function(){var _EP=$k[--$j];var _EQ=$k[--$j];$k[$j++]=$f((_EP+_EQ)%3+_EQ%3)%2},function(){var _ER=$k[--$j];var _ES=$k[--$j];$k[$j++]=$f(_ES%_ER+(_ER%_ES+(_ER%3+_ES%3)))%2}]);$_.hanxin_maskfuncs=_ET;$k[$j++]=Infinity;for(var _EU=0,_EV=$_.hanxin_rsparams.length;_EU<_EV;_EU++){var _EW=$g($_.hanxin_rsparams,_EU);$k[$j++]=_EW;if(_EW.length!=0){var _EX=$k[--$j];$q(_EX);var _EY=$k[--$j];$_.rspm=_EY;var _EZ=$k[--$j];$_.rsgf=_EZ;$k[$j++]=Infinity;$k[$j++]=1;for(var _Eb=0,_Ec=$_.rsgf-1;_Eb<_Ec;_Eb++){var _Ed=$k[$j-1];var _Ee=_Ed*2;$k[$j++]=_Ee;if(_Ee>=$_.rsgf){var _Eh=$k[--$j];$k[$j++]=$xo(_Eh,$_.rspm)}}$_.rsalog=$a();$_.rslog=$a($_.rsgf);for(var _Em=1,_El=$_.rsgf-1;_Em<=_El;_Em+=1){$p($_.rslog,$g($_.rsalog,_Em),_Em)}$k[$j++]=$a([$_.rslog,$_.rsalog])}else{$k[$j-1]=$a([])}}var _Eu=$a();$_.rstables=_Eu;$_.hanxin_rsprod=function(){var _Ev=$k[$j-1];if(_Ev!=0){var _Ex=$k[$j-2];if(_Ex!=0){var _Ez=$k[--$j];var _F1=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_Ez)+$g($_.rslog,_F1))%$_.rsgf_1)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.hanxin_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _F8=0,_F9=$_.rsnc;_F8<_F9;_F8++){$k[$j++]=0}$_.coeffs=$a();for(var _FC=1,_FB=$_.rsnc;_FC<=_FB;_FC+=1){var _FD=$_.coeffs;$p(_FD,_FC,$g(_FD,_FC-1));$k[$j++]=$g($_.rsalog,_FC);for(var _FH=_FC-1;_FH>=1;_FH-=1){var _FI=$_.coeffs;var _FK=$k[$j-1];$k[$j++]=_FI;$k[$j++]=_FH;$k[$j++]=$g(_FI,_FH);$k[$j++]=_FK;$_.hanxin_rsprod();var _FM=$k[--$j];var _FN=$k[--$j];var _FP=$k[--$j];$p(_FP,_FN,$xo(_FM,$g($_.coeffs,_FN-1)))}var _FQ=$_.coeffs;var _FS=$k[$j-1];$k[$j++]=_FQ;$k[$j++]=0;$k[$j++]=$g(_FQ,0);$k[$j++]=_FS;$_.hanxin_rsprod();var _FT=$k[--$j];var _FU=$k[--$j];var _FV=$k[--$j];$p(_FV,_FU,_FT);$j--}$k[$j++]=$G($_.coeffs,0,$_.coeffs.length-1)};$_.hanxin_coeffscachemax=15;$_.hanxin_coeffscachelimit=264;$k[$j++]=$_.hanxin_coeffscachemax;$k[$j++]=$_.hanxin_coeffscachelimit;bwipp_fifocache();var _Fb=$k[--$j];$_.hanxin_coeffscache=_Fb;$_.hanxin_coeffscachefetch=function(){var _Fc=$k[--$j];$_.rsbt=_Fc;var _Fd=$k[--$j];$_.rsnc=_Fd;$q($g($_.rstables,$_.rsbt));var _Fh=$k[--$j];$_.rsalog=_Fh;var _Fi=$k[--$j];$_.rslog=_Fi;$_.rsgf_1=$_.rsalog.length-1;var _Fm=$g($_.hanxin_coeffscache,"fetch");$k[$j++]=$f($_.rsbt*1e4+$_.rsnc);$k[$j++]=function(){$_.hanxin_gencoeffs()};$k[$j++]=function(){var _Fn=$k[--$j];$k[$j++]=_Fn.length};if(_Fm()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hanxin.globals);$_.dontdraw=false;$_.version="unset";$_.eclevel="L2";$_.parse=false;$_.parsefnc=false;$_.mask=-1;bwipp_processoptions();var _Fo=$k[--$j];$_.options=_Fo;var _Fp=$k[--$j];$_.barcode=_Fp;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.barcode.length==0){$k[$j++]="bwipp.hanxinEmptyData#32517";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>14e3){$k[$j++]="bwipp.hanxinInputTooLong#32521";$k[$j++]="The input data is too long";bwipp_raiseerror()}if($ne($_.version,"unset")){var _Fw=$_.version.length;var _Fx=_Fw>=1&&_Fw<=2;$k[$j++]=_Fx;if(_Fx){$j--;var _Fy=$_.version;$k[$j++]=true;for(var _Fz=0,_G0=_Fy.length;_Fz<_G0;_Fz++){var _G1=$g(_Fy,_Fz);if(_G1<48||_G1>57){$k[$j-1]=false}}var _G2=$k[$j-1];if(_G2){$j--;var _G4=$i($_.version);$k[$j++]=_G4>=1&&_G4<=84}}var _G5=$k[--$j];if(!_G5){$k[$j++]="bwipp.hanxinInvalidVersion#32532";$k[$j++]="Valid versions are 1 to 84";bwipp_raiseerror()}}var _G7=$_.eclevel.length==2;$k[$j++]=_G7;if(_G7){$j--;var _GA=$eq($G($_.eclevel,0,1),"L");$k[$j++]=_GA;if(_GA){$j--;var _GD=$g($_.eclevel,1)-48;$k[$j++]=_GD>=1&&_GD<=4}}var _GE=$k[--$j];if(!_GE){$k[$j++]="bwipp.hanxinInvalidErrorCorrectionLevel#32542";$k[$j++]="Valid error correction levels are L1 to L4";bwipp_raiseerror()}if($_.mask!=-1){if($_.mask<1||$_.mask>4){$k[$j++]="bwipp.hanxinInvalidErrorCorrectionLevel#32547";$k[$j++]="The valid masks are 1 to 4";bwipp_raiseerror()}}$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _GM=$k[--$j];$_.msg=_GM;$_.msglen=$_.msg.length;$_.tobin=function(){var _GO=$k[--$j];var _GP=$s(_GO);$k[$j++]=_GP;for(var _GR=0,_GQ=_GP.length-1;_GR<=_GQ;_GR+=1){var _GS=$k[$j-1];$p(_GS,_GR,48)}var _GT=$k[$j-1];$k[$j++]=_GT;var _GU=$k[$j-3];var _GV=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _GX=$R($s(_GV.length),_GU,2);$P(_GV,_GV.length-_GX.length,_GX)};$k[$j++]=4+13+$_.msglen*8;try{var _GZ=$k[--$j];$k[$j++]=$s(_GZ);var _Gb=false}catch(e){$k[$j++]=true}if(_Gb){$k[$j-1]="bwipp.hanxinInputTooLarge#32579";$k[$j++]="The input data exceeds the implementation limits";bwipp_raiseerror()}var _Gc=$k[--$j];$_.bits=_Gc;$P($_.bits,0,"0011");if($_.msglen>=8192){$k[$j++]="bwipp.hanxinInputTooLarge#32583";$k[$j++]="The input data exceeds the maximum symbol capacity";bwipp_raiseerror()}$k[$j++]=$_.bits;$k[$j++]=4;$k[$j++]=$_.msglen;$k[$j++]=13;$_.tobin();var _Gh=$k[--$j];var _Gi=$k[--$j];var _Gj=$k[--$j];$P(_Gj,_Gi,_Gh);for(var _Gm=0,_Gl=$_.msglen-1;_Gm<=_Gl;_Gm+=1){$_.i=_Gm;$k[$j++]=$_.bits;$k[$j++]=17+$_.i*8;$k[$j++]=$g($_.msg,$_.i);$k[$j++]=8;$_.tobin();var _Gs=$k[--$j];var _Gt=$k[--$j];var _Gu=$k[--$j];$P(_Gu,_Gt,_Gs)}$_.eclval=$g($_.eclevel,1)-49;for(var _Gx=0,_Gy=$_.hanxin_metrics.length;_Gx<_Gy;_Gx++){$_.m=$g($_.hanxin_metrics,_Gx);$_.vers=$g($_.m,0);$_.size=$g($_.m,1);$_.alnk=$g($_.m,2);$_.alnn=$g($_.m,3);$_.alnr=$f($_.size-$_.alnk*$_.alnn);$_.nmod=$g($_.m,4);$_.ncws=~~($_.nmod/8);$_.rbit=$_.nmod%8;$_.ecbs=$G($_.m,5+$_.eclval*3,3);var _HI=$_.ecbs;var _HP=0;for(var _HJ=0,_HK=_HI.length;_HJ<_HK;_HJ++){var _HL=$g(_HI,_HJ);_HP=$f(_HP+$g(_HL,0)*$g(_HL,2))}$_.ecws=_HP;$_.dcws=$f($_.ncws-$_.ecws);$_.dmod=$_.dcws*8;$_.okay=true;if($ne($_.version,"unset")&&$ne($_.version,$_.vers)){$_.okay=false}if($_.bits.length>$_.dmod){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.hanxinNoValidSymbol#32616";$k[$j++]="Maximum length exceeded or invalid content";bwipp_raiseerror()}$_.version=$_.vers;$_.msgbits=$_.bits;$_.e1nb=$g($g($_.ecbs,0),0);$_.e2nb=$g($g($_.ecbs,1),0);$_.e3nb=$g($g($_.ecbs,2),0);$_.e1dcws=$g($g($_.ecbs,0),1);$_.e2dcws=$g($g($_.ecbs,1),1);$_.e3dcws=$g($g($_.ecbs,2),1);$_.e1ecws=$g($g($_.ecbs,0),2);$_.e2ecws=$g($g($_.ecbs,1),2);$_.e3ecws=$g($g($_.ecbs,2),2);$_.pad=$s($_.dmod);for(var _I8=0,_I7=$_.pad.length-1;_I8<=_I7;_I8+=1){$p($_.pad,_I8,48)}$P($_.pad,0,$_.msgbits);$_.cws=$a($_.dcws);for(var _IG=0,_IF=$_.cws.length-1;_IG<=_IF;_IG+=1){$_.c=_IG;$_.cwb=$G($_.pad,$_.c*8,8);$_.cw=0;for(var _IK=0;_IK<=7;_IK+=1){$_.i=_IK;$_.cw=$f($_.cw+$pow(2,8-$_.i-1)*($g($_.cwb,$_.i)-48))}$p($_.cws,$_.c,$_.cw)}$_.rscodes=function(){var _IT=$k[--$j];$_.rsbt=_IT;var _IU=$k[--$j];$_.rsnc=_IU;var _IV=$k[--$j];$_.rscws=_IV;$k[$j++]="coeffs";$k[$j++]=$_.rsnc;$k[$j++]=$_.rsbt;$_.hanxin_coeffscachefetch();var _IY=$k[--$j];var _IZ=$k[--$j];$_[_IZ]=_IY;$_.lfsr=$a($_.rsnc);var _Ic=$_.rscws;var _Id=$_.coeffs;var _Ie=$_.rsnc;var _If=$_.lfsr;$k[$j++]=function(){var _Ih=$k[--$j];$k[$j++]=$g($_.rscws,_Ih)};$k[$j++]=_Ic.length;$k[$j++]=_Id;$k[$j++]=_Ie;$k[$j++]=_If;$k[$j++]=$_.hanxin_rsprod;bwipp_rsecbinary();$k[$j++]=$_.lfsr};$_.dcwsb=$a($f($_.e1nb+$_.e2nb+$_.e3nb));$_.ecwsb=$a($_.dcwsb.length);$_.in=0;$_.out=0;for(var _Ir=0,_Is=$_.e1nb;_Ir<_Is;_Ir++){var _Iw=$G($_.cws,$_.in,$_.e1dcws);$p($_.dcwsb,$_.out,_Iw);$k[$j++]=_Iw;$k[$j++]=$_.e1ecws;$k[$j++]=8;$_.rscodes();$k[$j++]=$_.ecwsb;$k[$j++]=$_.out;var _J2=$k[$j-3];var _J3=$k[$j-1];var _J4=$k[$j-2];$j-=3;$p(_J4,_J3,_J2);$_.in=$f($_.in+$_.e1dcws);$_.out=$_.out+1}for(var _J9=0,_JA=$_.e2nb;_J9<_JA;_J9++){var _JE=$G($_.cws,$_.in,$_.e2dcws);$p($_.dcwsb,$_.out,_JE);$k[$j++]=_JE;$k[$j++]=$_.e2ecws;$k[$j++]=8;$_.rscodes();$k[$j++]=$_.ecwsb;$k[$j++]=$_.out;var _JK=$k[$j-3];var _JL=$k[$j-1];var _JM=$k[$j-2];$j-=3;$p(_JM,_JL,_JK);$_.in=$f($_.in+$_.e2dcws);$_.out=$_.out+1}for(var _JR=0,_JS=$_.e3nb;_JR<_JS;_JR++){var _JW=$G($_.cws,$_.in,$_.e3dcws);$p($_.dcwsb,$_.out,_JW);$k[$j++]=_JW;$k[$j++]=$_.e3ecws;$k[$j++]=8;$_.rscodes();$k[$j++]=$_.ecwsb;$k[$j++]=$_.out;var _Jc=$k[$j-3];var _Jd=$k[$j-1];var _Je=$k[$j-2];$j-=3;$p(_Je,_Jd,_Jc);$_.in=$f($_.in+$_.e3dcws);$_.out=$_.out+1}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#32697";$k[$j++]=Infinity;var _Jk=$_.ecwsb;for(var _Jl=0,_Jm=_Jk.length;_Jl<_Jm;_Jl++){$q($g(_Jk,_Jl))}var _Jo=$a();$k[$j++]=_Jo;bwipp_raiseerror()}$_.cws=$a($_.ncws);$_.cw=0;for(var _Jt=0,_Js=$_.dcwsb.length-1;_Jt<=_Js;_Jt+=1){$_.i=_Jt;var _Jw=$g($_.dcwsb,$_.i);$P($_.cws,$_.cw,_Jw);$_.cw=_Jw.length+$_.cw;var _K2=$g($_.ecwsb,$_.i);$P($_.cws,$_.cw,_K2);$_.cw=_K2.length+$_.cw}$k[$j++]=Infinity;var _K6=$_.ncws;var _K7=12;var _K8=_K6-1;if(_K6-1>12){var _=_K7;_K7=_K8;_K8=_}for(var _KA=0,_K9=_K8;_KA<=_K9;_KA+=1){for(var _KD=_KA,_KC=$_.ncws-1;_KD<=_KC;_KD+=13){$k[$j++]=_KD;if(_KD<$_.ncws){var _KG=$k[--$j];$k[$j++]=$g($_.cws,_KG)}else{$j--}}}$_.cws=$a();if($_.rbit>0){$_.pad=$a($_.cws.length+1);$P($_.pad,0,$_.cws);$p($_.pad,$_.pad.length-1,0);$_.cws=$_.pad}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#32733";$k[$j++]=$_.cws;bwipp_raiseerror()}$k[$j++]=Infinity;for(var _KV=0,_KW=$_.size*$_.size;_KV<_KW;_KV++){$k[$j++]=-1}$_.pixs=$a();$_.qmv=function(){var _KY=$k[--$j];var _KZ=$k[--$j];$k[$j++]=$f(_KZ+_KY*$_.size)};if($_.alnn!=0){$_.trmv=function(){var _Kc=$k[--$j];var _Ke=$k[--$j];$k[$j++]=$f(_Kc*$_.size+$_.size-1-_Ke)};$_.aplot=function(){var _Kf=$k[$j-2];var _Kg=$k[$j-3];var _Kh=$k[$j-1];$j-=3;$k[$j++]=_Kh;$k[$j++]=_Kg;$k[$j++]=_Kf;$k[$j++]=_Kh;$k[$j++]=_Kf;$k[$j++]=_Kg;$_.trmv();var _Kj=$k[--$j];$k[$j++]=$_.pixs;$k[$j++]=_Kj;var _Kk=$k[$j-3];var _Kl=$k[$j-1];var _Km=$k[$j-2];$j-=3;$p(_Km,_Kl,_Kk);$_.trmv();var _Ko=$k[--$j];$k[$j++]=$_.pixs;$k[$j++]=_Ko;var _Kp=$k[$j-3];var _Kq=$k[$j-1];var _Kr=$k[$j-2];$j-=3;$p(_Kr,_Kq,_Kp)};$_.i=0;$_.stag=0;for(;;){if($_.i>=$_.size){break}for(var _Kw=0,_Kv=$_.size-1;_Kw<=_Kv;_Kw+=1){$_.j=_Kw;var _LA=$f($_.j+$_.alnr)<$_.size?(~~($_.j/$_.alnk)+$_.stag)%2==0&&!($_.i==0&&$_.j<$_.alnk)||$_.j%$_.alnk==0:$f($_.alnn+$_.stag)%2==0;if(_LA){$k[$j++]=$_.j;$k[$j++]=$_.i;$k[$j++]=1;$_.aplot();var _LD=$_.j;var _LE=$_.i;$k[$j++]=_LD+1;$k[$j++]=_LE+1;if(_LE+1<$_.size&&_LD+1<$_.size){$k[$j++]=0;$_.aplot()}else{$j-=2}}}if($f($_.i+$_.alnr)==$_.size){$_.i=$f($_.i+$_.alnr)-1}else{$_.i=$f($_.i+$_.alnk)}$_.stag=1-$_.stag}for(var _LT=$_.alnk,_LU=$_.alnk,_LS=$_.size-2;_LU<0?_LT>=_LS:_LT<=_LS;_LT+=_LU){$_.i=_LT;if(~~($_.i/$_.alnk)%2!=0){$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=$_.i-1;$_.trmv();var _LZ=$k[--$j];var _La=$k[--$j];$p(_La,_LZ,0);$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=$_.i+1;$_.trmv();var _Ld=$k[--$j];var _Le=$k[--$j];$p(_Le,_Ld,0);$k[$j++]=$_.pixs;$k[$j++]=1;$k[$j++]=$_.i-1;$_.trmv();var _Lh=$k[--$j];var _Li=$k[--$j];$p(_Li,_Lh,0);$k[$j++]=$_.pixs;$k[$j++]=1;$k[$j++]=$_.i;$_.trmv();var _Ll=$k[--$j];var _Lm=$k[--$j];$p(_Lm,_Ll,0);$k[$j++]=$_.pixs;$k[$j++]=1;$k[$j++]=$_.i+1;$_.trmv();var _Lp=$k[--$j];var _Lq=$k[--$j];$p(_Lq,_Lp,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i-1;$k[$j++]=0;$_.trmv();var _Lt=$k[--$j];var _Lu=$k[--$j];$p(_Lu,_Lt,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i+1;$k[$j++]=0;$_.trmv();var _Lx=$k[--$j];var _Ly=$k[--$j];$p(_Ly,_Lx,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i-1;$k[$j++]=1;$_.trmv();var _M1=$k[--$j];var _M2=$k[--$j];$p(_M2,_M1,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=1;$_.trmv();var _M5=$k[--$j];var _M6=$k[--$j];$p(_M6,_M5,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i+1;$k[$j++]=1;$_.trmv();var _M9=$k[--$j];var _MA=$k[--$j];$p(_MA,_M9,0)}$k[$j++]=$_.pixs;$k[$j++]=$_.size-1;$k[$j++]=$_.i-1;$_.trmv();var _ME=$k[--$j];var _MF=$k[--$j];if($g(_MF,_ME)!=1){$k[$j++]=$_.pixs;$k[$j++]=$_.size-1;$k[$j++]=$_.i-1;$_.trmv();var _MK=$k[--$j];var _ML=$k[--$j];$p(_ML,_MK,0);$k[$j++]=$_.pixs;$k[$j++]=$_.size-2;$k[$j++]=$_.i-1;$_.trmv();var _MP=$k[--$j];var _MQ=$k[--$j];$p(_MQ,_MP,0);$k[$j++]=$_.pixs;$k[$j++]=$_.size-2;$k[$j++]=$_.i;$_.trmv();var _MU=$k[--$j];var _MV=$k[--$j];$p(_MV,_MU,0);$k[$j++]=$_.pixs;$k[$j++]=$_.size-2;$k[$j++]=$_.i+1;$_.trmv();var _MZ=$k[--$j];var _Ma=$k[--$j];$p(_Ma,_MZ,0);$k[$j++]=$_.pixs;$k[$j++]=$_.size-1;$k[$j++]=$_.i+1;$_.trmv();var _Me=$k[--$j];var _Mf=$k[--$j];$p(_Mf,_Me,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i-1;$k[$j++]=$_.size-1;$_.trmv();var _Mj=$k[--$j];var _Mk=$k[--$j];$p(_Mk,_Mj,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i-1;$k[$j++]=$_.size-2;$_.trmv();var _Mo=$k[--$j];var _Mp=$k[--$j];$p(_Mp,_Mo,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.size-2;$_.trmv();var _Mt=$k[--$j];var _Mu=$k[--$j];$p(_Mu,_Mt,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i+1;$k[$j++]=$_.size-2;$_.trmv();var _My=$k[--$j];var _Mz=$k[--$j];$p(_Mz,_My,0);$k[$j++]=$_.pixs;$k[$j++]=$_.i+1;$k[$j++]=$_.size-1;$_.trmv();var _N3=$k[--$j];var _N4=$k[--$j];$p(_N4,_N3,0)}}}for(var _N6=0,_N5=$_.hanxin_fpat.length-1;_N6<=_N5;_N6+=1){$_.y=_N6;for(var _N9=0,_N8=$g($_.hanxin_fpat,0).length-1;_N9<=_N8;_N9+=1){$_.x=_N9;$_.fpb=$g($g($_.hanxin_fpat,$_.y),$_.x);$_.fpb2=$g($g($_.hanxin_fpat2,$_.y),$_.x);$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.qmv();var _NM=$k[--$j];var _NN=$k[--$j];$p(_NN,_NM,$_.fpb);$k[$j++]=$_.pixs;$k[$j++]=$f($_.size-$_.x)-1;$k[$j++]=$_.y;$_.qmv();var _NT=$k[--$j];var _NU=$k[--$j];$p(_NU,_NT,$_.fpb);$k[$j++]=$_.pixs;$k[$j++]=$f($_.size-$_.x)-1;$k[$j++]=$f($_.size-$_.y)-1;$_.qmv();var _Nb=$k[--$j];var _Nc=$k[--$j];$p(_Nc,_Nb,$_.fpb);$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$f($_.size-$_.y)-1;$_.qmv();var _Ni=$k[--$j];var _Nj=$k[--$j];$p(_Nj,_Ni,$_.fpb2)}}$k[$j++]=Infinity;for(var _Nk=0,_Nl=$_.hanxin_funmap.length;_Nk<_Nl;_Nk++){var _No=$g($_.hanxin_funmap,_Nk);$k[$j++]=Infinity;$F(_No,function(){var _Nq=$k[--$j];$k[$j++]=$_.size;if(_Nq()===true){return true}$as($a(2))});var _Ns=$a();$k[$j++]=_Ns}$_.functionmap=$a();var _Nt=$_.functionmap;for(var _Nu=0,_Nv=_Nt.length;_Nu<_Nv;_Nu++){$F($g(_Nt,_Nu),function(){var _Nx=$k[--$j];$q(_Nx);$_.qmv();var _Nz=$k[--$j];$p($_.pixs,_Nz,0)})}$_.maskfuncs=$_.hanxin_maskfuncs;if($_.mask!=-1){$_.maskfuncs=$a([$g($_.hanxin_maskfuncs,$_.mask-1)]);$_.bestmaskval=$_.mask-1}$_.masks=$a($_.maskfuncs.length);for(var _O8=0,_O7=$_.masks.length-1;_O8<=_O7;_O8+=1){$_.m=_O8;$_.mask=$a($_.size*$_.size);for(var _OE=0,_OD=$_.size-1;_OE<=_OD;_OE+=1){$_.j=_OE;for(var _OH=0,_OG=$_.size-1;_OH<=_OG;_OH+=1){$_.i=_OH;$k[$j++]=$_.i+1;$k[$j++]=$_.j+1;if($g($_.maskfuncs,$_.m)()===true){break}var _ON=$k[--$j];$k[$j++]=_ON==0;$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.j;$_.qmv();var _OR=$k[--$j];var _OS=$k[--$j];var _OU=$k[--$j];$k[$j++]=_OU&&$g(_OS,_OR)==-1?1:0;$k[$j++]=$_.mask;$k[$j++]=$_.i;$k[$j++]=$_.j;$_.qmv();var _OZ=$k[$j-3];var _Oa=$k[$j-1];var _Ob=$k[$j-2];$j-=3;$p(_Ob,_Oa,_OZ)}}$p($_.masks,$_.m,$_.mask)}$_.posx=0;$_.posy=0;$_.num=0;for(;;){if($_.posy==$_.size){break}$k[$j++]=$_.pixs;$k[$j++]=$_.posx;$k[$j++]=$_.posy;$_.qmv();var _Ok=$k[--$j];var _Ol=$k[--$j];if($g(_Ol,_Ok)==-1){$k[$j++]=$bs($g($_.cws,~~($_.num/8)),-(7-$_.num%8))&1;$k[$j++]=$_.pixs;$k[$j++]=$_.posx;$k[$j++]=$_.posy;$_.qmv();var _Ou=$k[$j-3];var _Ov=$k[$j-1];var _Ow=$k[$j-2];$j-=3;$p(_Ow,_Ov,_Ou);$_.num=$_.num+1}$_.posx=$_.posx+1;if($_.posx==$_.size){$_.posx=0;$_.posy=$_.posy+1}}$_.evalfulln1n3=function(){var _P2=$k[--$j];$_.scrle=_P2;$k[$j++]="scr1";$k[$j++]=0;$F($_.scrle,function(){var _P4=$k[$j-1];if(_P4>=3){var _P5=$k[--$j];var _P6=$k[--$j];var _P7=$f(_P6+_P5*4);$k[$j++]=_P7;$k[$j++]=_P7}$j--});var _P8=$k[--$j];var _P9=$k[--$j];$_[_P9]=_P8;$_.scr3=0;for(var _PC=5,_PB=$_.scrle.length-1;_PC<=_PB;_PC+=2){$_.j=_PC;if($g($_.scrle,$_.j)%3==0){$_.fact=~~($g($_.scrle,$_.j)/3);var _PL=$G($_.scrle,$_.j-4,4);for(var _PM=0,_PN=_PL.length;_PM<_PN;_PM++){$k[$j++]=$g(_PL,_PM)==$_.fact}var _PQ=$k[--$j];var _PR=$k[--$j];var _PS=$k[--$j];var _PT=$k[--$j];if(_PT&&(_PS&&(_PR&&_PQ))){if($_.j==5||$_.j+2>=$_.scrle.length){$_.scr3=$_.scr3+50}else{if($g($_.scrle,$_.j-5)>=3||$g($_.scrle,$_.j+1)>=3){$_.scr3=$_.scr3+50}}}}}for(var _Ph=1,_Pg=$_.scrle.length-5;_Ph<=_Pg;_Ph+=2){$_.j=_Ph;if($g($_.scrle,$_.j)%3==0){$_.fact=~~($g($_.scrle,$_.j)/3);var _Pq=$G($_.scrle,$_.j+1,4);for(var _Pr=0,_Ps=_Pq.length;_Pr<_Ps;_Pr++){$k[$j++]=$g(_Pq,_Pr)==$_.fact}var _Pv=$k[--$j];var _Pw=$k[--$j];var _Px=$k[--$j];var _Py=$k[--$j];if(_Py&&(_Px&&(_Pw&&_Pv))){if($_.j==1||$_.j+6>=$_.scrle.length){$_.scr3=$_.scr3+50}else{if($g($_.scrle,$_.j-1)>=3||$g($_.scrle,$_.j+5)>=3){$_.scr3=$_.scr3+50}}}}}$k[$j++]=$_.scr1;$k[$j++]=$_.scr3};$_.evalfull=function(){var _QC=$k[--$j];$_.sym=_QC;$_.n1=0;$_.n3=0;$_.rle=$a($_.size+1);$_.lastpairs=$a($_.size);$_.thispairs=$a($_.size);$_.sizeadd1=$_.size+1;for(var _QM=0,_QL=$_.size-1;_QM<=_QL;_QM+=1){$_.i=_QM;$k[$j++]=Infinity;var _QO=$_.size;$k[$j++]=0;$k[$j++]=0;for(var _QQ=$_.i,_QR=_QO,_QP=_QO*_QO-1;_QR<0?_QQ>=_QP:_QQ<=_QP;_QQ+=_QR){var _QT=$g($_.sym,_QQ);var _QU=$k[--$j];$k[$j++]=_QT;if($eq(_QU,_QT)){var _QV=$k[--$j];$k[$j-1]+=1;$k[$j++]=_QV}else{var _QX=$k[--$j];$k[$j++]=1;$k[$j++]=_QX}}$j--;var _QZ=$m()+2;$as($G($_.rle,0,_QZ-2));$_.evalfulln1n3();var _Qc=$k[--$j];$_.n3=$f(_Qc+$_.n3);var _Qe=$k[--$j];$_.n1=$f(_Qe+$_.n1);$j--;$_.symrow=$G($_.sym,$_.i*$_.size,$_.size);$k[$j++]=Infinity;var _Qk=$_.symrow;$k[$j++]=0;$k[$j++]=0;for(var _Ql=0,_Qm=_Qk.length;_Ql<_Qm;_Ql++){var _Qn=$g(_Qk,_Ql);var _Qo=$k[--$j];$k[$j++]=_Qn;if($eq(_Qo,_Qn)){var _Qp=$k[--$j];$k[$j-1]+=1;$k[$j++]=_Qp}else{var _Qr=$k[--$j];$k[$j++]=1;$k[$j++]=_Qr}}$j--;var _Qt=$m()+2;$as($G($_.rle,0,_Qt-2));$_.evalfulln1n3();var _Qw=$k[--$j];$_.n3=$f(_Qw+$_.n3);var _Qy=$k[--$j];$_.n1=$f(_Qy+$_.n1);$j--}$k[$j++]=$f($_.n1+$_.n3)};$_.bestscore=999999999;for(var _R3=0,_R2=$_.masks.length-1;_R3<=_R2;_R3+=1){$_.m=_R3;$_.masksym=$a($_.size*$_.size);for(var _RA=0,_R9=$_.size*$_.size-1;_RA<=_R9;_RA+=1){$_.i=_RA;$p($_.masksym,$_.i,$xo($g($_.pixs,$_.i),$g($g($_.masks,$_.m),$_.i)))}if($_.masks.length!=1){$k[$j++]=$_.masksym;$_.evalfull();var _RN=$k[--$j];$_.score=_RN;if($_.score<$_.bestscore){$_.bestsym=$_.masksym;$_.bestmaskval=$_.m;$_.bestscore=$_.score}}else{$_.bestsym=$_.masksym}}$_.pixs=$_.bestsym;$_.funval=((~~(($_.size-21)/2)+20)*4+$_.eclval)*4+$_.bestmaskval;$_.fundata=$a([$flr(($_.funval&3840)/256),$flr(($_.funval&240)/16),$_.funval&15]);$k[$j++]=Infinity;var _Rb=$_.fundata;for(var _Rc=0,_Rd=_Rb.length;_Rc<_Rd;_Rc++){$k[$j++]=$g(_Rb,_Rc);$k[$j++]=4;$_.tobin();var _Rf=$k[--$j];$F(_Rf,function(){$k[$j-1]-=48})}$k[$j++]=$_.fundata;$k[$j++]=4;$k[$j++]=4;$_.rscodes();var _Ri=$k[--$j];$F(_Ri,function(){$k[$j++]=4;$_.tobin();var _Rj=$k[--$j];$F(_Rj,function(){$k[$j-1]-=48})});$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$k[$j++]=0;$k[$j++]=1;$_.funbits=$a();for(var _Rn=0,_Rm=$_.functionmap.length-1;_Rn<=_Rm;_Rn+=1){$_.i=_Rn;$F($g($_.functionmap,$_.i),function(){var _Rs=$k[--$j];$k[$j++]=$_.pixs;$q(_Rs);$_.qmv();var _Rw=$k[--$j];var _Rx=$k[--$j];$p(_Rx,_Rw,$g($_.funbits,$_.i))})}$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.size],["pixy",$_.size],["height",$_.size*$_.modunit/72],["width",$_.size*$_.modunit/72],["borderleft",3],["borderright",3],["bordertop",3],["borderbottom",3],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_dotcode(){if(!bwipp_dotcode.globals){var $__=$_;$_=bwipp_dotcode.globals={};$_.dotcode_laa=-1;$_.dotcode_lab=-2;$_.dotcode_lac=-3;$_.dotcode_bin=-4;$_.dotcode_sfa=-5;$_.dotcode_sfb=-6;$_.dotcode_sb2=-7;$_.dotcode_sb3=-8;$_.dotcode_sb4=-9;$_.dotcode_sb5=-10;$_.dotcode_sb6=-11;$_.dotcode_sfc=-12;$_.dotcode_sc2=-13;$_.dotcode_sc3=-14;$_.dotcode_sc4=-15;$_.dotcode_sc5=-16;$_.dotcode_sc6=-17;$_.dotcode_sc7=-18;$_.dotcode_bsa=-19;$_.dotcode_bsb=-20;$_.dotcode_tma=-21;$_.dotcode_tmb=-22;$_.dotcode_tmc=-23;$_.dotcode_tms=-24;$_.dotcode_fn1=-25;$_.dotcode_fn2=-26;$_.dotcode_fn3=-27;$_.dotcode_crl=-28;$_.dotcode_aim=-29;$_.dotcode_m05=-30;$_.dotcode_m06=-31;$_.dotcode_m12=-32;$_.dotcode_mac=-33;$_.laa=$_.dotcode_laa;$_.lab=$_.dotcode_lab;$_.lac=$_.dotcode_lac;$_.bin=$_.dotcode_bin;$_.sfa=$_.dotcode_sfa;$_.sfb=$_.dotcode_sfb;$_.sb2=$_.dotcode_sb2;$_.sb3=$_.dotcode_sb3;$_.sb4=$_.dotcode_sb4;$_.sb5=$_.dotcode_sb5;$_.sb6=$_.dotcode_sb6;$_.sfc=$_.dotcode_sfc;$_.sc2=$_.dotcode_sc2;$_.sc3=$_.dotcode_sc3;$_.sc4=$_.dotcode_sc4;$_.sc5=$_.dotcode_sc5;$_.sc6=$_.dotcode_sc6;$_.sc7=$_.dotcode_sc7;$_.bsa=$_.dotcode_bsa;$_.bsb=$_.dotcode_bsb;$_.tma=$_.dotcode_tma;$_.tmb=$_.dotcode_tmb;$_.tmc=$_.dotcode_tmc;$_.tms=$_.dotcode_tms;$_.fn1=$_.dotcode_fn1;$_.fn2=$_.dotcode_fn2;$_.fn3=$_.dotcode_fn3;$_.crl=$_.dotcode_crl;$_.aim=$_.dotcode_aim;$_.m05=$_.dotcode_m05;$_.m06=$_.dotcode_m06;$_.m12=$_.dotcode_m12;$_.mac=$_.dotcode_mac;$_.dotcode_charmaps=$a([$a([32,32,"00"]),$a(["!","!","01"]),$a(['"','"',"02"]),$a(["#","#","03"]),$a(["$","$","04"]),$a(["%","%","05"]),$a(["&","&","06"]),$a(["'","'","07"]),$a([40,40,"08"]),$a([41,41,"09"]),$a(["*","*","10"]),$a(["+","+","11"]),$a([",",",","12"]),$a(["-","-","13"]),$a([".",".","14"]),$a(["/","/","15"]),$a(["0","0","16"]),$a(["1","1","17"]),$a(["2","2","18"]),$a(["3","3","19"]),$a(["4","4","20"]),$a(["5","5","21"]),$a(["6","6","22"]),$a(["7","7","23"]),$a(["8","8","24"]),$a(["9","9","25"]),$a([":",":","26"]),$a([";",";","27"]),$a(["<","<","28"]),$a(["=","=","29"]),$a([">",">","30"]),$a(["?","?","31"]),$a(["@","@","32"]),$a(["A","A","33"]),$a(["B","B","34"]),$a(["C","C","35"]),$a(["D","D","36"]),$a(["E","E","37"]),$a(["F","F","38"]),$a(["G","G","39"]),$a(["H","H","40"]),$a(["I","I","41"]),$a(["J","J","42"]),$a(["K","K","43"]),$a(["L","L","44"]),$a(["M","M","45"]),$a(["N","N","46"]),$a(["O","O","47"]),$a(["P","P","48"]),$a(["Q","Q","49"]),$a(["R","R","50"]),$a(["S","S","51"]),$a(["T","T","52"]),$a(["U","U","53"]),$a(["V","V","54"]),$a(["W","W","55"]),$a(["X","X","56"]),$a(["Y","Y","57"]),$a(["Z","Z","58"]),$a(["[","[","59"]),$a([92,92,"60"]),$a(["]","]","61"]),$a(["^","^","62"]),$a(["_","_","63"]),$a([0,"`","64"]),$a([1,"a","65"]),$a([2,"b","66"]),$a([3,"c","67"]),$a([4,"d","68"]),$a([5,"e","69"]),$a([6,"f","70"]),$a([7,"g","71"]),$a([8,"h","72"]),$a([9,"i","73"]),$a([10,"j","74"]),$a([11,"k","75"]),$a([12,"l","76"]),$a([13,"m","77"]),$a([14,"n","78"]),$a([15,"o","79"]),$a([16,"p","80"]),$a([17,"q","81"]),$a([18,"r","82"]),$a([19,"s","83"]),$a([20,"t","84"]),$a([21,"u","85"]),$a([22,"v","86"]),$a([23,"w","87"]),$a([24,"x","88"]),$a([25,"y","89"]),$a([26,"z","90"]),$a([27,"{","91"]),$a([28,"|","92"]),$a([29,"}","93"]),$a([30,"~","94"]),$a([31,127,"95"]),$a([$_.sfb,$_.crl,"96"]),$a([$_.sb2,9,"97"]),$a([$_.sb3,28,"98"]),$a([$_.sb4,29,"99"]),$a([$_.sb5,30,$_.aim]),$a([$_.sb6,$_.sfa,$_.laa]),$a([$_.lab,$_.laa,$_.sfb]),$a([$_.sc2,$_.sc2,$_.sb2]),$a([$_.sc3,$_.sc3,$_.sb3]),$a([$_.sc4,$_.sc4,$_.sb4]),$a([$_.lac,$_.lac,$_.lab]),$a([$_.fn1,$_.fn1,$_.fn1]),$a([$_.fn2,$_.fn2,$_.fn2]),$a([$_.fn3,$_.fn3,$_.fn3]),$a([$_.bsa,$_.bsa,$_.bsa]),$a([$_.bsb,$_.bsb,$_.bsb]),$a([$_.bin,$_.bin,$_.bin])]);$_.dotcode_encs=$a(["101010101","010101011","010101101","010110101","011010101","101010110","101011010","101101010","110101010","010101110","010110110","010111010","011010110","011011010","011101010","100101011","100101101","100110101","101001011","101001101","101010011","101011001","101100101","101101001","110010101","110100101","110101001","001010111","001011011","001011101","001101011","001101101","001110101","010010111","010011011","010011101","010100111","010110011","010111001","011001011","011001101","011010011","011011001","011100101","011101001","100101110","100110110","100111010","101001110","101011100","101100110","101101100","101110010","101110100","110010110","110011010","110100110","110101100","110110010","110110100","111001010","111010010","111010100","001011110","001101110","001110110","001111010","010011110","010111100","011001110","011011100","011100110","011101100","011110010","011110100","100010111","100011011","100011101","100100111","100110011","100111001","101000111","101100011","101110001","110001011","110001101","110010011","110011001","110100011","110110001","111000101","111001001","111010001","000101111","000110111","000111011","000111101","001001111","001100111","001110011","001111001","010001111","011000111","011100011","011110001","100011110","100111100","101111000","110001110","110011100","110111000","111000110","111001100"]);$_.dotcode_encfuncs=$a(["encA","encB","encC","encBIN"]);$_.dotcode_maskvals=$a([0,3,7,17]);$_.dotcode_maskbits=$a(["00","01","10","11"]);$k[$j++]=Infinity;$k[$j++]=1;for(var _2b=0;_2b<112;_2b++){var _2c=$k[$j-1];$k[$j++]=_2c*3%113}var _2d=$a();$_.rsalog=_2d;$_.charvals=$a([new Map,new Map,new Map]);for(var _2f=0,_2e=$_.dotcode_charmaps.length-1;_2f<=_2e;_2f+=1){$_.i=_2f;$_.encs=$g($_.dotcode_charmaps,$_.i);for(var _2i=0;_2i<=2;_2i+=1){$_.j=_2i;var _2l=$g($_.encs,$_.j);var _2m=$t(_2l);if($eq(_2m,"stringtype")){_2l=$g(_2l,0)}$p($g($_.charvals,$_.j),_2l,$_.i)}}$_.Avals=$g($_.charvals,0);$_.Bvals=$g($_.charvals,1);$p($_.Bvals,$_.dotcode_m05,97);$p($_.Bvals,$_.dotcode_m06,98);$p($_.Bvals,$_.dotcode_m12,99);$p($_.Bvals,$_.dotcode_mac,100);$_.Bvals=$_.Bvals;$_.Cvals=$g($_.charvals,2);$_.charvals=$_.charvals;$k[$j++]=Infinity;var _36=$a([$_.dotcode_sc2,$_.dotcode_sc3,$_.dotcode_sc4,$_.dotcode_sc5,$_.dotcode_sc6,$_.dotcode_sc7,$_.dotcode_tma,$_.dotcode_tmb,$_.dotcode_tmc,$_.dotcode_tms]);$k[$j++]=102;for(var _37=0,_38=_36.length;_37<_38;_37++){var _3A=$k[--$j];var _3B=_3A+1;$k[$j++]=$g(_36,_37);$k[$j++]=_3B;$k[$j++]=_3B}$j--;var _3C=$d();$_.BINvals=_3C;$_.dotcode_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _3E=0,_3F=$_.NC;_3E<_3F;_3E++){$k[$j++]=0}$_.coeffs=$a();for(var _3I=1,_3H=$_.NC;_3I<=_3H;_3I+=1){$k[$j++]=_3I;for(var _3K=$_.NC;_3K>=1;_3K-=1){var _3L=$_.coeffs;var _3O=$k[$j-1];$p(_3L,_3K,$f($g(_3L,_3K)+113-$g($_.rsalog,_3O)*$g($_.coeffs,_3K-1)%113)%113)}$j--}for(var _3T=$_.NC;_3T>=1;_3T-=1){$k[$j++]=$g($_.coeffs,_3T)}$as($a($_.NC))};$_.dotcode_coeffscachemax=79;$_.dotcode_coeffscachelimit=3160;$k[$j++]=$_.dotcode_coeffscachemax;$k[$j++]=$_.dotcode_coeffscachelimit;bwipp_fifocache();var _3a=$k[--$j];$_.dotcode_coeffscache=_3a;$_.dotcode_coeffscachefetch=function(){var _3b=$k[--$j];$_.NC=_3b;var _3d=$g($_.dotcode_coeffscache,"fetch");$k[$j++]=$_.NC;$k[$j++]=function(){$_.dotcode_gencoeffs()};$k[$j++]=function(){var _3e=$k[--$j];$k[$j++]=_3e.length};if(_3d()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_dotcode.globals);$_.dontdraw=false;$_.rows=-1;$_.columns=-1;$_.ratio=-1;$_.parse=false;$_.parsefnc=false;$_.raw=false;$_.fast=false;$_.mask=-1;bwipp_processoptions();var _3f=$k[--$j];$_.options=_3f;var _3g=$k[--$j];$_.barcode=_3g;if($_.barcode.length>4e3){$k[$j++]="bwipp.dotcodeinputTooLong#33295";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.rows!=-1){if($_.rows<5){$k[$j++]="bwipp.dotcodeBadRows#33322";$k[$j++]="There must be at least 5 rows";bwipp_raiseerror()}}if($_.columns!=-1){if($_.columns<5){$k[$j++]="bwipp.dotcodeBadColumns#33328";$k[$j++]="There must be at least 5 columns";bwipp_raiseerror()}}if($_.rows!=-1&&$_.columns!=-1&&($_.rows+$_.columns)%2!=1){$k[$j++]="bwipp.dotcodeRowsColumnsBadParity#33333";$k[$j++]="Sum of rows and columns must be odd";bwipp_raiseerror()}if($_.ratio==-1&&$_.rows==-1&&$_.columns==-1){$_.ratio=3/2}if($_.ratio!=-1){if($_.ratio<=0){$k[$j++]="bwipp.dotcodeRatio#33344";$k[$j++]="The ratio must be greater than 0";bwipp_raiseerror()}}if($_.mask!=-1){if($_.mask<0||$_.mask>3){$k[$j++]="bwipp.dotcodeBadMask#33350";$k[$j++]="Valid mask values are 0 to 3";bwipp_raiseerror()}}$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["eci",true],["FNC1",$_.dotcode_fn1],["FNC3",$_.dotcode_fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _44=$k[--$j];$_.msg=_44;$_.msglen=$_.msg.length;$k[$j++]="numecis";$k[$j++]=0;$F($_.msg,function(){var _47=$k[--$j];if(_47<=-1e6){$k[$j-1]+=1}});var _49=$k[--$j];var _4A=$k[--$j];$_[_4A]=_49;$_.msgtmp=$a($f($_.msg.length+$_.numecis*6));$_.j=0;for(var _4G=0,_4F=$_.msg.length-1;_4G<=_4F;_4G+=1){var _4I=$g($_.msg,_4G);$k[$j++]=_4I;if(_4I<=-1e6){var _4J=$k[--$j];var _4M=$G($R($s(7),-_4J,10),1,6);for(var _4N=0,_4O=_4M.length;_4N<_4O;_4N++){$k[$j++]=$g(_4M,_4N)}$as($a(6));var _4S=$k[--$j];$P($_.msgtmp,$_.j+1,_4S);$p($_.msgtmp,$_.j,$_.dotcode_fn2);$_.j=$_.j+7}else{var _4Y=$k[--$j];$p($_.msgtmp,$_.j,_4Y);$_.j=$_.j+1}}$_.msg=$_.msgtmp;$_.msglen=$_.msg.length;$_.A=0;$_.B=1;$_.C=2;$_.BIN=3;$k[$j++]=Infinity;for(var _4e=0,_4f=$_.msglen+1;_4e<_4f;_4e++){$k[$j++]=0}$_.nDigits=$a();$k[$j++]=Infinity;for(var _4h=0,_4i=$_.msglen+1;_4h<_4i;_4h++){$k[$j++]=false}$_.SeventeenTen=$a();$k[$j++]=Infinity;for(var _4k=0,_4l=$_.msglen+1;_4k<_4l;_4k++){$k[$j++]=false}$_.ECI=$a();$k[$j++]=Infinity;for(var _4n=0,_4o=$_.msglen+1;_4n<_4o;_4n++){$k[$j++]=false}$_.DatumA=$a();$k[$j++]=Infinity;for(var _4q=0,_4r=$_.msglen+1;_4q<_4r;_4q++){$k[$j++]=false}$_.DatumB=$a();$k[$j++]=Infinity;for(var _4t=0,_4u=$_.msglen+1;_4t<_4u;_4t++){$k[$j++]=false}$_.DatumC=$a();$k[$j++]=Infinity;for(var _4w=0,_4x=$_.msglen+8;_4w<_4x;_4w++){$k[$j++]=false}$_.Binary=$a();$k[$j++]=Infinity;for(var _4z=0,_50=$_.msglen+1;_4z<_50;_4z++){$k[$j++]=0}$_.AheadC=$a();$k[$j++]=Infinity;for(var _52=0,_53=$_.msglen+1;_52<_53;_52++){$k[$j++]=0}$_.TryC=$a();$k[$j++]=Infinity;for(var _55=0,_56=$_.msglen+1;_55<_56;_55++){$k[$j++]=0}$_.AheadA=$a();$k[$j++]=Infinity;for(var _58=0,_59=$_.msglen+1;_58<_59;_58++){$k[$j++]=0}$_.AheadB=$a();$k[$j++]=Infinity;for(var _5B=0,_5C=$_.msglen+1;_5B<_5C;_5B++){$k[$j++]=0}$_.UntilEndSeg=$a();for(var _5E=$_.msglen-1;_5E>=0;_5E-=1){$_.i=_5E;$_.barchar=$g($_.msg,$_.i);if($_.barchar>=48&&$_.barchar<=57){$p($_.nDigits,$_.i,$g($_.nDigits,$_.i+1)+1)}if($has($_.Avals,$_.barchar)){$p($_.DatumA,$_.i,true)}if($has($_.Bvals,$_.barchar)){$p($_.DatumB,$_.i,true)}$_.CRLF=false;if($_.barchar==13&&$_.i<$_.msglen-1){if($g($_.msg,$_.i+1)==10){$_.CRLF=true}}if($_.CRLF){$p($_.DatumB,$_.i,true)}if($g($_.nDigits,$_.i)>=2){$p($_.DatumC,$_.i,true)}if($_.barchar<0){$p($_.DatumC,$_.i,true)}if($_.barchar>=128){$p($_.Binary,$_.i,true)}if($g($_.nDigits,$_.i)>=10){$k[$j++]=Infinity;$q($G($_.msg,$_.i,10));for(var _5z=0;_5z<1;_5z++){var _60=$k[--$j];if(_60!=48){$k[$j++]=false;break}var _61=$k[--$j];if(_61!=49){$k[$j++]=false;break}$j-=6;var _62=$k[--$j];if(_62!=55){$k[$j++]=false;break}var _63=$k[--$j];if(_63!=49){$k[$j++]=false;break}$k[$j++]=true}$k[$j++]=$_.SeventeenTen;$k[$j++]=$_.i;var _66=$k[$j-3];var _67=$k[$j-1];var _68=$k[$j-2];$j-=3;$p(_68,_67,_66);$l()}if($g($_.nDigits,$_.i+1)>=6&&$g($_.msg,$_.i)==$_.dotcode_fn2){$p($_.ECI,$_.i,true)}if($_.barchar<0&&$_.barchar!=$_.dotcode_fn3){$p($_.AheadC,$_.i,$g($_.AheadC,$_.i+1)+1)}else{if($g($_.nDigits,$_.i)<=1){$p($_.AheadC,$_.i,0)}else{$p($_.AheadC,$_.i,$g($_.AheadC,$_.i+2)+1)}}if($g($_.nDigits,$_.i)>0&&$gt($g($_.AheadC,$_.i),$g($_.AheadC,$_.i+1))){$p($_.TryC,$_.i,$g($_.AheadC,$_.i))}if($g($_.DatumA,$_.i)&&$g($_.TryC,$_.i)<2&&$_.barchar!=$_.dotcode_fn3){$p($_.AheadA,$_.i,$g($_.AheadA,$_.i+1)+1)}if($g($_.DatumB,$_.i)&&$g($_.TryC,$_.i)<2&&$_.barchar!=$_.dotcode_fn3){var _7F=$_.AheadB;var _7E=$_.i;var _7C=$_.AheadB;var _7B=$_.i+1;if($_.CRLF){_7B=_7B+1}$p(_7F,_7E,$g(_7C,_7B)+1)}if($_.barchar!=$_.dotcode_fn3){$p($_.UntilEndSeg,$_.i,$g($_.UntilEndSeg,$_.i+1)+1)}}$_.addtocws=function(){var _7M=$k[--$j];$P($_.cws,$_.j,_7M);$_.j=_7M.length+$_.j};$_.base259to103=function(){var _7Q=$k[--$j];$_.in=_7Q;$_.inlen=$_.in.length;$k[$j++]=Infinity;for(var _7T=0,_7U=5-$_.inlen;_7T<_7U;_7T++){$k[$j++]=0}$q($_.in);$_.in=$a();$_.out=$a(6);$k[$j++]=Infinity;$q($G($_.in,0,2));$_.msbs=$a();$k[$j++]=Infinity;$q($_.msbs);var _7a=$k[--$j];var _7b=$k[--$j];$k[$j++]=$f(_7a+_7b*259);for(var _7c=0;_7c<2;_7c++){var _7d=$k[--$j];$k[$j++]=_7d%103;$k[$j++]=~~(_7d/103)}$_.mscs=$a();$k[$j++]=Infinity;$q($G($_.in,2,3));$_.lsbs=$a();$k[$j++]=Infinity;$q($_.lsbs);var _7h=$k[--$j];var _7i=$k[--$j];var _7j=$k[--$j];$k[$j++]=$f(_7h+_7i*259+_7j*67081);for(var _7k=0;_7k<3;_7k++){var _7l=$k[--$j];$k[$j++]=_7l%103;$k[$j++]=~~(_7l/103)}$_.lscs=$a();var _7n=$g($_.lscs,0);var _7p=$g($_.mscs,0);$p($_.out,5,$f(_7n+_7p*42)%103);var _7s=$g($_.lscs,1);var _7u=$g($_.mscs,0);var _7w=$g($_.mscs,1);$p($_.out,4,$f(~~((_7n+_7p*42)/103)+_7s+_7u*68+_7w*42)%103);var _7z=$g($_.lscs,2);var _81=$g($_.mscs,0);var _83=$g($_.mscs,1);var _85=$g($_.mscs,2);$p($_.out,3,$f(~~((~~((_7n+_7p*42)/103)+_7s+_7u*68+_7w*42)/103)+_7z+_81*92+_83*68+_85*42)%103);var _88=$g($_.lscs,3);var _8A=$g($_.mscs,0);var _8C=$g($_.mscs,1);var _8E=$g($_.mscs,2);$p($_.out,2,$f(~~((~~((~~((_7n+_7p*42)/103)+_7s+_7u*68+_7w*42)/103)+_7z+_81*92+_83*68+_85*42)/103)+_88+_8A*15+_8C*92+_8E*68)%103);var _8H=$g($_.mscs,1);var _8J=$g($_.mscs,2);$p($_.out,1,$f(~~((~~((~~((~~((_7n+_7p*42)/103)+_7s+_7u*68+_7w*42)/103)+_7z+_81*92+_83*68+_85*42)/103)+_88+_8A*15+_8C*92+_8E*68)/103)+_8H*15+_8J*92)%103);$p($_.out,0,$f(~~((~~((~~((~~((~~((_7n+_7p*42)/103)+_7s+_7u*68+_7w*42)/103)+_7z+_81*92+_83*68+_85*42)/103)+_88+_8A*15+_8C*92+_8E*68)/103)+_8H*15+_8J*92)/103)+$g($_.mscs,2)*15)%103);$k[$j++]=$G($_.out,6-$_.inlen-1,$_.inlen+1)};$_.finaliseBIN=function(){if($_.bpos!=0){$k[$j++]=$G($_.bvals,0,$_.bpos);$_.base259to103();var _8W=$k[--$j];$q(_8W);$_.bpos=0}};$_.addtobin=function(){var _8Y=$k[--$j];$p($_.bvals,$_.bpos,_8Y);$_.bpos=$_.bpos+1;if($_.bpos==5){$_.finaliseBIN()}};$_.ECIabc=function(){var _8e=$G($_.msg,$_.i+1,6);var _8j=0;for(var _8f=0,_8g=_8e.length;_8f<_8g;_8f++){_8j=$f(_8j+($g(_8e,_8f)-48))*10}var _8k=~~(_8j/10);$k[$j++]=_8k;if(_8k>=40){var _8l=$k[--$j];var _8m=_8l-40;var _8n=_8m%12769;$k[$j++]=~~(_8m/12769)+40;$k[$j++]=~~(_8n/113);$k[$j++]=_8n%113}};$_.ECIbin=function(){$k[$j++]=Infinity;var _8q=$G($_.msg,$_.i+1,6);var _8v=0;for(var _8r=0,_8s=_8q.length;_8r<_8s;_8r++){_8v=$f(_8v+($g(_8q,_8r)-48))*10}var _8w=~~(_8v/10);$k[$j++]=_8w;if(_8w>=65536){var _8x=$k[--$j];var _8y=_8x%65536;$k[$j++]=258;$k[$j++]=~~(_8x/65536);$k[$j++]=~~(_8y/256);$k[$j++]=_8y%256}else{var _8z=$k[$j-1];if(_8z>=256){var _90=$k[--$j];$k[$j++]=257;$k[$j++]=~~(_90/256);$k[$j++]=_90%256}else{var _91=$k[--$j];$k[$j++]=256;$k[$j++]=_91}}var _92=$a();for(var _93=0,_94=_92.length;_93<_94;_93++){$k[$j++]=$g(_92,_93);$_.addtobin()}};$_.encC=function(){for(var _96=0;_96<1;_96++){if($_.i==$_.segstart){for(var _99=0;_99<1;_99++){if($_.i>$_.segend-7){$k[$j++]=0;break}if($g($_.msg,$_.segstart)!=91){$k[$j++]=0;break}if($g($_.msg,$_.segstart+1)!=41){$k[$j++]=0;break}if($g($_.msg,$_.segstart+2)!=62){$k[$j++]=0;break}if($g($_.msg,$_.segstart+3)!=30){$k[$j++]=0;break}var _9Q=$g($_.msg,$_.segstart+4);if(_9Q<48||_9Q>57){$k[$j++]=0;break}var _9T=$g($_.msg,$_.segstart+5);if(_9T<48||_9T>57){$k[$j++]=0;break}if($g($_.msg,$_.segend-1)!=4){$k[$j++]=0;break}var _9d=$f(($g($_.msg,$_.segstart+4)-48)*10+($g($_.msg,$_.segstart+5)-48));$k[$j++]=_9d;if(_9d!=5&&(_9d!=6&&_9d!=12)){$k[$j-1]=$_.dotcode_mac;break}if($g($_.msg,$_.segstart+6)!=29){$k[$j-1]=0;break}if($g($_.msg,$_.segend-2)!=30){$k[$j-1]=0;break}var _9k=$k[$j-1];if(_9k==5){$k[$j-1]=$_.dotcode_m05;break}var _9l=$k[--$j];if(_9l==6){$k[$j++]=$_.dotcode_m06;break}$k[$j++]=$_.dotcode_m12;break}var _9m=$k[--$j];$_.inmac=_9m;if($_.inmac!=0){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_lab)]);$_.addtocws();$_.mode=$_.B;$k[$j++]=$a([$g($_.Bvals,$_.inmac)]);$_.addtocws();if($_.inmac==$_.dotcode_mac){$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.segstart+4))]);$_.addtocws();$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.segstart+5))]);$_.addtocws();$_.i=$_.i+6}else{$_.i=$_.i+7}break}}if($_.i==$_.segstart){if($g($_.nDigits,$_.i)>=2){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_fn1)]);$_.addtocws()}if($g($_.msg,$_.i)==$_.dotcode_fn1&&$g($_.nDigits,$_.i+1)>=2){$_.i=$_.i+1}}if($g($_.SeventeenTen,$_.i)){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_aim),$f(($g($_.msg,$_.i+2)-48)*10+($g($_.msg,$_.i+3)-48)),$f(($g($_.msg,$_.i+4)-48)*10+($g($_.msg,$_.i+5)-48)),$f(($g($_.msg,$_.i+6)-48)*10+($g($_.msg,$_.i+7)-48))]);$_.addtocws();$_.i=$_.i+10;break}if($g($_.DatumC,$_.i)){var _Au=$g($_.msg,$_.i);if(_Au==$_.dotcode_fn1||(_Au==$_.dotcode_fn2||_Au==$_.dotcode_fn3)){$k[$j++]=$a([$g($_.Cvals,$g($_.msg,$_.i))]);$_.addtocws();if($g($_.ECI,$_.i)){$k[$j++]=Infinity;$_.ECIabc();var _B4=$a();$k[$j++]=_B4;$_.addtocws();$_.i=$_.i+7;break}if($g($_.msg,$_.i)==$_.dotcode_fn3&&$_.segstart!=$_.i){$_.i=$_.i+1;$_.inmac=0;$_.segstart=$_.i;$_.segend=$f($_.i+$g($_.UntilEndSeg,$_.i));break}$_.i=$_.i+1;break}$k[$j++]=$a([$f(($g($_.msg,$_.i)-48)*10+($g($_.msg,$_.i+1)-48))]);$_.addtocws();$_.i=$_.i+2;break}if($g($_.Binary,$_.i)){if($g($_.nDigits,$_.i+1)>0){if($g($_.msg,$_.i)<160){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_bsa),$g($_.Avals,$g($_.msg,$_.i)-128)]);$_.addtocws()}else{$k[$j++]=$a([$g($_.Cvals,$_.dotcode_bsb),$g($_.Bvals,$g($_.msg,$_.i)-128)]);$_.addtocws()}$_.i=$_.i+1;break}$k[$j++]=$a([$g($_.Cvals,$_.dotcode_bin)]);$_.addtocws();$_.mode=$_.BIN;break}$_.m=$g($_.AheadA,$_.i);$_.n=$g($_.AheadB,$_.i);if($gt($_.m,$_.n)){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_laa)]);$_.addtocws();$_.mode=$_.A;break}if($_.i==$_.segstart){var _CA=$g($_.msg,$_.i);if(_CA==9||(_CA==28||(_CA==29||_CA==30))){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_laa)]);$_.addtocws();$_.mode=$_.A;break}}if($_.n>4){$k[$j++]=$a([$g($_.Cvals,$_.dotcode_lab)]);$_.addtocws();$_.mode=$_.B;break}$k[$j++]=$a([$g($_.Cvals,$g($a([$_.dotcode_sfb,$_.dotcode_sb2,$_.dotcode_sb3,$_.dotcode_sb4]),$_.n-1))]);$_.addtocws();for(var _CR=0,_CS=$_.n;_CR<_CS;_CR++){if($g($_.msg,$_.i)==13){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_crl)]);$_.addtocws();$_.i=$_.i+2}else{$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1}}break}};$_.encB=function(){for(var _Ch=0;_Ch<1;_Ch++){$_.n=$g($_.TryC,$_.i);if($_.n>=2){if($_.n>4){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_lac)]);$_.addtocws();$_.mode=$_.C;break}$k[$j++]=$a([$g($_.Bvals,$g($a([$_.dotcode_sfc,$_.dotcode_sc2,$_.dotcode_sc3,$_.dotcode_sc4]),$_.n-1))]);$_.addtocws();for(var _Cy=0,_Cz=$_.n;_Cy<_Cz;_Cy++){if($g($_.msg,$_.i)<0){$k[$j++]=$a([$g($_.Cvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1}else{$k[$j++]=$a([$f(($g($_.msg,$_.i)-48)*10+($g($_.msg,$_.i+1)-48))]);$_.addtocws();$_.i=$_.i+2}}break}if($g($_.DatumB,$_.i)){var _DN=$g($_.msg,$_.i);if(_DN==$_.dotcode_fn1||(_DN==$_.dotcode_fn2||_DN==$_.dotcode_fn3)){$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.i))]);$_.addtocws();if($g($_.ECI,$_.i)){$k[$j++]=Infinity;$_.ECIabc();var _DX=$a();$k[$j++]=_DX;$_.addtocws();$_.i=$_.i+7;break}if($g($_.msg,$_.i)==$_.dotcode_fn3&&$_.i!=$_.segstart){$_.i=$_.i+1;$_.mode=$_.C;$_.inmac=0;$_.segstart=$_.i;$_.segend=$f($_.i+$g($_.UntilEndSeg,$_.i));break}$_.i=$_.i+1;break}if($g($_.msg,$_.i)==13&&$_.i<$_.msglen-1){if($g($_.msg,$_.i+1)==10){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_crl)]);$_.addtocws();$_.i=$_.i+2;break}}$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1;break}if($g($_.Binary,$_.i)){if($g($_.DatumB,$_.i+1)){if($g($_.msg,$_.i)<160){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_bsa),$g($_.Avals,$g($_.msg,$_.i)-128)]);$_.addtocws()}else{$k[$j++]=$a([$g($_.Bvals,$_.dotcode_bsb),$g($_.Bvals,$g($_.msg,$_.i)-128)]);$_.addtocws()}$_.i=$_.i+1;break}$k[$j++]=$a([$g($_.Bvals,$_.dotcode_bin)]);$_.addtocws();$_.mode=$_.BIN;break}if($g($_.AheadA,$_.i)==1){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_sfa),$g($_.Avals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1;break}$k[$j++]=$a([$g($_.Bvals,$_.dotcode_laa)]);$_.addtocws();$_.mode=$_.A;break}};$_.encA=function(){for(var _Ep=0;_Ep<1;_Ep++){$_.n=$g($_.TryC,$_.i);if($_.n>=2){if($_.n>4){$k[$j++]=$a([$g($_.Avals,$_.dotcode_lac)]);$_.addtocws();$_.mode=$_.C;break}$k[$j++]=$a([$g($_.Avals,$g($a([$_.dotcode_sfc,$_.dotcode_sc2,$_.dotcode_sc3,$_.dotcode_sc4]),$_.n-1))]);$_.addtocws();for(var _F6=0,_F7=$_.n;_F6<_F7;_F6++){if($g($_.msg,$_.i)<0){$k[$j++]=$a([$g($_.Cvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1}else{$k[$j++]=$a([$f(($g($_.msg,$_.i)-48)*10+($g($_.msg,$_.i+1)-48))]);$_.addtocws();$_.i=$_.i+2}}break}if($g($_.DatumA,$_.i)){var _FV=$g($_.msg,$_.i);if(_FV==$_.dotcode_fn1||(_FV==$_.dotcode_fn2||_FV==$_.dotcode_fn3)){$k[$j++]=$a([$g($_.Avals,$g($_.msg,$_.i))]);$_.addtocws();if($g($_.ECI,$_.i)){$k[$j++]=Infinity;$_.ECIabc();var _Ff=$a();$k[$j++]=_Ff;$_.addtocws();$_.i=$_.i+7;break}if($g($_.msg,$_.i)==$_.dotcode_fn3&&$_.i!=$_.segstart){$_.i=$_.i+1;$_.mode=$_.C;$_.inmac=0;$_.segstart=$_.i;$_.segend=$f($_.i+$g($_.UntilEndSeg,$_.i));break}$_.i=$_.i+1;break}$k[$j++]=$a([$g($_.Avals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1;break}if($g($_.Binary,$_.i)){if($g($_.DatumA,$_.i+1)){if($g($_.msg,$_.i)<160){$k[$j++]=$a([$g($_.Avals,$_.dotcode_bsa),$g($_.Avals,$g($_.msg,$_.i)-128)]);$_.addtocws()}else{$k[$j++]=$a([$g($_.Avals,$_.dotcode_bsb),$g($_.Bvals,$g($_.msg,$_.i)-128)]);$_.addtocws()}$_.i=$_.i+1;break}$k[$j++]=$a([$g($_.Avals,$_.dotcode_bin)]);$_.addtocws();$_.mode=$_.BIN;break}$_.n=$g($_.AheadB,$_.i);if($_.n>6){$k[$j++]=$a([$g($_.Avals,$_.dotcode_lab)]);$_.addtocws();$_.mode=$_.B;break}$k[$j++]=$a([$g($_.Avals,$g($a([$_.dotcode_sfb,$_.dotcode_sb2,$_.dotcode_sb3,$_.dotcode_sb4,$_.dotcode_sb5,$_.dotcode_sb6]),$_.n-1))]);$_.addtocws();for(var _Gk=0,_Gl=$_.n;_Gk<_Gl;_Gk++){if($g($_.msg,$_.i)==13){$k[$j++]=$a([$g($_.Bvals,$_.dotcode_crl)]);$_.addtocws();$_.i=$_.i+2}else{$k[$j++]=$a([$g($_.Bvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1}}break}};$_.encBIN=function(){for(var _H0=0;_H0<1;_H0++){$_.n=$g($_.TryC,$_.i);if($_.n>=2){$k[$j++]=Infinity;$_.finaliseBIN();var _H5=$a();$k[$j++]=_H5;$_.addtocws();if($_.n>7){$k[$j++]=$a([$g($_.BINvals,$_.dotcode_tmc)]);$_.addtocws();$_.mode=$_.C;break}$k[$j++]=$a([$g($_.BINvals,$g($a([$_.dotcode_sc2,$_.dotcode_sc3,$_.dotcode_sc4,$_.dotcode_sc5,$_.dotcode_sc6,$_.dotcode_sc7]),$_.n-2))]);$_.addtocws();for(var _HI=0,_HJ=$_.n;_HI<_HJ;_HI++){if($g($_.msg,$_.i)<0){$k[$j++]=$a([$g($_.Cvals,$g($_.msg,$_.i))]);$_.addtocws();$_.i=$_.i+1}else{$k[$j++]=$a([$f(($g($_.msg,$_.i)-48)*10+($g($_.msg,$_.i+1)-48))]);$_.addtocws();$_.i=$_.i+2}}break}if($g($_.ECI,$_.i)&&$g($_.Binary,$_.i+7)){$k[$j++]=Infinity;$_.ECIbin();var _Hi=$a();$k[$j++]=_Hi;$_.addtocws();$_.i=$_.i+7;if($_.i==$_.msglen){$k[$j++]=Infinity;$_.finaliseBIN();var _Hm=$a();$k[$j++]=_Hm;$_.addtocws()}break}if($g($_.msg,$_.i)>=0){if($g($_.Binary,$_.i)||$g($_.Binary,$_.i+1)||$g($_.Binary,$_.i+2)||$g($_.Binary,$_.i+3)||$g($_.ECI,$_.i+1)&&$g($_.Binary,$_.i+8)){$k[$j++]=Infinity;$k[$j++]=$g($_.msg,$_.i);$_.addtobin();var _IB=$a();$k[$j++]=_IB;$_.addtocws();$_.i=$_.i+1;if($_.i==$_.msglen){$k[$j++]=Infinity;$_.finaliseBIN();var _IF=$a();$k[$j++]=_IF;$_.addtocws()}break}}$k[$j++]=Infinity;$_.finaliseBIN();var _IG=$a();$k[$j++]=_IG;$_.addtocws();if($g($_.msg,$_.i)==$_.dotcode_fn3&&$_.i!=$_.segstart){$k[$j++]=$a([$g($_.BINvals,$_.dotcode_tms)]);$_.addtocws();$_.i=$_.i+1;$_.mode=$_.C;$_.inmac=0;$_.segstart=$_.i;$_.segend=$f($_.i+$g($_.UntilEndSeg,$_.i));break}if($gt($g($_.AheadA,$_.i),$g($_.AheadB,$_.i))){$k[$j++]=$a([$g($_.BINvals,$_.dotcode_tma)]);$_.addtocws();$_.mode=$_.A}else{$k[$j++]=$a([$g($_.BINvals,$_.dotcode_tmb)]);$_.addtocws();$_.mode=$_.B}break}};$_.cws=$a($_.msglen*2+1);$_.mode=$_.C;$_.bvals=$a(5);$_.bpos=0;$_.inmac=0;$_.segstart=0;$_.segend=$g($_.UntilEndSeg,0);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.msglen){break}if($_.inmac!=0){if($_.inmac!=$_.dotcode_mac&&$_.i==$_.segend-2){$_.i=$_.i+2;if($_.i>=$_.msglen){break}}if($_.inmac==$_.dotcode_mac&&$_.i==$_.segend-1){$_.i=$_.i+1;if($_.i>=$_.msglen){break}}}var _J7=$_[$g($_.dotcode_encfuncs,$_.mode)];if(_J7()===true){break}}$_.cws=$G($_.cws,0,$_.j);$_.nd=$_.cws.length;$_.minarea=(($_.nd+3+~~($_.nd/2))*9+2)*2;if($_.ratio!=-1){$_.hgt=$sqrt($_.minarea/$_.ratio);$_.wid=$sqrt($_.minarea*$_.ratio);$_.h=~~$_.hgt;$_.w=~~$_.wid;if(($_.h+$_.w)%2==1){if($_.h*$_.w<$_.minarea){$_.h=$_.h+1;$_.w=$_.w+1}}else{if($_.hgt*$_.w<$_.wid*$_.h){$_.w=$_.w+1;if($_.h*$_.w<$_.minarea){$_.w=$_.w-1;$_.h=$_.h+1;if($_.h*$_.w<$_.minarea){$_.w=$_.w+2}}}else{$_.h=$_.h+1;if($_.h*$_.w<$_.minarea){$_.h=$_.h-1;$_.w=$_.w+1;if($_.h*$_.w<$_.minarea){$_.h=$_.h+2}}}}$_.rows=$_.h;$_.columns=$_.w}else{if($_.columns==-1){var _Jw=~~(($_.minarea+$_.rows-1)/$_.rows);if((_Jw+$_.rows)%2==0){_Jw=_Jw+1}$_.columns=_Jw;if($_.columns<5){var _K5=5;if($_.rows!=-1){_K5=$f(_K5+$_.rows%2)}$_.columns=_K5}}if($_.rows==-1){var _KB=~~(($_.minarea+$_.columns-1)/$_.columns);if((_KB+$_.columns)%2==0){_KB=_KB+1}$_.rows=_KB;if($_.rows<5){$_.rows=5+$_.columns%2}}}$_.ndots=~~($_.rows*$_.columns/2);for(;;){var _KL=$_.nd+1;if((_KL+(~~(_KL/2)+3))*9+2>$_.ndots){break}$_.nd=$_.nd+1}$_.nc=~~($_.nd/2)+3;$_.nw=$_.nd+$_.nc;$_.rembits=$_.ndots-($_.nw*9+2);if($_.nd>$_.cws.length){$k[$j++]=Infinity;$q($_.cws);$k[$j++]=$_.mode==$_.BIN?109:106;for(var _Kb=0,_Kc=$_.nd-$_.cws.length-1;_Kb<_Kc;_Kb++){$k[$j++]=106}$_.cws=$a()}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#33962";$k[$j++]=$_.cws;bwipp_raiseerror()}if($_.nw*9>$_.ndots-2){$k[$j++]="bwipp.dotcodeTooLong#33968";$k[$j++]="Maximum length exceeded";bwipp_raiseerror()}if($_.rows%2==0){$_.sixedges=$a([$a([$_.columns-1,$_.rows-2]),$a([0,$_.rows-2]),$a([$_.columns-2,$_.rows-1]),$a([1,$_.rows-1]),$a([$_.columns-1,0]),$a([0,0])])}else{$_.sixedges=$a([$a([$_.columns-2,0]),$a([$_.columns-2,$_.rows-1]),$a([$_.columns-1,1]),$a([$_.columns-1,$_.rows-2]),$a([0,0]),$a([0,$_.rows-1])])}$_.dmv=function(){var _LA=$k[--$j];var _LB=$k[--$j];$k[$j++]=$f(_LB+_LA*$_.columns)};$k[$j++]=$_.rows*$_.columns;try{var _LE=$k[--$j];$k[$j++]=$a(_LE);var _LG=false}catch(e){$k[$j++]=true}if(_LG){$k[$j-1]="bwipp.dotcodeSymbolTooLarge#34002";$k[$j++]="The resulting symbol exceeds the implementation maximum array size";bwipp_raiseerror()}var _LH=$k[--$j];$_.outline=_LH;for(var _LK=0,_LJ=$_.rows-1;_LK<=_LJ;_LK+=1){$_.y=_LK;for(var _LN=0,_LM=$_.columns-1;_LN<=_LM;_LN+=1){$_.x=_LN;$k[$j++]=$_.outline;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.dmv();var _LT=$k[--$j];var _LU=$k[--$j];$p(_LU,_LT,($_.x+$_.y)%2-1)}}var _LV=$_.sixedges;for(var _LW=0,_LX=_LV.length;_LW<_LX;_LW++){$k[$j++]=$_.outline;$q($g(_LV,_LW));$_.dmv();var _La=$k[--$j];var _Lb=$k[--$j];$p(_Lb,_La,1)}$_.clearcol=function(){var _Lc=$k[--$j];$_.x=_Lc;$k[$j++]=true;for(var _Lg=$_.x&1,_Lf=$_.rows-1;_Lg<=_Lf;_Lg+=2){$k[$j++]=$_.x;$k[$j++]=_Lg;$_.dmv();var _Lj=$k[--$j];if($g($_.sym,_Lj)==1){$k[$j-1]=false;break}}};$_.clearrow=function(){var _Ll=$k[--$j];$_.y=_Ll;$k[$j++]=true;for(var _Lp=$_.y&1,_Lo=$_.columns-1;_Lp<=_Lo;_Lp+=2){$k[$j++]=_Lp;$k[$j++]=$_.y;$_.dmv();var _Ls=$k[--$j];if($g($_.sym,_Ls)==1){$k[$j-1]=false;break}}};$_.evalsymbol=function(){var _Lu=$k[--$j];$_.sym=_Lu;$_.worst=9999999;var _Lz=$a([$a(["x",0]),$a(["x",1]),$a(["y",0]),$a(["y",1])]);for(var _M0=0,_M1=_Lz.length;_M0<_M1;_M0++){$q($g(_Lz,_M0));var _M3=$k[--$j];$_.fl=_M3;var _M4=$k[--$j];$_.dir=_M4;$_.sum=0;$_.first=-1;$_.last=-1;var _M6=$eq($_.dir,"x")?$_.columns:$_.rows;for(var _M8=0,_M7=_M6-1;_M8<=_M7;_M8+=1){$_[$_.dir]=_M8;var _MA=$_.sym;var _MC=$_[$_.dir];var _ME=$eq($_.dir,"x")?$_.rows:$_.columns;var _MH=(_ME-1)*$_.fl;if($eq($_.dir,"y")){var _=_MH;_MH=_MC;_MC=_}$k[$j++]=_MA;$k[$j++]=_MC;$k[$j++]=_MH;$_.dmv();var _MI=$k[--$j];var _MJ=$k[--$j];if($g(_MJ,_MI)==1){if($_.first==-1){var _MN=$_[$_.dir];$_.first=_MN}var _MP=$_[$_.dir];$_.last=_MP;$_.sum=$_.sum+1}}var _MV=$eq($_.dir,"x")?$_.rows:$_.columns;var _MW=$f($_.sum+$_.last-$_.first)*_MV;$k[$j++]=_MW;if(_MW<$_.worst){var _MY=$k[--$j];$_.worst=_MY}else{$j--}}$_.pen=0;if($_.rows%2==1||$_.rows<=12){$_.sum=0;$_.p=0;for(var _Md=1,_Mc=$_.columns-2;_Md<=_Mc;_Md+=1){$k[$j++]=_Md;$_.clearcol();var _Me=$k[--$j];if(_Me){$_.sum=$_.sum+1;var _Mk=$_.sum==1?$_.rows:$_.p*$_.rows;$_.p=_Mk}else{$_.sum=0;$_.pen=$_.pen+$_.p;$_.p=0}}$_.pen=$_.pen+$_.p}if($_.rows%2==0||$_.columns<=12){$_.sum=0;$_.p=0;for(var _Mu=1,_Mt=$_.rows-2;_Mu<=_Mt;_Mu+=1){$k[$j++]=_Mu;$_.clearrow();var _Mv=$k[--$j];if(_Mv){$_.sum=$_.sum+1;var _N1=$_.sum==1?$_.columns:$_.p*$_.columns;$_.p=_N1}else{$_.sum=0;$_.pen=$_.pen+$_.p;$_.p=0}}$_.pen=$_.pen+$_.p}$k[$j++]=Infinity;for(var _N8=0,_N9=($_.columns+4)*2;_N8<_N9;_N8++){$k[$j++]=0}for(var _ND=0,_NE=$_.columns,_NC=$_.sym.length-1;_NE<0?_ND>=_NC:_ND<=_NC;_ND+=_NE){$k[$j++]=0;$k[$j++]=0;$q($G($_.sym,_ND,$_.columns));$k[$j++]=0;$k[$j++]=0}for(var _NJ=0,_NK=($_.columns+4)*2;_NJ<_NK;_NJ++){$k[$j++]=0}$_.symp=$a();$_.columns=$_.columns+4;$_.rows=$_.rows+4;$_.sum=0;for(var _NP=2,_NO=$_.rows-3;_NP<=_NO;_NP+=1){$_.y=_NP;for(var _NT=($_.y&1)+2,_NS=$_.columns-3;_NT<=_NS;_NT+=2){$_.x=_NT;for(var _NU=0;_NU<1;_NU++){$k[$j++]=$_.symp;$k[$j++]=$_.x-1;$k[$j++]=$_.y-1;$_.dmv();var _NY=$k[--$j];var _NZ=$k[--$j];if($g(_NZ,_NY)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x+1;$k[$j++]=$_.y-1;$_.dmv();var _Ne=$k[--$j];var _Nf=$k[--$j];if($g(_Nf,_Ne)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x-1;$k[$j++]=$_.y+1;$_.dmv();var _Nk=$k[--$j];var _Nl=$k[--$j];if($g(_Nl,_Nk)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x+1;$k[$j++]=$_.y+1;$_.dmv();var _Nq=$k[--$j];var _Nr=$k[--$j];if($g(_Nr,_Nq)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.dmv();var _Nw=$k[--$j];var _Nx=$k[--$j];if($g(_Nx,_Nw)==0){$_.sum=$_.sum+1;break}$k[$j++]=$_.symp;$k[$j++]=$_.x-2;$k[$j++]=$_.y;$_.dmv();var _O3=$k[--$j];var _O4=$k[--$j];if($g(_O4,_O3)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x;$k[$j++]=$_.y-2;$_.dmv();var _O9=$k[--$j];var _OA=$k[--$j];if($g(_OA,_O9)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x+2;$k[$j++]=$_.y;$_.dmv();var _OF=$k[--$j];var _OG=$k[--$j];if($g(_OG,_OF)==1){break}$k[$j++]=$_.symp;$k[$j++]=$_.x;$k[$j++]=$_.y+2;$_.dmv();var _OL=$k[--$j];var _OM=$k[--$j];if($g(_OM,_OL)==1){break}$_.sum=$_.sum+1}}}$_.columns=$_.columns-4;$_.rows=$_.rows-4;if($_.worst==0){$k[$j++]=-99999}else{$k[$j++]=$f($_.worst-$_.sum*$_.sum-$_.pen)}};$_.step=~~($_.nw/112)+1;$_.offset=function(){var _OY=$k[--$j];$k[$j++]=$f(_OY*$_.step+$_.start)};$_.bestscore=-99999999;$k[$j++]="masks";if($_.mask!=-1){$k[$j++]=$a([$_.mask])}else{if($_.fast){$k[$j++]=$a([3,2,1,0])}else{$k[$j++]=$a([0,1,2,3])}}var _Og=$k[--$j];var _Oh=$k[--$j];$_[_Oh]=_Og;$_.litmasks=$a(4);$F($_.masks,function(){var _Ok=$k[--$j];$_.mask=_Ok;$k[$j++]=Infinity;var _Oo=$_.cws;$k[$j++]=$_.mask;$k[$j++]=$g($_.dotcode_maskvals,$_.mask);$k[$j++]=0;for(var _Op=0,_Oq=_Oo.length;_Op<_Oq;_Op++){var _Os=$k[--$j];var _Ot=$k[--$j];$k[$j++]=$f($g(_Oo,_Op)+_Os)%113;$k[$j++]=_Ot;$k[$j++]=$f(_Os+_Ot)}$j-=2;for(var _Ov=0,_Ow=$_.nc;_Ov<_Ow;_Ov++){$k[$j++]=0}$_.rscws=$a();for(var _Oz=0,_Oy=$_.step-1;_Oz<=_Oy;_Oz+=1){$_.start=_Oz;$_.ND=~~(($_.nd+1-$_.start+$_.step-1)/$_.step);$_.NW=~~(($_.nw+1-$_.start+$_.step-1)/$_.step);$_.NC=$_.NW-$_.ND;$k[$j++]="coeffs";$k[$j++]=$_.NC;$_.dotcode_coeffscachefetch();var _PB=$k[--$j];var _PC=$k[--$j];$_[_PC]=_PB;$_.lfsr=$a($_.NC);var _PF=$_.ND;var _PG=$_.coeffs;var _PH=$_.NC;var _PI=$_.lfsr;$k[$j++]=function(){var _PK=$k[--$j];$k[$j++]=$g($_.rscws,$f(_PK*$_.step+$_.start))};$k[$j++]=_PF;$k[$j++]=_PG;$k[$j++]=_PH;$k[$j++]=_PI;$k[$j++]=113;bwipp_rsecprime();for(var _PQ=0,_PP=$_.NC-1;_PQ<=_PP;_PQ+=1){$_.j=_PQ;$k[$j++]=$_.rscws;$k[$j++]=$_.ND+$_.j;$_.offset();var _PX=$k[--$j];var _PY=$k[--$j];$p(_PY,_PX,$g($_.lfsr,$_.j))}}if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#34212";$k[$j++]=$_.rscws;bwipp_raiseerror()}$_.bits=$s($_.ndots);$P($_.bits,0,$g($_.dotcode_maskbits,$_.mask));for(var _Pj=1,_Pi=$_.nw;_Pj<=_Pi;_Pj+=1){$_.i=_Pj;$P($_.bits,($_.i-1)*9+2,$g($_.dotcode_encs,$g($_.rscws,$_.i)))}if($_.rembits>0){$P($_.bits,$_.nw*9+2,$G("11111111111111111",0,$_.rembits))}var _Pv=$_.outline;$_.pixs=$A($a(_Pv.length),_Pv);$_.posx=0;var _Q0=$_.rows%2==0?0:$_.rows-1;$_.posy=_Q0;var _Q4=$G($_.bits,0,$_.bits.length-6);for(var _Q5=0,_Q6=_Q4.length;_Q5<_Q6;_Q5++){$k[$j++]=$g(_Q4,_Q5);for(;;){$k[$j++]=$_.pixs;$k[$j++]=$_.posx;$k[$j++]=$_.posy;$_.dmv();var _QB=$k[--$j];var _QC=$k[--$j];if($g(_QC,_QB)==-1){break}if($_.rows%2==0){$_.posy=$_.posy+1;if($_.posy==$_.rows){$_.posy=0;$_.posx=$_.posx+1}}else{$_.posx=$_.posx+1;if($_.posx==$_.columns){$_.posx=0;$_.posy=$_.posy-1}}}$k[$j++]=$_.pixs;$k[$j++]=$_.posx;$k[$j++]=$_.posy;$_.dmv();var _QQ=$k[$j-3];var _QR=$k[$j-1];var _QS=$k[$j-2];$j-=3;$p(_QS,_QR,_QQ-48)}for(var _QT=0;_QT<=5;_QT+=1){$_.i=_QT;$k[$j++]=$_.pixs;$q($g($_.sixedges,$_.i));$_.dmv();var _Qb=$g($_.bits,$_.bits.length-6+$_.i);var _Qc=$k[--$j];var _Qd=$k[--$j];$p(_Qd,_Qc,_Qb-48)}$k[$j++]="score";$k[$j++]=$_.pixs;$_.evalsymbol();var _Qf=$k[--$j];var _Qg=$k[--$j];$_[_Qg]=_Qf;if($_.score>$_.bestscore){$_.bestsym=$_.pixs;$_.bestscore=$_.score;if($_.fast&&$_.bestscore>~~($_.rows*$_.columns/2)){return true}}var _Qp=$_.pixs;$_.litmask=$A($a(_Qp.length),_Qp);for(var _Qs=0;_Qs<=5;_Qs+=1){$_.i=_Qs;$k[$j++]=$_.litmask;$q($g($_.sixedges,$_.i));$_.dmv();var _Qx=$k[--$j];var _Qy=$k[--$j];$p(_Qy,_Qx,1)}$p($_.litmasks,$_.mask,$_.litmask);if($_.fast){$k[$j++]="score";$k[$j++]=$_.litmask;$_.evalsymbol();var _R4=$k[--$j];var _R5=$k[--$j];$_[_R5]=_R4;if($gt($_.score,$_.bestscore)){$_.bestsym=$_.litmask;$_.bestscore=$_.score;if($_.bestscore>~~($_.rows*$_.columns/2)){return true}}}});$_.pixs=$_.bestsym;if(!$_.fast&&$_.bestscore<=~~($_.rows*$_.columns/2)){$_.bestscore=-99999999;$F($_.masks,function(){var _RK=$k[--$j];$_.litmask=$g($_.litmasks,_RK);$k[$j++]="score";$k[$j++]=$_.litmask;$_.evalsymbol();var _RN=$k[--$j];var _RO=$k[--$j];$_[_RO]=_RN;if($_.score>$_.bestscore){$_.bestsym=$_.litmask;$_.bestscore=$_.score}});$_.pixs=$_.bestsym}$k[$j++]=new Map([["ren","renmatrix"],["dotty",true],["pixs",$_.pixs],["pixx",$_.columns],["pixy",$_.rows],["height",$_.rows*$_.modunit/72],["width",$_.columns*$_.modunit/72],["borderleft",3],["borderright",3],["bordertop",3],["borderbottom",3],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_ultracode(){if(!bwipp_ultracode.globals){var $__=$_;$_=bwipp_ultracode.globals={};$_.ultracode_metrics=$a([$a([2,7,37,5]),$a([3,36,84,13]),$a([4,85,161,22]),$a([5,142,282,29])]);$_.ultracode_tiles=$a([13135,13136,13153,13156,13163,13165,13513,13515,13516,13531,13535,13536,13561,13563,13565,13613,13615,13616,13631,13635,13636,13651,13653,13656,15135,15136,15153,15163,15165,15313,15315,15316,15351,15353,15356,15361,15363,15365,15613,15615,15616,15631,15635,15636,15651,15653,15656,16135,16136,16153,16156,16165,16313,16315,16316,16351,16353,16356,16361,16363,16365,16513,16515,16516,16531,16535,16536,16561,16563,16565,31315,31316,31351,31356,31361,31365,31513,31515,31516,31531,31535,31536,31561,31563,31565,31613,31615,31631,31635,31636,31651,31653,31656,35131,35135,35136,35151,35153,35156,35161,35163,35165,35315,35316,35351,35356,35361,35365,35613,35615,35616,35631,35635,35636,35651,35653,35656,36131,36135,36136,36151,36153,36156,36163,36165,36315,36316,36351,36356,36361,36365,36513,36515,36516,36531,36535,36536,36561,36563,36565,51313,51315,51316,51351,51353,51356,51361,51363,51365,51513,51516,51531,51536,51561,51563,51613,51615,51616,51631,51635,51636,51651,51653,51656,53131,53135,53136,53151,53153,53156,53161,53163,53165,53513,53516,53531,53536,53561,53563,53613,53615,53616,53631,53635,53636,53651,53653,53656,56131,56135,56136,56151,56153,56156,56161,56163,56165,56313,56315,56316,56351,56353,56356,56361,56363,56365,56513,56516,56531,56536,56561,56563,61313,61315,61316,61351,61353,61356,61361,61363,61365,61513,61515,61516,61531,61535,61536,61561,61563,61565,61615,61631,61635,61651,61653,63131,63135,63136,63151,63153,63156,63161,63163,63165,63513,63515,63516,63531,63535,63536,63561,63563,63565,63613,63615,63631,63635,63651,63653,65131,65135,65136,65151,65153,65156,65161,65163,65165,65313,65315,65316,65351,65353,65356,65361,65363,65365,65613,65615,65631,65635,65651,65653,56565,51515]);$_.ultracode_dccurev1=$a([51363,51563,51653,53153,53163,53513,53563,53613,53653,56153,56163,56313,56353,56363,56513,56563,51316,51356,51536,51616,53156,53516,53536,53616,53636,53656,56136,56156,56316,56356,56516,56536]);$_.ultracode_dcclrev1=$a([61351,61361,61531,61561,61631,61651,63131,63151,63161,63531,63561,63631,65131,65161,65351,65631,31351,31361,31531,31561,31631,31651,35131,35151,35161,35361,35631,35651,36131,36151,36351,36531]);$_.ultracode_dccurev2=$a([15316,16316,13516,16516,13616,15616,13136,15136,16136,13536,16536,13636,13156,16156,15356,13656,15313,16313,13513,16513,13613,15613,13153,15153,16153,16353,13653,15653,13163,15163,15363,13563]);$_.ultracode_dcclrev2=$a([36315,36515,35615,35135,36135,31535,36535,31635,35635,35165,36165,31365,35365,36365,31565,36565,61315,65315,63515,61615,65135,61535,63535,61635,63635,65635,63165,65165,61365,65365,61565,63565]);var _A=new Map([[0,"FFFFFF"],[9,"000000"],[1,"00FFFF"],[3,"FF00FF"],[5,"FFFF00"],[6,"00FF00"]]);$_.ultracode_colormap=_A;$_.ultracode_qccfact=$a([0,1,2,4,6,8]);$k[$j++]=Infinity;$k[$j++]=1;for(var _C=0;_C<282;_C++){var _D=$k[$j-1];$k[$j++]=_D*3%283}var _E=$a();$_.rsalog=_E;$_.rslog=$a(283);for(var _G=1;_G<=282;_G+=1){$p($_.rslog,$g($_.rsalog,_G),_G)}$_.rslog=$_.rslog;$_.ultracode_rsprod=function(){var _L=$k[$j-1];if(_L!=0){var _N=$k[$j-2];if(_N!=0){var _P=$k[--$j];var _R=$k[--$j];$k[$j++]=$g($_.rsalog,$f($g($_.rslog,_P)+$g($_.rslog,_R))%282)}else{$j-=2;$k[$j++]=0}}else{$j-=2;$k[$j++]=0}};$_.ultracode_gencoeffs=function(){$k[$j++]=Infinity;$k[$j++]=1;for(var _X=0,_Y=$_.k;_X<_Y;_X++){$k[$j++]=0}$_.coeffs=$a();for(var _b=1,_a=$_.k;_b<=_a;_b+=1){var _c=$_.coeffs;$p(_c,_b,$g(_c,_b-1));$k[$j++]=$g($_.rsalog,_b);for(var _g=_b-1;_g>=1;_g-=1){var _h=$_.coeffs;var _j=$k[$j-1];$k[$j++]=_h;$k[$j++]=_g;$k[$j++]=$g(_h,_g);$k[$j++]=_j;$_.ultracode_rsprod();var _l=$k[--$j];var _m=$k[--$j];var _o=$k[--$j];$p(_o,_m,$f(_l+$g($_.coeffs,_m-1))%283)}var _p=$_.coeffs;var _r=$k[$j-1];$k[$j++]=_p;$k[$j++]=0;$k[$j++]=$g(_p,0);$k[$j++]=_r;$_.ultracode_rsprod();var _s=$k[--$j];var _t=$k[--$j];var _u=$k[--$j];$p(_u,_t,_s);$j--}$_.coeffs=$G($_.coeffs,0,$_.coeffs.length-1);for(var _z=$_.coeffs.length-1;_z>=0;_z-=2){var _10=$_.coeffs;$p(_10,_z,283-$g(_10,_z))}$k[$j++]=$_.coeffs};$_.ultracode_coeffscachemax=37;$_.ultracode_coeffscachelimit=1311;$k[$j++]=$_.ultracode_coeffscachemax;$k[$j++]=$_.ultracode_coeffscachelimit;bwipp_fifocache();var _15=$k[--$j];$_.ultracode_coeffscache=_15;$_.ultracode_coeffscachefetch=function(){var _16=$k[--$j];$_.k=_16;var _18=$g($_.ultracode_coeffscache,"fetch");$k[$j++]=$_.k;$k[$j++]=function(){$_.ultracode_gencoeffs()};$k[$j++]=function(){var _19=$k[--$j];$k[$j++]=_19.length};if(_18()===true){return true}};$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_ultracode.globals);$_.dontdraw=false;$_.eclevel="EC2";$_.parse=false;$_.parsefnc=false;$_.start=257;$_.link1=0;$_.raw=false;$_.rev=2;bwipp_processoptions();var _1A=$k[--$j];$_.options=_1A;var _1B=$k[--$j];$_.barcode=_1B;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.modunit=2;if($_.barcode.length>2500){$k[$j++]="bwipp.ultracodeinputTooLong#34609";$k[$j++]="The input data is too long";bwipp_raiseerror()}var _1F=$_.rev;if(_1F!=1&&_1F!=2){$k[$j++]="bwipp.ultracodeInvalidRevision#34613";$k[$j++]="Valid revisions are 1 and 2";bwipp_raiseerror()}var _1H=$_.eclevel.length==3;$k[$j++]=_1H;if(_1H){$j--;var _1K=$eq($G($_.eclevel,0,2),"EC");$k[$j++]=_1K;if(_1K){$j--;var _1N=$g($_.eclevel,2)-48;var _1P=$_.rev==2?1:0;$k[$j++]=_1N>=_1P&&_1N<=5}}var _1Q=$k[--$j];if(!_1Q){$k[$j++]="bwipp.ultracodeInvalidErrorCorrectionLevel#34622";$k[$j++]="Valid error correction levels are EC1 to EC5, and EC0 for legacy revision 1";bwipp_raiseerror()}if($_.raw){$_.dcws=$a($_.barcode.length);$_.i=0;$_.j=0;for(;;){if($_.i>=$_.barcode.length-3){break}if($g($_.barcode,$_.i)!=94){break}var _1b=$G($_.barcode,$_.i+1,3);$k[$j++]=_1b;$k[$j++]=false;for(var _1c=0,_1d=_1b.length;_1c<_1d;_1c++){var _1e=$g(_1b,_1c);if(_1e<48||_1e>57){$k[$j-1]=true}}var _1f=$k[--$j];if(_1f){$j--;break}var _1g=$k[--$j];$_.cw=$i(_1g);if($_.cw>284){$k[$j++]="bwipp.ultracodeBadRawCodeword#34641";$k[$j++]="Raw codewords must be 0 to 284";bwipp_raiseerror()}$p($_.dcws,$_.j,$_.cw);$_.i=$_.i+4;$_.j=$_.j+1}if($_.i!=$_.barcode.length){$k[$j++]="bwipp.ultracodeBadRawFormat#34648";$k[$j++]="Raw codewords must be formatted as ^NNN";bwipp_raiseerror()}$_.dcws=$G($_.dcws,0,$_.j)}else{$_.fn1=-1;$_.fn3=-2;$_.fncvals=new Map([["parse",$_.parse],["parsefnc",$_.parsefnc],["FNC1",$_.fn1],["FNC3",$_.fn3]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _1y=$k[--$j];$_.msg=_1y;$_.msglen=$_.msg.length;$_.scr=$a([]);$_.scp=$a([]);$k[$j++]=Infinity;$q($_.scr);$q($_.scp);$F($_.msg,function(){var _23=$k[$j-1];if(_23==$_.fn1){$k[$j-1]=268}var _25=$k[$j-1];if(_25==$_.fn3){$k[$j-1]=269}});$_.dcws=$a()}if($has($_.options,"debugcws")){$k[$j++]="bwipp.debugcws#34690";$k[$j++]=$_.dcws;bwipp_raiseerror()}$_.mcc=$_.dcws.length+3;$_.eclval=$g($_.eclevel,2)-48;if($_.eclval!=0){var _2K=$g($_.ultracode_qccfact,$_.eclval);var _2J=~~($_.mcc/25);if($_.mcc%25!=0){_2J=_2J+1}$_.qcc=_2K*_2J+5}else{$_.qcc=3}$_.acc=$_.qcc-3+78*$_.link1;$_.tcc=$_.mcc+$_.qcc;for(var _2Q=0,_2R=$_.ultracode_metrics.length;_2Q<_2R;_2Q++){$_.m=$g($_.ultracode_metrics,_2Q);$_.rows=$g($_.m,0);$_.minc=$g($_.m,1);$_.maxc=$g($_.m,2);$_.mcol=$g($_.m,3);$_.okay=true;if($_.tcc<$_.minc||$_.tcc>$_.maxc){$_.okay=false}if($_.okay){break}}if(!$_.okay){$k[$j++]="bwipp.ultracodeNoValidSymbol#34720";$k[$j++]="Maximum length exceeded or invalid content";bwipp_raiseerror()}for(var _2i=$_.mcol;_2i<=61;_2i+=1){$_.columns=_2i;$k[$j++]=$_.columns;if($_.columns>=15){$k[$j-1]-=1}if($_.columns>=31){$k[$j-1]-=1}if($_.columns>=47){$k[$j-1]-=1}var _2r=$k[--$j];var _2t=$f(_2r*$_.rows-3-$_.tcc);$k[$j++]=_2t;if(_2t>=0){var _2u=$k[--$j];$_.pads=_2u;break}$j--}$_.dcc=$f($_.columns-$_.mcol);$_.n=$_.mcc;$_.k=$_.qcc;$k[$j++]="coeffs";$k[$j++]=$_.k;$_.ultracode_coeffscachefetch();var _30=$k[--$j];var _31=$k[--$j];$_[_31]=_30;$k[$j++]=Infinity;$k[$j++]=$_.start;$k[$j++]=$_.mcc;$k[$j++]=$_.acc;$q($_.dcws);$_.rsdata=$a();$_.ecws=$a($_.k);var _38=$_.n;var _39=$_.coeffs;var _3A=$_.k;var _3B=$_.ecws;$k[$j++]=function(){var _3D=$k[--$j];$k[$j++]=$g($_.rsdata,_3D)};$k[$j++]=_38;$k[$j++]=_39;$k[$j++]=_3A;$k[$j++]=_3B;$k[$j++]=283;bwipp_rsecprime();if($has($_.options,"debugecc")){$k[$j++]="bwipp.debugecc#34762";$k[$j++]=$_.ecws;bwipp_raiseerror()}var _3J=$_.rev==1?$_.ultracode_dccurev1:$_.ultracode_dccurev2;$_.dccu=_3J;var _3M=$_.rev==1?$_.ultracode_dcclrev1:$_.ultracode_dcclrev2;$_.dccl=_3M;$_.rows=$_.rows*6+1;$_.columns=$_.columns+6;$k[$j++]=Infinity;for(var _3S=0,_3T=$_.rows*$_.columns;_3S<_3T;_3S++){$k[$j++]=-1}$_.pixs=$a();$_.qmv=function(){var _3V=$k[--$j];var _3W=$k[--$j];$k[$j++]=$f(_3W+_3V*$_.columns)};for(var _3Z=0,_3Y=$_.columns-1;_3Z<=_3Y;_3Z+=1){$_.i=_3Z;for(var _3c=0,_3b=$_.rows-1;_3c<=_3b;_3c+=6){$_.j=_3c;if($_.i>=5){$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.j;$_.qmv();var _3i=$k[--$j];var _3j=$k[--$j];$p(_3j,_3i,$_.i%2*9)}}$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=0;$_.qmv();var _3m=$k[--$j];var _3n=$k[--$j];$p(_3n,_3m,9);$k[$j++]=$_.pixs;$k[$j++]=$_.i;$k[$j++]=$_.rows-1;$_.qmv();var _3r=$k[--$j];var _3s=$k[--$j];$p(_3s,_3r,9)}for(var _3v=1,_3u=$_.rows-2;_3v<=_3u;_3v+=1){$_.i=_3v;for(var _3y=3,_3x=$_.columns-1;_3y<=_3x;_3y+=16){$_.j=_3y;$k[$j++]=$_.pixs;$k[$j++]=$_.j;$k[$j++]=$_.i;$_.qmv();var _43=$k[--$j];var _44=$k[--$j];$p(_44,_43,(1-$_.i%2)*9)}$k[$j++]=$_.pixs;$k[$j++]=0;$k[$j++]=$_.i;$_.qmv();var _47=$k[--$j];var _48=$k[--$j];$p(_48,_47,9);$k[$j++]=$_.pixs;$k[$j++]=1;$k[$j++]=$_.i;$_.qmv();var _4C=$k[--$j];var _4D=$k[--$j];$p(_4D,_4C,(1-$_.i%2)*9);$k[$j++]=$_.pixs;$k[$j++]=2;$k[$j++]=$_.i;$_.qmv();var _4G=$k[--$j];var _4H=$k[--$j];$p(_4H,_4G,0);$k[$j++]=$_.pixs;$k[$j++]=3;$k[$j++]=$_.i;$_.qmv();var _4K=$k[--$j];var _4L=$k[--$j];$p(_4L,_4K,9);$k[$j++]=$_.pixs;$k[$j++]=4;$k[$j++]=$_.i;$_.qmv();var _4O=$k[--$j];var _4P=$k[--$j];$p(_4P,_4O,0);$k[$j++]=$_.pixs;$k[$j++]=$_.columns-1;$k[$j++]=$_.i;$_.qmv();var _4T=$k[--$j];var _4U=$k[--$j];$p(_4U,_4T,9)}$_.i=~~($_.rows/2)-5;$k[$j++]=Infinity;var _4a=$R($s(5),$g($_.dccu,$_.dcc),10);for(var _4b=0,_4c=_4a.length;_4b<_4c;_4b++){$k[$j++]=$g(_4a,_4b)-48}var _4i=$R($s(5),$g($_.dccl,$_.dcc),10);$k[$j++]=0;for(var _4j=0,_4k=_4i.length;_4j<_4k;_4j++){$k[$j++]=$g(_4i,_4j)-48}var _4m=$a();for(var _4n=0,_4o=_4m.length;_4n<_4o;_4n++){$k[$j++]=$g(_4m,_4n);$k[$j++]=$_.pixs;$k[$j++]=2;$k[$j++]=$_.i;$_.qmv();var _4s=$k[$j-3];var _4t=$k[$j-1];var _4u=$k[$j-2];$j-=3;$p(_4u,_4t,_4s);$_.i=$_.i+1}$k[$j++]=Infinity;$k[$j++]=$_.start;$k[$j++]=$_.mcc;$q($_.ecws);$k[$j++]=$_.tcc;$k[$j++]=283;$k[$j++]=$_.acc;$q($_.dcws);for(var _53=0,_54=$_.pads;_53<_54;_53++){$k[$j++]=284}$k[$j++]=$_.qcc;$_.tileseq=$a();$_.x=5;$_.y=1;var _56=$_.tileseq;for(var _57=0,_58=_56.length;_57<_58;_57++){var _5C=$R($s(5),$g($_.ultracode_tiles,$g(_56,_57)),10);for(var _5D=0,_5E=_5C.length;_5D<_5E;_5D++){$k[$j++]=$g(_5C,_5D);$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.qmv();var _5J=$k[$j-3];var _5K=$k[$j-1];var _5L=$k[$j-2];$j-=3;$p(_5L,_5K,_5J-48);$_.y=$_.y+1}if($_.y!=$_.rows-1){$_.y=$_.y+1}else{$_.x=$_.x+1;$_.y=1;$k[$j++]=$_.pixs;$k[$j++]=$_.x;$k[$j++]=$_.y;$_.qmv();var _5U=$k[--$j];var _5V=$k[--$j];if($g(_5V,_5U)!=-1){$_.x=$_.x+1}}}$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.columns],["pixy",$_.rows],["height",$_.rows*$_.modunit/72],["width",$_.columns*$_.modunit/72],["colormap",$_.ultracode_colormap],["borderleft",1],["borderright",1],["bordertop",1],["borderbottom",1],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1_cc(){if(!bwipp_gs1_cc.globals){var $__=$_;$_=bwipp_gs1_cc.globals={};var _0=new Map([["ean13",4],["upca",4],["ean8",3],["upce",2],["gs1-128",4],["databaromni",4],["databarstacked",2],["databarstackedomni",2],["databartruncated",4],["databarlimited",3],["databarexpanded",4],["databarexpandedstacked",4]]);$_.gs1_cc_lintypecccolumns=_0;var _9=new Map([["a",$a([$a([167,138,118,108,88,78,59]),$a([167,138,118,98,78]),$a([197,167,138,108,78])])],["b",$a([$a([336,296,256,208,160,104,56]),$a([768,648,536,416,304,208,152,112,72,32]),$a([1184,1016,840,672,496,352,264,208,152,96,56])])]]);$_.gs1_cc_bitcapsmaps=_9;$_.gs1_cc_fillpat=$a([0,0,1,0,0]);$_.gs1_cc_pwr928init=$a([0,0,0,0,0,0,1]);$_.gs1_cc_tobin=function(){var _C=$k[--$j];var _D=$s(_C);$k[$j++]=_D;for(var _F=0,_E=_D.length-1;_F<=_E;_F+=1){var _G=$k[$j-1];$p(_G,_F,48)}var _H=$k[$j-1];$k[$j++]=_H;var _I=$k[$j-3];var _J=$k[$j-1];$k[$j-3]=$k[$j-2];$j-=2;var _L=$R($s(_J.length),_I,2);$P(_J,_J.length-_L.length,_L)};$_.gs1_cc_fnc1=-1;$_.gs1_cc_lnumeric=-2;$_.gs1_cc_lalphanumeric=-3;$_.gs1_cc_liso646=-4;$k[$j++]=Infinity;for(var _M=65;_M<=90;_M+=1){$k[$j++]=_M;$k[$j++]=_M-65;$k[$j++]=5;$_.gs1_cc_tobin()}for(var _N=48;_N<=57;_N+=1){$k[$j++]=_N;$k[$j++]=_N+4;$k[$j++]=6;$_.gs1_cc_tobin()}$k[$j++]=$_.gs1_cc_fnc1;$k[$j++]="11111";var _O=$d();$_.alpha=_O;$k[$j++]=Infinity;for(var _P=0;_P<=119;_P+=1){var _R=$Z($s(2),"00");var _T=$R($s(2),_P,11);$P(_R,2-_T.length,_T);$k[$j++]=_P;$k[$j++]=_R;if($g(_R,0)==65){var _V=$k[$j-1];$p(_V,0,94)}var _W=$k[$j-1];if($g(_W,1)==65){var _Y=$k[$j-1];$p(_Y,1,94)}var _Z=$k[--$j];var _a=$k[--$j];var _c=$Z($s(7),"0000000");var _e=$R($s(7),_a+8,2);$P(_c,7-_e.length,_e);$k[$j++]=_Z;$k[$j++]=_c}$k[$j++]=$_.gs1_cc_lalphanumeric;$k[$j++]="0000";var _f=$d();$_.numeric=_f;$k[$j++]=Infinity;for(var _g=48;_g<=57;_g+=1){$k[$j++]=_g;$k[$j++]=_g-43;$k[$j++]=5;$_.gs1_cc_tobin()}$k[$j++]=$_.gs1_cc_fnc1;$k[$j++]="01111";for(var _h=65;_h<=90;_h+=1){$k[$j++]=_h;$k[$j++]=_h-33;$k[$j++]=6;$_.gs1_cc_tobin()}$k[$j++]=42;$k[$j++]="111010";for(var _i=44;_i<=47;_i+=1){$k[$j++]=_i;$k[$j++]=_i+15;$k[$j++]=6;$_.gs1_cc_tobin()}$k[$j++]=$_.gs1_cc_lnumeric;$k[$j++]="000";$k[$j++]=$_.gs1_cc_liso646;$k[$j++]="00100";var _j=$d();$_.alphanumeric=_j;$k[$j++]=Infinity;for(var _k=48;_k<=57;_k+=1){$k[$j++]=_k;$k[$j++]=_k-43;$k[$j++]=5;$_.gs1_cc_tobin()}$k[$j++]=$_.gs1_cc_fnc1;$k[$j++]="01111";for(var _l=65;_l<=90;_l+=1){$k[$j++]=_l;$k[$j++]=_l-1;$k[$j++]=7;$_.gs1_cc_tobin()}for(var _m=97;_m<=122;_m+=1){$k[$j++]=_m;$k[$j++]=_m-7;$k[$j++]=7;$_.gs1_cc_tobin()}$k[$j++]=33;$k[$j++]="11101000";$k[$j++]=34;$k[$j++]="11101001";for(var _n=37;_n<=47;_n+=1){$k[$j++]=_n;$k[$j++]=_n+197;$k[$j++]=8;$_.gs1_cc_tobin()}for(var _o=58;_o<=63;_o+=1){$k[$j++]=_o;$k[$j++]=_o+187;$k[$j++]=8;$_.gs1_cc_tobin()}$k[$j++]=95;$k[$j++]="11111011";$k[$j++]=32;$k[$j++]="11111100";$k[$j++]=$_.gs1_cc_lnumeric;$k[$j++]="000";$k[$j++]=$_.gs1_cc_lalphanumeric;$k[$j++]="00100";var _p=$d();$_.iso646=_p;$k[$j++]=Infinity;$k[$j++]=$_.gs1_cc_pwr928init;for(var _q=0;_q<68;_q++){$k[$j++]=$a(7)}$_.pwr928=$a();for(var _s=1;_s<=68;_s+=1){$_.j=_s;$_.v=0;for(var _t=6;_t>=1;_t-=1){$_.i=_t;$_.v=$f($g($g($_.pwr928,$_.j-1),$_.i)*2+~~($_.v/928));$p($g($_.pwr928,$_.j),$_.i,$_.v%928)}$p($g($_.pwr928,$_.j),0,$f($g($g($_.pwr928,$_.j-1),0)*2+~~($_.v/928)))}$_.pwr928=$_.pwr928;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_gs1_cc.globals);$_.parse=false;$_.dontlint=false;$_.lintreqs=false;$_.dontdraw=false;$_.ccversion="a";$_.cccolumns=-1;$_.lintype="";$_.linwidth=-1;bwipp_processoptions();var _1E=$k[--$j];$_.options=_1E;var _1F=$k[--$j];$_.barcode=_1F;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($ne($_.ccversion,"a")&&$ne($_.ccversion,"b")&&$ne($_.ccversion,"c")){$k[$j++]="bwipp.gs1ccBadCCversion#36503";$k[$j++]="ccversion must be a, b or c";bwipp_raiseerror()}if($_.cccolumns>30){$k[$j++]="bwipp.gs1ccColumnsTooBig#36507";$k[$j++]="The maximum number of composite component columns is 30";bwipp_raiseerror()}if($_.lintype.length!=0){if(!$has($_.gs1_cc_lintypecccolumns,$_.lintype)){$k[$j++]="bwipp.gs1ccBadLinType#36512";$k[$j++]="The lintype is not recognised";bwipp_raiseerror()}}if($_.cccolumns==-1){if($eq($_.lintype,"gs1-128")&&$eq($_.ccversion,"c")){if($_.linwidth<0){$k[$j++]="bwipp.gs1ccMissingLinWidth#36522";$k[$j++]="linwidth must be set for a GS1-128 with a CC-C composite component";bwipp_raiseerror()}if($_.linwidth<68){$k[$j++]="bwipp.gs1ccMinimumLinWidth#36525";$k[$j++]="Minimum linwidth for a GS1-128 with a CC-C composite component is 68";bwipp_raiseerror()}if($_.linwidth==68){$k[$j++]=1}else{$k[$j++]=~~(($_.linwidth-52)/17)}}else{if($_.lintype.length!=0){$k[$j++]=$g($_.gs1_cc_lintypecccolumns,$_.lintype)}else{$k[$j++]=2}}var _1Z=$k[--$j];$_.cccolumns=_1Z}if($ne($_.ccversion,"c")){if($_.cccolumns<2||$_.cccolumns>4){$k[$j++]="bwipp.gs1ccBadColumns#36536";$k[$j++]="CC-A and CC-B require 2 to 4 columns";bwipp_raiseerror()}}if($_.lintype.length!=0&&$ne($_.ccversion,"c")){if($lt($_.cccolumns,$g($_.gs1_cc_lintypecccolumns,$_.lintype))){$k[$j++]="bwipp.gs1ccColumnsTooSmall#36542";$k[$j++]="The cccolumns value is too small for the linear symbology";bwipp_raiseerror()}}$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _1j=$k[--$j];$_.fncs=_1j;var _1k=$k[--$j];$_.vals=_1k;var _1l=$k[--$j];$_.ais=_1l;$_.isupper=function(){var _1m=$k[--$j];$k[$j++]=_1m>=65&&_1m<=90};$_.isnum0=function(){var _1n=$k[--$j];$k[$j++]=_1n>=48&&_1n<=57};$_.isnum1=function(){var _1o=$k[--$j];$k[$j++]=_1o>=49&&_1o<=57};for(;;){if($_.ais.length>=1){if($eq($g($_.ais,0),"10")||$eq($g($_.ais,0),"11")||$eq($g($_.ais,0),"17")){$k[$j++]=-1;$k[$j++]="10";break}}if($_.ais.length>=1){if($eq($g($_.ais,0),"90")){$_.v=$g($_.vals,0);if($_.v.length>=1){$k[$j++]=$g($_.v,0);$_.isupper();var _24=$k[--$j];if(_24){$k[$j++]=0;$k[$j++]="11";break}}if($_.v.length>=2){$k[$j++]=$g($_.v,0);$_.isnum1();$k[$j++]=$g($_.v,1);$_.isupper();var _2A=$k[--$j];var _2B=$k[--$j];if(_2B&&_2A){$k[$j++]=1;$k[$j++]="11";break}}if($_.v.length>=3){$k[$j++]=$g($_.v,0);$_.isnum1();$k[$j++]=$g($_.v,1);$_.isnum0();var _2H=$k[--$j];var _2I=$k[--$j];$k[$j++]=$an(_2I,_2H);$k[$j++]=$g($_.v,2);$_.isupper();var _2L=$k[--$j];var _2M=$k[--$j];if(_2M&&_2L){$k[$j++]=2;$k[$j++]="11";break}}if($_.v.length>=4){$k[$j++]=$g($_.v,0);$_.isnum1();$k[$j++]=$g($_.v,1);$_.isnum0();var _2S=$k[--$j];var _2T=$k[--$j];$k[$j++]=$an(_2T,_2S);$k[$j++]=$g($_.v,2);$_.isnum0();var _2W=$k[--$j];var _2X=$k[--$j];$k[$j++]=$an(_2X,_2W);$k[$j++]=$g($_.v,3);$_.isupper();var _2a=$k[--$j];var _2b=$k[--$j];if(_2b&&_2a){$k[$j++]=3;$k[$j++]="11";break}}}}$k[$j++]=-1;$k[$j++]="0";break}var _2c=$k[--$j];$_.method=_2c;var _2d=$k[--$j];$_.npre=_2d;if($eq($_.method,"10")){var _2k=$g($_.vals,0);$k[$j++]=$eq($g($_.ais,0),"11")||$eq($g($_.ais,0),"17");$k[$j++]=_2k;if(_2k.length>=6){var _2l=$k[--$j];var _2m=$G(_2l,0,6);$k[$j++]=true;for(var _2n=0,_2o=_2m.length;_2n<_2o;_2n++){var _2p=$g(_2m,_2n);if(_2p<48||_2p>57){$k[$j-1]=false}}}else{$k[$j-1]=false}var _2q=$k[--$j];var _2r=$k[--$j];if(_2r&&_2q){var _2t=$g($_.vals,0);var _2y=$Z($s(16),"0000000000000000");var _30=$R($s(16),$i($G(_2t,0,2))*384+(($i($G(_2t,2,2))-1)*32+$i($G(_2t,4,2))),2);$P(_2y,16-_30.length,_30);$k[$j++]=_2y;$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=0;$r(4,-1);var _31=$k[--$j];$F(_31,function(){$k[$j-1]-=48});$k[$j++]=$eq($g($_.ais,0),"11")?0:1;var _36=$a();$_.cdf=_36;$_.ais=$G($_.ais,1,$_.ais.length-1);$_.vals=$G($_.vals,1,$_.vals.length-1);$_.fncs=$G($_.fncs,1,$_.fncs.length-1)}else{$_.cdf=$a([1,0,1,1])}if($_.ais.length!=0){if($eq($g($_.ais,0),"10")){$k[$j++]=Infinity;$F($g($_.vals,0));$_.gpf=$a();if($_.ais.length>1){$k[$j++]=Infinity;$q($_.gpf);$k[$j++]=$_.gs1_cc_fnc1;$_.gpf=$a()}$_.ais=$G($_.ais,1,$_.ais.length-1);$_.vals=$G($_.vals,1,$_.vals.length-1);$_.fncs=$G($_.fncs,1,$_.fncs.length-1)}else{$_.gpf=$a([$_.gs1_cc_fnc1])}}else{$k[$j++]=Infinity;$q($_.cdf);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$_.cdf=$a();$_.gpf=$a([])}$_.mode="numeric"}if($eq($_.method,"11")){$_.cdf=$a([1,1]);$_.ai90=$g($_.vals,0);var _3h=$_.npre+1!=$_.ai90.length?$G($_.ai90,$_.npre+1,$f($_.ai90.length-$_.npre)-1):"";$_.ai90rem=_3h;$k[$j++]="nalpha";$k[$j++]=0;$F($_.ai90rem,function(){var _3j=$k[--$j];if(_3j>=65&&_3j<=90){$k[$j-1]+=1}});var _3l=$k[--$j];var _3m=$k[--$j];$_[_3m]=_3l;$k[$j++]="nnums";$k[$j++]=0;$F($_.ai90rem,function(){var _3o=$k[--$j];if(_3o>=48&&_3o<=57){$k[$j-1]+=1}});var _3q=$k[--$j];var _3r=$k[--$j];$_[_3r]=_3q;$k[$j++]="mode";if($gt($_.nalpha,$_.nnums)){$k[$j++]="alpha"}else{if($_.nalpha==0){$k[$j++]="numeric"}else{$k[$j++]="alphanumeric"}}var _3v=$k[--$j];var _3w=$k[--$j];$_[_3w]=_3v;if($f($_.nalpha+$_.nnums)!=$_.ai90rem.length){$_.mode="alphanumeric"}$k[$j++]=Infinity;$q($_.cdf);if($eq($_.mode,"alphanumeric")){$k[$j++]=0}if($eq($_.mode,"numeric")){$k[$j++]=1;$k[$j++]=0}if($eq($_.mode,"alpha")){$k[$j++]=1;$k[$j++]=1}$_.cdf=$a();var _47=$_.ais.length>1?$g($_.ais,1):-1;$_.ais1=_47;var _4C=$_.vals.length>1?$g($_.vals,1):-1;$_.vals1=_4C;if($eq($_.ais1,"21")||$eq($_.ais1,"8004")){$k[$j++]=Infinity;$q($_.cdf);if($eq($_.ais1,"21")){$k[$j++]=1;$k[$j++]=0}else{$k[$j++]=1;$k[$j++]=1}$_.cdf=$a()}else{$k[$j++]=Infinity;$q($_.cdf);$k[$j++]=0;$_.cdf=$a()}var _4N=$_.npre!=0?$i($G($_.ai90,0,$_.npre)):0;$_.nval=_4N;$X("BDHIJKLNPQRSTVXZ",$G($_.ai90,$_.npre,1));var _4S=$k[--$j];if(_4S){var _4T=$k[--$j];$j--;var _4V=_4T.length;$j--;$_.aval=_4V}else{$j--;$_.aval=-1}if($_.nval<31&&$_.aval!=-1){var _4b=$Z($s(5),"00000");var _4e=$R($s(5),$_.nval,2);$P(_4b,5-_4e.length,_4e);$k[$j++]=Infinity;$F(_4b,function(){$k[$j-1]-=48});var _4i=$a();$_.nbits=_4i;var _4k=$Z($s(4),"0000");var _4n=$R($s(4),$_.aval,2);$P(_4k,4-_4n.length,_4n);$k[$j++]=Infinity;$F(_4k,function(){$k[$j-1]-=48});var _4r=$a();$_.abits=_4r;$k[$j++]=Infinity;$q($_.cdf);$q($_.nbits);$q($_.abits);$_.cdf=$a()}else{var _4w=$Z($s(10),"0000000000");var _4z=$R($s(10),$_.nval,2);$P(_4w,10-_4z.length,_4z);$k[$j++]=Infinity;$F(_4w,function(){$k[$j-1]-=48});var _53=$a();$_.nbits=_53;var _55=$Z($s(5),"00000");var _5A=$R($s(5),$g($_.ai90,$_.npre)-65,2);$P(_55,5-_5A.length,_5A);$k[$j++]=Infinity;$F(_55,function(){$k[$j-1]-=48});var _5E=$a();$_.abits=_5E;$k[$j++]=Infinity;$q($_.cdf);$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$q($_.nbits);$q($_.abits);$_.cdf=$a()}if($ne($_.mode,"alpha")){$k[$j++]=Infinity;$F($_.ai90rem);if($_.ais.length>1){$k[$j++]=$_.gs1_cc_fnc1}$_.gpf=$a()}else{$k[$j++]=Infinity;$F($_.ai90rem);if($_.ais.length>1){$k[$j++]=$_.gs1_cc_fnc1}$_.in=$a();$_.out=$a($_.in.length*6);$_.j=0;for(var _5R=0,_5Q=$_.in.length-1;_5R<=_5Q;_5R+=1){var _5V=$g($_.alpha,$g($_.in,_5R));$k[$j++]=Infinity;$F(_5V,function(){$k[$j-1]-=48});var _5Z=$a();$P($_.out,$_.j,_5Z);$_.j=_5V.length+$_.j}$k[$j++]=Infinity;$q($_.cdf);$q($G($_.out,0,$_.j));$_.cdf=$a();$_.gpf=$a([]);if($_.ais.length>1){$_.mode="numeric"}}$_.ais=$G($_.ais,1,$_.ais.length-1);$_.vals=$G($_.vals,1,$_.vals.length-1);$_.fncs=$G($_.fncs,1,$_.fncs.length-1);if($_.ais.length!=0){if($eq($_.ais1,"21")||$eq($_.ais1,"8004")){$k[$j++]=Infinity;$q($_.gpf);$F($_.vals1);$_.gpf=$a();$_.ais=$G($_.ais,1,$_.ais.length-1);$_.vals=$G($_.vals,1,$_.vals.length-1);$_.fncs=$G($_.fncs,1,$_.fncs.length-1);if($_.ais.length!=0){$k[$j++]=Infinity;$q($_.gpf);$k[$j++]=$_.gs1_cc_fnc1;$_.gpf=$a()}}}}if($eq($_.method,"0")){$_.cdf=$a([0]);$_.gpf=$a([]);$_.mode="numeric"}$k[$j++]=Infinity;$q($_.gpf);for(var _6C=0,_6B=$_.ais.length-1;_6C<=_6B;_6C+=1){$_.i=_6C;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){$k[$j++]=$_.gs1_cc_fnc1}}$as($a($m()));var _6Q=$k[--$j];$_.gpf=_6Q;$j--;$_.rembits=function(){var _6R=$k[--$j];$_.used=_6R;if($ne($_.ccversion,"c")){$_.bitcaps=$g($g($_.gs1_cc_bitcapsmaps,$_.ccversion),$_.cccolumns-2);$k[$j++]=-1;$F($_.bitcaps,function(){var _6Y=$k[$j-1];if($ge(_6Y,$_.used)){var _6a=$k[--$j];var _6b=$k[--$j];$k[$j++]=_6a;$k[$j++]=_6b}$j--});var _6c=$k[$j-1];if(_6c!=-1){var _6e=$k[--$j];$k[$j++]=$f(_6e-$_.used)}}else{var _6f=new Map([["c",-1]]);var _6h=$g(_6f,$_.ccversion);var _6j=$ceil($_.used/8);$_.m=~~(_6j/6)*5+_6j%6;if($_.m<=40){$k[$j++]=8}if($_.m>=41&&$_.m<=160){$k[$j++]=16}if($_.m>=161&&$_.m<=320){$k[$j++]=32}if($_.m>=321&&$_.m<=833){$k[$j++]=64}if($_.m>=834){$k[$j++]=32}var _6s=$k[--$j];$_.eccws=_6s;$_.m=$f($_.m+$_.eccws)+3;if($_.cccolumns>30){$_.cccolumns=30}for(;;){if($ceil($_.m/$_.cccolumns)<=30||$_.cccolumns>=30){break}$_.cccolumns=$_.cccolumns+1}$_.r=$ceil($_.m/$_.cccolumns);if($_.r<3){$_.r=3}var _76=$f($_.cccolumns*$_.r-$_.eccws)-3;$_.tgt=$f(~~(_76/5)*6+_76%5)*8;if($_.used<=8304){$k[$j++]=$f($_.tgt-$_.used)}else{$k[$j++]=-1}}var _7A=$k[$j-1];if(_7A==-1){$j--;if($eq($_.ccversion,"a")){$_.ccversion="b";$k[$j++]=$_.used;$_.rembits()}else{if($eq($_.ccversion,"b")&&$eq($_.lintype,"gs1-128")){$_.ccversion="c";$_.cccolumns=~~(($_.linwidth-52)/17);$k[$j++]=$_.used;$_.rembits()}else{$k[$j++]=-1}}}};$_.encode=function(){var _7H=$k[$j-1];if($ne(_7H,"raw")){var _7I=$k[--$j];var _7J=$k[--$j];$k[$j++]=$g(_7I,_7J)}else{$j--}var _7M=$k[--$j];$k[$j++]=Infinity;$F(_7M,function(){$k[$j-1]-=48});var _7O=$a();var _7P=_7O.length;$k[$j++]=_7O;$k[$j++]=_7P;if(_7P+$_.j>$_.gpfenc.length){$j-=2;$k[$j++]="bwipp.gs1ccDataTooLarge#36809";$k[$j++]="Data too large for the composite component";bwipp_raiseerror()}var _7S=$k[--$j];var _7T=$k[--$j];$P($_.gpfenc,$_.j,_7T);$_.j=$f(_7S+$_.j)};$k[$j++]=Infinity;for(var _7Y=0,_7Z=$_.gpf.length;_7Y<_7Z;_7Y++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=-1;$_.numericruns=$a();$k[$j++]=Infinity;for(var _7b=0,_7c=$_.gpf.length;_7b<_7c;_7b++){$k[$j++]=0}$k[$j++]=0;$_.alphanumericruns=$a();$k[$j++]=Infinity;for(var _7e=0,_7f=$_.gpf.length;_7e<_7f;_7e++){$k[$j++]=0}$k[$j++]=9999;$_.nextiso646only=$a();for(var _7h=$_.gpf.length-1;_7h>=0;_7h-=1){$_.i=_7h;var _7m=$Z($s(2),"00");var _7p=$g($_.gpf,$_.i);$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=_7m;var _7r=0;if(_7p==$_.gs1_cc_fnc1){_7p=94}$p(_7m,_7r,_7p);if($_.i<$_.gpf.length-1){var _7v=$k[$j-1];var _7y=$g($_.gpf,$_.i+1);var _80=1;if(_7y==$_.gs1_cc_fnc1){_7y=94}$p(_7v,_80,_7y)}var _83=$k[--$j];if($has($_.numeric,_83)){$p($_.numericruns,$_.i,$g($_.numericruns,$_.i+2)+2)}else{$p($_.numericruns,$_.i,0)}var _8C=$k[$j-1];var _8E=$has($_.alphanumeric,_8C);if(_8E){$p($_.alphanumericruns,$_.i,$g($_.alphanumericruns,$_.i+1)+1)}else{$p($_.alphanumericruns,$_.i,0)}var _8M=$k[--$j];if($has($_.iso646,_8M)&&!$has($_.alphanumeric,_8M)){$p($_.nextiso646only,$_.i,0)}else{$p($_.nextiso646only,$_.i,$g($_.nextiso646only,$_.i+1)+1)}}$_.gpfenc=$a(8304);$_.i=0;$_.j=0;for(;;){if($_.i==$_.gpf.length){break}for(;;){if($eq($_.mode,"numeric")){if($_.i<=$_.gpf.length-2){var _8e=$s(2);var _8h=$g($_.gpf,$_.i);$k[$j++]=_8e;var _8j=0;if(_8h==$_.gs1_cc_fnc1){_8h=94}$p(_8e,_8j,_8h);var _8l=$k[$j-1];var _8o=$g($_.gpf,$_.i+1);var _8q=1;if(_8o==$_.gs1_cc_fnc1){_8o=94}$p(_8l,_8q,_8o);var _8s=$k[$j-1];var _8u=$has($_.numeric,_8s);if(_8u){$k[$j++]=$_.numeric;$_.encode();$_.i=$_.i+2;break}$k[$j-1]=$_.gs1_cc_lalphanumeric;$k[$j++]=$_.numeric;$_.encode();$_.mode="alphanumeric";break}else{var _90=$g($_.gpf,$_.i);if(_90<48||_90>57){$k[$j++]=$_.gs1_cc_lalphanumeric;$k[$j++]=$_.numeric;$_.encode();$_.mode="alphanumeric";break}$k[$j++]="rem";$k[$j++]=$_.cdf.length+$_.j;$_.rembits();var _94=$k[--$j];var _95=$k[--$j];$_[_95]=_94;if($_.rem>=4&&$_.rem<=6){var _9B=$G($Z($s(6),"000000"),0,$_.rem);var _9G=$R($s(4),$g($_.gpf,$_.i)-47,2);$P(_9B,4-_9G.length,_9G);$k[$j++]=_9B;$k[$j++]="raw";$_.encode();$_.i=$_.i+1;break}else{var _9I=$s(2);$p(_9I,0,$g($_.gpf,$_.i));$p(_9I,1,94);$k[$j++]=_9I;$k[$j++]=$_.numeric;$_.encode();$_.i=$_.i+1;break}}}if($eq($_.mode,"alphanumeric")){if($g($_.gpf,$_.i)==$_.gs1_cc_fnc1){$k[$j++]=$_.gs1_cc_fnc1;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";$_.i=$_.i+1;break}var _9W=$g($_.gpf,$_.i);if($has($_.iso646,_9W)&&!$has($_.alphanumeric,_9W)){$k[$j++]=$_.gs1_cc_liso646;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="iso646";break}if($g($_.numericruns,$_.i)>=6){$k[$j++]=$_.gs1_cc_lnumeric;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";break}var _9i=$g($_.numericruns,$_.i);if(_9i>=4&&$f(_9i+$_.i)==$_.gpf.length){$k[$j++]=$_.gs1_cc_lnumeric;$k[$j++]=$_.alphanumeric;$_.encode();$_.mode="numeric";break}$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=$_.alphanumeric;$_.encode();$_.i=$_.i+1;break}if($eq($_.mode,"iso646")){if($g($_.gpf,$_.i)==$_.gs1_cc_fnc1){$k[$j++]=$_.gs1_cc_fnc1;$k[$j++]=$_.iso646;$_.encode();$_.mode="numeric";$_.i=$_.i+1;break}if($g($_.numericruns,$_.i)>=4&&$g($_.nextiso646only,$_.i)>=10){$k[$j++]=$_.gs1_cc_lnumeric;$k[$j++]=$_.iso646;$_.encode();$_.mode="numeric";break}if($g($_.alphanumericruns,$_.i)>=5&&$g($_.nextiso646only,$_.i)>=10){$k[$j++]=$_.gs1_cc_lalphanumeric;$k[$j++]=$_.iso646;$_.encode();$_.mode="alphanumeric";break}$k[$j++]=$g($_.gpf,$_.i);$k[$j++]=$_.iso646;$_.encode();$_.i=$_.i+1;break}}}$_.gpf=$G($_.gpfenc,0,$_.j);$k[$j++]=$_.cdf.length+$_.gpf.length;$_.rembits();var _AL=$k[$j-1];if(_AL==-1){$k[$j-1]="bwipp.gs1ccDataTooLarge#36946";$k[$j++]="Data too large for the composite component";bwipp_raiseerror()}var _AM=$k[--$j];$_.pad=$a(_AM);if($_.pad.length>0){for(var _AR=0,_AQ=$_.pad.length-1;_AR<=_AQ;_AR+=5){$_.i=_AR;var _AS=$_.pad;var _AT=$_.i;var _AU=$_.pad;var _AV=$_.i;var _AW=5;var _AX=_AU.length-_AV;if(_AU.length-_AV>5){var _=_AW;_AW=_AX;_AX=_}$P(_AS,_AT,$G($_.gs1_cc_fillpat,0,_AX))}if($eq($_.mode,"numeric")){$k[$j++]=Infinity;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.pad);var _Ab=$a();$_.pad=$G(_Ab,0,$_.pad.length)}if($eq($_.mode,"alpha")){$k[$j++]=Infinity;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=1;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.pad);var _Ag=$a();$_.pad=$G(_Ag,0,$_.pad.length)}}$k[$j++]=Infinity;$q($_.cdf);$q($_.gpf);$q($_.pad);$_.bits=$a();if($eq($_.ccversion,"a")){$k[$j++]=Infinity;for(var _An=0;_An<28;_An++){$k[$j++]=0}$_.cws=$a();$_.b=0;$_.c=0;for(;;){if($_.b==$_.bits.length){break}var _Aq=$_.bits;var _Ar=$_.b;var _As=$_.bits;var _At=$_.b;var _Au=_As.length-_At;var _Av=69;if(69>_As.length-_At){var _=_Au;_Au=_Av;_Av=_}$_.bs=$G(_Aq,_Ar,_Av);$_.bsl=$_.bs.length;$_.cs=$G($_.cws,$_.c,~~($_.bsl/10)+1);$_.csl=$_.cs.length;for(var _B5=0,_B4=$_.bsl-1;_B5<=_B4;_B5+=1){$_.i=_B5;for(var _B8=0,_B7=$_.csl-1;_B8<=_B7;_B8+=1){$_.j=_B8;var _B9=$_.cs;var _BA=$_.j;$p(_B9,_BA,$f($g(_B9,_BA)+$g($g($_.pwr928,$_.i),$_.j+7-$_.csl)*$g($_.bs,$_.bsl-$_.i-1)))}}for(var _BN=$_.csl-1;_BN>=1;_BN-=1){$_.i=_BN;var _BO=$_.cs;var _BP=$_.i;$p(_BO,_BP-1,$f($g(_BO,_BP-1)+~~($g($_.cs,$_.i)/928)));var _BU=$_.cs;var _BV=$_.i;$p(_BU,_BV,$g(_BU,_BV)%928)}$_.b=$_.b+$_.bsl;$_.c=$_.c+$_.csl}$_.cws=$G($_.cws,0,$_.c);$_.barcode=$s($_.cws.length*4);for(var _Bi=0,_Bh=$_.cws.length-1;_Bi<=_Bh;_Bi+=1){$_.i=_Bi;var _Bk=$Z($s(4),"^000");var _Bp=$R($s(4),$g($_.cws,$_.i),10);$P(_Bk,4-_Bp.length,_Bp);$P($_.barcode,$_.i*4,_Bk)}$del($_.options,"parse");$p($_.options,"cca",true);$p($_.options,"columns",$_.cccolumns);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_micropdf417();var _By=$k[--$j];$_.args=_By}if($eq($_.ccversion,"b")){$_.barcode=$s(~~($_.bits.length/8));for(var _C4=0,_C3=$_.barcode.length-1;_C4<=_C3;_C4+=1){$_.i=_C4;var _C7=$G($_.bits,$_.i*8,8);var _CC=0;for(var _C8=0,_C9=_C7.length;_C8<_C9;_C8++){_CC=$f(_CC+$g(_C7,_C8))*2}$p($_.barcode,$_.i,~~(_CC/2))}$del($_.options,"parse");$p($_.options,"ccb",true);$p($_.options,"columns",$_.cccolumns);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_micropdf417();var _CL=$k[--$j];$_.args=_CL}if($eq($_.ccversion,"c")){$_.barcode=$s(~~($_.bits.length/8));for(var _CR=0,_CQ=$_.barcode.length-1;_CR<=_CQ;_CR+=1){$_.i=_CR;var _CU=$G($_.bits,$_.i*8,8);var _CZ=0;for(var _CV=0,_CW=_CU.length;_CV<_CW;_CV++){_CZ=$f(_CZ+$g(_CU,_CV))*2}$p($_.barcode,$_.i,~~(_CZ/2))}$del($_.options,"parse");$p($_.options,"ccc",true);$p($_.options,"columns",$_.cccolumns);$p($_.options,"eclevel",~~($log($_.eccws)/$log(2))-1);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_pdf417();var _Ck=$k[--$j];$_.args=_Ck}$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_ean13composite(){var $__=$_;$_=Object.assign({},$_,bwipp_ean13composite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.guardwhitespace=false;$_.guardwidth=5;$_.guardheight=7;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#37123";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","ean13");$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _C=$s($_.comp.length+18);$P(_C,0,"(01)00000000000000");$P(_C,18,$_.comp);$k[$j++]=_C;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_ean13();var _G=$k[--$j];$_.linsym=_G;$_.sbs=$g($_.linsym,"sbs");$_.bhs=$g($_.linsym,"bhs");$_.bbs=$g($_.linsym,"bbs");$k[$j++]="linwidth";var _Q=0;$F($_.sbs,function(){var _O=$k[--$j];_Q=$f(_Q+$i(_O))});var _R=$k[--$j];$_[_R]=_Q;$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _U=$k[--$j];$_.compsym=_U;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;for(var _c=0,_d=$_.ccpixx-97;_c<_d;_c++){$k[$j++]=0}$_.linpad=$a();$k[$j++]=Infinity;var _e=$_.linsym;var _f=$has(_e,"txt");$k[$j++]=_e;$k[$j++]="txt";if(_f){var _g=$k[--$j];var _h=$k[--$j];$F($g(_h,_g),function(){var _j=$k[--$j];$q(_j);$r(4,-1);var _l=$k[--$j];$k[$j++]=$f(_l+($_.linpad.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _n=$_.linsym;var _o=$has(_n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_n;$k[$j++]="text1xalign";if(_o){var _p=$k[--$j];var _q=$k[--$j];$k[$j++]=$g(_q,_p)}else{$j-=2;$k[$j++]="unset"}var _s=$k[--$j];var _t=$k[--$j];$_[_t]=_s;var _u=$_.linsym;var _v=$has(_u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_u;$k[$j++]="text1yalign";if(_v){var _w=$k[--$j];var _x=$k[--$j];$k[$j++]=$g(_x,_w)}else{$j-=2;$k[$j++]="unset"}var _z=$k[--$j];var _10=$k[--$j];$_[_10]=_z;$_.diff=$f($_.linwidth+$_.linpad.length+1-$_.ccpixx);if($_.diff>0){$k[$j++]=Infinity;for(var _16=0,_17=$_.diff;_16<_17;_16++){$k[$j++]=0}$_.ccrpad=$a();$_.pixx=$f($_.ccpixx+$_.diff)}else{$_.ccrpad=$a(0);$_.pixx=$_.ccpixx}$_.ccrows=$_.ccrowmult.length;$_.nbars=~~(($_.sbs.length+1)/2);$_.bbsrow=$a($_.nbars);$_.bhsrow=$a($_.nbars);for(var _1K=0,_1J=$_.nbars-1;_1K<=_1J;_1K+=1){$_.b=_1K;$p($_.bbsrow,$_.b,~~($g($_.bbs,$_.b)*72));$p($_.bhsrow,$_.b,$f($g($_.bbsrow,$_.b)+$g($_.bhs,$_.b)*72))}var _1Y=$_.bhsrow;$k[$j++]="linheight";$k[$j++]=0;for(var _1Z=0,_1a=_1Y.length;_1Z<_1a;_1Z++){var _1b=$g(_1Y,_1Z);var _1c=$k[--$j];var _1d=$ceil(_1b);if(_1c<$ceil(_1b)){var _=_1d;_1d=_1c;_1c=_}$k[$j++]=_1c}var _1e=$k[--$j];var _1f=$k[--$j];$_[_1f]=_1e;var _1g=$_.bbsrow;$k[$j++]="lindescent";$k[$j++]=0;for(var _1h=0,_1i=_1g.length;_1h<_1i;_1h++){var _1j=$g(_1g,_1h);var _1k=$k[--$j];var _1l=$flr(_1j);if(_1k>$flr(_1j)){var _=_1l;_1l=_1k;_1k=_}$k[$j++]=_1k}var _1m=$k[--$j];var _1n=$k[--$j];$_[_1n]=_1m;var _1o=$_.txt;for(var _1p=0,_1q=_1o.length;_1p<_1q;_1p++){var _1r=$g(_1o,_1p);$p(_1r,2,$f($g(_1r,2)+-$_.lindescent))}$_.mainbars=$_.nbars;for(var _1x=0,_1w=$_.sbs.length-1;_1x<=_1w;_1x+=1){var _20=$t($g($_.sbs,_1x));$k[$j++]=_1x;if($eq(_20,"realtype")){var _21=$k[--$j];$_.mainbars=~~((_21+1)/2);break}else{$j--}}for(var _24=0,_23=$_.mainbars-1;_24<=_23;_24+=1){$p($_.bhsrow,_24,$_.linheight)}$_.rowbuf=$s($_.pixx);$_.prevrow="";$_.linrowmult=$a(72);$_.lri=0;$k[$j++]=Infinity;for(var _2D=$_.linheight-1,_2C=$_.lindescent;_2D>=_2C;_2D-=1){$_.y=_2D;$_.p=0;var _2E=$_.linpad;for(var _2F=0,_2G=_2E.length;_2F<_2G;_2F++){$p($_.rowbuf,$_.p,$g(_2E,_2F));$_.p=$_.p+1}$p($_.rowbuf,$_.p,0);$_.p=$_.p+1;for(var _2Q=0,_2P=$_.sbs.length-1;_2Q<=_2P;_2Q+=1){$_.i=_2Q;if($_.i%2==0){$k[$j++]=$g($_.bbsrow,~~($_.i/2))>$_.y||$g($_.bhsrow,~~($_.i/2))<$_.y?0:1}else{$k[$j++]=0}for(var _2e=0,_2f=$i($g($_.sbs,$_.i));_2e<_2f;_2e++){var _2i=$k[--$j];$p($_.rowbuf,$_.p,_2i);$_.p=$_.p+1;$k[$j++]=_2i}$j--}if($_.diff<0){$p($_.rowbuf,$_.p,0);$_.p=$_.p+1}if($eq($_.rowbuf,$_.prevrow)){var _2q=$_.linrowmult;var _2r=$_.lri;$p(_2q,_2r-1,$g(_2q,_2r-1)+1)}else{if($_.prevrow.length>0){var _2u=$_.prevrow;for(var _2v=0,_2w=_2u.length;_2v<_2w;_2v++){$k[$j++]=$g(_2u,_2v)}}$_.prevrow=$Z($s($_.pixx),$_.rowbuf);$p($_.linrowmult,$_.lri,1);$_.lri=$_.lri+1}}var _35=$_.prevrow;for(var _36=0,_37=_35.length;_36<_37;_36++){$k[$j++]=$g(_35,_36)}$_.linpixs=$a();$_.linrowmult=$G($_.linrowmult,0,$_.lri);$k[$j++]=Infinity;for(var _3F=0,_3G=$_.ccpixx,_3E=$_.ccpixs.length-1;_3G<0?_3F>=_3E:_3F<=_3E;_3F+=_3G){$_.i=_3F;$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3N=0;_3N<93;_3N++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpad);$k[$j++]=1;$k[$j++]=0;for(var _3Q=0;_3Q<93;_3Q++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=1;$q($_.ccrpad);$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3T=0;_3T<93;_3T++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=2;$k[$j++]=2;$k[$j++]=2;$q($_.linrowmult);$_.rowmult=$a();var _3Y=$_.rowmult;var _3d=0;for(var _3Z=0,_3a=_3Y.length;_3Z<_3a;_3Z++){_3d=$f(_3d+$g(_3Y,_3Z))}$_.pixy=_3d;var _3f=$_.linsym;var _3g=$has(_3f,"borderleft");$k[$j++]="borderleft";$k[$j++]=_3f;$k[$j++]="borderleft";if(_3g){var _3h=$k[--$j];var _3i=$k[--$j];$k[$j++]=$g(_3i,_3h)}else{$j-=2;$k[$j++]=10}var _3k=$_.linpad;var _3l=$k[--$j];var _3m=1;var _3n=$f(_3l-(_3k.length+1));if($f(_3l-(_3k.length+1))<1){var _=_3m;_3m=_3n;_3n=_}if(_3n<0){_3n=0}var _3p=$k[--$j];$_[_3p]=_3n;var _3q=$_.linsym;var _3r=$has(_3q,"borderright");$k[$j++]="borderright";$k[$j++]=_3q;$k[$j++]="borderright";if(_3r){var _3s=$k[--$j];var _3t=$k[--$j];$k[$j++]=$g(_3t,_3s)}else{$j-=2;$k[$j++]=10}var _3v=$_.pixx;var _3w=$_.linpad;var _3x=$_.linwidth;var _3y=$k[--$j];var _3z=$_.ccrpad;var _40=1-_3z.length;var _41=$f(_3y-(_3v-_3w.length-1-_3x));if($f(_3y-(_3v-_3w.length-1-_3x))<1-_3z.length){var _=_40;_40=_41;_41=_}if(_41<0){_41=0}var _43=$k[--$j];$_[_43]=_41;$_.bordertop=1;var _44=$_.linsym;var _45=$has(_44,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_44;$k[$j++]="borderbottom";if(_45){var _46=$k[--$j];var _47=$k[--$j];$k[$j++]=$g(_47,_46)}else{$j-=2;$k[$j++]=0}var _4A=$k[--$j];var _4B=$k[--$j];$_[_4B]=$f(_4A+$_.lindescent);var _4C=$_.linsym;var _4D=$has(_4C,"guardleftpos");$k[$j++]="guardleftpos";$k[$j++]=_4C;$k[$j++]="guardleftpos";if(_4D){var _4E=$k[--$j];var _4F=$k[--$j];$k[$j++]=$f($g(_4F,_4E)-($_.linpad.length+1))}else{$j-=2;$k[$j++]=0}var _4I=$k[--$j];var _4J=$k[--$j];$_[_4J]=_4I;var _4K=$_.linsym;var _4L=$has(_4K,"guardleftypos");$k[$j++]="guardleftypos";$k[$j++]=_4K;$k[$j++]="guardleftypos";if(_4L){var _4M=$k[--$j];var _4N=$k[--$j];$k[$j++]=$f($g(_4N,_4M)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4Q=$k[--$j];var _4R=$k[--$j];$_[_4R]=_4Q;var _4S=$_.linsym;var _4T=$has(_4S,"guardrightpos");$k[$j++]="guardrightpos";$k[$j++]=_4S;$k[$j++]="guardrightpos";if(_4T){var _4U=$k[--$j];var _4V=$k[--$j];$k[$j++]=$f($g(_4V,_4U)+($_.linpad.length+1+$_.linwidth-$_.pixx))}else{$j-=2;$k[$j++]=0}var _4a=$k[--$j];var _4b=$k[--$j];$_[_4b]=_4a;var _4c=$_.linsym;var _4d=$has(_4c,"guardrightypos");$k[$j++]="guardrightypos";$k[$j++]=_4c;$k[$j++]="guardrightypos";if(_4d){var _4e=$k[--$j];var _4f=$k[--$j];$k[$j++]=$f($g(_4f,_4e)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4i=$k[--$j];var _4j=$k[--$j];$_[_4j]=_4i;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["guardwhitespace",$_.guardwhitespace],["guardleftpos",$_.guardleftpos],["guardleftypos",$_.guardleftypos],["guardrightpos",$_.guardrightpos],["guardrightypos",$_.guardrightypos],["guardwidth",$_.guardwidth],["guardheight",$_.guardheight],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_ean8composite(){var $__=$_;$_=Object.assign({},$_,bwipp_ean8composite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.guardwhitespace=false;$_.guardwidth=5;$_.guardheight=7;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#37400";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","ean8");$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _C=$s($_.comp.length+18);$P(_C,0,"(01)00000000000000");$P(_C,18,$_.comp);$k[$j++]=_C;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_ean8();var _G=$k[--$j];$_.linsym=_G;$_.sbs=$g($_.linsym,"sbs");$_.bhs=$g($_.linsym,"bhs");$_.bbs=$g($_.linsym,"bbs");$k[$j++]="linwidth";var _Q=0;$F($_.sbs,function(){var _O=$k[--$j];_Q=$f(_Q+$i(_O))});var _R=$k[--$j];$_[_R]=_Q;$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _U=$k[--$j];$_.compsym=_U;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;for(var _c=0,_d=$_.ccpixx-69;_c<_d;_c++){$k[$j++]=0}$_.linpad=$a();$k[$j++]=Infinity;var _e=$_.linsym;var _f=$has(_e,"txt");$k[$j++]=_e;$k[$j++]="txt";if(_f){var _g=$k[--$j];var _h=$k[--$j];$F($g(_h,_g),function(){var _j=$k[--$j];$q(_j);$r(4,-1);var _l=$k[--$j];$k[$j++]=$f(_l+($_.linpad.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _n=$_.linsym;var _o=$has(_n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_n;$k[$j++]="text1xalign";if(_o){var _p=$k[--$j];var _q=$k[--$j];$k[$j++]=$g(_q,_p)}else{$j-=2;$k[$j++]="unset"}var _s=$k[--$j];var _t=$k[--$j];$_[_t]=_s;var _u=$_.linsym;var _v=$has(_u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_u;$k[$j++]="text1yalign";if(_v){var _w=$k[--$j];var _x=$k[--$j];$k[$j++]=$g(_x,_w)}else{$j-=2;$k[$j++]="unset"}var _z=$k[--$j];var _10=$k[--$j];$_[_10]=_z;$_.diff=$f($_.linwidth+$_.linpad.length+1-$_.ccpixx);if($_.diff>0){$k[$j++]=Infinity;for(var _16=0,_17=$_.diff;_16<_17;_16++){$k[$j++]=0}$_.ccrpad=$a();$_.pixx=$f($_.ccpixx+$_.diff)}else{$_.ccrpad=$a(0);$_.pixx=$_.ccpixx}$_.ccrows=$_.ccrowmult.length;$_.nbars=~~(($_.sbs.length+1)/2);$_.bbsrow=$a($_.nbars);$_.bhsrow=$a($_.nbars);for(var _1K=0,_1J=$_.nbars-1;_1K<=_1J;_1K+=1){$_.b=_1K;$p($_.bbsrow,$_.b,~~($g($_.bbs,$_.b)*72));$p($_.bhsrow,$_.b,$f($g($_.bbsrow,$_.b)+$g($_.bhs,$_.b)*72))}var _1Y=$_.bhsrow;$k[$j++]="linheight";$k[$j++]=0;for(var _1Z=0,_1a=_1Y.length;_1Z<_1a;_1Z++){var _1b=$g(_1Y,_1Z);var _1c=$k[--$j];var _1d=$ceil(_1b);if(_1c<$ceil(_1b)){var _=_1d;_1d=_1c;_1c=_}$k[$j++]=_1c}var _1e=$k[--$j];var _1f=$k[--$j];$_[_1f]=_1e;var _1g=$_.bbsrow;$k[$j++]="lindescent";$k[$j++]=0;for(var _1h=0,_1i=_1g.length;_1h<_1i;_1h++){var _1j=$g(_1g,_1h);var _1k=$k[--$j];var _1l=$flr(_1j);if(_1k>$flr(_1j)){var _=_1l;_1l=_1k;_1k=_}$k[$j++]=_1k}var _1m=$k[--$j];var _1n=$k[--$j];$_[_1n]=_1m;var _1o=$_.txt;for(var _1p=0,_1q=_1o.length;_1p<_1q;_1p++){var _1r=$g(_1o,_1p);$p(_1r,2,$f($g(_1r,2)+-$_.lindescent))}$_.mainbars=$_.nbars;for(var _1x=0,_1w=$_.sbs.length-1;_1x<=_1w;_1x+=1){var _20=$t($g($_.sbs,_1x));$k[$j++]=_1x;if($eq(_20,"realtype")){var _21=$k[--$j];$_.mainbars=~~((_21+1)/2);break}else{$j--}}for(var _24=0,_23=$_.mainbars-1;_24<=_23;_24+=1){$p($_.bhsrow,_24,$_.linheight)}$_.rowbuf=$s($_.pixx);$_.prevrow="";$_.linrowmult=$a(72);$_.lri=0;$k[$j++]=Infinity;for(var _2D=$_.linheight-1,_2C=$_.lindescent;_2D>=_2C;_2D-=1){$_.y=_2D;$_.p=0;var _2E=$_.linpad;for(var _2F=0,_2G=_2E.length;_2F<_2G;_2F++){$p($_.rowbuf,$_.p,$g(_2E,_2F));$_.p=$_.p+1}$p($_.rowbuf,$_.p,0);$_.p=$_.p+1;for(var _2Q=0,_2P=$_.sbs.length-1;_2Q<=_2P;_2Q+=1){$_.i=_2Q;if($_.i%2==0){$k[$j++]=$g($_.bbsrow,~~($_.i/2))>$_.y||$g($_.bhsrow,~~($_.i/2))<$_.y?0:1}else{$k[$j++]=0}for(var _2e=0,_2f=$i($g($_.sbs,$_.i));_2e<_2f;_2e++){var _2i=$k[--$j];$p($_.rowbuf,$_.p,_2i);$_.p=$_.p+1;$k[$j++]=_2i}$j--}if($_.diff<0){$p($_.rowbuf,$_.p,0);$_.p=$_.p+1}if($eq($_.rowbuf,$_.prevrow)){var _2q=$_.linrowmult;var _2r=$_.lri;$p(_2q,_2r-1,$g(_2q,_2r-1)+1)}else{if($_.prevrow.length>0){var _2u=$_.prevrow;for(var _2v=0,_2w=_2u.length;_2v<_2w;_2v++){$k[$j++]=$g(_2u,_2v)}}$_.prevrow=$Z($s($_.pixx),$_.rowbuf);$p($_.linrowmult,$_.lri,1);$_.lri=$_.lri+1}}var _35=$_.prevrow;for(var _36=0,_37=_35.length;_36<_37;_36++){$k[$j++]=$g(_35,_36)}$_.linpixs=$a();$_.linrowmult=$G($_.linrowmult,0,$_.lri);$k[$j++]=Infinity;for(var _3F=0,_3G=$_.ccpixx,_3E=$_.ccpixs.length-1;_3G<0?_3F>=_3E:_3F<=_3E;_3F+=_3G){$_.i=_3F;$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3N=0;_3N<65;_3N++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpad);$k[$j++]=1;$k[$j++]=0;for(var _3Q=0;_3Q<65;_3Q++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=1;$q($_.ccrpad);$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3T=0;_3T<65;_3T++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=2;$k[$j++]=2;$k[$j++]=2;$q($_.linrowmult);$_.rowmult=$a();var _3Y=$_.rowmult;var _3d=0;for(var _3Z=0,_3a=_3Y.length;_3Z<_3a;_3Z++){_3d=$f(_3d+$g(_3Y,_3Z))}$_.pixy=_3d;var _3f=$_.linsym;var _3g=$has(_3f,"borderleft");$k[$j++]="borderleft";$k[$j++]=_3f;$k[$j++]="borderleft";if(_3g){var _3h=$k[--$j];var _3i=$k[--$j];$k[$j++]=$g(_3i,_3h)}else{$j-=2;$k[$j++]=10}var _3k=$_.linpad;var _3l=$k[--$j];var _3m=1;var _3n=$f(_3l-(_3k.length+1));if($f(_3l-(_3k.length+1))<1){var _=_3m;_3m=_3n;_3n=_}if(_3n<0){_3n=0}var _3p=$k[--$j];$_[_3p]=_3n;var _3q=$_.linsym;var _3r=$has(_3q,"borderright");$k[$j++]="borderright";$k[$j++]=_3q;$k[$j++]="borderright";if(_3r){var _3s=$k[--$j];var _3t=$k[--$j];$k[$j++]=$g(_3t,_3s)}else{$j-=2;$k[$j++]=10}var _3v=$_.pixx;var _3w=$_.linpad;var _3x=$_.linwidth;var _3y=$k[--$j];var _3z=$_.ccrpad;var _40=1-_3z.length;var _41=$f(_3y-(_3v-_3w.length-1-_3x));if($f(_3y-(_3v-_3w.length-1-_3x))<1-_3z.length){var _=_40;_40=_41;_41=_}if(_41<0){_41=0}var _43=$k[--$j];$_[_43]=_41;$_.bordertop=1;var _44=$_.linsym;var _45=$has(_44,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_44;$k[$j++]="borderbottom";if(_45){var _46=$k[--$j];var _47=$k[--$j];$k[$j++]=$g(_47,_46)}else{$j-=2;$k[$j++]=0}var _4A=$k[--$j];var _4B=$k[--$j];$_[_4B]=$f(_4A+$_.lindescent);var _4C=$_.linsym;var _4D=$has(_4C,"guardleftpos");$k[$j++]="guardleftpos";$k[$j++]=_4C;$k[$j++]="guardleftpos";if(_4D){var _4E=$k[--$j];var _4F=$k[--$j];$k[$j++]=$f($g(_4F,_4E)-($_.linpad.length+1))}else{$j-=2;$k[$j++]=0}var _4I=$k[--$j];var _4J=$k[--$j];$_[_4J]=_4I;var _4K=$_.linsym;var _4L=$has(_4K,"guardleftypos");$k[$j++]="guardleftypos";$k[$j++]=_4K;$k[$j++]="guardleftypos";if(_4L){var _4M=$k[--$j];var _4N=$k[--$j];$k[$j++]=$f($g(_4N,_4M)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4Q=$k[--$j];var _4R=$k[--$j];$_[_4R]=_4Q;var _4S=$_.linsym;var _4T=$has(_4S,"guardrightpos");$k[$j++]="guardrightpos";$k[$j++]=_4S;$k[$j++]="guardrightpos";if(_4T){var _4U=$k[--$j];var _4V=$k[--$j];$k[$j++]=$f($g(_4V,_4U)+($_.linpad.length+1+$_.linwidth-$_.pixx))}else{$j-=2;$k[$j++]=0}var _4a=$k[--$j];var _4b=$k[--$j];$_[_4b]=_4a;var _4c=$_.linsym;var _4d=$has(_4c,"guardrightypos");$k[$j++]="guardrightypos";$k[$j++]=_4c;$k[$j++]="guardrightypos";if(_4d){var _4e=$k[--$j];var _4f=$k[--$j];$k[$j++]=$f($g(_4f,_4e)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4i=$k[--$j];var _4j=$k[--$j];$_[_4j]=_4i;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["guardwhitespace",$_.guardwhitespace],["guardleftpos",$_.guardleftpos],["guardleftypos",$_.guardleftypos],["guardrightpos",$_.guardrightpos],["guardrightypos",$_.guardrightypos],["guardwidth",$_.guardwidth],["guardheight",$_.guardheight],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_upcacomposite(){var $__=$_;$_=Object.assign({},$_,bwipp_upcacomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.guardwhitespace=false;$_.guardwidth=5;$_.guardheight=7;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#37673";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","ean13");$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _C=$s($_.comp.length+18);$P(_C,0,"(01)00000000000000");$P(_C,18,$_.comp);$k[$j++]=_C;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_upca();var _G=$k[--$j];$_.linsym=_G;$_.sbs=$g($_.linsym,"sbs");$_.bhs=$g($_.linsym,"bhs");$_.bbs=$g($_.linsym,"bbs");$k[$j++]="linwidth";var _Q=0;$F($_.sbs,function(){var _O=$k[--$j];_Q=$f(_Q+$i(_O))});var _R=$k[--$j];$_[_R]=_Q;$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _U=$k[--$j];$_.compsym=_U;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;for(var _c=0,_d=$_.ccpixx-97;_c<_d;_c++){$k[$j++]=0}$_.linpad=$a();$k[$j++]=Infinity;var _e=$_.linsym;var _f=$has(_e,"txt");$k[$j++]=_e;$k[$j++]="txt";if(_f){var _g=$k[--$j];var _h=$k[--$j];$F($g(_h,_g),function(){var _j=$k[--$j];$q(_j);$r(4,-1);var _l=$k[--$j];$k[$j++]=$f(_l+($_.linpad.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _n=$_.linsym;var _o=$has(_n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_n;$k[$j++]="text1xalign";if(_o){var _p=$k[--$j];var _q=$k[--$j];$k[$j++]=$g(_q,_p)}else{$j-=2;$k[$j++]="unset"}var _s=$k[--$j];var _t=$k[--$j];$_[_t]=_s;var _u=$_.linsym;var _v=$has(_u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_u;$k[$j++]="text1yalign";if(_v){var _w=$k[--$j];var _x=$k[--$j];$k[$j++]=$g(_x,_w)}else{$j-=2;$k[$j++]="unset"}var _z=$k[--$j];var _10=$k[--$j];$_[_10]=_z;$_.diff=$f($_.linwidth+$_.linpad.length+1-$_.ccpixx);if($_.diff>0){$k[$j++]=Infinity;for(var _16=0,_17=$_.diff;_16<_17;_16++){$k[$j++]=0}$_.ccrpad=$a();$_.pixx=$f($_.ccpixx+$_.diff)}else{$_.ccrpad=$a(0);$_.pixx=$_.ccpixx}$_.ccrows=$_.ccrowmult.length;$_.nbars=~~(($_.sbs.length+1)/2);$_.bbsrow=$a($_.nbars);$_.bhsrow=$a($_.nbars);for(var _1K=0,_1J=$_.nbars-1;_1K<=_1J;_1K+=1){$_.b=_1K;$p($_.bbsrow,$_.b,~~($g($_.bbs,$_.b)*72));$p($_.bhsrow,$_.b,$f($g($_.bbsrow,$_.b)+$g($_.bhs,$_.b)*72))}var _1Y=$_.bhsrow;$k[$j++]="linheight";$k[$j++]=0;for(var _1Z=0,_1a=_1Y.length;_1Z<_1a;_1Z++){var _1b=$g(_1Y,_1Z);var _1c=$k[--$j];var _1d=$ceil(_1b);if(_1c<$ceil(_1b)){var _=_1d;_1d=_1c;_1c=_}$k[$j++]=_1c}var _1e=$k[--$j];var _1f=$k[--$j];$_[_1f]=_1e;var _1g=$_.bbsrow;$k[$j++]="lindescent";$k[$j++]=0;for(var _1h=0,_1i=_1g.length;_1h<_1i;_1h++){var _1j=$g(_1g,_1h);var _1k=$k[--$j];var _1l=$flr(_1j);if(_1k>$flr(_1j)){var _=_1l;_1l=_1k;_1k=_}$k[$j++]=_1k}var _1m=$k[--$j];var _1n=$k[--$j];$_[_1n]=_1m;var _1o=$_.txt;for(var _1p=0,_1q=_1o.length;_1p<_1q;_1p++){var _1r=$g(_1o,_1p);$p(_1r,2,$f($g(_1r,2)+-$_.lindescent))}$_.mainbars=$_.nbars;for(var _1x=0,_1w=$_.sbs.length-1;_1x<=_1w;_1x+=1){var _20=$t($g($_.sbs,_1x));$k[$j++]=_1x;if($eq(_20,"realtype")){var _21=$k[--$j];$_.mainbars=~~((_21+1)/2);break}else{$j--}}for(var _24=0,_23=$_.mainbars-1;_24<=_23;_24+=1){$p($_.bhsrow,_24,$_.linheight)}$_.rowbuf=$s($_.pixx);$_.prevrow="";$_.linrowmult=$a(72);$_.lri=0;$k[$j++]=Infinity;for(var _2D=$_.linheight-1,_2C=$_.lindescent;_2D>=_2C;_2D-=1){$_.y=_2D;$_.p=0;var _2E=$_.linpad;for(var _2F=0,_2G=_2E.length;_2F<_2G;_2F++){$p($_.rowbuf,$_.p,$g(_2E,_2F));$_.p=$_.p+1}$p($_.rowbuf,$_.p,0);$_.p=$_.p+1;for(var _2Q=0,_2P=$_.sbs.length-1;_2Q<=_2P;_2Q+=1){$_.i=_2Q;if($_.i%2==0){$k[$j++]=$g($_.bbsrow,~~($_.i/2))>$_.y||$g($_.bhsrow,~~($_.i/2))<$_.y?0:1}else{$k[$j++]=0}for(var _2e=0,_2f=$i($g($_.sbs,$_.i));_2e<_2f;_2e++){var _2i=$k[--$j];$p($_.rowbuf,$_.p,_2i);$_.p=$_.p+1;$k[$j++]=_2i}$j--}if($_.diff<0){$p($_.rowbuf,$_.p,0);$_.p=$_.p+1}if($eq($_.rowbuf,$_.prevrow)){var _2q=$_.linrowmult;var _2r=$_.lri;$p(_2q,_2r-1,$g(_2q,_2r-1)+1)}else{if($_.prevrow.length>0){var _2u=$_.prevrow;for(var _2v=0,_2w=_2u.length;_2v<_2w;_2v++){$k[$j++]=$g(_2u,_2v)}}$_.prevrow=$Z($s($_.pixx),$_.rowbuf);$p($_.linrowmult,$_.lri,1);$_.lri=$_.lri+1}}var _35=$_.prevrow;for(var _36=0,_37=_35.length;_36<_37;_36++){$k[$j++]=$g(_35,_36)}$_.linpixs=$a();$_.linrowmult=$G($_.linrowmult,0,$_.lri);$k[$j++]=Infinity;for(var _3F=0,_3G=$_.ccpixx,_3E=$_.ccpixs.length-1;_3G<0?_3F>=_3E:_3F<=_3E;_3F+=_3G){$_.i=_3F;$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3N=0;_3N<93;_3N++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpad);$k[$j++]=1;$k[$j++]=0;for(var _3Q=0;_3Q<93;_3Q++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=1;$q($_.ccrpad);$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3T=0;_3T<93;_3T++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=2;$k[$j++]=2;$k[$j++]=2;$q($_.linrowmult);$_.rowmult=$a();var _3Y=$_.rowmult;var _3d=0;for(var _3Z=0,_3a=_3Y.length;_3Z<_3a;_3Z++){_3d=$f(_3d+$g(_3Y,_3Z))}$_.pixy=_3d;var _3f=$_.linsym;var _3g=$has(_3f,"borderleft");$k[$j++]="borderleft";$k[$j++]=_3f;$k[$j++]="borderleft";if(_3g){var _3h=$k[--$j];var _3i=$k[--$j];$k[$j++]=$g(_3i,_3h)}else{$j-=2;$k[$j++]=10}var _3k=$_.linpad;var _3l=$k[--$j];var _3m=1;var _3n=$f(_3l-(_3k.length+1));if($f(_3l-(_3k.length+1))<1){var _=_3m;_3m=_3n;_3n=_}if(_3n<0){_3n=0}var _3p=$k[--$j];$_[_3p]=_3n;var _3q=$_.linsym;var _3r=$has(_3q,"borderright");$k[$j++]="borderright";$k[$j++]=_3q;$k[$j++]="borderright";if(_3r){var _3s=$k[--$j];var _3t=$k[--$j];$k[$j++]=$g(_3t,_3s)}else{$j-=2;$k[$j++]=10}var _3v=$_.pixx;var _3w=$_.linpad;var _3x=$_.linwidth;var _3y=$k[--$j];var _3z=$_.ccrpad;var _40=1-_3z.length;var _41=$f(_3y-(_3v-_3w.length-1-_3x));if($f(_3y-(_3v-_3w.length-1-_3x))<1-_3z.length){var _=_40;_40=_41;_41=_}if(_41<0){_41=0}var _43=$k[--$j];$_[_43]=_41;$_.bordertop=1;var _44=$_.linsym;var _45=$has(_44,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_44;$k[$j++]="borderbottom";if(_45){var _46=$k[--$j];var _47=$k[--$j];$k[$j++]=$g(_47,_46)}else{$j-=2;$k[$j++]=0}var _4A=$k[--$j];var _4B=$k[--$j];$_[_4B]=$f(_4A+$_.lindescent);var _4C=$_.linsym;var _4D=$has(_4C,"guardleftpos");$k[$j++]="guardleftpos";$k[$j++]=_4C;$k[$j++]="guardleftpos";if(_4D){var _4E=$k[--$j];var _4F=$k[--$j];$k[$j++]=$f($g(_4F,_4E)-($_.linpad.length+1))}else{$j-=2;$k[$j++]=0}var _4I=$k[--$j];var _4J=$k[--$j];$_[_4J]=_4I;var _4K=$_.linsym;var _4L=$has(_4K,"guardleftypos");$k[$j++]="guardleftypos";$k[$j++]=_4K;$k[$j++]="guardleftypos";if(_4L){var _4M=$k[--$j];var _4N=$k[--$j];$k[$j++]=$f($g(_4N,_4M)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4Q=$k[--$j];var _4R=$k[--$j];$_[_4R]=_4Q;var _4S=$_.linsym;var _4T=$has(_4S,"guardrightpos");$k[$j++]="guardrightpos";$k[$j++]=_4S;$k[$j++]="guardrightpos";if(_4T){var _4U=$k[--$j];var _4V=$k[--$j];$k[$j++]=$f($g(_4V,_4U)+($_.linpad.length+1+$_.linwidth-$_.pixx))}else{$j-=2;$k[$j++]=0}var _4a=$k[--$j];var _4b=$k[--$j];$_[_4b]=_4a;var _4c=$_.linsym;var _4d=$has(_4c,"guardrightypos");$k[$j++]="guardrightypos";$k[$j++]=_4c;$k[$j++]="guardrightypos";if(_4d){var _4e=$k[--$j];var _4f=$k[--$j];$k[$j++]=$f($g(_4f,_4e)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4i=$k[--$j];var _4j=$k[--$j];$_[_4j]=_4i;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["guardwhitespace",$_.guardwhitespace],["guardleftpos",$_.guardleftpos],["guardleftypos",$_.guardleftypos],["guardrightpos",$_.guardrightpos],["guardrightypos",$_.guardrightypos],["guardwidth",$_.guardwidth],["guardheight",$_.guardheight],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_upcecomposite(){var $__=$_;$_=Object.assign({},$_,bwipp_upcecomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.guardwhitespace=false;$_.guardwidth=5;$_.guardheight=7;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#37943";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","upce");$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _C=$s($_.comp.length+18);$P(_C,0,"(01)00000000000000");$P(_C,18,$_.comp);$k[$j++]=_C;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_upce();var _G=$k[--$j];$_.linsym=_G;$_.sbs=$g($_.linsym,"sbs");$_.bhs=$g($_.linsym,"bhs");$_.bbs=$g($_.linsym,"bbs");$k[$j++]="linwidth";var _Q=0;$F($_.sbs,function(){var _O=$k[--$j];_Q=$f(_Q+$i(_O))});var _R=$k[--$j];$_[_R]=_Q;$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _U=$k[--$j];$_.compsym=_U;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;for(var _c=0,_d=$_.ccpixx-53;_c<_d;_c++){$k[$j++]=0}$_.linpad=$a();$k[$j++]=Infinity;var _e=$_.linsym;var _f=$has(_e,"txt");$k[$j++]=_e;$k[$j++]="txt";if(_f){var _g=$k[--$j];var _h=$k[--$j];$F($g(_h,_g),function(){var _j=$k[--$j];$q(_j);$r(4,-1);var _l=$k[--$j];$k[$j++]=$f(_l+($_.linpad.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _n=$_.linsym;var _o=$has(_n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_n;$k[$j++]="text1xalign";if(_o){var _p=$k[--$j];var _q=$k[--$j];$k[$j++]=$g(_q,_p)}else{$j-=2;$k[$j++]="unset"}var _s=$k[--$j];var _t=$k[--$j];$_[_t]=_s;var _u=$_.linsym;var _v=$has(_u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_u;$k[$j++]="text1yalign";if(_v){var _w=$k[--$j];var _x=$k[--$j];$k[$j++]=$g(_x,_w)}else{$j-=2;$k[$j++]="unset"}var _z=$k[--$j];var _10=$k[--$j];$_[_10]=_z;$_.diff=$f($_.linwidth+$_.linpad.length+1-$_.ccpixx);if($_.diff>0){$k[$j++]=Infinity;for(var _16=0,_17=$_.diff;_16<_17;_16++){$k[$j++]=0}$_.ccrpad=$a();$_.pixx=$f($_.ccpixx+$_.diff)}else{$_.ccrpad=$a(0);$_.pixx=$_.ccpixx}$_.ccrows=$_.ccrowmult.length;$_.nbars=~~(($_.sbs.length+1)/2);$_.bbsrow=$a($_.nbars);$_.bhsrow=$a($_.nbars);for(var _1K=0,_1J=$_.nbars-1;_1K<=_1J;_1K+=1){$_.b=_1K;$p($_.bbsrow,$_.b,~~($g($_.bbs,$_.b)*72));$p($_.bhsrow,$_.b,$f($g($_.bbsrow,$_.b)+$g($_.bhs,$_.b)*72))}var _1Y=$_.bhsrow;$k[$j++]="linheight";$k[$j++]=0;for(var _1Z=0,_1a=_1Y.length;_1Z<_1a;_1Z++){var _1b=$g(_1Y,_1Z);var _1c=$k[--$j];var _1d=$ceil(_1b);if(_1c<$ceil(_1b)){var _=_1d;_1d=_1c;_1c=_}$k[$j++]=_1c}var _1e=$k[--$j];var _1f=$k[--$j];$_[_1f]=_1e;var _1g=$_.bbsrow;$k[$j++]="lindescent";$k[$j++]=0;for(var _1h=0,_1i=_1g.length;_1h<_1i;_1h++){var _1j=$g(_1g,_1h);var _1k=$k[--$j];var _1l=$flr(_1j);if(_1k>$flr(_1j)){var _=_1l;_1l=_1k;_1k=_}$k[$j++]=_1k}var _1m=$k[--$j];var _1n=$k[--$j];$_[_1n]=_1m;var _1o=$_.txt;for(var _1p=0,_1q=_1o.length;_1p<_1q;_1p++){var _1r=$g(_1o,_1p);$p(_1r,2,$f($g(_1r,2)+-$_.lindescent))}$_.mainbars=$_.nbars;for(var _1x=0,_1w=$_.sbs.length-1;_1x<=_1w;_1x+=1){var _20=$t($g($_.sbs,_1x));$k[$j++]=_1x;if($eq(_20,"realtype")){var _21=$k[--$j];$_.mainbars=~~((_21+1)/2);break}else{$j--}}for(var _24=0,_23=$_.mainbars-1;_24<=_23;_24+=1){$p($_.bhsrow,_24,$_.linheight)}$_.rowbuf=$s($_.pixx);$_.prevrow="";$_.linrowmult=$a(72);$_.lri=0;$k[$j++]=Infinity;for(var _2D=$_.linheight-1,_2C=$_.lindescent;_2D>=_2C;_2D-=1){$_.y=_2D;$_.p=0;var _2E=$_.linpad;for(var _2F=0,_2G=_2E.length;_2F<_2G;_2F++){$p($_.rowbuf,$_.p,$g(_2E,_2F));$_.p=$_.p+1}$p($_.rowbuf,$_.p,0);$_.p=$_.p+1;for(var _2Q=0,_2P=$_.sbs.length-1;_2Q<=_2P;_2Q+=1){$_.i=_2Q;if($_.i%2==0){$k[$j++]=$g($_.bbsrow,~~($_.i/2))>$_.y||$g($_.bhsrow,~~($_.i/2))<$_.y?0:1}else{$k[$j++]=0}for(var _2e=0,_2f=$i($g($_.sbs,$_.i));_2e<_2f;_2e++){var _2i=$k[--$j];$p($_.rowbuf,$_.p,_2i);$_.p=$_.p+1;$k[$j++]=_2i}$j--}if($_.diff<0){$p($_.rowbuf,$_.p,0);$_.p=$_.p+1}if($eq($_.rowbuf,$_.prevrow)){var _2q=$_.linrowmult;var _2r=$_.lri;$p(_2q,_2r-1,$g(_2q,_2r-1)+1)}else{if($_.prevrow.length>0){var _2u=$_.prevrow;for(var _2v=0,_2w=_2u.length;_2v<_2w;_2v++){$k[$j++]=$g(_2u,_2v)}}$_.prevrow=$Z($s($_.pixx),$_.rowbuf);$p($_.linrowmult,$_.lri,1);$_.lri=$_.lri+1}}var _35=$_.prevrow;for(var _36=0,_37=_35.length;_36<_37;_36++){$k[$j++]=$g(_35,_36)}$_.linpixs=$a();$_.linrowmult=$G($_.linrowmult,0,$_.lri);$k[$j++]=Infinity;for(var _3F=0,_3G=$_.ccpixx,_3E=$_.ccpixs.length-1;_3G<0?_3F>=_3E:_3F<=_3E;_3F+=_3G){$_.i=_3F;$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3N=0;_3N<49;_3N++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpad);$k[$j++]=1;$k[$j++]=0;for(var _3Q=0;_3Q<49;_3Q++){$k[$j++]=0}$k[$j++]=0;$k[$j++]=1;$q($_.ccrpad);$q($_.linpad);$k[$j++]=0;$k[$j++]=1;for(var _3T=0;_3T<49;_3T++){$k[$j++]=0}$k[$j++]=1;$k[$j++]=0;$q($_.ccrpad);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=2;$k[$j++]=2;$k[$j++]=2;$q($_.linrowmult);$_.rowmult=$a();var _3Y=$_.rowmult;var _3d=0;for(var _3Z=0,_3a=_3Y.length;_3Z<_3a;_3Z++){_3d=$f(_3d+$g(_3Y,_3Z))}$_.pixy=_3d;var _3f=$_.linsym;var _3g=$has(_3f,"borderleft");$k[$j++]="borderleft";$k[$j++]=_3f;$k[$j++]="borderleft";if(_3g){var _3h=$k[--$j];var _3i=$k[--$j];$k[$j++]=$g(_3i,_3h)}else{$j-=2;$k[$j++]=10}var _3k=$_.linpad;var _3l=$k[--$j];var _3m=1;var _3n=$f(_3l-(_3k.length+1));if($f(_3l-(_3k.length+1))<1){var _=_3m;_3m=_3n;_3n=_}if(_3n<0){_3n=0}var _3p=$k[--$j];$_[_3p]=_3n;var _3q=$_.linsym;var _3r=$has(_3q,"borderright");$k[$j++]="borderright";$k[$j++]=_3q;$k[$j++]="borderright";if(_3r){var _3s=$k[--$j];var _3t=$k[--$j];$k[$j++]=$g(_3t,_3s)}else{$j-=2;$k[$j++]=10}var _3v=$_.pixx;var _3w=$_.linpad;var _3x=$_.linwidth;var _3y=$k[--$j];var _3z=$_.ccrpad;var _40=1-_3z.length;var _41=$f(_3y-(_3v-_3w.length-1-_3x));if($f(_3y-(_3v-_3w.length-1-_3x))<1-_3z.length){var _=_40;_40=_41;_41=_}if(_41<0){_41=0}var _43=$k[--$j];$_[_43]=_41;$_.bordertop=1;var _44=$_.linsym;var _45=$has(_44,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_44;$k[$j++]="borderbottom";if(_45){var _46=$k[--$j];var _47=$k[--$j];$k[$j++]=$g(_47,_46)}else{$j-=2;$k[$j++]=0}var _4A=$k[--$j];var _4B=$k[--$j];$_[_4B]=$f(_4A+$_.lindescent);var _4C=$_.linsym;var _4D=$has(_4C,"guardleftpos");$k[$j++]="guardleftpos";$k[$j++]=_4C;$k[$j++]="guardleftpos";if(_4D){var _4E=$k[--$j];var _4F=$k[--$j];$k[$j++]=$f($g(_4F,_4E)-($_.linpad.length+1))}else{$j-=2;$k[$j++]=0}var _4I=$k[--$j];var _4J=$k[--$j];$_[_4J]=_4I;var _4K=$_.linsym;var _4L=$has(_4K,"guardleftypos");$k[$j++]="guardleftypos";$k[$j++]=_4K;$k[$j++]="guardleftypos";if(_4L){var _4M=$k[--$j];var _4N=$k[--$j];$k[$j++]=$f($g(_4N,_4M)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4Q=$k[--$j];var _4R=$k[--$j];$_[_4R]=_4Q;var _4S=$_.linsym;var _4T=$has(_4S,"guardrightpos");$k[$j++]="guardrightpos";$k[$j++]=_4S;$k[$j++]="guardrightpos";if(_4T){var _4U=$k[--$j];var _4V=$k[--$j];$k[$j++]=$f($g(_4V,_4U)+($_.linpad.length+1+$_.linwidth-$_.pixx))}else{$j-=2;$k[$j++]=0}var _4a=$k[--$j];var _4b=$k[--$j];$_[_4b]=_4a;var _4c=$_.linsym;var _4d=$has(_4c,"guardrightypos");$k[$j++]="guardrightypos";$k[$j++]=_4c;$k[$j++]="guardrightypos";if(_4d){var _4e=$k[--$j];var _4f=$k[--$j];$k[$j++]=$f($g(_4f,_4e)+-$_.lindescent)}else{$j-=2;$k[$j++]=0}var _4i=$k[--$j];var _4j=$k[--$j];$_[_4j]=_4i;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["guardwhitespace",$_.guardwhitespace],["guardleftpos",$_.guardleftpos],["guardleftypos",$_.guardleftypos],["guardrightpos",$_.guardrightpos],["guardrightypos",$_.guardrightypos],["guardwidth",$_.guardwidth],["guardheight",$_.guardheight],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databaromnicomposite(){if(!bwipp_databaromnicomposite.globals){var $__=$_;$_=bwipp_databaromnicomposite.globals={};$_.databaromnicomposite_seppad=$a([0,0,0,0]);$_.databaromnicomposite_findersep=$a([0,0,0,0,0,0,0,0,0,0,1,0,0]);$_.databaromnicomposite_f3pat=$a([1,1,1,1,1,1,1,1,1,0,1,1,1]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databaromnicomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _3=$k[--$j];$_.options=_3;var _4=$k[--$j];$_.barcode=_4;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _8=$k[--$j];if(_8){var _9=$k[--$j];$_.linear=_9;$j--;var _A=$k[--$j];$_.comp=_A}else{$k[$j-1]="bwipp.missingCompositeComponent#38215";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databaromni");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _H=$s($_.linear.length+$_.comp.length);$P(_H,0,$_.linear);$P(_H,$_.linear.length,$_.comp);$k[$j++]=_H;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databaromni();var _N=$k[--$j];$_.linsbs=$g(_N,"sbs");$_.linheight=$g($g(_N,"bhs"),0)*72;$_.linsym=_N;$_.sepfinder=function(){var _R=$k[--$j];$_.fp=_R;for(var _V=$_.fp,_U=$_.fp+12;_V<=_U;_V+=1){$_.i=_V;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _h=$k[--$j];$p($_.sep,$_.i,_h)}var _p=true;for(var _j=0;_j<=12;_j+=1){var _m=$g($_.bot,$f(_j+$_.fp));_p=_p&&$eq(_m,$g($_.databaromnicomposite_f3pat,_j))}if(_p){$P($_.sep,$_.fp,$_.databaromnicomposite_findersep)}};$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _t=$k[--$j];var _u=$k[$j-1];var _v=_u==1?0:1;for(var _w=0,_x=_t;_w<_x;_w++){$k[$j++]=_v}});$as($a($m()-1));var _10=$k[--$j];$_.bot=_10;$j-=2;$k[$j++]=Infinity;$F($_.bot,function(){var _12=$k[--$j];$k[$j++]=1-_12});$_.sep=$a();$P($_.sep,0,$a([0,0,0]));$P($_.sep,$_.sep.length-4,$_.databaromnicomposite_seppad);$k[$j++]=18;$_.sepfinder();$k[$j++]=64;$_.sepfinder();$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _19=$k[--$j];$_.compsym=_19;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _1H=$k[--$j];var _1I=$k[$j-1];var _1J=_1I==0?1:0;for(var _1K=0,_1L=$i(_1H);_1K<_1L;_1K++){$k[$j++]=_1J}});$_.linpixs=$a();$k[$j++]=Infinity;$k[$j++]=0;$q($_.sep);$_.sep=$a();$_.linheight=~~$_.linheight;$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _1S=0,_1T=$_.ccpixx,_1R=$_.ccpixs.length-1;_1T<0?_1S>=_1R:_1S<=_1R;_1S+=_1T){$_.i=_1S;$q($G($_.ccpixs,$_.i,$_.ccpixx));$k[$j++]=0}$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.sep);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$k[$j++]=$_.linheight;$_.rowmult=$a();$_.pixx=$_.ccpixx+1;$k[$j++]=Infinity;var _1d=$_.linsym;var _1e=$has(_1d,"txt");$k[$j++]=_1d;$k[$j++]="txt";if(_1e){var _1f=$k[--$j];var _1g=$k[--$j];$F($g(_1g,_1f),function(){var _1i=$k[--$j];$q(_1i);$r(4,-1);var _1l=$k[--$j];$k[$j++]=$f(_1l+($_.pixx-$_.linpixs.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1n=$_.linsym;var _1o=$has(_1n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1n;$k[$j++]="text1xalign";if(_1o){var _1p=$k[--$j];var _1q=$k[--$j];$k[$j++]=$g(_1q,_1p)}else{$j-=2;$k[$j++]="unset"}var _1s=$k[--$j];var _1t=$k[--$j];$_[_1t]=_1s;var _1u=$_.linsym;var _1v=$has(_1u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1u;$k[$j++]="text1yalign";if(_1v){var _1w=$k[--$j];var _1x=$k[--$j];$k[$j++]=$g(_1x,_1w)}else{$j-=2;$k[$j++]="unset"}var _1z=$k[--$j];var _20=$k[--$j];$_[_20]=_1z;var _21=$_.rowmult;var _26=0;for(var _22=0,_23=_21.length;_22<_23;_22++){_26=$f(_26+$g(_21,_22))}$_.pixy=_26;var _28=$_.linsym;var _29=$has(_28,"borderleft");$k[$j++]="borderleft";$k[$j++]=_28;$k[$j++]="borderleft";if(_29){var _2A=$k[--$j];var _2B=$k[--$j];$k[$j++]=$g(_2B,_2A)}else{$j-=2;$k[$j++]=10}var _2D=$_.pixx;var _2E=$_.linpixs;var _2F=$k[--$j];var _2G=1;var _2H=$f(_2F-(_2D-_2E.length+1));if($f(_2F-(_2D-_2E.length+1))<1){var _=_2G;_2G=_2H;_2H=_}if(_2H<0){_2H=0}var _2J=$k[--$j];$_[_2J]=_2H;var _2K=$_.linsym;var _2L=$has(_2K,"borderright");$k[$j++]="borderright";$k[$j++]=_2K;$k[$j++]="borderright";if(_2L){var _2M=$k[--$j];var _2N=$k[--$j];$k[$j++]=$g(_2N,_2M)}else{$j-=2;$k[$j++]=10}var _2P=$k[--$j];var _2Q=0;if(_2P<0){var _=_2Q;_2Q=_2P;_2P=_}if(_2P<0){_2P=0}var _2S=$k[--$j];$_[_2S]=_2P;$_.bordertop=1;var _2T=$_.linsym;var _2U=$has(_2T,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2T;$k[$j++]="borderbottom";if(_2U){var _2V=$k[--$j];var _2W=$k[--$j];$k[$j++]=$g(_2W,_2V)}else{$j-=2;$k[$j++]=0}var _2Y=$k[--$j];var _2Z=$k[--$j];$_[_2Z]=_2Y;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarstackedcomposite(){if(!bwipp_databarstackedcomposite.globals){var $__=$_;$_=bwipp_databarstackedcomposite.globals={};$_.databarstackedcomposite_seppad=$a([0,0,0,0]);$_.databarstackedcomposite_findersep=$a([0,0,0,0,0,0,0,0,0,0,1,0,0]);$_.databarstackedcomposite_f3pat=$a([1,1,1,1,1,1,1,1,1,0,1,1,1]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarstackedcomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _3=$k[--$j];$_.options=_3;var _4=$k[--$j];$_.barcode=_4;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _8=$k[--$j];if(_8){var _9=$k[--$j];$_.linear=_9;$j--;var _A=$k[--$j];$_.comp=_A}else{$k[$j-1]="bwipp.missingCompositeComponent#38449";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databarstacked");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _H=$s($_.linear.length+$_.comp.length);$P(_H,0,$_.linear);$P(_H,$_.linear.length,$_.comp);$k[$j++]=_H;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databarstacked();var _N=$k[--$j];$_.bot=$G($g(_N,"pixs"),0,$g(_N,"pixx"));$_.linheight=$g(_N,"pixy");$_.linsym=_N;$_.linpixs=$g($_.linsym,"pixs");$_.linrowmult=$g($_.linsym,"rowmult");$_.sepfinder=function(){var _W=$k[--$j];$_.fp=_W;for(var _a=$_.fp,_Z=$_.fp+12;_a<=_Z;_a+=1){$_.i=_a;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _m=$k[--$j];$p($_.sep,$_.i,_m)}var _u=true;for(var _o=0;_o<=12;_o+=1){var _r=$g($_.bot,$f(_o+$_.fp));_u=_u&&$eq(_r,$g($_.databarstackedcomposite_f3pat,_o))}if(_u){$P($_.sep,$_.fp,$_.databarstackedcomposite_findersep)}};$k[$j++]=Infinity;var _x=$_.bot;for(var _y=0,_z=_x.length;_y<_z;_y++){$k[$j++]=1-$g(_x,_y)}$_.sep=$a();$P($_.sep,0,$_.databarstackedcomposite_seppad);$P($_.sep,$_.sep.length-4,$_.databarstackedcomposite_seppad);$k[$j++]=18;$_.sepfinder();$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _16=$k[--$j];$_.compsym=_16;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$_.linwidth=$_.sep.length;$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _1I=0,_1J=$_.ccpixx,_1H=$_.ccpixs.length-1;_1J<0?_1I>=_1H:_1I<=_1H;_1I+=_1J){$_.i=_1I;$k[$j++]=0;$q($G($_.ccpixs,$_.i,$_.ccpixx))}$q($_.sep);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;for(var _1S=0,_1T=$_.linwidth,_1R=$_.linpixs.length-1;_1T<0?_1S>=_1R:_1S<=_1R;_1S+=_1T){$_.i=_1S;$q($G($_.linpixs,$_.i,$_.linwidth));$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0}$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$q($_.linrowmult);$_.rowmult=$a();$_.pixx=$_.ccpixx+1;$k[$j++]=Infinity;var _1b=$_.linsym;var _1c=$has(_1b,"txt");$k[$j++]=_1b;$k[$j++]="txt";if(_1c){var _1d=$k[--$j];var _1e=$k[--$j];$F($g(_1e,_1d),function(){var _1g=$k[--$j];$q(_1g);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1i=$_.linsym;var _1j=$has(_1i,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1i;$k[$j++]="text1xalign";if(_1j){var _1k=$k[--$j];var _1l=$k[--$j];$k[$j++]=$g(_1l,_1k)}else{$j-=2;$k[$j++]="unset"}var _1n=$k[--$j];var _1o=$k[--$j];$_[_1o]=_1n;var _1p=$_.linsym;var _1q=$has(_1p,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1p;$k[$j++]="text1yalign";if(_1q){var _1r=$k[--$j];var _1s=$k[--$j];$k[$j++]=$g(_1s,_1r)}else{$j-=2;$k[$j++]="unset"}var _1u=$k[--$j];var _1v=$k[--$j];$_[_1v]=_1u;var _1w=$_.rowmult;var _21=0;for(var _1x=0,_1y=_1w.length;_1x<_1y;_1x++){_21=$f(_21+$g(_1w,_1x))}$_.pixy=_21;var _23=$_.linsym;var _24=$has(_23,"borderleft");$k[$j++]="borderleft";$k[$j++]=_23;$k[$j++]="borderleft";if(_24){var _25=$k[--$j];var _26=$k[--$j];$k[$j++]=$g(_26,_25)}else{$j-=2;$k[$j++]=0}var _28=$k[--$j];var _29=1-1;if(_28<1-1){var _=_29;_29=_28;_28=_}if(_28<0){_28=0}var _2B=$k[--$j];$_[_2B]=_28;var _2C=$_.linsym;var _2D=$has(_2C,"borderright");$k[$j++]="borderright";$k[$j++]=_2C;$k[$j++]="borderright";if(_2D){var _2E=$k[--$j];var _2F=$k[--$j];$k[$j++]=$g(_2F,_2E)}else{$j-=2;$k[$j++]=0}var _2H=$_.pixx;var _2I=$_.linwidth;var _2J=$k[--$j];var _2K=1;var _2L=$f(_2J-(_2H-_2I));if($f(_2J-(_2H-_2I))<1){var _=_2K;_2K=_2L;_2L=_}if(_2L<0){_2L=0}var _2N=$k[--$j];$_[_2N]=_2L;$_.bordertop=1;var _2O=$_.linsym;var _2P=$has(_2O,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2O;$k[$j++]="borderbottom";if(_2P){var _2Q=$k[--$j];var _2R=$k[--$j];$k[$j++]=$g(_2R,_2Q)}else{$j-=2;$k[$j++]=0}var _2T=$k[--$j];var _2U=$k[--$j];$_[_2U]=_2T;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarstackedomnicomposite(){if(!bwipp_databarstackedomnicomposite.globals){var $__=$_;$_=bwipp_databarstackedomnicomposite.globals={};$_.databarstackedomnicomposite_seppad=$a([0,0,0,0]);$_.databarstackedomnicomposite_findersep=$a([0,0,0,0,0,0,0,0,0,0,1,0,0]);$_.databarstackedomnicomposite_f3pat=$a([1,1,1,1,1,1,1,1,1,0,1,1,1]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarstackedomnicomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _3=$k[--$j];$_.options=_3;var _4=$k[--$j];$_.barcode=_4;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _8=$k[--$j];if(_8){var _9=$k[--$j];$_.linear=_9;$j--;var _A=$k[--$j];$_.comp=_A}else{$k[$j-1]="bwipp.missingCompositeComponent#38682";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databarstackedomni");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _H=$s($_.linear.length+$_.comp.length);$P(_H,0,$_.linear);$P(_H,$_.linear.length,$_.comp);$k[$j++]=_H;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databarstackedomni();var _N=$k[--$j];$_.bot=$G($g(_N,"pixs"),0,$g(_N,"pixx"));$_.linheight=$g(_N,"pixy");$_.linsym=_N;$_.linpixs=$g($_.linsym,"pixs");$_.linrowmult=$g($_.linsym,"rowmult");$_.sepfinder=function(){var _W=$k[--$j];$_.fp=_W;for(var _a=$_.fp,_Z=$_.fp+12;_a<=_Z;_a+=1){$_.i=_a;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _m=$k[--$j];$p($_.sep,$_.i,_m)}var _u=true;for(var _o=0;_o<=12;_o+=1){var _r=$g($_.bot,$f(_o+$_.fp));_u=_u&&$eq(_r,$g($_.databarstackedomnicomposite_f3pat,_o))}if(_u){$P($_.sep,$_.fp,$_.databarstackedomnicomposite_findersep)}};$k[$j++]=Infinity;var _x=$_.bot;for(var _y=0,_z=_x.length;_y<_z;_y++){$k[$j++]=1-$g(_x,_y)}$_.sep=$a();$P($_.sep,0,$_.databarstackedomnicomposite_seppad);$P($_.sep,$_.sep.length-4,$_.databarstackedomnicomposite_seppad);$k[$j++]=18;$_.sepfinder();$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _16=$k[--$j];$_.compsym=_16;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$_.linwidth=$_.sep.length;$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _1I=0,_1J=$_.ccpixx,_1H=$_.ccpixs.length-1;_1J<0?_1I>=_1H:_1I<=_1H;_1I+=_1J){$_.i=_1I;$k[$j++]=0;$q($G($_.ccpixs,$_.i,$_.ccpixx))}$q($_.sep);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;for(var _1S=0,_1T=$_.linwidth,_1R=$_.linpixs.length-1;_1T<0?_1S>=_1R:_1S<=_1R;_1S+=_1T){$_.i=_1S;$q($G($_.linpixs,$_.i,$_.linwidth));$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0}$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$q($_.linrowmult);$_.rowmult=$a();$_.pixx=$_.ccpixx+1;$k[$j++]=Infinity;var _1b=$_.linsym;var _1c=$has(_1b,"txt");$k[$j++]=_1b;$k[$j++]="txt";if(_1c){var _1d=$k[--$j];var _1e=$k[--$j];$F($g(_1e,_1d),function(){var _1g=$k[--$j];$q(_1g);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1i=$_.linsym;var _1j=$has(_1i,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1i;$k[$j++]="text1xalign";if(_1j){var _1k=$k[--$j];var _1l=$k[--$j];$k[$j++]=$g(_1l,_1k)}else{$j-=2;$k[$j++]="unset"}var _1n=$k[--$j];var _1o=$k[--$j];$_[_1o]=_1n;var _1p=$_.linsym;var _1q=$has(_1p,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1p;$k[$j++]="text1yalign";if(_1q){var _1r=$k[--$j];var _1s=$k[--$j];$k[$j++]=$g(_1s,_1r)}else{$j-=2;$k[$j++]="unset"}var _1u=$k[--$j];var _1v=$k[--$j];$_[_1v]=_1u;var _1w=$_.rowmult;var _21=0;for(var _1x=0,_1y=_1w.length;_1x<_1y;_1x++){_21=$f(_21+$g(_1w,_1x))}$_.pixy=_21;var _23=$_.linsym;var _24=$has(_23,"borderleft");$k[$j++]="borderleft";$k[$j++]=_23;$k[$j++]="borderleft";if(_24){var _25=$k[--$j];var _26=$k[--$j];$k[$j++]=$g(_26,_25)}else{$j-=2;$k[$j++]=0}var _28=$k[--$j];var _29=1-1;if(_28<1-1){var _=_29;_29=_28;_28=_}if(_28<0){_28=0}var _2B=$k[--$j];$_[_2B]=_28;var _2C=$_.linsym;var _2D=$has(_2C,"borderright");$k[$j++]="borderright";$k[$j++]=_2C;$k[$j++]="borderright";if(_2D){var _2E=$k[--$j];var _2F=$k[--$j];$k[$j++]=$g(_2F,_2E)}else{$j-=2;$k[$j++]=0}var _2H=$_.pixx;var _2I=$_.linwidth;var _2J=$k[--$j];var _2K=1;var _2L=$f(_2J-(_2H-_2I));if($f(_2J-(_2H-_2I))<1){var _=_2K;_2K=_2L;_2L=_}if(_2L<0){_2L=0}var _2N=$k[--$j];$_[_2N]=_2L;$_.bordertop=1;var _2O=$_.linsym;var _2P=$has(_2O,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2O;$k[$j++]="borderbottom";if(_2P){var _2Q=$k[--$j];var _2R=$k[--$j];$k[$j++]=$g(_2R,_2Q)}else{$j-=2;$k[$j++]=0}var _2T=$k[--$j];var _2U=$k[--$j];$_[_2U]=_2T;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databartruncatedcomposite(){if(!bwipp_databartruncatedcomposite.globals){var $__=$_;$_=bwipp_databartruncatedcomposite.globals={};$_.databaromnicomposite_seppadleft=$a([0,0,0]);$_.databaromnicomposite_seppadright=$a([0,0,0,0]);$_.databaromnicomposite_findersep=$a([0,0,0,0,0,0,0,0,0,0,1,0,0]);$_.databaromnicomposite_f3pat=$a([1,1,1,1,1,1,1,1,1,0,1,1,1]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databartruncatedcomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _9=$k[--$j];if(_9){var _A=$k[--$j];$_.linear=_A;$j--;var _B=$k[--$j];$_.comp=_B}else{$k[$j-1]="bwipp.missingCompositeComponent#38916";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databartruncated");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _I=$s($_.linear.length+$_.comp.length);$P(_I,0,$_.linear);$P(_I,$_.linear.length,$_.comp);$k[$j++]=_I;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databartruncated();var _O=$k[--$j];$_.linsbs=$g(_O,"sbs");$_.linheight=$g($g(_O,"bhs"),0)*72;$_.linsym=_O;$_.sepfinder=function(){var _S=$k[--$j];$_.fp=_S;for(var _W=$_.fp,_V=$_.fp+12;_W<=_V;_W+=1){$_.i=_W;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _i=$k[--$j];$p($_.sep,$_.i,_i)}var _q=true;for(var _k=0;_k<=12;_k+=1){var _n=$g($_.bot,$f(_k+$_.fp));_q=_q&&$eq(_n,$g($_.databaromnicomposite_f3pat,_k))}if(_q){$P($_.sep,$_.fp,$_.databaromnicomposite_findersep)}};$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _u=$k[--$j];var _v=$k[$j-1];var _w=_v==1?0:1;for(var _x=0,_y=_u;_x<_y;_x++){$k[$j++]=_w}});$as($a($m()-1));var _11=$k[--$j];$_.bot=_11;$j-=2;$k[$j++]=Infinity;$F($_.bot,function(){var _13=$k[--$j];$k[$j++]=1-_13});$_.sep=$a();$P($_.sep,0,$_.databaromnicomposite_seppadleft);$P($_.sep,$_.sep.length-4,$_.databaromnicomposite_seppadright);$k[$j++]=18;$_.sepfinder();$k[$j++]=64;$_.sepfinder();$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _19=$k[--$j];$_.compsym=_19;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _1H=$k[--$j];var _1I=$k[$j-1];var _1J=_1I==0?1:0;for(var _1K=0,_1L=$i(_1H);_1K<_1L;_1K++){$k[$j++]=_1J}});$_.linpixs=$a();$k[$j++]=Infinity;$k[$j++]=0;$q($_.sep);$_.sep=$a();$_.linheight=~~$_.linheight;$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _1S=0,_1T=$_.ccpixx,_1R=$_.ccpixs.length-1;_1T<0?_1S>=_1R:_1S<=_1R;_1S+=_1T){$_.i=_1S;$q($G($_.ccpixs,$_.i,$_.ccpixx));$k[$j++]=0}$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.sep);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$k[$j++]=$_.linheight;$_.rowmult=$a();$_.pixx=$_.ccpixx+1;$k[$j++]=Infinity;var _1d=$_.linsym;var _1e=$has(_1d,"txt");$k[$j++]=_1d;$k[$j++]="txt";if(_1e){var _1f=$k[--$j];var _1g=$k[--$j];$F($g(_1g,_1f),function(){var _1i=$k[--$j];$q(_1i);$r(4,-1);var _1l=$k[--$j];$k[$j++]=$f(_1l+($_.pixx-$_.linpixs.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1n=$_.linsym;var _1o=$has(_1n,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1n;$k[$j++]="text1xalign";if(_1o){var _1p=$k[--$j];var _1q=$k[--$j];$k[$j++]=$g(_1q,_1p)}else{$j-=2;$k[$j++]="unset"}var _1s=$k[--$j];var _1t=$k[--$j];$_[_1t]=_1s;var _1u=$_.linsym;var _1v=$has(_1u,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1u;$k[$j++]="text1yalign";if(_1v){var _1w=$k[--$j];var _1x=$k[--$j];$k[$j++]=$g(_1x,_1w)}else{$j-=2;$k[$j++]="unset"}var _1z=$k[--$j];var _20=$k[--$j];$_[_20]=_1z;var _21=$_.rowmult;var _26=0;for(var _22=0,_23=_21.length;_22<_23;_22++){_26=$f(_26+$g(_21,_22))}$_.pixy=_26;var _28=$_.linsym;var _29=$has(_28,"borderleft");$k[$j++]="borderleft";$k[$j++]=_28;$k[$j++]="borderleft";if(_29){var _2A=$k[--$j];var _2B=$k[--$j];$k[$j++]=$g(_2B,_2A)}else{$j-=2;$k[$j++]=10}var _2D=$_.pixx;var _2E=$_.linpixs;var _2F=$k[--$j];var _2G=1;var _2H=$f(_2F-(_2D-_2E.length+1));if($f(_2F-(_2D-_2E.length+1))<1){var _=_2G;_2G=_2H;_2H=_}if(_2H<0){_2H=0}var _2J=$k[--$j];$_[_2J]=_2H;var _2K=$_.linsym;var _2L=$has(_2K,"borderright");$k[$j++]="borderright";$k[$j++]=_2K;$k[$j++]="borderright";if(_2L){var _2M=$k[--$j];var _2N=$k[--$j];$k[$j++]=$g(_2N,_2M)}else{$j-=2;$k[$j++]=10}var _2P=$k[--$j];var _2Q=0;if(_2P<0){var _=_2Q;_2Q=_2P;_2P=_}if(_2P<0){_2P=0}var _2S=$k[--$j];$_[_2S]=_2P;$_.bordertop=1;var _2T=$_.linsym;var _2U=$has(_2T,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2T;$k[$j++]="borderbottom";if(_2U){var _2V=$k[--$j];var _2W=$k[--$j];$k[$j++]=$g(_2W,_2V)}else{$j-=2;$k[$j++]=0}var _2Y=$k[--$j];var _2Z=$k[--$j];$_[_2Z]=_2Y;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarlimitedcomposite(){if(!bwipp_databarlimitedcomposite.globals){var $__=$_;$_=bwipp_databarlimitedcomposite.globals={};$_.databarlimitedcomposite_sepleft=$a([0,0,0]);$_.databarlimitedcomposite_sepright=$a([0,0,0,0,0,0,0,0,0]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarlimitedcomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _2=$k[--$j];$_.options=_2;var _3=$k[--$j];$_.barcode=_3;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _7=$k[--$j];if(_7){var _8=$k[--$j];$_.linear=_8;$j--;var _9=$k[--$j];$_.comp=_9}else{$k[$j-1]="bwipp.missingCompositeComponent#39149";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databarlimited");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _G=$s($_.linear.length+$_.comp.length);$P(_G,0,$_.linear);$P(_G,$_.linear.length,$_.comp);$k[$j++]=_G;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databarlimited();var _M=$k[--$j];$_.linsbs=$g(_M,"sbs");$_.linheight=$g($g(_M,"bhs"),0)*72;$_.linsym=_M;$k[$j++]=Infinity;$k[$j++]=1;$F($_.linsbs,function(){var _R=$k[--$j];var _S=$k[$j-1];var _T=_S==0?1:0;for(var _U=0,_V=_R;_U<_V;_U++){$k[$j++]=_T}});$as($a($m()-1));var _Y=$k[--$j];$_.sep=_Y;$j-=2;$P($_.sep,0,$_.databarlimitedcomposite_sepleft);$P($_.sep,$_.sep.length-9,$_.databarlimitedcomposite_sepright);$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _e=$k[--$j];$_.compsym=_e;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;var _n=$G($_.linsbs,0,~~(($_.linsbs.length+1)/2)*2-1);$k[$j++]=0;for(var _o=0,_p=_n.length;_o<_p;_o++){var _r=$k[$j-1];var _s=_r==0?1:0;for(var _t=0,_u=$i($g(_n,_o));_t<_u;_t++){$k[$j++]=_s}}$_.linpixs=$a();$k[$j++]=Infinity;$k[$j++]=0;$q($G($_.sep,0,$_.linpixs.length-1));$_.sep=$a();$_.linheight=~~$_.linheight;$_.ccrows=$_.ccrowmult.length;if($_.ccpixx==72){$k[$j++]=Infinity;for(var _14=0,_15=$_.ccpixx,_13=$_.ccpixs.length-1;_15<0?_14>=_13:_14<=_13;_14+=_15){$_.i=_14;$k[$j++]=0;$q($G($_.ccpixs,$_.i,$_.ccpixx));$k[$j++]=0}$q($_.sep);$q($_.linpixs);$_.pixs=$a();$_.pixx=$_.linpixs.length}else{$k[$j++]=Infinity;for(var _1G=0,_1H=$_.ccpixx,_1F=$_.ccpixs.length-1;_1H<0?_1G>=_1F:_1G<=_1F;_1G+=_1H){$_.i=_1G;$q($G($_.ccpixs,$_.i,$_.ccpixx));$k[$j++]=0}$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.sep);$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$k[$j++]=0;$q($_.linpixs);$_.pixs=$a();$_.pixx=$_.ccpixx+1}$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$k[$j++]=$_.linheight;$_.rowmult=$a();$k[$j++]=Infinity;var _1R=$_.linsym;var _1S=$has(_1R,"txt");$k[$j++]=_1R;$k[$j++]="txt";if(_1S){var _1T=$k[--$j];var _1U=$k[--$j];$F($g(_1U,_1T),function(){var _1W=$k[--$j];$q(_1W);$r(4,-1);var _1Z=$k[--$j];$k[$j++]=$f(_1Z+($_.pixx-$_.linpixs.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1b=$_.linsym;var _1c=$has(_1b,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1b;$k[$j++]="text1xalign";if(_1c){var _1d=$k[--$j];var _1e=$k[--$j];$k[$j++]=$g(_1e,_1d)}else{$j-=2;$k[$j++]="unset"}var _1g=$k[--$j];var _1h=$k[--$j];$_[_1h]=_1g;var _1i=$_.linsym;var _1j=$has(_1i,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1i;$k[$j++]="text1yalign";if(_1j){var _1k=$k[--$j];var _1l=$k[--$j];$k[$j++]=$g(_1l,_1k)}else{$j-=2;$k[$j++]="unset"}var _1n=$k[--$j];var _1o=$k[--$j];$_[_1o]=_1n;var _1p=$_.rowmult;var _1u=0;for(var _1q=0,_1r=_1p.length;_1q<_1r;_1q++){_1u=$f(_1u+$g(_1p,_1q))}$_.pixy=_1u;var _1w=$_.linsym;var _1x=$has(_1w,"borderleft");$k[$j++]="borderleft";$k[$j++]=_1w;$k[$j++]="borderleft";if(_1x){var _1y=$k[--$j];var _1z=$k[--$j];$k[$j++]=$g(_1z,_1y)}else{$j-=2;$k[$j++]=10}var _21=$_.pixx;var _22=$_.linpixs;var _23=$k[--$j];var _24=$_.pixx;var _25=$_.ccpixx;var _26=1-($f(_24-_25)-1);var _27=$f(_23-(_21-_22.length+1));if($f(_23-(_21-_22.length+1))<1-($f(_24-_25)-1)){var _=_26;_26=_27;_27=_}if(_27<0){_27=0}var _29=$k[--$j];$_[_29]=_27;var _2A=$_.linsym;var _2B=$has(_2A,"borderright");$k[$j++]="borderright";$k[$j++]=_2A;$k[$j++]="borderright";if(_2B){var _2C=$k[--$j];var _2D=$k[--$j];$k[$j++]=$g(_2D,_2C)}else{$j-=2;$k[$j++]=10}var _2F=$k[--$j];var _2G=0;if(_2F<0){var _=_2G;_2G=_2F;_2F=_}if(_2F<0){_2F=0}var _2I=$k[--$j];$_[_2I]=_2F;$_.bordertop=1;var _2J=$_.linsym;var _2K=$has(_2J,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2J;$k[$j++]="borderbottom";if(_2K){var _2L=$k[--$j];var _2M=$k[--$j];$k[$j++]=$g(_2M,_2L)}else{$j-=2;$k[$j++]=0}var _2O=$k[--$j];var _2P=$k[--$j];$_[_2P]=_2O;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarexpandedcomposite(){var $__=$_;$_=Object.assign({},$_,bwipp_databarexpandedcomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#39368";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databarexpanded");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _E=$s($_.linear.length+$_.comp.length);$P(_E,0,$_.linear);$P(_E,$_.linear.length,$_.comp);$k[$j++]=_E;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databarexpanded();var _K=$k[--$j];$_.linsbs=$g(_K,"sbs");$_.linheight=$g($g(_K,"bhs"),0)*72;$_.linsym=_K;$_.sepfinder=function(){var _O=$k[--$j];$_.fp=_O;for(var _S=$_.fp,_R=$_.fp+12;_S<=_R;_S+=1){$_.i=_S;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _e=$k[--$j];$p($_.sep,$_.i,_e)}};$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _h=$k[--$j];var _i=$k[$j-1];var _j=_i==1?0:1;for(var _k=0,_l=_h;_k<_l;_k++){$k[$j++]=_j}});$as($a($m()-1));var _o=$k[--$j];$_.bot=_o;$j-=2;$k[$j++]=Infinity;$F($_.bot,function(){var _q=$k[--$j];$k[$j++]=1-_q});$_.sep=$a();$P($_.sep,0,$a([0,0,0]));$P($_.sep,$_.sep.length-4,$a([0,0,0,0]));$k[$j++]=Infinity;for(var _y=18,_x=$_.bot.length-13;_y<=_x;_y+=98){$k[$j++]=_y}for(var _11=69,_10=$_.bot.length-13;_11<=_10;_11+=98){$k[$j++]=_11}var _12=$a();for(var _13=0,_14=_12.length;_13<_14;_13++){$k[$j++]=$g(_12,_13);$_.sepfinder()}$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _18=$k[--$j];$_.compsym=_18;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;$k[$j++]=0;$F($_.linsbs,function(){var _1G=$k[--$j];var _1H=$k[$j-1];var _1I=_1H==0?1:0;for(var _1J=0,_1K=$i(_1G);_1J<_1K;_1J++){$k[$j++]=_1I}});$_.linpixs=$a();$k[$j++]=Infinity;$k[$j++]=0;$q($_.sep);$_.sep=$a();$_.linheight=~~$_.linheight;$_.ccrows=$_.ccrowmult.length;$_.diff=$f($_.linpixs.length-$_.ccpixx);$k[$j++]=Infinity;for(var _1R=0,_1S=$_.diff-2;_1R<_1S;_1R++){$k[$j++]=0}$_.ccrpad=$a();$k[$j++]=Infinity;for(var _1W=0,_1X=$_.ccpixx,_1V=$_.ccpixs.length-1;_1X<0?_1W>=_1V:_1W<=_1V;_1W+=_1X){$_.i=_1W;$k[$j++]=0;$k[$j++]=0;$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.sep);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$k[$j++]=$_.linheight;$_.rowmult=$a();$_.pixx=$_.linpixs.length;$k[$j++]=Infinity;var _1i=$_.linsym;var _1j=$has(_1i,"txt");$k[$j++]=_1i;$k[$j++]="txt";if(_1j){var _1k=$k[--$j];var _1l=$k[--$j];$F($g(_1l,_1k),function(){var _1n=$k[--$j];$q(_1n);$r(4,-1);var _1q=$k[--$j];$k[$j++]=$f(_1q+($_.pixx-$_.linpixs.length+1));$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1s=$_.linsym;var _1t=$has(_1s,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1s;$k[$j++]="text1xalign";if(_1t){var _1u=$k[--$j];var _1v=$k[--$j];$k[$j++]=$g(_1v,_1u)}else{$j-=2;$k[$j++]="unset"}var _1x=$k[--$j];var _1y=$k[--$j];$_[_1y]=_1x;var _1z=$_.linsym;var _20=$has(_1z,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1z;$k[$j++]="text1yalign";if(_20){var _21=$k[--$j];var _22=$k[--$j];$k[$j++]=$g(_22,_21)}else{$j-=2;$k[$j++]="unset"}var _24=$k[--$j];var _25=$k[--$j];$_[_25]=_24;var _26=$_.rowmult;var _2B=0;for(var _27=0,_28=_26.length;_27<_28;_27++){_2B=$f(_2B+$g(_26,_27))}$_.pixy=_2B;var _2D=$_.linsym;var _2E=$has(_2D,"borderleft");$k[$j++]="borderleft";$k[$j++]=_2D;$k[$j++]="borderleft";if(_2E){var _2F=$k[--$j];var _2G=$k[--$j];$k[$j++]=$g(_2G,_2F)}else{$j-=2;$k[$j++]=10}var _2I=$_.pixx;var _2J=$_.linpixs;var _2K=$k[--$j];var _2L=1-2;var _2M=$f(_2K-(_2I-_2J.length+1));if($f(_2K-(_2I-_2J.length+1))<1-2){var _=_2L;_2L=_2M;_2M=_}if(_2M<0){_2M=0}var _2O=$k[--$j];$_[_2O]=_2M;var _2P=$_.linsym;var _2Q=$has(_2P,"borderright");$k[$j++]="borderright";$k[$j++]=_2P;$k[$j++]="borderright";if(_2Q){var _2R=$k[--$j];var _2S=$k[--$j];$k[$j++]=$g(_2S,_2R)}else{$j-=2;$k[$j++]=10}var _2U=$_.ccrpad;var _2V=$k[--$j];var _2W=1-_2U.length;if(_2V<1-_2U.length){var _=_2W;_2W=_2V;_2V=_}if(_2V<0){_2V=0}var _2Y=$k[--$j];$_[_2Y]=_2V;$_.bordertop=1;var _2Z=$_.linsym;var _2a=$has(_2Z,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2Z;$k[$j++]="borderbottom";if(_2a){var _2b=$k[--$j];var _2c=$k[--$j];$k[$j++]=$g(_2c,_2b)}else{$j-=2;$k[$j++]=0}var _2e=$k[--$j];var _2f=$k[--$j];$_[_2f]=_2e;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_databarexpandedstackedcomposite(){if(!bwipp_databarexpandedstackedcomposite.globals){var $__=$_;$_=bwipp_databarexpandedstackedcomposite.globals={};$_.databarexpandedstackedcomposite_seppad=$a([0,0,0,0]);$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_databarexpandedstackedcomposite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _1=$k[--$j];$_.options=_1;var _2=$k[--$j];$_.barcode=_2;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _6=$k[--$j];if(_6){var _7=$k[--$j];$_.linear=_7;$j--;var _8=$k[--$j];$_.comp=_8}else{$k[$j-1]="bwipp.missingCompositeComponent#39601";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"lintype","databarexpandedstacked");$p($_.options,"linkage",true);$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _F=$s($_.linear.length+$_.comp.length);$P(_F,0,$_.linear);$P(_F,$_.linear.length,$_.comp);$k[$j++]=_F;$k[$j++]="ai";bwipp_gs1process();$j-=3;$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=$_.options;bwipp_databarexpandedstacked();var _L=$k[--$j];$_.bot=$G($g(_L,"pixs"),0,$g(_L,"pixx"));$_.linheight=$g(_L,"pixy");$_.linsym=_L;$_.linpixs=$g($_.linsym,"pixs");$_.linrowmult=$g($_.linsym,"rowmult");$_.sepfinder=function(){var _U=$k[--$j];$_.fp=_U;for(var _Y=$_.fp,_X=$_.fp+12;_Y<=_X;_Y+=1){$_.i=_Y;if($g($_.bot,$_.i)==0){if($g($_.bot,$_.i-1)==1){$k[$j++]=1}else{$k[$j++]=$g($_.sep,$_.i-1)==0?1:0}}else{$k[$j++]=0}var _k=$k[--$j];$p($_.sep,$_.i,_k)}};$k[$j++]=Infinity;var _m=$_.bot;for(var _n=0,_o=_m.length;_n<_o;_n++){$k[$j++]=1-$g(_m,_n)}$_.sep=$a();$P($_.sep,0,$_.databarexpandedstackedcomposite_seppad);$P($_.sep,$_.sep.length-4,$_.databarexpandedstackedcomposite_seppad);$k[$j++]=Infinity;for(var _v=19,_u=$_.bot.length-13;_v<=_u;_v+=98){$k[$j++]=_v}for(var _y=70,_x=$_.bot.length-13;_y<=_x;_y+=98){$k[$j++]=_y}var _z=$a();for(var _10=0,_11=_z.length;_10<_11;_10++){$k[$j++]=$g(_z,_10);$_.sepfinder()}$k[$j++]=$_.comp;$k[$j++]=$_.options;bwipp_gs1_cc();var _15=$k[--$j];$_.compsym=_15;$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$_.pixx=$_.sep.length;$k[$j++]=Infinity;for(var _1F=0,_1G=~~(($f($_.pixx-$_.ccpixx)+1)/2);_1F<_1G;_1F++){$k[$j++]=0}$_.cclpad=$a();$k[$j++]=Infinity;for(var _1J=0,_1K=~~($f($_.pixx-$_.ccpixx)/2);_1J<_1K;_1J++){$k[$j++]=0}$_.ccrpad=$a();$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _1P=0,_1Q=$_.ccpixx,_1O=$_.ccpixs.length-1;_1Q<0?_1P>=_1O:_1P<=_1O;_1P+=_1Q){$_.i=_1P;$q($_.cclpad);$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.sep);$q($_.linpixs);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$q($_.linrowmult);$_.rowmult=$a();$k[$j++]=Infinity;var _1b=$_.linsym;var _1c=$has(_1b,"txt");$k[$j++]=_1b;$k[$j++]="txt";if(_1c){var _1d=$k[--$j];var _1e=$k[--$j];$F($g(_1e,_1d),function(){var _1g=$k[--$j];$q(_1g);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1i=$_.linsym;var _1j=$has(_1i,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1i;$k[$j++]="text1xalign";if(_1j){var _1k=$k[--$j];var _1l=$k[--$j];$k[$j++]=$g(_1l,_1k)}else{$j-=2;$k[$j++]="unset"}var _1n=$k[--$j];var _1o=$k[--$j];$_[_1o]=_1n;var _1p=$_.linsym;var _1q=$has(_1p,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1p;$k[$j++]="text1yalign";if(_1q){var _1r=$k[--$j];var _1s=$k[--$j];$k[$j++]=$g(_1s,_1r)}else{$j-=2;$k[$j++]="unset"}var _1u=$k[--$j];var _1v=$k[--$j];$_[_1v]=_1u;var _1w=$_.rowmult;var _21=0;for(var _1x=0,_1y=_1w.length;_1x<_1y;_1x++){_21=$f(_21+$g(_1w,_1x))}$_.pixy=_21;var _23=$_.linsym;var _24=$has(_23,"borderleft");$k[$j++]="borderleft";$k[$j++]=_23;$k[$j++]="borderleft";if(_24){var _25=$k[--$j];var _26=$k[--$j];$k[$j++]=$g(_26,_25)}else{$j-=2;$k[$j++]=0}var _28=$_.cclpad;var _29=$k[--$j];var _2A=1-_28.length;if(_29<1-_28.length){var _=_2A;_2A=_29;_29=_}if(_29<0){_29=0}var _2C=$k[--$j];$_[_2C]=_29;var _2D=$_.linsym;var _2E=$has(_2D,"borderright");$k[$j++]="borderright";$k[$j++]=_2D;$k[$j++]="borderright";if(_2E){var _2F=$k[--$j];var _2G=$k[--$j];$k[$j++]=$g(_2G,_2F)}else{$j-=2;$k[$j++]=0}var _2I=$_.ccrpad;var _2J=$k[--$j];var _2K=1-_2I.length;if(_2J<1-_2I.length){var _=_2K;_2K=_2J;_2J=_}if(_2J<0){_2J=0}var _2M=$k[--$j];$_[_2M]=_2J;$_.bordertop=1;var _2N=$_.linsym;var _2O=$has(_2N,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2N;$k[$j++]="borderbottom";if(_2O){var _2P=$k[--$j];var _2Q=$k[--$j];$k[$j++]=$g(_2Q,_2P)}else{$j-=2;$k[$j++]=0}var _2S=$k[--$j];var _2T=$k[--$j];$_[_2T]=_2S;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1_128composite(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1_128composite.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.width=0;$_.modunit=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$X($_.barcode,"|");var _5=$k[--$j];if(_5){var _6=$k[--$j];$_.linear=_6;$j--;var _7=$k[--$j];$_.comp=_7}else{$k[$j-1]="bwipp.missingCompositeComponent#39824";$k[$j++]="A Composite Component must be provided following a pipe character";bwipp_raiseerror()}$p($_.options,"inkspreadv",0);$p($_.options,"dontlint",true);var _C=$s($_.linear.length+$_.comp.length);$P(_C,0,$_.linear);$P(_C,$_.linear.length,$_.comp);$k[$j++]=_C;$k[$j++]="ai";bwipp_gs1process();$j-=3;$p($_.options,"linkagea",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.linear;$k[$j++]=Infinity;$F($_.options);var _J=$d();$k[$j++]=_J;bwipp_gs1_128();var _K=$k[--$j];var _O=0;$F($g(_K,"sbs"),function(){var _M=$k[--$j];_O=$f(_O+_M)});$_.linwidth=_O;$p($_.options,"lintype","gs1-128");$p($_.options,"linwidth",$_.linwidth);$k[$j++]=$_.comp;$k[$j++]=Infinity;$F($_.options);var _U=$d();$k[$j++]=_U;bwipp_gs1_cc();var _V=$k[--$j];$_.compsym=_V;var _Y=$g($_.compsym,"pixx")==99?"a":"c";$_.linktype=_Y;$p($_.compsym,"borderbottom",0);if($eq($_.linktype,"a")){$p($_.options,"linkagea",true);$p($_.options,"linkagec",false)}else{$p($_.options,"linkagea",false);$p($_.options,"linkagec",true)}$k[$j++]=$_.linear;$k[$j++]=Infinity;$F($_.options);var _h=$d();$k[$j++]=_h;bwipp_gs1_128();var _i=$k[--$j];$_.linsbs=$g(_i,"sbs");$_.linheight=$g($g(_i,"bhs"),0)*72;$_.linsym=_i;$k[$j++]=Infinity;$k[$j++]=1;$F($_.linsbs,function(){var _n=$k[--$j];var _o=$k[$j-1];var _p=_o==0?1:0;for(var _q=0,_r=_n;_q<_r;_q++){$k[$j++]=_p}});$as($a($m()-1));var _u=$k[--$j];$_.sep=_u;$j-=2;if($eq($_.linktype,"a")){$_.s=~~(($_.linwidth-2)/11);$_.p=~~(($_.s-9)/2);var _12=($_.s-$_.p-1)*11+10;if($_.p==0){_12=_12+2}$_.x=_12-99}else{$_.x=-7}$_.ccpixs=$g($_.compsym,"pixs");$_.ccrowmult=$g($_.compsym,"rowmult");$_.ccpixx=$g($_.compsym,"pixx");$k[$j++]=Infinity;$F($_.linsbs,function(){var _1B=$k[--$j];var _1C=$k[$j-1];var _1D=_1C==1?0:1;for(var _1E=0,_1F=_1B;_1E<_1F;_1E++){$k[$j++]=_1D}});$_.linpixs=$a();if($_.x>0){$k[$j++]=Infinity;for(var _1I=0,_1J=$_.x;_1I<_1J;_1I++){$k[$j++]=0}$_.cclpad=$a();$_.linlpad=$a(0)}else{$_.cclpad=$a(0);$k[$j++]=Infinity;for(var _1N=0,_1O=-$_.x;_1N<_1O;_1N++){$k[$j++]=0}$_.linlpad=$a()}$_.diff=$f($_.linwidth-($_.ccpixx+$_.x));if($_.diff>0){$k[$j++]=Infinity;for(var _1U=0,_1V=$_.diff;_1U<_1V;_1U++){$k[$j++]=0}$_.ccrpad=$a();$_.linrpad=$a(0)}else{$_.ccrpad=$a(0);$k[$j++]=Infinity;for(var _1Z=0,_1a=-$_.diff;_1Z<_1a;_1Z++){$k[$j++]=0}$_.linrpad=$a()}$k[$j++]=Infinity;var _1b=$_.linsym;var _1c=$has(_1b,"txt");$k[$j++]=_1b;$k[$j++]="txt";if(_1c){var _1d=$k[--$j];var _1e=$k[--$j];$F($g(_1e,_1d),function(){var _1g=$k[--$j];$q(_1g);$r(4,-1);var _1i=$k[--$j];$k[$j++]=$f(_1i+$_.linlpad.length);$r(4,1);$as($a(5))})}else{$j-=2}$_.txt=$a();var _1k=$_.linsym;var _1l=$has(_1k,"text1xalign");$k[$j++]="text1xalign";$k[$j++]=_1k;$k[$j++]="text1xalign";if(_1l){var _1m=$k[--$j];var _1n=$k[--$j];$k[$j++]=$g(_1n,_1m)}else{$j-=2;$k[$j++]="unset"}var _1p=$k[--$j];var _1q=$k[--$j];$_[_1q]=_1p;var _1r=$_.linsym;var _1s=$has(_1r,"text1yalign");$k[$j++]="text1yalign";$k[$j++]=_1r;$k[$j++]="text1yalign";if(_1s){var _1t=$k[--$j];var _1u=$k[--$j];$k[$j++]=$g(_1u,_1t)}else{$j-=2;$k[$j++]="unset"}var _1w=$k[--$j];var _1x=$k[--$j];$_[_1x]=_1w;$_.linheight=~~$_.linheight;$_.ccrows=$_.ccrowmult.length;$k[$j++]=Infinity;for(var _23=0,_24=$_.ccpixx,_22=$_.ccpixs.length-1;_24<0?_23>=_22:_23<=_22;_23+=_24){$_.i=_23;$q($_.cclpad);$q($G($_.ccpixs,$_.i,$_.ccpixx));$q($_.ccrpad)}$q($_.linlpad);$q($_.sep);$q($_.linrpad);$q($_.linlpad);$q($_.linpixs);$q($_.linrpad);$_.pixs=$a();$k[$j++]=Infinity;$q($_.ccrowmult);$k[$j++]=1;$k[$j++]=$_.linheight;$_.rowmult=$a();$_.pixx=$f($_.cclpad.length+$_.ccpixx+$_.ccrpad.length);var _2M=$_.rowmult;var _2R=0;for(var _2N=0,_2O=_2M.length;_2N<_2O;_2N++){_2R=$f(_2R+$g(_2M,_2N))}$_.pixy=_2R;var _2U=$eq($_.linktype,"a")?1:2;$_.ccqz=_2U;var _2V=$_.linsym;var _2W=$has(_2V,"borderleft");$k[$j++]="borderleft";$k[$j++]=_2V;$k[$j++]="borderleft";if(_2W){var _2X=$k[--$j];var _2Y=$k[--$j];$k[$j++]=$g(_2Y,_2X)}else{$j-=2;$k[$j++]=10}var _2a=$_.linlpad;var _2b=$k[--$j];var _2c=$_.ccqz;var _2d=$_.cclpad;var _2e=_2c-_2d.length;var _2f=$f(_2b-_2a.length);if($f(_2b-_2a.length)<_2c-_2d.length){var _=_2e;_2e=_2f;_2f=_}if(_2f<0){_2f=0}var _2h=$k[--$j];$_[_2h]=_2f;var _2i=$_.linsym;var _2j=$has(_2i,"borderright");$k[$j++]="borderright";$k[$j++]=_2i;$k[$j++]="borderright";if(_2j){var _2k=$k[--$j];var _2l=$k[--$j];$k[$j++]=$g(_2l,_2k)}else{$j-=2;$k[$j++]=10}var _2n=$_.linrpad;var _2o=$k[--$j];var _2p=$_.ccqz;var _2q=$_.ccrpad;var _2r=_2p-_2q.length;var _2s=$f(_2o-_2n.length);if($f(_2o-_2n.length)<_2p-_2q.length){var _=_2r;_2r=_2s;_2s=_}if(_2s<0){_2s=0}var _2u=$k[--$j];$_[_2u]=_2s;$_.bordertop=$_.ccqz;var _2w=$_.linsym;var _2x=$has(_2w,"borderbottom");$k[$j++]="borderbottom";$k[$j++]=_2w;$k[$j++]="borderbottom";if(_2x){var _2y=$k[--$j];var _2z=$k[--$j];$k[$j++]=$g(_2z,_2y)}else{$j-=2;$k[$j++]=0}var _31=$k[--$j];var _32=$k[--$j];$_[_32]=_31;$del($_.options,"height");$k[$j++]=new Map([["ren","renmatrix"],["pixs",$_.pixs],["pixx",$_.pixx],["pixy",$_.pixy],["rowmult",$_.rowmult],["height",$_.pixy/72],["width",$_.pixx/72],["borderleft",$_.borderleft],["borderright",$_.borderright],["bordertop",$_.bordertop],["borderbottom",$_.borderbottom],["txt",$_.txt],["text1xalign",$_.text1xalign],["text1yalign",$_.text1yalign],["opt",$_.options]]);if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1datamatrix(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1datamatrix.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.gssep=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;if($_.barcode.length>4e3){$k[$j++]="bwipp.gs1datamatrixinputTooLong#40056";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _6=$k[--$j];$_.fncs=_6;var _7=$k[--$j];$_.vals=_7;var _8=$k[--$j];$_.ais=_8;$_.fnc1=-1;$k[$j++]=Infinity;$k[$j++]=$_.fnc1;for(var _C=0,_B=$_.ais.length-1;_C<=_B;_C+=1){$_.i=_C;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){if($_.gssep){$k[$j++]=29}else{$k[$j++]=$_.fnc1}}}$as($a($m()));var _S=$k[--$j];$_.dmtx=_S;$j--;$_.barcode=$s(($_.dmtx.length+1)*5);$_.j=0;$F($_.dmtx,function(){var _W=$k[$j-1];if(_W==$_.fnc1){$j--;$P($_.barcode,$_.j,"^FNC1");$_.j=$_.j+5}else{var _c=$k[--$j];$p($_.barcode,$_.j,_c);$_.j=$_.j+1}});$_.barcode=$G($_.barcode,0,$_.j);$del($_.options,"parse");$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _m=$k[--$j];$_.args=_m;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1datamatrixrectangular(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1datamatrixrectangular.globals);$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.dontdraw=false;$_.gssep=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;if($_.barcode.length>4e3){$k[$j++]="bwipp.gs1datamatrixrectangularinputTooLong#40188";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _6=$k[--$j];$_.fncs=_6;var _7=$k[--$j];$_.vals=_7;var _8=$k[--$j];$_.ais=_8;$_.fnc1=-1;$k[$j++]=Infinity;$k[$j++]=$_.fnc1;for(var _C=0,_B=$_.ais.length-1;_C<=_B;_C+=1){$_.i=_C;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){if($_.gssep){$k[$j++]=29}else{$k[$j++]=$_.fnc1}}}$as($a($m()));var _S=$k[--$j];$_.dmtx=_S;$j--;$_.barcode=$s(($_.dmtx.length+1)*5);$_.j=0;$F($_.dmtx,function(){var _W=$k[$j-1];if(_W==$_.fnc1){$j--;$P($_.barcode,$_.j,"^FNC1");$_.j=$_.j+5}else{var _c=$k[--$j];$p($_.barcode,$_.j,_c);$_.j=$_.j+1}});$_.barcode=$G($_.barcode,0,$_.j);$del($_.options,"parse");$p($_.options,"parsefnc",true);$p($_.options,"format","rectangle");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _n=$k[--$j];$_.args=_n;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1dldatamatrix(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1dldatamatrix.globals);$_.includetext=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _7=$k[--$j];$_.barcode=_7;$k[$j++]=$_.barcode;$k[$j++]="dl";bwipp_gs1process();$j--;var _9=$k[--$j];$_.val=$g(_9,0);var _B=$k[--$j];$_.key=$g(_B,0);$_.hri=$s($_.key.length+$_.val.length+2);$p($_.hri,0,40);$P($_.hri,1,$_.key);$p($_.hri,$_.key.length+1,41);$P($_.hri,$_.key.length+2,$_.val);$del($_.options,"parse");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _R=$k[--$j];$_.args=_R;$p($_.args,"opt",$_.options);if($_.includetext){$p($_.args,"text1",$_.hri);$p($_.args,"text1yoffset",-1);$p($_.args,"text1font","OCR-B");$p($_.args,"text1size",5)}$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1qrcode(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1qrcode.globals);$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;if($_.barcode.length>4e3){$k[$j++]="bwipp.gs1qrcodeinputTooLong#40438";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _6=$k[--$j];$_.fncs=_6;var _7=$k[--$j];$_.vals=_7;var _8=$k[--$j];$_.ais=_8;$_.fnc1=-1;$k[$j++]=Infinity;$k[$j++]=$_.fnc1;for(var _C=0,_B=$_.ais.length-1;_C<=_B;_C+=1){$_.i=_C;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){$k[$j++]=$_.fnc1}}$as($a($m()));var _R=$k[--$j];$_.qrc=_R;$j--;$_.barcode=$s(($_.qrc.length+1)*5);$_.j=0;$F($_.qrc,function(){var _V=$k[$j-1];if(_V==$_.fnc1){$j--;$P($_.barcode,$_.j,"^FNC1");$_.j=$_.j+5}else{var _b=$k[--$j];$p($_.barcode,$_.j,_b);$_.j=$_.j+1}});$_.barcode=$G($_.barcode,0,$_.j);$del($_.options,"parse");$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _l=$k[--$j];$_.args=_l;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1dlqrcode(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1dlqrcode.globals);$_.includetext=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;$_.dontdraw=false;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$_.fncvals=new Map([["parse",$_.parse],["parseonly",true],["parsefnc",false]]);$k[$j++]=$_.barcode;$k[$j++]=$_.fncvals;bwipp_parseinput();var _7=$k[--$j];$_.barcode=_7;$k[$j++]=$_.barcode;$k[$j++]="dl";bwipp_gs1process();$j--;var _9=$k[--$j];$_.val=$g(_9,0);var _B=$k[--$j];$_.key=$g(_B,0);$_.hri=$s($_.key.length+$_.val.length+2);$p($_.hri,0,40);$P($_.hri,1,$_.key);$p($_.hri,$_.key.length+1,41);$P($_.hri,$_.key.length+2,$_.val);$del($_.options,"parse");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _R=$k[--$j];$_.args=_R;$p($_.args,"opt",$_.options);if($_.includetext){$p($_.args,"text1",$_.hri);$p($_.args,"text1yoffset",-4);$p($_.args,"text1font","OCR-B");$p($_.args,"text1size",5)}$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_gs1dotcode(){var $__=$_;$_=Object.assign({},$_,bwipp_gs1dotcode.globals);$_.dontdraw=false;$_.parse=false;$_.dontlint=false;$_.lintreqs=true;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;if($_.barcode.length>4e3){$k[$j++]="bwipp.gs1dotcodeinputTooLong#40687";$k[$j++]="The input data is too long";bwipp_raiseerror()}$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));$k[$j++]=$_.barcode;$k[$j++]="ai";bwipp_gs1process();var _6=$k[--$j];$_.fncs=_6;var _7=$k[--$j];$_.vals=_7;var _8=$k[--$j];$_.ais=_8;$_.fnc1=-1;$k[$j++]=Infinity;$k[$j++]=$_.fnc1;for(var _C=0,_B=$_.ais.length-1;_C<=_B;_C+=1){$_.i=_C;$F($g($_.ais,$_.i));$F($g($_.vals,$_.i));if($_.i!=$_.ais.length-1&&$g($_.fncs,$_.i)){$k[$j++]=$_.fnc1}}$as($a($m()));var _R=$k[--$j];$_.dcode=_R;$j--;$_.barcode=$s(($_.dcode.length+1)*5);$_.j=0;$F($_.dcode,function(){var _V=$k[$j-1];if(_V==$_.fnc1){$j--;$P($_.barcode,$_.j,"^FNC1");$_.j=$_.j+5}else{var _b=$k[--$j];$p($_.barcode,$_.j,_b);$_.j=$_.j+1}});$_.barcode=$G($_.barcode,0,$_.j);$del($_.options,"parse");$p($_.options,"parsefnc",true);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_dotcode();var _l=$k[--$j];$_.args=_l;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibccode39(){if(!bwipp_hibccode39.globals){var $__=$_;$_=bwipp_hibccode39.globals={};$_.hibccode39_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibccode39_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibccode39.globals);$_.dontdraw=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.text1xoffset=0;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibccode39emptyData#40847";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.hibccode39inputTooLong#40851";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibccode39badCharacter#40859";$k[$j++]="HIBC Code 39 must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibccode39_barchars,$_.checksum)){$k[$j++]="bwipp.hibccode39badCheckDigit#40873";$k[$j++]="Incorrect HIBC Code 39 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibccode39_barchars,$_.checksum));$_.text=$s($_.barlen+4);$p($_.text,0,42);$P($_.text,1,$_.barcode);var _v=$g($_.barcode,$_.barlen+1);var _y=$_.text;var _x=$_.barlen+2;if(_v==32){_v=95}$p(_y,_x,_v);$p($_.text,$_.barlen+3,42);$p($_.options,"includecheck",false);$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code39();var _15=$k[--$j];$_.args=_15;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_hibccode128(){if(!bwipp_hibccode128.globals){var $__=$_;$_=bwipp_hibccode128.globals={};$_.hibccode128_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibccode128_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibccode128.globals);$_.dontdraw=false;$_.text1font="OCR-B";$_.text1size=10;$_.textyoffset=-8;$_.text1xoffset=0;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibccode128emptyData#40989";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>500){$k[$j++]="bwipp.hibccode128inputTooLong#40993";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibccode128badCharacter#41001";$k[$j++]="HIBC Code 128 must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibccode128_barchars,$_.checksum)){$k[$j++]="bwipp.hibccode128badCheckDigit#41015";$k[$j++]="Incorrect HIBC Code 128 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibccode128_barchars,$_.checksum));$_.text=$s($_.barlen+4);$p($_.text,0,42);$P($_.text,1,$_.barcode);var _v=$g($_.barcode,$_.barlen+1);var _y=$_.text;var _x=$_.barlen+2;if(_v==32){_v=95}$p(_y,_x,_v);$p($_.text,$_.barlen+3,42);$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_code128();var _14=$k[--$j];$_.args=_14;$p($_.args,"txt",$a([$a([$_.text,$_.text1xoffset,$_.text1yoffset,$_.text1font,$_.text1size])]));$p($_.args,"text1xalign","center");$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_hibcdatamatrix(){if(!bwipp_hibcdatamatrix.globals){var $__=$_;$_=bwipp_hibcdatamatrix.globals={};$_.hibcdatamatrix_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcdatamatrix_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcdatamatrix.globals);$_.dontdraw=false;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcdatamatrixEmptyData#41129";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>15e3){$k[$j++]="bwipp.hibcdatamatrixinputTooLong#41133";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcdatamatrixBadCharacter#41138";$k[$j++]="HIBC Data Matrix must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcdatamatrix_barchars,$_.checksum)){$k[$j++]="bwipp.hibcdatamatrixBadCheckDigit#41152";$k[$j++]="Incorrect HIBC Data Matrix check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcdatamatrix_barchars,$_.checksum));$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _p=$k[--$j];$_.args=_p;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibcdatamatrixrectangular(){if(!bwipp_hibcdatamatrixrectangular.globals){var $__=$_;$_=bwipp_hibcdatamatrixrectangular.globals={};$_.hibcdatamatrixrectangular_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcdatamatrixrectangular_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcdatamatrixrectangular.globals);$_.dontdraw=false;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcdatamatrixrectangularEmptyData#41258";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>15e3){$k[$j++]="bwipp.hibcdatamatrixrectangularinputTooLong#41262";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcdatamatrixrectangularBadCharacter#41267";$k[$j++]="HIBC Data Matrix Rectangular must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcdatamatrixrectangular_barchars,$_.checksum)){$k[$j++]="bwipp.hibcdatamatrixrectangularBadCheckDigit#41281";$k[$j++]="Incorrect HIBC Data Matrix Rectangular check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcdatamatrixrectangular_barchars,$_.checksum));$p($_.options,"validatecheck",false);$p($_.options,"format","rectangle");$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_datamatrix();var _q=$k[--$j];$_.args=_q;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibcpdf417(){if(!bwipp_hibcpdf417.globals){var $__=$_;$_=bwipp_hibcpdf417.globals={};$_.hibcpdf417_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcpdf417_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcpdf417.globals);$_.dontdraw=false;$_.columns=2;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcpdf417EmptyData#41389";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>12500){$k[$j++]="bwipp.hibcpdf417inputTooLong#41393";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcpdf417BadCharacter#41398";$k[$j++]="HIBC PDF417 must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcpdf417_barchars,$_.checksum)){$k[$j++]="bwipp.hibcpdf417BadCheckDigit#41412";$k[$j++]="Incorrect HIBC PDF417 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcpdf417_barchars,$_.checksum));$p($_.options,"columns",$_.columns);$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_pdf417();var _r=$k[--$j];$_.args=_r;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibcmicropdf417(){if(!bwipp_hibcmicropdf417.globals){var $__=$_;$_=bwipp_hibcmicropdf417.globals={};$_.hibcmicropdf417_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcmicropdf417_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcmicropdf417.globals);$_.dontdraw=false;$_.columns=2;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcmicropdf417EmptyData#41520";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>5e3){$k[$j++]="bwipp.hibcmicropdf417inputTooLong#41524";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcmicropdf417BadCharacter#41529";$k[$j++]="HIBC MicroPDF417 must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcmicropdf417_barchars,$_.checksum)){$k[$j++]="bwipp.hibcmicropdf417BadCheckDigit#41543";$k[$j++]="Incorrect HIBC MicroPDF417 check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcmicropdf417_barchars,$_.checksum));$p($_.options,"columns",$_.columns);$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_micropdf417();var _r=$k[--$j];$_.args=_r;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibcqrcode(){if(!bwipp_hibcqrcode.globals){var $__=$_;$_=bwipp_hibcqrcode.globals={};$_.hibcqrcode_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcqrcode_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcqrcode.globals);$_.dontdraw=false;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcqrcodeEmptyData#41648";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>3e4){$k[$j++]="bwipp.hibcqrcodeinputTooLong#41652";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcqrcodeBadCharacter#41657";$k[$j++]="HIBC QR Code must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcqrcode_barchars,$_.checksum)){$k[$j++]="bwipp.hibcqrcodeBadCheckDigit#41671";$k[$j++]="Incorrect HIBC QR Code check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcqrcode_barchars,$_.checksum));$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_qrcode();var _p=$k[--$j];$_.args=_p;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibccodablockf(){if(!bwipp_hibccodablockf.globals){var $__=$_;$_=bwipp_hibccodablockf.globals={};$_.hibccodablockf_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibccodablockf_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibccodablockf.globals);$_.dontdraw=false;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibccodablockfEmptyData#41775";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>25e3){$k[$j++]="bwipp.hibccodablockfinputTooLong#41779";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibccodablockfBadCharacter#41784";$k[$j++]="HIBC Codablock F must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibccodablockf_barchars,$_.checksum)){$k[$j++]="bwipp.hibccodablockfBadCheckDigit#41798";$k[$j++]="Incorrect HIBC Codablock F check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibccodablockf_barchars,$_.checksum));$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_codablockf();var _p=$k[--$j];$_.args=_p;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_hibcazteccode(){if(!bwipp_hibcazteccode.globals){var $__=$_;$_=bwipp_hibcazteccode.globals={};$_.hibcazteccode_barchars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";$_.charvals=new Map;for(var _0=0;_0<=42;_0+=1){$p($_.charvals,$G($_.hibcazteccode_barchars,_0,1),_0)}$_.charvals=$_.charvals;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_hibcazteccode.globals);$_.dontdraw=false;$_.validatecheck=false;bwipp_processoptions();var _4=$k[--$j];$_.options=_4;var _5=$k[--$j];$_.barcode=_5;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length==0){$k[$j++]="bwipp.hibcazteccodeEmptyData#41904";$k[$j++]="The data must not be empty";bwipp_raiseerror()}if($_.barcode.length>16e3){$k[$j++]="bwipp.hibcazteccodeinputTooLong#41908";$k[$j++]="The input data is too long";bwipp_raiseerror()}for(var _C=0,_B=$_.barcode.length-1;_C<=_B;_C+=1){if(!$has($_.charvals,$G($_.barcode,_C,1))){$k[$j++]="bwipp.hibcazteccodeBadCharacter#41913";$k[$j++]="HIBC Aztec Code must contain only digits, capital letters, spaces and the symbols -.$/+%";bwipp_raiseerror()}}var _K=$_.barcode.length;if($_.validatecheck){_K=_K-1}$_.barlen=_K;$_.checksum=41;for(var _O=0,_N=$_.barlen-1;_O<=_N;_O+=1){$_.checksum=$f($g($_.charvals,$G($_.barcode,_O,1))+$_.checksum)}$_.checksum=$_.checksum%43;if($_.validatecheck){if($g($_.barcode,$_.barlen)!=$g($_.hibcazteccode_barchars,$_.checksum)){$k[$j++]="bwipp.hibcazteccodeBadCheckDigit#41927";$k[$j++]="Incorrect HIBC Aztec Code check digit provided";bwipp_raiseerror()}$_.barcode=$G($_.barcode,0,$_.barlen)}var _f=$s($_.barlen+2);$P(_f,1,$_.barcode);$_.barcode=_f;$p($_.barcode,0,43);$p($_.barcode,$_.barlen+1,$g($_.hibcazteccode_barchars,$_.checksum));$p($_.options,"validatecheck",false);$_.bwipp_dontdraw=true;$k[$j++]=$_.barcode;$k[$j++]=$_.options;bwipp_azteccode();var _p=$k[--$j];$_.args=_p;$p($_.args,"opt",$_.options);$k[$j++]=$_.args;if($_._render){bwipp_renmatrix()}$_=$__}function bwipp_channelcode(){var $__=$_;$_=Object.assign({},$_,bwipp_channelcode.globals);$_.dontdraw=false;$_.shortfinder=false;$_.includetext=false;$_.includecheck=false;$_.height=1;bwipp_processoptions();var _0=$k[--$j];$_.options=_0;var _1=$k[--$j];$_.barcode=_1;$_._render=!($_.dontdraw||($_.bwipp_dontdraw||bwipp_enabledontdraw));if($_.barcode.length<2||$_.barcode.length>7){$k[$j++]="bwipp.channelcodeBadLength#41997";$k[$j++]="Channel Code must be 2 to 7 digits";bwipp_raiseerror()}$F($_.barcode,function(){var _7=$k[--$j];if(_7<48||_7>57){$k[$j++]="bwipp.channelcodeBadCharacter#42001";$k[$j++]="Channel Code must contain only digits";bwipp_raiseerror()}});if($i($_.barcode)>$g($a([26,292,3493,44072,576688,7742862]),$_.barcode.length-2)){$k[$j++]="bwipp.channelcodeTooBig#42005";$k[$j++]="The Channel Code value is too big for the number of channels";bwipp_raiseerror()}$_.nextb=function(){var _C=$k[$j-1];$k[$j++]=$f($g($_.s,_C)+($g($_.b,_C-1)+($g($_.b,_C-2)+$g($_.s,_C-1))))>4?1:2;if(_C<$_.chan+2){var _N=$k[$j-1];var _P=$k[$j-3];for(var _R=_N,_Q=_P;_R<=_Q;_R+=1){var _U=$k[$j-2];$p($_.b,_U,_R);var _V=$k[$j-3];var _W=$k[$j-4];$k[$j++]=$f(_V-_R)+1;$k[$j++]=_W;$k[$j++]=_U+1;$_.nexts()}}else{var _X=$k[$j-1];var _Z=$k[$j-3];if($le(_X,_Z)){var _c=$k[$j-2];var _d=$k[$j-3];$p($_.b,_c,_d);if($_.value==$_.target){$k[$j++]=Infinity;for(var _g=3;_g<=10;_g+=1){$k[$j++]=$g($_.s,_g);$k[$j++]=$g($_.b,_g)}var _l=$a();$_.out=$G(_l,0,$_.chan*2)}$_.value=$_.value+1}}$j-=4};$_.nexts=function(){var _p=$k[$j-1];if(_p<$_.chan+2){$k[$j++]=1}else{var _s=$k[$j-2];$k[$j++]=_s}var _t=$k[--$j];var _v=$k[$j-2];for(var _x=_t,_w=_v;_x<=_w;_x+=1){var _z=$k[$j-1];$p($_.s,_z,_x);var _10=$k[$j-2];var _11=$k[$j-3];$k[$j++]=$f(_10-_x)+1;$k[$j++]=_11;$k[$j++]=_z;$_.nextb()}$j-=3};$_.encode=function(){var _12=$k[--$j];$_.chan=_12;var _13=$k[--$j];$_.target=_13;$_.value=0;$_.out=-1;$_.b=$a([1,1,1,0,0,0,0,0,0,0,0]);$_.s=$a([0,1,1,0,0,0,0,0,0,0,0]);var _14=$_.chan;$k[$j++]=_14;$k[$j++]=_14;$k[$j++]=3;$_.nexts();$k[$j++]=$_.out};$_.barlen=$_.barcode.length;var _1A=$_.shortfinder?$a([1,1,1,1,1]):$a([1,1,1,1,1,1,1,1,1]);$_.finder=_1A;$k[$j++]="data";$k[$j++]=$i($_.barcode);$k[$j++]=$_.barlen+1;$_.encode();var _1E=$k[--$j];var _1F=$k[--$j];$_[_1F]=_1E;$_.check=$a([]);if($_.includecheck){$_.mod23=$g($a([$a([]),$a([]),$a([13,12,4,9,3,1]),$a([13,2,12,3,18,16,4,1]),$a([11,16,17,8,20,4,10,2,5,1]),$a([1,4,16,18,3,12,2,8,9,13,6,1]),$a([20,16,22,13,15,12,5,4,8,9,21,3,7,1]),$a([2,6,18,8,1,3,9,4,12,13,16,2,6,18,8,1])]),$_.barlen);var _1a=0;for(var _1U=0,_1T=$_.data.length-1;_1U<=_1T;_1U+=1){_1a=$f(_1a+($g($_.data,_1U)-1)*$g($_.mod23,_1U))}$k[$j++]=_1a%23;$k[$j++]=3;$_.encode();var _1b=$k[--$j];$_.check=_1b}$k[$j++]=Infinity;$q($_.finder);$q($_.data);$q($_.check);$_.sbs=$a();$_.txt=$a($_.barlen);for(var _1j=0,_1i=$_.barlen-1;_1j<=_1i;_1j+=1){$_.i=_1j;$p($_.txt,$_.i,$a([$G($_.barcode,$_.i,1),0,0,"",0]))}$k[$j++]=Infinity;var _1q=$_.sbs;var _1v=[];for(var _1s=0,_1t=~~(($_.sbs.length+1)/2);_1s<_1t;_1s++){_1v[_1s]=$_.height}_1v=$a(_1v);var _1z=[];for(var _1x=0,_1y=~~(($_.sbs.length+1)/2);_1x<_1y;_1x++){_1z[_1x]=0}_1z=$a(_1z);$k[$j++]="ren";$k[$j++]="renlinear";$k[$j++]="sbs";$k[$j++]=_1q;$k[$j++]="bhs";$k[$j++]=_1v;$k[$j++]="bbs";$k[$j++]=_1z;$k[$j++]="txt";$k[$j++]=$_.txt;$k[$j++]="text1xalign";$k[$j++]="center";$k[$j++]="borderleft";$k[$j++]=1;$k[$j++]="borderright";$k[$j++]=2;$k[$j++]="opt";$k[$j++]=$_.options;var _22=$d();$k[$j++]=_22;if($_._render){bwipp_renlinear()}$_=$__}function bwipp_renderguards(){var _0=$k[--$j];$_.pixx=_0;if($_.guardwidth<0||$_.guardwidth>20){$k[$j++]="bwipp.renderBadGuardwidth#42124";$k[$j++]="guardwidth must be from 0 to 20";bwipp_raiseerror()}if($_.guardheight<0||$_.guardheight>20){$k[$j++]="bwipp.renderBadGuardheight#42128";$k[$j++]="guardheight must be from 0 to 20";bwipp_raiseerror()}if($_.guardleftpos<-50||$_.guardleftpos>150){$k[$j++]="bwipp.renderBadGuardleftpos#42132";$k[$j++]="guardleftpos must be from -50 to 150";bwipp_raiseerror()}if($_.guardleftypos<-50||$_.guardleftypos>150){$k[$j++]="bwipp.renderBadGuardleftypos#42136";$k[$j++]="guardleftypos must be from -50 to 150";bwipp_raiseerror()}if($_.guardrightpos<-50||$_.guardrightpos>150){$k[$j++]="bwipp.renderBadGuardrightpos#42140";$k[$j++]="guardrightpos must be from -50 to 150";bwipp_raiseerror()}if($_.guardrightypos<-50||$_.guardrightypos>150){$k[$j++]="bwipp.renderBadGuardrightypos#42144";$k[$j++]="guardrightypos must be from -50 to 150";bwipp_raiseerror()}if($_.guardwhitespace){$$.selectfont("OCR-B",$_.guardheight*2);if($_.guardleftpos!=0){$$.moveto(-$_.guardleftpos-2,$f($_.guardleftypos-$_.guardheight/2-1.25));$$.show("<",0,0)}if($_.guardrightpos!=0){$$.moveto($f($_.guardrightpos+$_.pixx-$_.guardwidth)-1,$f($_.guardrightypos-$_.guardheight/2-1.25));$$.show(">",0,0)}}}function bwipp_rendertext(){if(!bwipp_rendertext.globals){var $__=$_;$_=bwipp_rendertext.globals={};var _G=new Map([["offleft",function(){$k[$j++]=$f(-$_.tw-$_.nudge)}],["below",function(){$k[$j++]=$f(-$_.th-$_.nudge)}],["left",function(){$k[$j++]=0}],["bottom",function(){$k[$j++]=0}],["xcenter",function(){$k[$j++]=$f($_.pixx-$_.tw)/2}],["ycenter",function(){$k[$j++]=$f($_.pixy-$_.th)/2}],["right",function(){$k[$j++]=$f($_.pixx-$_.tw)}],["top",function(){$k[$j++]=$f($_.pixy-$_.th)}],["offright",function(){$k[$j++]=$f($_.pixx+$_.nudge)}],["above",function(){$k[$j++]=$f($_.pixy+$_.nudge)}]]);var _X=new Map([["offleft",function(){$k[$j++]=0-$_.nudge}],["below",function(){$k[$j++]=0-$_.nudge}],["left",function(){$k[$j++]=$_.tw}],["bottom",function(){$k[$j++]=$_.th}],["xcenter",function(){$k[$j++]=$f($_.pixx+$_.tw)/2}],["ycenter",function(){$k[$j++]=$f($_.pixy+$_.th)/2}],["right",function(){$k[$j++]=$_.pixx}],["top",function(){$k[$j++]=$_.pixy}],["offright",function(){$k[$j++]=$f($_.pixx+$_.tw+$_.nudge)}],["above",function(){$k[$j++]=$f($_.pixy+$_.th+$_.nudge)}]]);var _o=new Map([["offleft",function(){$k[$j++]=0-$_.nudge}],["below",function(){$k[$j++]=$f(-$_.tw-$_.nudge)}],["left",function(){$k[$j++]=$_.th}],["bottom",function(){$k[$j++]=0}],["xcenter",function(){$k[$j++]=$f($_.pixx+$_.th)/2}],["ycenter",function(){$k[$j++]=$f($_.pixy-$_.tw)/2}],["right",function(){$k[$j++]=$_.pixx}],["top",function(){$k[$j++]=$f($_.pixy-$_.tw)}],["offright",function(){$k[$j++]=$f($_.pixx+$_.th+$_.nudge)}],["above",function(){$k[$j++]=$f($_.pixy+$_.nudge)}]]);var _15=new Map([["offleft",function(){$k[$j++]=$f(-$_.th-$_.nudge)}],["below",function(){$k[$j++]=0-$_.nudge}],["left",function(){$k[$j++]=0}],["bottom",function(){$k[$j++]=$_.tw}],["xcenter",function(){$k[$j++]=$f($_.pixx-$_.th)/2}],["ycenter",function(){$k[$j++]=$f($_.pixy+$_.tw)/2}],["right",function(){$k[$j++]=$f($_.pixx-$_.th)}],["top",function(){$k[$j++]=$_.pixy}],["offright",function(){$k[$j++]=$f($_.pixx+$_.nudge)}],["above",function(){$k[$j++]=$f($_.pixy+$_.tw+$_.nudge)}]]);var _16=new Map([["forward",_G],["backward",_X],["upward",_o],["downward",_15]]);$_.rendertext_positions=_16;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_rendertext.globals);$splay();var _17=$k[--$j];$_.grp=_17;var _18=$k[--$j];$_.pixy=_18;var _19=$k[--$j];$_.pixx=_19;$_.makeerr=function(){var _1A=$k[--$j];$_.makeerr_msg=_1A;var _1B=$k[--$j];$_.makeerr_name=$c($s(128),_1B);if($_.grp==1){$k[$j++]="text"}else{if($_.grp==2){$k[$j++]="extratext"}else{var _1F=$s(5);$P(_1F,0,"text");$p(_1F,4,$_.grp+48);$k[$j++]=_1F}}var _1H=$k[--$j];$_.makeerr_pfx=_1H;var _1K=$s($_.makeerr_pfx.length+6+$_.makeerr_name.length);$P(_1K,0,"bwipp.");$P(_1K,6,$_.makeerr_pfx);$P(_1K,$_.makeerr_pfx.length+6,$_.makeerr_name);var _1Q=$s($_.makeerr_pfx.length+$_.makeerr_msg.length);$P(_1Q,0,$_.makeerr_pfx);$P(_1Q,$_.makeerr_pfx.length,$_.makeerr_msg);$k[$j++]=_1K;$k[$j++]=_1Q};$_.positiontext=function(){var _1U=$k[--$j];$_.th=_1U;var _1V=$k[--$j];$_.tw=_1V;$_.nudge=1;var _1W=$k[--$j];var _1X=$g($_.rendertext_positions,_1W);$k[$j++]=_1X;$k[$j++]=_1X;$r(4,-1);var _1Y=$k[$j-1];if($eq(_1Y,"center")){$k[$j-1]="xcenter"}var _1Z=$k[--$j];var _1a=$k[--$j];if($g(_1a,_1Z)()===true){return true}var _1c=$k[--$j];var _1d=$k[--$j];$k[$j++]=_1c;$k[$j++]=_1d;$r(3,-1);var _1e=$k[$j-1];if($eq(_1e,"center")){$k[$j-1]="ycenter"}var _1f=$k[--$j];var _1g=$k[--$j];if($g(_1g,_1f)()===true){return true}};for(var _1i=0;_1i<1;_1i++){if($_.txt.length>0&&$eq($_.xalign,"unset")&&$eq($_.yalign,"unset")&&$_.content.length==0){if($ne($_.color,"unset")){$$.setcolor($_.color)}$_.s=0;$_.fn="";$_.xoff=0;$_.yoff=0;try{$F($_.txt,function(){var _1q=$k[--$j];$q(_1q);var _1r=$k[$j-1];var _1s=$k[$j-2];if(_1r!=$_.s||$ne(_1s,$_.fn)){var _1v=$k[$j-1];if(_1v<=0){$j-=5;throw Infinity}var _1w=$k[--$j];var _1x=$k[--$j];$_.s=_1w;$_.fn=_1x;$$.selectfont(_1x,_1w);var _1y=$$.stringwidth("0");$_.xoff=-(_1y.w/2);$$.save();$$.newpath();$$.moveto(0,0);$$.charpath("0",false);var _1z=$$.pathbbox();$$.restore();$k[$j++]=_1z.llx;$k[$j++]=_1z.lly;$k[$j++]=_1z.ury;$k[$j++]=_1z.urx;$j--;var _20=$k[--$j];var _21=$k[--$j];$_.yoff=-($f(_21+_20)/2);$j--}else{$j-=2}var _22=$k[--$j];var _23=$k[--$j];$$.moveto(_23,_22);var _24=$k[$j-1];if(_24.length==1){$$.rmoveto($_.xoff,$_.yoff)}var _27=$k[--$j];$$.show(_27,0,0)});var _28=false}catch(e){$k[$j++]=true}if(_28){$k[$j++]="bwipp.fontTooSmall#42285";$k[$j++]="The font size is too small";$k[$j++]=false;break}$k[$j++]=true;break}if($_.content.length==0&&$_.txt.length>0){$k[$j++]=Infinity;$F($_.txt,function(){var _2C=$k[--$j];$F($g(_2C,0))});$_.txtchars=$a();$_.tstr=$s($_.txtchars.length);for(var _2I=0,_2H=$_.txtchars.length-1;_2I<=_2H;_2I+=1){$p($_.tstr,_2I,$g($_.txtchars,_2I))}$_.content=$_.tstr}if($_.content.length==0){$k[$j++]=true;break}if($_.subspace.length!=0&&$_.subspace.length!=1){$k[$j++]="subspaceBad";$k[$j++]="subspace option must be a single character";$_.makeerr();$k[$j++]=false;break}if($_.subspace.length!=0){for(var _2T=0,_2S=$_.content.length-1;_2T<=_2S;_2T+=1){$k[$j++]=_2T;$X($_.subspace,$G($_.content,_2T,1));var _2X=$k[--$j];if(_2X){$j--;$j--;var _2c=$k[$j-2];$p($_.content,_2c,32)}$j-=2}}if($_.split.length!=0&&$_.content.length!=0){if($_.split.length!=1){$k[$j++]="splitBad";$k[$j++]="split option must be a single character";$_.makeerr();$k[$j++]=false;break}$k[$j++]=Infinity;$k[$j++]=$_.content;for(;;){var _2i=$k[--$j];$X(_2i,$_.split);var _2j=$k[--$j];if(_2j){var _2k=$k[--$j];$j--;var _2n=$k[--$j];$k[$j++]=_2k;$k[$j++]=_2n}else{break}}$_.textlines=$a()}else{$_.textlines=$a([$_.content])}if($ne($_.color,"unset")){$$.setcolor($_.color)}$$.selectfont($_.font,$_.size);if($_.content.length==0){$k[$j++]=0}else{$$.save();$$.newpath();$$.moveto(0,0);$$.charpath("0",false);var _2u=$$.pathbbox();$$.restore();$k[$j++]=_2u.ury}var _2v=$k[--$j];$_.textascent=_2v;var _2w=$_.textlines;$k[$j++]="textwidth";$k[$j++]=0;for(var _2x=0,_2y=_2w.length;_2x<_2y;_2x++){var _30=$$.stringwidth($g(_2w,_2x));var _31=$k[--$j];var _32=_30.w;if(_31<_30.w){var _=_32;_32=_31;_31=_}$k[$j++]=_31}var _35=$k[--$j];var _36=$k[--$j];$_[_36]=$f(_35+($_.content.length-1)*$_.gaps);var _38=$_.textlines.length;$_.textheight=$f(_38*$_.textascent+(_38-1)*$_.linegaps);if($eq($_.xalign,"unset")){$_.xalign="center"}if($eq($_.yalign,"unset")){$_.yalign="below"}if($eq($_.xalign,"justify")){if($ne($_.direction,"forward")&&$ne($_.direction,"backward")){$k[$j++]="xjustify";$k[$j++]="xalign=justify requires forward or backward text";$_.makeerr();$k[$j++]=false;break}if($lt($_.textwidth,$_.pixx)&&$_.content.length>1){$_.gaps=$f($_.pixx-$_.textwidth)/($_.content.length-1);var _3N=$eq($_.direction,"forward")?"left":"right";$_.xalign=_3N}else{$_.gaps=0;$_.xalign="center"}}if($eq($_.yalign,"justify")){if($ne($_.direction,"upward")&&$ne($_.direction,"downward")){$k[$j++]="yjustify";$k[$j++]="yalign=justify requires upward or downward text";$_.makeerr();$k[$j++]=false;break}if($lt($_.textwidth,$_.pixy)&&$_.content.length>1){$_.gaps=$f($_.pixy-$_.textwidth)/($_.content.length-1);var _3Z=$eq($_.direction,"upward")?"bottom":"top";$_.yalign=_3Z}else{$_.gaps=0;$_.yalign="center"}}$k[$j++]=$_.xalign;$k[$j++]=$_.yalign;$k[$j++]=$_.direction;$k[$j++]=$_.textwidth;$k[$j++]=$_.textheight;$_.positiontext();var _3g=$k[--$j];var _3h=$k[--$j];$$.moveto(_3h,_3g);$$.rmoveto($_.xoffset,$_.yoffset);$$.save();var _3k=new Map([["forward",0],["upward",90],["backward",180],["downward",270]]);$$.rotate($g(_3k,$_.direction));var _3n=$$.currpos();$$.translate(_3n.x,_3n.y);for(var _3q=0,_3p=$_.textlines.length-1;_3q<=_3p;_3q+=1){$_.i=_3q;$$.moveto(0,0+$f($_.textascent+$_.linegaps)*$_.i);var _3v=$_.textlines;$$.show($g(_3v,_3v.length-$_.i-1),$_.gaps,0)}$$.restore();$k[$j++]=true;break}$_=$__}function bwipp_renlinear(){if($_.bwipjs_rawstack){$_.bwipjs_rawstack.push($k[--$j]);return}if(!bwipp_renlinear.globals){var $__=$_;$_=bwipp_renlinear.globals={};var _0=new Map([["offleft","offleft"],["left","left"],["center","center"],["right","right"],["offright","offright"],["justify","justify"]]);$_.renlinear_xalignopts=_0;var _1=new Map([["above","above"],["top","top"],["center","center"],["bottom","bottom"],["below","below"],["justify","justify"]]);$_.renlinear_yalignopts=_1;var _2=new Map([["forward","forward"],["backward","backward"],["upward","upward"],["downward","downward"]]);$_.renlinear_directionoptions=_2;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_renlinear.globals);$_.sbs=$a([]);$_.bhs=$a([]);$_.bbs=$a([]);$_.txt=$a([]);bwipp_inittextoptions();$_.text1xalign="unset";$_.text1yalign="unset";$_.includetext=false;$_.barcolor="unset";$_.bordercolor="unset";$_.inkspread=null;$_.width=0;$_.barratio=1;$_.spaceratio=1;$_.showborder=false;$_.showbearer=false;$_.borderleft=10;$_.borderright=10;$_.bordertop=1;$_.borderbottom=1;$_.borderwidth=.5;$_.guardwhitespace=false;$_.guardleftpos=0;$_.guardleftypos=0;$_.guardrightpos=0;$_.guardrightypos=0;$_.guardwidth=5;$_.guardheight=7;var _3=$k[--$j];$F(_3,function(){var _4=$k[--$j];var _5=$k[--$j];$_[_5]=_4});$k[$j++]=$_.opt;$del($_,"opt");bwipp_processoptions();$k[$j-1]="textopts";bwipp_grouptextoptions();var _7=$k[--$j];var _8=$k[--$j];$_[_8]=_7;for(var _9=1;_9<=9;_9+=1){$_.textgrp=_9;$k[$j++]=$_.textgrp;$k[$j++]=$g($_.textopts,$_.textgrp-1);bwipp_validatetext();var _E=$k[--$j];if(!_E){bwipp_raiseerror()}}if($_.inkspread<-1||$_.inkspread>1){$k[$j++]="bwipp.renlinearBadInkspread#42500";$k[$j++]="inkspread must be from -1 to 1";bwipp_raiseerror()}if($_.borderleft<-1||$_.borderleft>50){$k[$j++]="bwipp.renlinearBadBorderleft#42504";$k[$j++]="borderleft must be from -1 to 50";bwipp_raiseerror()}if($_.borderright<-1||$_.borderright>50){$k[$j++]="bwipp.renlinearBadBorderright#42508";$k[$j++]="borderright must be from -1 to 50";bwipp_raiseerror()}if($_.bordertop<-1||$_.bordertop>50){$k[$j++]="bwipp.renlinearBadBordertop#42512";$k[$j++]="bordertop must be from -1 to 50";bwipp_raiseerror()}if($_.borderbottom<-1||$_.borderbottom>50){$k[$j++]="bwipp.renlinearBadBorderbottom#42516";$k[$j++]="borderbottom must be from -1 to 50";bwipp_raiseerror()}if($_.borderwidth<0||$_.borderwidth>10){$k[$j++]="bwipp.renlinearBadBorderwidth#42520";$k[$j++]="borderwidth must be from 0 to 10";bwipp_raiseerror()}if($_.barratio<.1||$_.barratio>5){$k[$j++]="bwipp.renlinearBadBarratio#42524";$k[$j++]="barratio must be from 0.1 to 5";bwipp_raiseerror()}if($_.spaceratio<.1||$_.spaceratio>5){$k[$j++]="bwipp.renlinearBadSpaceratio#42528";$k[$j++]="spaceratio must be from 0.1 to 5";bwipp_raiseerror()}if($_.width!=0){if($_.width<.01||$_.width>20){$k[$j++]="bwipp.renlinearBadWidth#42532";$k[$j++]="width must be 0 or from 0.01 to 20";bwipp_raiseerror()}}if($_.guardwidth<0||$_.guardwidth>20){$k[$j++]="bwipp.renlinearBadGuardwidth#42536";$k[$j++]="guardwidth must be from 0 to 20";bwipp_raiseerror()}if($_.guardheight<0||$_.guardheight>20){$k[$j++]="bwipp.renlinearBadGuardheight#42540";$k[$j++]="guardheight must be from 0 to 20";bwipp_raiseerror()}if($_.guardleftpos<-50||$_.guardleftpos>150){$k[$j++]="bwipp.renlinearBadGuardleftpos#42544";$k[$j++]="guardleftpos must be from -50 to 150";bwipp_raiseerror()}if($_.guardleftypos<-50||$_.guardleftypos>150){$k[$j++]="bwipp.renlinearBadGuardleftypos#42548";$k[$j++]="guardleftypos must be from -50 to 150";bwipp_raiseerror()}if($_.guardrightpos<-50||$_.guardrightpos>150){$k[$j++]="bwipp.renlinearBadGuardrightpos#42552";$k[$j++]="guardrightpos must be from -50 to 150";bwipp_raiseerror()}if($_.guardrightypos<-50||$_.guardrightypos>150){$k[$j++]="bwipp.renlinearBadGuardrightypos#42556";$k[$j++]="guardrightypos must be from -50 to 150";bwipp_raiseerror()}if($_.sbs.length!=0){var _l=$_.sbs;$k[$j++]=~~((_l.length+1)/2);if($_.bhs.length<~~((_l.length+1)/2)||$_.bbs.length<~~((_l.length+1)/2)){$k[$j-1]="bwipp.renlinearBadBarHeightArrays#42562";$k[$j++]="The bar height and baseline arrays must be at least as long as the number of bars";bwipp_raiseerror()}$j--}$_.bars=$a(~~(($_.sbs.length+1)/2));$_.pixx=0;$_.pixy=0;for(var _s=0,_r=~~(($_.sbs.length+1)/2)*2-2;_s<=_r;_s+=1){$_.i=_s;if($_.i%2==0){$_.d=$f($g($_.sbs,$_.i)*$_.barratio-$_.barratio)+1;if($g($_.sbs,$_.i)!=0){$_.h=$g($_.bhs,~~($_.i/2))*72;$_.c=$f($_.d/2+$_.pixx);$_.y=$g($_.bbs,~~($_.i/2))*72;$_.w=$f($_.d-$_.inkspread);$p($_.bars,~~($_.i/2),$a([$_.h,$_.c,$_.y,$_.w]));if($f($_.h+$_.y)>$_.pixy){$_.pixy=$f($_.h+$_.y)}}else{$p($_.bars,~~($_.i/2),-1)}}else{$_.d=$f($g($_.sbs,$_.i)*$_.spaceratio-$_.spaceratio)+1}$_.pixx=$f($_.pixx+$_.d)}$$.save();var _1X=$$.currpos();$$.translate(_1X.x,_1X.y);if($_.width!=0){$$.scale($_.width*72/$_.pixx,1)}$_.tl=$a([-$f($_.borderleft+$_.borderwidth/2),$f($_.pixy+$_.bordertop+$_.borderwidth/2)]);$_.tr=$a([$f($_.pixx+$_.borderright+$_.borderwidth/2),$f($_.pixy+$_.bordertop+$_.borderwidth/2)]);$_.bl=$a([-$f($_.borderleft+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)]);$_.br=$a([$f($_.pixx+$_.borderright+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)]);if($_.showbearer){$$.save();$$.newpath();$q($_.bl);var _1x=$k[--$j];var _1y=$k[--$j];$$.moveto(_1y,_1x);$q($_.br);var _20=$k[--$j];var _21=$k[--$j];$$.lineto(_21,_20);$q($_.tl);var _23=$k[--$j];var _24=$k[--$j];$$.moveto(_24,_23);$q($_.tr);var _26=$k[--$j];var _27=$k[--$j];$$.lineto(_27,_26);if($ne($_.bordercolor,"unset")){$$.setcolor($_.bordercolor)}$$.setlinewidth($f($_.borderwidth-$_.inkspread*2));$$.stroke();$$.restore()}else{if($_.showborder){$$.save();$$.newpath();$q($_.bl);var _2E=$k[--$j];var _2F=$k[--$j];$$.moveto(_2F,_2E);var _2J=$a([$_.br,$_.tr,$_.tl]);for(var _2K=0,_2L=_2J.length;_2K<_2L;_2K++){$q($g(_2J,_2K));var _2N=$k[--$j];var _2O=$k[--$j];$$.lineto(_2O,_2N)}$$.closepath();if($ne($_.bordercolor,"unset")){$$.setcolor($_.bordercolor)}$$.setlinewidth($_.borderwidth);$$.stroke();$$.restore()}}$$.save();if($ne($_.barcolor,"unset")){$$.setcolor($_.barcolor)}var _2U=$_.bars;for(var _2V=0,_2W=_2U.length;_2V<_2W;_2V++){var _2X=$g(_2U,_2V);$k[$j++]=_2X;if(_2X!=-1){var _2Y=$k[--$j];$q(_2Y);$$.newpath();var _2Z=$k[--$j];$$.setlinewidth(_2Z);var _2a=$k[--$j];var _2b=$k[--$j];$$.moveto(_2b,_2a);var _2c=$k[--$j];$$.rlineto(0,_2c);$$.stroke()}else{$j--}}$$.restore();for(var _2d=1;_2d<=9;_2d+=1){$_.textgrp=_2d;if($g($g($_.textopts,$_.textgrp-1),"").length!=0||$_.textgrp==1&&$_.txt.length>0&&$_.includetext){var _2n=$g($_.textopts,$_.textgrp-1);$p(_2n,"content",$g(_2n,""));$k[$j++]=_2n;var _2t="txt";var _2s=$_.textgrp==1?$_.txt:$a([]);$p(_2n,_2t,_2s);$k[$j++]=$_.pixx;$k[$j++]=$_.pixy;$k[$j++]=$_.textgrp;$r(4,-1);bwipp_rendertext();var _2y=$k[--$j];if(!_2y){$$.restore();bwipp_raiseerror()}}}$k[$j++]=$_.pixx;bwipp_renderguards();$$.restore();$_=$__}function bwipp_renmatrix(){if($_.bwipjs_rawstack){$_.bwipjs_rawstack.push($k[--$j]);return}if(!bwipp_renmatrix.globals){var $__=$_;$_=bwipp_renmatrix.globals={};var _0=new Map([["offleft","offleft"],["left","left"],["center","center"],["right","right"],["offright","offright"],["justify","justify"]]);$_.renmatrix_xalignopts=_0;var _1=new Map([["above","above"],["top","top"],["center","center"],["bottom","bottom"],["below","below"],["justify","justify"]]);$_.renmatrix_yalignopts=_1;var _2=new Map([["forward","forward"],["backward","backward"],["upward","upward"],["downward","downward"]]);$_.renmatrix_directionoptions=_2;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_renmatrix.globals);$_.width=1;$_.height=1;$_.barcolor="unset";$_.bordercolor="unset";$_.colormap="unset";$_.dotty=false;$_.inkspread=null;$_.inkspreadh=null;$_.inkspreadv=null;$_.txt=$a([]);bwipp_inittextoptions();$_.text1xalign="unset";$_.text1yalign="unset";$_.includetext=false;$_.showborder=false;$_.borderleft=0;$_.borderright=0;$_.bordertop=0;$_.borderbottom=0;$_.borderwidth=.5;$_.guardwhitespace=false;$_.guardleftpos=0;$_.guardleftypos=0;$_.guardrightpos=0;$_.guardrightypos=0;$_.guardwidth=5;$_.guardheight=7;var _3=$k[--$j];$F(_3,function(){var _4=$k[--$j];var _5=$k[--$j];$_[_5]=_4});$k[$j++]=$_.opt;$del($_,"opt");bwipp_processoptions();$k[$j-1]="textopts";bwipp_grouptextoptions();var _7=$k[--$j];var _8=$k[--$j];$_[_8]=_7;if($_.inkspread==null){$_.inkspread=0}if($_.inkspreadh==null){$_.inkspreadh=$_.inkspread}if($_.inkspreadv==null){$_.inkspreadv=$_.inkspread}if(!$has($_,"rowmult")){$k[$j++]=Infinity;for(var _G=0,_H=$_.pixy;_G<_H;_G++){$k[$j++]=1}$_.rowmult=$a()}$_.bufnew=$a($_.pixx*$_.pixy);$_.bufoff=0;$_.pixoff=0;var _L=$_.rowmult;for(var _M=0,_N=_L.length;_M<_N;_M++){for(var _P=0,_Q=$g(_L,_M);_P<_Q;_P++){$P($_.bufnew,$_.bufoff,$G($_.pixs,$_.pixoff,$_.pixx));$_.bufoff=$_.bufoff+$_.pixx}$_.pixoff=$_.pixoff+$_.pixx}$_.pixs=$_.bufnew;for(var _c=1;_c<=9;_c+=1){$_.textgrp=_c;$k[$j++]=$_.textgrp;$k[$j++]=$g($_.textopts,$_.textgrp-1);bwipp_validatetext();var _h=$k[--$j];if(!_h){bwipp_raiseerror()}}if($_.inkspread<-1||$_.inkspread>1){$k[$j++]="bwipp.renmatrixBadInkspread#42780";$k[$j++]="inkspread must be from -1 to 1";bwipp_raiseerror()}if($_.inkspreadh<-1||$_.inkspreadh>1){$k[$j++]="bwipp.renmatrixBadInkspreadh#42784";$k[$j++]="inkspreadh must be from -1 to 1";bwipp_raiseerror()}if($_.inkspreadv<-1||$_.inkspreadv>1){$k[$j++]="bwipp.renmatrixBadInkspreadv#42788";$k[$j++]="inkspreadv must be from -1 to 1";bwipp_raiseerror()}if($_.borderleft<-1||$_.borderleft>50){$k[$j++]="bwipp.renmatrixBadBorderleft#42792";$k[$j++]="borderleft must be from -1 to 50";bwipp_raiseerror()}if($_.borderright<-1||$_.borderright>50){$k[$j++]="bwipp.renmatrixBadBorderright#42796";$k[$j++]="borderright must be from -1 to 50";bwipp_raiseerror()}if($_.bordertop<-1||$_.bordertop>50){$k[$j++]="bwipp.renmatrixBadBordertop#42800";$k[$j++]="bordertop must be from -1 to 50";bwipp_raiseerror()}if($_.borderbottom<-1||$_.borderbottom>50){$k[$j++]="bwipp.renmatrixBadBorderbottom#42804";$k[$j++]="borderbottom must be from -1 to 50";bwipp_raiseerror()}if($_.borderwidth<0||$_.borderwidth>10){$k[$j++]="bwipp.renmatrixBadBorderwidth#42808";$k[$j++]="borderwidth must be from 0 to 10";bwipp_raiseerror()}if($_.width<.01||$_.width>50){$k[$j++]="bwipp.renmatrixBadWidth#42812";$k[$j++]="width must be from 0.01 to 50";bwipp_raiseerror()}if($_.height<.01||$_.height>50){$k[$j++]="bwipp.renmatrixBadHeight#42816";$k[$j++]="height must be from 0.01 to 50";bwipp_raiseerror()}if($_.pixx<=0||$_.pixy<=0){$k[$j++]="bwipp.renmatrixBadDimensions#42820";$k[$j++]="The symbol dimensions must be positive";bwipp_raiseerror()}if($_.pixs.length<$_.pixx*$_.pixy){$k[$j++]="bwipp.renmatrixBadPixelData#42824";$k[$j++]="The pixel data is shorter than the symbol dimensions require";bwipp_raiseerror()}$_.xyget=function(){var _18=$k[--$j];var _19=$k[--$j];$k[$j++]=$g($_.pixs,$f(_19+_18*$_.pixx))};$_.drawlayerdots=function(){$_.pixsorig=$_.pixs;var _1D=$k[--$j];$_.pixs=_1D;$$.newpath();for(var _1G=0,_1F=$_.pixs.length-1;_1G<=_1F;_1G+=1){$_.x=_1G%$_.pixx;$_.y=~~(_1G/$_.pixx);$k[$j++]=$_.x;$k[$j++]=$_.y;$_.xyget();var _1L=$k[--$j];if(_1L==1){$$.moveto($f($_.x+.5),$f($_.pixy-$_.y-.5));$$.arc($f($_.x+.5),$f($_.pixy-$_.y-.5),$f(.5-$_.inkspread),0,360,1)}}$$.fill();$_.pixs=$_.pixsorig};$$.save();var _1U=$$.currpos();$$.translate(_1U.x,_1U.y);$_.inkspread=$_.inkspread/2;$_.inkspreadh=$_.inkspreadh/2;$_.inkspreadv=$_.inkspreadv/2;$$.scale($_.width/$_.pixx*72,$_.height/$_.pixy*72);if($_.showborder){$_.tl=$a([-$f($_.borderleft+$_.borderwidth/2),$f($_.pixy+$_.bordertop+$_.borderwidth/2)]);$_.tr=$a([$f($_.pixx+$_.borderright+$_.borderwidth/2),$f($_.pixy+$_.bordertop+$_.borderwidth/2)]);$_.bl=$a([-$f($_.borderleft+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)]);$_.br=$a([$f($_.pixx+$_.borderright+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)])}else{$_.tl=$a([$f(-$_.borderleft+$_.inkspread),$f($_.pixy+$_.bordertop-$_.inkspread)]);$_.tr=$a([$f($_.pixx+$_.borderright-$_.inkspread),$f($_.pixy+$_.bordertop-$_.inkspread)]);$_.bl=$a([$f(-$_.borderleft+$_.inkspread),$f(-$_.borderbottom+$_.inkspread)]);$_.br=$a([$f($_.pixx+$_.borderright-$_.inkspread),$f(-$_.borderbottom+$_.inkspread)])}if($_.showborder){$$.save();$$.newpath();$q($_.bl);var _2J=$k[--$j];var _2K=$k[--$j];$$.moveto(_2K,_2J);var _2O=$a([$_.br,$_.tr,$_.tl]);for(var _2P=0,_2Q=_2O.length;_2P<_2Q;_2P++){$q($g(_2O,_2P));var _2S=$k[--$j];var _2T=$k[--$j];$$.lineto(_2T,_2S)}$$.closepath();if($ne($_.bordercolor,"unset")){$$.setcolor($_.bordercolor)}$$.setlinewidth($f($_.borderwidth-$_.inkspread*2));$$.stroke();$$.restore()}if($eq($_.colormap,"unset")){$_.colormap=new Map([[1,$_.barcolor]])}var _2a=$_.colormap;for(var _2f=_2a.size,_2e=_2a.keys(),_2d=0;_2d<_2f;_2d++){var _2b=_2e.next().value;var _2c=_2a.get(_2b);$k[$j++]=_2b;$k[$j++]=_2c;if($ne(_2c,"unset")){var _2g=$k[--$j];$$.setcolor(_2g)}else{$j--}var _2h=$k[--$j];$_.key=_2h;var _2o=[];var _2i=$_.pixs;for(var _2j=0,_2k=_2i.length;_2j<_2k;_2j++){_2o[_2j]=$eq($g(_2i,_2j),$_.key)?1:0}_2o=$a(_2o);$k[$j++]=_2o;if($_.dotty){$_.drawlayerdots()}else{var _2q=$k[--$j];$$.drawlayer(_2q,$_.pixx,$_.pixy,$_.inkspreadh,$_.inkspreadv)}}for(var _2r=1;_2r<=9;_2r+=1){$_.textgrp=_2r;if($g($g($_.textopts,$_.textgrp-1),"").length!=0||$_.textgrp==1&&$_.txt.length>0&&$_.includetext){var _31=$g($_.textopts,$_.textgrp-1);$p(_31,"txt",$_.txt);$p(_31,"content",$g(_31,""));$k[$j++]=$_.pixx;$k[$j++]=$_.pixy;$k[$j++]=$_.textgrp;$k[$j++]=_31;bwipp_rendertext();var _37=$k[--$j];if(!_37){$$.restore();bwipp_raiseerror()}}}$k[$j++]=$_.pixx;bwipp_renderguards();$$.restore();$_=$__}function bwipp_renmaximatrix(){if($_.bwipjs_rawstack){$_.bwipjs_rawstack.push($k[--$j]);return}var $__=$_;$_=Object.assign({},$_,bwipp_renmaximatrix.globals);$_.barcolor="unset";$_.bordercolor="unset";$_.inkspread=null;$_.showborder=false;$_.borderleft=0;$_.borderright=0;$_.bordertop=0;$_.borderbottom=0;$_.borderwidth=.5;var _0=$k[--$j];$F(_0,function(){var _1=$k[--$j];var _2=$k[--$j];$_[_2]=_1});$k[$j++]=$_.opt;$del($_,"opt");bwipp_processoptions();$j--;if($_.inkspread==null){$_.inkspread=0}if($_.inkspread<-1||$_.inkspread>1){$k[$j++]="bwipp.renmaximatrixBadInkspread#42974";$k[$j++]="inkspread must be from -1 to 1";bwipp_raiseerror()}if($_.borderleft<-1||$_.borderleft>50){$k[$j++]="bwipp.renmaximatrixBadBorderleft#42978";$k[$j++]="borderleft must be from -1 to 50";bwipp_raiseerror()}if($_.borderright<-1||$_.borderright>50){$k[$j++]="bwipp.renmaximatrixBadBorderright#42982";$k[$j++]="borderright must be from -1 to 50";bwipp_raiseerror()}if($_.bordertop<-1||$_.bordertop>50){$k[$j++]="bwipp.renmaximatrixBadBordertop#42986";$k[$j++]="bordertop must be from -1 to 50";bwipp_raiseerror()}if($_.borderbottom<-1||$_.borderbottom>50){$k[$j++]="bwipp.renmaximatrixBadBorderbottom#42990";$k[$j++]="borderbottom must be from -1 to 50";bwipp_raiseerror()}if($_.borderwidth<0||$_.borderwidth>10){$k[$j++]="bwipp.renmaximatrixBadBorderwidth#42994";$k[$j++]="borderwidth must be from 0 to 10";bwipp_raiseerror()}$$.save();if($_.showborder){$_.tl=$a([-$f($_.borderleft+$_.borderwidth/2),$f(29+$_.bordertop+$_.borderwidth/2)]);$_.tr=$a([$f(30+$_.borderright+$_.borderwidth/2),$f(29+$_.bordertop+$_.borderwidth/2)]);$_.bl=$a([-$f($_.borderleft+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)]);$_.br=$a([$f(30+$_.borderright+$_.borderwidth/2),-$f($_.borderbottom+$_.borderwidth/2)])}else{$_.tl=$a([-$_.borderleft+$_.inkspread,29+$_.bordertop-$_.inkspread]);$_.tr=$a([30+$_.borderright-$_.inkspread,29+$_.bordertop-$_.inkspread]);$_.bl=$a([-$_.borderleft+$_.inkspread,-$_.borderbottom+$_.inkspread]);$_.br=$a([30+$_.borderright-$_.inkspread,-$_.borderbottom+$_.inkspread])}if($_.showborder){$$.save();$$.newpath();$q($_.bl);var _q=$k[--$j];var _r=$k[--$j];$$.moveto(_r,_q);var _v=$a([$_.br,$_.tr,$_.tl]);for(var _w=0,_x=_v.length;_w<_x;_w++){$q($g(_v,_w));var _z=$k[--$j];var _10=$k[--$j];$$.lineto(_10,_z)}$$.closepath();if($ne($_.bordercolor,"unset")){$$.setcolor($_.bordercolor)}$$.setlinewidth($f($_.borderwidth-$_.inkspread*2));$$.stroke();$$.restore()}if($ne($_.barcolor,"unset")){$$.setcolor($_.barcolor)}$$.showmaxicode($_.pixs);$$.restore();$_=$__}function bwipp_validatetext(){if(!bwipp_validatetext.globals){var $__=$_;$_=bwipp_validatetext.globals={};var _0=new Map([["offleft","offleft"],["left","left"],["center","center"],["right","right"],["offright","offright"],["justify","justify"]]);$_.validatetext_xalignopts=_0;var _1=new Map([["above","above"],["top","top"],["center","center"],["bottom","bottom"],["below","below"],["justify","justify"]]);$_.validatetext_yalignopts=_1;var _2=new Map([["forward","forward"],["backward","backward"],["upward","upward"],["downward","downward"]]);$_.validatetext_directionoptions=_2;$_=$__}var $__=$_;$_=Object.assign({},$_,bwipp_validatetext.globals);var _3=$k[--$j];$_.td=_3;var _4=$k[--$j];$_.grp=_4;$k[$j++]="pfx";if($_.grp==1){$k[$j++]="text"}else{if($_.grp==2){$k[$j++]="extratext"}else{var _7=$s(5);$P(_7,0,"text");$p(_7,4,$_.grp+48);$k[$j++]=_7}}var _9=$k[--$j];var _A=$k[--$j];$_[_A]=_9;$_.mkerr=function(){var _B=$k[--$j];$_.msgtail=_B;var _C=$k[--$j];$_.prop=$c($s(128),_C);var _G=$s($_.pfx.length+9+$_.prop.length);$P(_G,0,"bwipp.");$P(_G,6,$_.pfx);$P(_G,$_.pfx.length+6,"Bad");$P(_G,$_.pfx.length+9,$_.prop);var _O=$s($_.pfx.length+$_.prop.length+$_.msgtail.length);$P(_O,0,$_.pfx);$P(_O,$_.pfx.length,$_.prop);$P(_O,$_.pfx.length+$_.prop.length,$_.msgtail);$k[$j++]=_G;$k[$j++]=_O};for(var _V=0;_V<1;_V++){var _X=$g($_.td,"xalign");$k[$j++]=_X;if($ne(_X,"unset")){var _Y=$k[--$j];if(!$has($_.validatetext_xalignopts,_Y)){$k[$j++]="xalign";$k[$j++]=" must be offleft, left, center, right, offright or justify";$_.mkerr();$k[$j++]=false;break}}else{$j--}var _b=$g($_.td,"yalign");$k[$j++]=_b;if($ne(_b,"unset")){var _c=$k[--$j];if(!$has($_.validatetext_yalignopts,_c)){$k[$j++]="yalign";$k[$j++]=" must be above, top, center, bottom, below or justify";$_.mkerr();$k[$j++]=false;break}}else{$j--}if(!$has($_.validatetext_directionoptions,$g($_.td,"direction"))){$k[$j++]="direction";$k[$j++]=" must be forward, backward, upward or downward";$_.mkerr();$k[$j++]=false;break}var _i=$g($_.td,"size");if(_i<=0||_i>=25){$k[$j++]="size";$k[$j++]=" must be greater than zero and less than 25";$_.mkerr();$k[$j++]=false;break}var _k=$g($_.td,"xoffset");if(_k<-150||_k>150){$k[$j++]="xoffset";$k[$j++]=" must be from -150 to 150";$_.mkerr();$k[$j++]=false;break}var _m=$g($_.td,"yoffset");if(_m<-150||_m>150){$k[$j++]="yoffset";$k[$j++]=" must be from -150 to 150";$_.mkerr();$k[$j++]=false;break}var _o=$g($_.td,"gaps");if(_o<-20||_o>20){$k[$j++]="gaps";$k[$j++]=" must be from -20 to 20";$_.mkerr();$k[$j++]=false;break}var _q=$g($_.td,"linegaps");if(_q<0||_q>20){$k[$j++]="linegaps";$k[$j++]=" must be from 0 to 20";$_.mkerr();$k[$j++]=false;break}$k[$j++]=true;break}$_=$__}function bwipp_encode(bwipjs,encoder,text,opts,dontdraw){if(typeof text!=="string"){throw new Error("bwipp.typeError: barcode text not a string ("+text+")")}opts=opts||{};if(typeof opts==="string"){var tmp=opts.split(" ");opts={};for(var i=0;i^03001^02996152382802^029840^029001^0291Z00004951^029UPSN^02906X610^029159^0291234567^0291/1^029^029Y^029634 ALPHA DR^029PITTSBURGH^029PA^029^004",opts:"mode=2 parse"},{bcid:"azteccode",desc:"Aztec Code",text:"This is Aztec Code",opts:"format=full"},{bcid:"azteccodecompact",desc:"Compact Aztec Code",text:"1234",opts:""},{bcid:"aztecrune",desc:"Aztec Runes",text:"1",opts:""},{bcid:"codeone",desc:"Code One",text:"Code One",opts:""},{bcid:"hanxin",desc:"Han Xin Code",text:"This is Han Xin",opts:""},{bcid:"dotcode",desc:"DotCode",text:"This is DotCode",opts:"inkspread=0.16"},{bcid:"ultracode",desc:"Ultracode",text:"Awesome colours!",opts:"eclevel=EC2"},{bcid:"gs1-cc",desc:"GS1 Composite 2D Component",text:"(01)09521234543213(3103)000123",opts:"ccversion=b cccolumns=4"},{bcid:"ean13composite",desc:"EAN-13 Composite",text:"9520123456788|(99)1234-abcd",opts:"includetext"},{bcid:"ean8composite",desc:"EAN-8 Composite",text:"95200002|(21)A12345678",opts:"includetext"},{bcid:"upcacomposite",desc:"UPC-A Composite",text:"012345000058|(99)1234-abcd",opts:"includetext"},{bcid:"upcecomposite",desc:"UPC-E Composite",text:"01234558|(15)021231",opts:"includetext"},{bcid:"databaromnicomposite",desc:"GS1 DataBar Omnidirectional Composite",text:"(01)09521234543213|(11)990102",opts:""},{bcid:"databarstackedcomposite",desc:"GS1 DataBar Stacked Composite",text:"(01)09521234543213|(17)010200",opts:""},{bcid:"databarstackedomnicomposite",desc:"GS1 DataBar Stacked Omnidirectional Composite",text:"(01)03612345678904|(11)990102",opts:""},{bcid:"databartruncatedcomposite",desc:"GS1 DataBar Truncated Composite",text:"(01)09521234543213|(11)990102",opts:""},{bcid:"databarlimitedcomposite",desc:"GS1 DataBar Limited Composite",text:"(01)09521234543213|(21)abcdefghijklmnopqrst",opts:""},{bcid:"databarexpandedcomposite",desc:"GS1 DataBar Expanded Composite",text:"(01)09521234543213(3103)001234|(91)1A2B3C4D5E",opts:""},{bcid:"databarexpandedstackedcomposite",desc:"GS1 DataBar Expanded Stacked Composite",text:"(01)09521234543213(10)ABCDEF|(21)12345678",opts:"segments=4"},{bcid:"gs1-128composite",desc:"GS1-128 Composite",text:"(00)095287654321012346|(02)09521234543213(37)24(10)1234567ABCDEFG",opts:"ccversion=c"},{bcid:"gs1datamatrix",desc:"GS1 Data Matrix",text:"(01)09521234543213(17)120508(10)ABCD1234(410)9501101020917",opts:""},{bcid:"gs1datamatrixrectangular",desc:"GS1 Data Matrix Rectangular",text:"(01)09521234543213(17)120508(10)ABCD1234(410)9501101020917",opts:""},{bcid:"gs1dldatamatrix",desc:"GS1 Digital Link Data Matrix",text:"https://id.gs1.org/01/09521234543213/22/ABC%2D123?99=XYZ-987",opts:"includetext"},{bcid:"gs1qrcode",desc:"GS1 QR Code",text:"(01)09521234543213(8200)http://www.abc.net(10)ABCD1234(410)9501101020917",opts:""},{bcid:"gs1dlqrcode",desc:"GS1 Digital Link QR Code",text:"HTTPS://ID.GS1.ORG/01/09521234543213/22/ABC%2D123?99=XYZ-987",opts:"includetext"},{bcid:"gs1dotcode",desc:"GS1 DotCode",text:"(235)5vBZIF%!>>0;return r*i>>>0}if(t!=null){t=t>>>0;return t*i>>>0}e=e>>>0;return e*i>>>0||0}}var BWIPJS_OPTIONS={bcid:1,text:1,scale:1,scaleX:1,scaleY:1,rotate:1,padding:1,paddingwidth:1,paddingheight:1,paddingtop:1,paddingleft:1,paddingright:1,paddingbottom:1,backgroundcolor:1};function Render(r,t){return _Render(bwipp_lookup(r.bcid),r,t)}function _Render(r,t,e){var i=t.text;if(!i){throw new ReferenceError("bwip-js: bar code text not specified.")}FixupOptions(t);e.setopts&&e.setopts(t);var n=t.scale||2;var a=+t.scaleX||n;var s=+t.scaleY||a;var f=t.rotate||"N";var o=new BWIPJS(e);var h={};for(var v in t){if(!BWIPJS_OPTIONS[v]){h[v]=t[v]}}if(h.alttext){h.includetext=true}if(+h.height&&r!=bwipp_pharmacode2){h.height=h.height/25.4||.5}if(+h.width){h.width=h.width/25.4||0}o.scale(a,s);bwipp_encode(o,r,i,h);return o.render()}function ToRaw(r,t,e){if(arguments.length==1){e=r;r=e.bcid;t=e.text}var i=DrawingBuiltin();i.setopts(e);var n=new BWIPJS(i);var a=bwipp_encode(n,bwipp_lookup(r),t,e,true);var s={pixs:1,pixx:1,pixy:1,sbs:1,bbs:1,bhs:1,txt:1,width:1,height:1};for(var f=0;f=0&&r[e].op=="l";e--);e++;if(eh.x0)n=h.x0;if(sh.y0)a=h.y0;if(fh.x1)n=h.x1;if(sh.y1)a=h.y1;if(fs.x0)t=s.x0;if(is.x1)t=s.x1;if(is.y0)e=s.y0;if(ns.y1)e=s.y1;if(no){var y=s;s=o;o=y}if(f>h){var y=f;f=h;h=y}if(s==o){this.bbox(s-v,f,s+c-v-1,h)}else{this.bbox(s,f-p+g+1,o,h+g)}e++}else if(a.op=="p"){var d=Infinity;var x=Infinity;var _=-Infinity;var m=-Infinity;var b=a.poly;if(b.length!=4){throw new Error("stroke: --not-a-rect--")}for(var n=0,w=b.length-1;n_)_=C;if(Fm)m=F}var v=A(c/2);var g=A(p/2);this.bbox(d-v,x-g,_+v,m+g);i++}else{throw new Error("stroke: --not-a-line--")}}var S=this;this.cmds.push(function(){var r=A(c/2);var t=A(p/2);var e=c-r;var i=p-t;for(var n=0;ns)s=v;if(lf)f=l}this.bbox(e,a+1,s-1,f)}else if(t.op=="e"){this.bbox(t.x-t.rx,t.y-t.ry,t.x+t.rx,t.y+t.ry)}else{throw new Error("fill: --not-a-polygon--")}}var u=this;this.cmds.push(function(){for(var r=0;r9){h++}var t,v,e,i;e=s/2|0;i=f/2|0;t=h-e;if(t&1){t--}v=(4*f|0)-i;var l=t/2-1;var u=(l+1)/2|0;var c=v-2-2*u;this.bbox(0,0,h*30-e,f*3*32+f*4-i);var p=this;this.cmds.push(function(){for(var r=0;re){var n=r;r=e;e=n}if(t>i){var n=t;t=i;i=n}r=M(r);t=M(t);e=A(e);i=A(i);if(this.minx>r)this.minx=r;if(this.maxxt)this.miny=t;if(this.maxy=0;r--){let t=new Uint8Array(i);for(let r=0;rs){for(var f=s+1;fa){F(n,a)}if(v>a){F(o,a)}}else{var h=r[i==t-1?0:i+1][1];var v=r[e==0?t-1:e-1][1];if(h>a){F(o,a)}if(v>a){F(n,a)}}}}},hexagon:function(r,t){var e=r[0][0]|0;var i=r[0][1]|0;var n=r[1][1]-r[0][1]|0;var a=r[2][1]-r[1][1]-1|0;var s=r[2][0]|0;var f=r[4][0]|0;j=parseInt(t.substr(0,2),16);T=parseInt(t.substr(2,2),16);B=parseInt(t.substr(4,2),16);S(e,e+1,i++);for(var o=1;o=1;o--){S(e-2*o,e+1+2*o,i++)}S(e,e+1,i)},ellipse:function(r,t,e,i,n){a(r-e|0,t-i|0,r+e|0,t+i|0,n)},fill:function(r){j=parseInt(r.substr(0,2),16);T=parseInt(r.substr(2,2),16);B=parseInt(r.substr(4,2),16);t();I=[];I.min=Infinity},clip:function(r){if(!C){C=[];C.min=Infinity}var t=I;I=C;for(var e=0,i=r.length;et)I.min=t;if(!I[t]){I[t]=[r]}else{I[t].push(r)}}function S(r,t,e){while(r<=t){L(r++,e,255)}}function t(){var r=I.min;var t=I.length-1;for(var e=r;e<=t;e++){var i=I[e];if(!i){continue}i.sort(function(r,t){return r-t});var n=false;var a=0;for(var s=0,f=i.length;se){r=e;e+=a}if(t>i)t=i;t+=(s+1)/2|0;i=t-f;a*=8*a;f=8*s*s;do{d(c,e,t);y(u,r,t);y(u,r,i);d(c,e,i);l=2*v;if(l>=o){r++;e--;o+=f;v+=o}if(l<=h){t++;i--;h+=a;v+=h}}while(r<=e);while(t-ie)r.min=e;var i=r[e];if(i==null||i>t){r[e]=t}}function d(r,t,e){if(r.min>e)r.min=e;var i=r[e];if(i==null||ir){return!i}else if(s==r){return i}i=!i}return true}function e(r){var t=0;for(var e=0,i=r.length,n=i-1;e0?1:-1}}function DrawingCanvas(e,r){if(IsCanvas(r)){e=r}var i;var n=e.getContext("2d",{willReadFrequently:true});var t=DrawingBuiltin();t.image=f;t.end=o;var a;var s=t.setopts;t.setopts=function(r){a=r;s&&s.call(t,r)};return t;function f(r,t){e.width=r;e.height=t;n.setTransform(1,0,0,1,0,0);if(/^[0-9a-fA-F]{6}$/.test(""+a.backgroundcolor)){n.fillStyle="#"+a.backgroundcolor;n.fillRect(0,0,r,t)}else{n.clearRect(0,0,r,t)}i=n.getImageData(0,0,r,t);return{buffer:i.data,ispng:false}}function o(){n.putImageData(i,0,0);return e}}function DrawingSVG(){var o=0,h=0,v=0,n=0;var l=0,u=0,a=0,c=0;var p;var d="";var f;var t="";var g=[];var y={};var x,_;var m=.55228475-45e-5;var b,w;var k,I;return{setopts(r){p=r},scale(r,t){x=r;_=t},measure(r,t,e,i){e=e|0;i=i|0;var n=FontLib.lookup(t);var a=0;var s=0;var f=0;for(var o=0,h=r.length;o\n";f=null}},clip:function(e){var i='';t="clip"+g.length;g.push(i)},unclip:function(){t=""},text(t,e,r,i,n){t=t|0;e=e|0;var a=t,s=e;var f=FontLib.lookup(n.name);var o=n.width|0;var h=n.height|0;var v=n.dx|0;var l="";for(var u=0;u\n'}else{d+='\n'}}},end(){var r="";for(var t in y){r+=y[t]+'" />\n'}var e=p.backgroundcolor;return'\n'+(g.length?""+g.join("")+"":"")+(/^[0-9A-Fa-f]{6}$/.test(""+e)?'\n':"")+r+d+"\n"}};function C(r,t){r+=k;t+=I;var e=o*r+h*t+v*(b-1)+n*(w-1);var i=l*r+u*t+a*(b-1)+c*(w-1);return""+((e|0)==e?e:e.toFixed(2))+" "+((i|0)==i?i:i.toFixed(2))}}var FontLib=function(){var h=[];var s={};var v={};var l={};var u=0;l.next=l;l.prev=l;return{lookup:t,monochrome:e,getglyph:i,getpaths:n,loadFont:r};function r(r){var t=100;var e=100;var i=null;if(arguments.length==2){i=arguments[1]}else if(arguments.length==3){t=e=+arguments[1]||100;i=arguments[2]}else if(arguments.length==4){e=+arguments[1]||100;t=+arguments[2]||100;i=arguments[3]}else{throw new Error("bwipjs: loadFont: invalid number of arguments")}var n=STBTT.InitFont(toUint8Array(i));n.bwipjs_name=r;n.bwipjs_multx=t;n.bwipjs_multy=e;var a=h.push(n)-1;s[r.toUpperCase()]=a;return a}function t(r){var t=s[r.toUpperCase()];return t===undefined?1:t}function e(r){if(r){throw new Error("bwipjs: monochrome fonts not implemented")}}function i(r,t,e,i){r=r|0;t=t|0;e=+e;i=+i;if(!e||e<8){e=8}if(!i||i<8){i=e}if(r<0||r>=h.length){r=1}if(!t||t<32){t=32}var n=""+r+"c"+t+"w"+e+"h"+i;var a=v[n];if(a){a.prev.next=a.next;a.next.prev=a.prev;var s=l;s.next.prev=a;a.next=s.next;a.prev=s;s.next=a;return a}var f=h[r];var a=STBTT.GetGlyph(f,t,e*f.bwipjs_multx/100,i*f.bwipjs_multy/100)||STBTT.GetGlyph(f,0,e*f.bwipjs_multx/100,i*f.bwipjs_multy/100);a.bytes=a.pixels;a.cachekey=n;a.offset=0;if(u>250){var s=l;var o=s.prev;o.prev.next=s;s.prev=o.prev;o.next=o.prev=null;delete v[o.cachekey]}else{u++}v[n]=a;var s=l;s.next.prev=a;a.next=s.next;a.prev=s;s.next=a;return a}function n(r,t,e,i){r=r|0;t=t|0;e=+e;i=+i;if(!e||e<8){e=8}if(!i||i<8){i=e}if(r<0||r>=h.length){r=1}if(!t||t<32){t=32}var n=h[r];return STBTT.GetPaths(n,t,e*n.bwipjs_multx/100,i*n.bwipjs_multy/100)}}();function LoadFont(){return FontLib.loadFont.apply(FontLib,Array.prototype.slice.call(arguments))}var STBTT=function(){var O=1,D=2,U=3,y=4,F=0,r=1,t=2,S=3,e=0,i=1,n=2,a=3,s=4,o=0,A=1,v=2,j=10;var W=Math.floor;var f=Math.ceil;var N=Math.sqrt;var B=Math.abs;function Y(r){var t=[];for(var e=0;er.length||t<0?r.length:t}function L(r,t){d(r,r.cursor+t)}function E(r,t){var e=0;for(var i=0;ir.length||e>r.length-t){return x()}var i=r.subarray(t,t+e);i.cursor=0;return i}function m(r){var t=r.cursor;var e=E(r,2);if(e){var i=V(r);L(r,i*e);L(r,E(r,i)-1)}return _(r,t,r.cursor-t)}function R(r){var t=V(r);if(t>=32&&t<=246){return t-139}else if(t>=247&&t<=250){return(t-247)*256+V(r)+108}else if(t>=251&&t<=254){return-(t-251)*256-V(r)-108}else if(t==28){return E(r,2)}else if(t==29){return E(r,4)}return 0}function T(r){var t=g(r);if(t==30){L(r,1);while(r.cursor>4==15){break}}}else{R(r)}}function Q(r,t){d(r,0);while(r.cursor=28){T(r)}i=r.cursor;n=V(r);if(n==12){n=V(r)|256}if(n==t){return _(r,e,i-e)}}return _(r,0,0)}function K(r,t,e,i){var n=Q(r,t);for(var a=0;a>0:r}function z(r,t){return r[t]*256+r[t+1]}function J(r,t){var e=r[t]*256+r[t+1];return e&32768?(4294901760|e)>>0:e}function C(r,t){return(r[t]<<24)+(r[t+1]<<16)+(r[t+2]<<8)+r[t+3]}function w(r,t,e){var i=z(r,t+4);var n=t+12;for(var a=0;a=s&&t>1,h=z(e,i+8)>>1,v=z(e,i+10),l=z(e,i+12)>>1,u=i+14,c=u;if(t>65535){return 0}if(t>=z(e,c+l*2)){c+=l*2}c-=2;while(v){h>>=1;var p=z(e,c+h*2);if(t>p){c+=h*2}--v}c+=2;var g,y,d=c-u>>>1;y=z(e,i+14+o*2+2+2*d);if(t>1);var w=C(e,i+16+b*12);var k=C(e,i+16+b*12+4);if(tk){_=b+1}else{var I=C(e,i+16+b*12+8);if(n==12){return I+t-w}else{return I}}}return 0}return 0}function $(r,t,e,i,n,a){r.type=t;r.x=e;r.y=i;r.cx=n;r.cy=a}function nr(r,t){var e,i;if(t>=r.numGlyphs){return-1}if(r.indexToLocFormat>=2){return-1}if(r.indexToLocFormat==0){e=r.glyf+z(r.data,r.loca+t*2)*2;i=r.glyf+z(r.data,r.loca+t*2+2)*2}else{e=r.glyf+C(r.data,r.loca+t*4);i=r.glyf+C(r.data,r.loca+t*4+4)}return e==i?-1:e}function ar(r,t,e){if(r.cff.length){pr(r,t,e)}else{var i=nr(r,t);if(i<0){return 0}e.x0=J(r.data,i+2);e.y0=J(r.data,i+4);e.x1=J(r.data,i+6);e.y1=J(r.data,i+8)}return 1}function sr(r,t,e,i,n,a,s,f,o,h){if(i){if(e){$(r[t++],U,o+s>>1,h+f>>1,o,h)}$(r[t++],U,n,a,s,f)}else{if(e){$(r[t++],U,n,a,o,h)}else{$(r[t++],D,n,a,0,0)}}return t}function fr(r,t){var e=r.data,i=nr(r,t);if(i<0){return null}var n=[];var a=J(e,i);if(a>0){var s=0,f,o,h=0,v,l,u,c=0,p,g=0,y,d,x,_,m,b,w,k;var I=i+10;var G=z(e,i+10+a*2);var C=e.subarray(i+10+a*2+2+G);var F=0;l=1+z(e,I+a*2-2);v=l+2*a;n=Y(v);u=0;f=0;p=v-l;for(o=0;o>1;b=d+n[p+o+1].y>>1}else{m=n[p+o+1].x;b=n[p+o+1].y;++o}}else{m=y;b=d}$(n[A++],O,m,b,0,0);c=0;u=1+z(e,I+h*2);++h}else{if(!(s&1)){if(c){$(n[A++],U,x+y>>1,_+d>>1,x,_)}x=y;_=d;c=1}else{if(c){$(n[A++],U,y,d,x,_)}else{$(n[A++],D,y,d,0,0)}c=0}}}n.length=sr(n,A,c,g,m,b,w,k,x,_)}else if(a==-1){var j=1;var T=i+10;while(j){var s,B,L=[1,0,0,1,0,0];s=J(e,T);T+=2;B=J(e,T);T+=2;if(s&2){if(s&1){L[4]=J(e,T);T+=2;L[5]=J(e,T);T+=2}else{L[4]=V(e,T);T+=1;L[5]=V(e,T);T+=1}}if(s&1<<3){L[0]=L[3]=J(e,T)/16384;T+=2;L[1]=L[2]=0}else if(s&1<<6){L[0]=J(e,T)/16384;T+=2;L[1]=L[2]=0;L[3]=J(e,T)/16384;T+=2}else if(s&1<<7){L[0]=J(e,T)/16384;T+=2;L[1]=J(e,T)/16384;T+=2;L[2]=J(e,T)/16384;T+=2;L[3]=J(e,T)/16384;T+=2}var v=N(L[0]*L[0]+L[1]*L[1]);var l=N(L[2]*L[2]+L[3]*L[3]);var E=Z(r,B);if(E.length>0){for(var o=0,P=E.length;or.max_x||!r.started){r.max_x=t}if(e>r.max_y||!r.started){r.max_y=e}if(t=33900){i=32768}else if(e>=1240){i=1131}t+=i;if(t<0||t>=e){return x()}return G(r,t)}function vr(r,t){var e=r.fdselect;var i,n,a,s,f,o=-1,h;d(e,0);f=V(e);if(f==0){L(e,t);o=V(e)}else if(f==3){i=E(e,2);n=E(e,2);for(h=0;h=n&&t=s){break}q(e,0,u[o]);o++;if(o>=s){break}q(e,u[o],0);o++}break;case 6:if(s<1){return 0}for(;;){if(o>=s){break}q(e,u[o],0);o++;if(o>=s){break}q(e,0,u[o]);o++}break;case 31:if(s<4){return 0}for(;;){if(o+3>=s){break}H(e,u[o],0,u[o+1],u[o+2],s-o==5?u[o+4]:0,u[o+3]);o+=4;if(o+3>=s){break}H(e,0,u[o],u[o+1],u[o+2],u[o+3],s-o==5?u[o+4]:0);o+=4}break;case 30:if(s<4){return 0}for(;;){if(o+3>=s){break}H(e,0,u[o],u[o+1],u[o+2],u[o+3],s-o==5?u[o+4]:0);o+=4;if(o+3>=s){break}H(e,u[o],0,u[o+1],u[o+2],s-o==5?u[o+4]:0,u[o+3]);o+=4}break;case 8:if(s<6){return 0}for(;o+5=s){return 0}q(e,u[o],u[o+1]);break;case 25:if(s<8){return 0}for(;o+1=s){return 0}H(e,u[o],u[o+1],u[o+2],u[o+3],u[o+4],u[o+5]);break;case 26:case 27:if(s<4){return 0}y=0;if(s&1){y=u[o];o++}for(;o+3=10){return 0}c[a++]=g;g=hr(h==10?p:r.gsubrs,f);if(g.length==0){return 0}g.cursor=0;l=0;break;case 11:if(a<=0){return 0}g=c[--a];l=0;break;case 14:or(e);return 1;case 12:var d,x,_,m,b,w,k,I,C,F,S,M,A,j,T=V(g);switch(T){case 34:if(s<7){return 0}d=u[0];x=u[1];I=u[2];_=u[3];m=u[4];b=u[5];w=u[6];H(e,d,0,x,I,_,0);H(e,m,0,b,-I,w,0);break;case 35:if(s<13){return 0}d=u[0];k=u[1];x=u[2];I=u[3];_=u[4];C=u[5];m=u[6];F=u[7];b=u[8];S=u[9];w=u[10];M=u[11];H(e,d,k,x,I,_,C);H(e,m,F,b,S,w,M);break;case 36:if(s<9){return 0}d=u[0];k=u[1];x=u[2];I=u[3];_=u[4];m=u[5];b=u[6];S=u[7];w=u[8];H(e,d,k,x,I,_,0);H(e,m,0,b,S,w,-(k+I+S));break;case 37:if(s<11){return 0}d=u[0];k=u[1];x=u[2];I=u[3];_=u[4];C=u[5];m=u[6];F=u[7];b=u[8];S=u[9];w=M=u[10];A=d+x+_+m+b;j=k+I+C+F+S;if(B(A)>B(j)){M=-j}else{w=-A}H(e,d,k,x,I,_,C);H(e,m,F,b,S,w,M);break;default:return 0}break;default:if(h!=255&&h!=28&&(h<32||h>254)){return 0}if(h==255){y=(E(g,4)|0)/65536}else{L(g,-1);y=(R(g)<<16|0)>>16}if(s>=48){return 0}u[s++]=y;l=0;break}if(l){s=0}}return 0}function ur(){return{started:0,first_x:0,first_y:0,x:0,y:0,min_x:0,max_x:0,min_y:0,max_y:0,vertices:[]}}function cr(r,t){var e=ur();if(lr(r,t,e)){return e.vertices}return null}function pr(r,t,e){var i=ur();var n=lr(r,t,i);e.x0=n?i.min_x:0;e.y0=n?i.min_y:0;e.x1=n?i.max_x:0;e.y1=n?i.max_y:0;return n&&i.vertices?i.vertices.length:0}function Z(r,t){if(!r.cff.length){return fr(r,t)}else{return cr(r,t)}}function I(r,t){var e=z(r.data,r.hhea+34);if(te.ey){return}if(se.ey){a+=(a-i)*(e.ey-s)/(s-n);s=e.ey}if(i<=t&&a<=t){r[t]+=e.direction*(s-n)}else if(i>=t+1&&a>=t+1){}else{r[t]+=e.direction*(s-n)*(1-(i-t+(a-t))/2)}}function mr(r,t,e,i,n){var a=n+1;while(i){if(i.fdx==0){var s=i.fx;if(s=0){M(r,s,i,s,n,s,a);M(t,s+1,i,s,n,s,a)}else{M(t,0,i,s,n,s,a)}}}else{var s=i.fx,f=i.fdx,o=s+f,h,v,l,u,c=i.fdy;if(i.sy>n){h=s+f*(i.sy-n);l=i.sy}else{h=s;l=n}if(i.ey=0&&v>=0&&hv){l=a-(l-n);u=a-(u-n);y=l,l=u,u=y;y=v,v=h,h=y;f=-f;c=-c;y=s,s=o,o=y}d=h|0;x=v|0;_=(d+1-s)*c+n;b=i.direction;w=b*(_-l);r[d]+=w*(1-(h-d+(d+1-d))/2);m=b*c;for(g=d+1;gx){M(r,g,i,s,k,d,F);M(r,g,i,d,F,x,S);M(r,g,i,x,S,I,C)}else if(Ix){M(r,g,i,s,k,x,S);M(r,g,i,x,S,d,F);M(r,g,i,d,F,I,C)}else if(sd){M(r,g,i,s,k,d,F);M(r,g,i,d,F,I,C)}else if(Id){M(r,g,i,s,k,d,F);M(r,g,i,d,F,I,C)}else if(sx){M(r,g,i,s,k,x,S);M(r,g,i,x,S,I,C)}else if(Ix){M(r,g,i,s,k,x,S);M(r,g,i,x,S,I,C)}else{M(r,g,i,s,k,I,C)}}}}i=i.next}}function br(r,t,e,i,n,a){i|=0,n|=0,a|=0;var s=null,f;var o=a,h=0,v;var l=new Float32Array(r.w*2+1);var u=l.subarray(r.w);var c=0;t[e].y0=a+r.h+1;while(h>>0;if(b>255){b=255}r.pixels[h*r.stride+v]=b}y=s;while(y){f=y;f.fx+=f.fdx;y=f.next}++o;++h}}function wr(r,t){for(var e=1;e0&&i.y012){var i,n,a,s,f,o=e>>1,h=r[t].y0=s){break}i=r[t+a];r[t+a]=r[t+s];r[t+s]=i;++a;--s}if(st[x+g].y:t[x+p].y16){return 1}if(l*l+u*u>f){c(r,t,e,(t+i)/2,(e+n)/2,h,v,f,o+1);c(r,h,v,(i+a)/2,(n+s)/2,a,s,f,o+1)}else{r.push({x:a,y:s})}return 1}function X(r,t,e,i,n,a,s,f,o,h,v){var l=i-t,u=n-e,c=a-i,p=s-n,g=f-a,y=o-s,d=f-t,x=o-e,_=N(l*l+u*u)+N(c*c+p*p)+N(g*g+y*y),m=N(d*d+x*x),b=_*_-m*m;if(v>16){return}if(b>h){var w=(t+i)/2,k=(e+n)/2,I=(i+a)/2,C=(n+s)/2,F=(a+f)/2,S=(s+o)/2,M=(w+I)/2,A=(k+C)/2,j=(I+F)/2,T=(C+S)/2,B=(M+j)/2,L=(A+T)/2;X(r,t,e,w,k,M,A,B,L,h,v+1);X(r,B,L,j,T,F,S,f,o,h,v+1)}else{r.push({x:f,y:o})}}function Cr(r,t,e){var i=[],n=t*t,a=-1,s=0,f=0,o=0;for(var h=0,v=r.length;h=0){e[a]=i.length-s}++a;s=i.length;f=r[h].x,o=r[h].y;i.push({x:f,y:o});break;case D:f=r[h].x,o=r[h].y;i.push({x:f,y:o});break;case U:c(i,f,o,r[h].cx,r[h].cy,r[h].x,r[h].y,n,0);f=r[h].x,o=r[h].y;break;case y:X(i,f,o,r[h].cx,r[h].cy,r[h].cx1,r[h].cy1,r[h].x,r[h].y,n,0);f=r[h].x,o=r[h].y;break}}e[a]=i.length-s;return i}function Fr(r,t,e,i,n,a,s,f,o,h){f|=0,o|=0;var v=i>n?n:i,l=[],u=Cr(e,t/v,l);if(u){Ir(r,u,l,i,n,a,s,f,o,h)}}function Sr(r,t,e,i,n,a,s,f,o,h){var v=Z(r,h);var l={};var u=p(r,h,a,s,f,o);l.pixels=t;l.w=e|0;l.h=i|0;l.stride=n|0;if(l.w&&l.h){Fr(l,.35,v,a,s,f,o,u.x0,u.y0,1)}}function Mr(r,t,e,i,n,a,s,f,o,h){Sr(r,t,e,i,n,a,s,f,o,k(r,h))}function Ar(r,t,e){return ir(r,t,e)}function jr(r){var t={};if(!ir(t,r,0)){return null}var e=yr(t);t.ascent=e.ascent;t.descent=e.descent;t.linegap=e.linegap;return t}function Tr(r,t,e,i){i=i||e;var n=e/r.ascent;var a=i/r.ascent;var s=k(r,t);if(!s&&t){return null}var f=Z(r,s);var o=p(r,s,n,a,0,0);var h=o.x1-o.x0;var v=o.y1-o.y0;var l=null;if(h&&v){var u={pixels:l=new Uint8Array(h*v),w:h,h:v,stride:h};Fr(u,.35,f,n,a,0,0,o.x0,o.y0,1)}var c=I(r,s);return{glyph:s,pixels:l,width:h,height:v,top:-o.y0,left:o.x0,advance:W(c.advanceWidth*n)}}function Br(r,t,e,i){i=i||e;var n=e/r.ascent;var a=i/r.ascent;var s=k(r,t);if(!s&&t){return null}var f=Z(r,s);var o=I(r,s);var h=0;var v=0;var l=[];if(f){for(var u=0,c=f.length;uh)h=g.y;if(g.y2cX34`eY}Zh>(aH&xmIe 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 diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v1.2/pst-indexer.zip b/Forensic-Mail-Indexer/OLD_VERSIONS/v1.2/pst-indexer.zip deleted file mode 100644 index d25e6578c42594a6bc77c42d98e7008b3665e093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51421 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
    =*joQIuG>Sasc3T9E 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

    jrZ4Li= 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 z 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 diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v1.4/v1.4.zip b/Forensic-Mail-Indexer/OLD_VERSIONS/v1.4/v1.4.zip deleted file mode 100644 index 335f9e5575a73fc1663346332f7d693536db8115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63171 zcmaI7V~{35(w(sn>-+TA&M(nMKtg490s>*+r z=j16xSx_)Ep#RZgBGYyLYx3V6_`lJOnSqT_@xNW5fW*zxbu!@1NcjFO@&7ZF|F|%i z*c)4$I$4_A**lrykN$xNB8CI&+brQ?lGA}it8WBy1mhEtKLt=?TNY;V7`gRn2oL53 zXs7*7(z#S}x?n|?jU~$qZ`*+X&s{)3=>JDJ|0Br%3dhjI*3wSj%*o!)#njH^{}Y{k zVY<#Xu2rr*JRq9@rj#UeL^-Y(q|qK6KZ}GMWYBj{>~qOjMEThN zDLkDdW|;O_7v*x{!fPcVqV{@ZdLQmb!}Zx!*Z8FAn)^7h-=0jSD)hZ81NnRpF?PPE z^$N3vBOPIuK0ehA8vBc_JH|XnOcn+icks(bmhW}|5(_&ne0i2mGKS5G8csWoy@`$+ z&m@J5Nq{){%!7C&d6JT;xgPVlggzVwDb7@%&WWtvHaP))x;`|#ok!!B{v<_mA}ydg zfJOovlC`DAvWLXWpnUJlg$)_hIwyq5g*&$$TxE1{f@-KIaegQoxZmVYpLyDvWZv;D*(hfOUO;`{b8xblBWVnDz^?NaRdKyF&IguIjt^j$ zu36e^UQ$1SO4F-7UOCC*T9q5OFC6*TSJtco76^4mD6mF?=cf|PYk~lcpkBA9=K_&; zscY70c+uW08GIq(`ryP~IgJ;KTfMDiVcXR3E6PP-UM6OrhxlU=^J!#B^mdk(sQ5VE zwF?Vwwp^k6CM+hAbzvLhoso|c@|Q~xC1x5Le>hLmXi-gJn~)g>=H`)xl>a=%_a4Sw z@Z-Y|1SU|x*rD%Z4947uRJUN419$jLBq&~Z0WDa(I@|3B(1Ih~y@nI6PC{`yw$o=e=9uT4e?Vz8`5mW!FZQaDyyz zB61PxOF$4zX$3dfFmL1l9oODa-PnGA5r_y*z;q2)Ay+ZMGk*?Bc(R_ds#VWLGQ7~P zzu`^D>SFW&_aHZ{$TJy`nR>aePQ@XPUO>9ZH$;DL$WQ>?rA>e;1(#u=6W?rR)7=p9 zgg_xQ!kz;eQ^>EUi@!0PzSB^0P$j9_SC4aO z7+rf&JPt6)OdwmGu^*r}E)!PC^xJrNG^-KLx-&h6dUIns9~7QnKSJK1w~Tt1g6vMv zrjh<`1C#wZh&g5P6Nnsv{;5jt%Rfjx#IG2oD`m7Y2XAk0Ufl%MlA!fcCux>hHs91* z-Uzz7c>{fxwc+~{l7t-qL^0BtKLYS;>P~s&uw45F>qx#)V^0;?2H8eG8-HcTsEIO? zW>D|FAy@&m3RC?@)F8R<2&H^UX!(G`6t6|SEpLGjhMpV%>uerNP0uh<2t3p1%&If$ zkzg=!Qr?v2(?s(pR~AunKM$sb|0D52PY{n=eYLc3{wKq+ULK2lk9q6>L2%#e{hYLY z=NNs9D5jPbWk`rfxEkO9DMKv>xq$Z+pV6QIEQiXDJPvu~)8mJ{B&AzvrSE7r# z4_g;I1}*H{PItuy2m+M=hkzUy4=cO=VKB^pLg?~3*)Z5Kuz#G?5}BSWfBX&Dk=gB7 zYK_YgOGc!9-U`CQ_)yds!YG`4N{+oco|7upXGSTua>$%74BHshFSZn~y8e~+Qp{Qd z0da^i8I(##TcHIB`mR5VKM95ywq7F$MTTQ>7mpTO*$eiTJVgSy-V`ERw(F4VlKyNg z{K5qKW->)<&4*p(OL>nfLy#26*da3^A5Z5b&D-ccQh*D2H36I|M*+gQnyGs;c%Qs! zYaD}hnyP8ddTg~^eQ*fxmw7-`5B?

    ;5Y-UMCt`@2@tC< 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

    u4WK4*ZQ~>D`w?f8 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 y@+VhBJ-iXCtRn_N(p%@tZCKQOt8w_Kjug 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 diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer.zip b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer.zip deleted file mode 100644 index b02810f322c59e9ec005386aecad4e1ecb6d47f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71234 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 Ms6e0vy6vj|4?@b8H~;_u diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/.dockerignore b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/.dockerignore deleted file mode 100644 index d52803e..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/.dockerignore +++ /dev/null @@ -1,7 +0,0 @@ -data/ -**/__pycache__ -**/*.pyc -.git -.gitignore -*.md -.DS_Store diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/Dockerfile b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/Dockerfile deleted file mode 100644 index 234c804..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM python:3.11-slim - -ENV PYTHONUNBUFFERED=1 \ - PYTHONDONTWRITEBYTECODE=1 \ - PIP_NO_CACHE_DIR=1 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 - -# Build tools for libpff-python, curl for healthcheck, libjpeg for qrcode PIL -RUN apt-get update && apt-get install -y --no-install-recommends \ - build-essential \ - curl \ - libjpeg-dev \ - zlib1g-dev \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /app - -COPY backend/requirements.txt /app/backend/requirements.txt -RUN pip install --upgrade pip && \ - pip install -r /app/backend/requirements.txt - -COPY backend /app/backend -COPY frontend /app/frontend -COPY admin_frontend /app/admin_frontend -COPY entrypoint.sh /app/entrypoint.sh - -RUN chmod +x /app/entrypoint.sh && \ - mkdir -p /app/data - -ENV DATA_DIR=/app/data \ - FRONTEND_DIR=/app/frontend \ - ADMIN_FRONTEND_DIR=/app/admin_frontend \ - PYTHONPATH=/app/backend \ - COOKIE_SECURE=false - -EXPOSE 8000 8001 - -HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ - CMD curl -fsS http://localhost:8000/api/health && curl -fsS http://localhost:8001/api/health || exit 1 - -CMD ["/app/entrypoint.sh"] diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/README.md b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/README.md deleted file mode 100644 index 657990c..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/README.md +++ /dev/null @@ -1,1098 +0,0 @@ -# PST Archive — Mail Indexer - -A self-hosted, Dockerized application for **uploading Microsoft Outlook PST/OST files**, **indexing every email inside them**, and **searching the contents through a web browser** — with full **user authentication**, **multi-factor authentication (MFA)**, **encrypted-at-rest credentials**, and a **separate admin panel** on its own port. - -Designed for **forensic review, e-discovery, personal archive browsing, and migration audits** — any situation where you need to crack open a PST and actually find things inside it without loading it into Outlook. - ---- - -## Table of Contents - -1. [Features](#features) -2. [Quick Start](#quick-start) -3. [First-Run Setup](#first-run-setup) -4. [Running as a Daemon](#running-as-a-daemon) -5. [Theming & Dark Mode](#theming--dark-mode) -6. [Authentication & Security Model](#authentication--security-model) -7. [Admin Panel](#admin-panel) -8. [Organizing PSTs with Folders](#organizing-psts-with-folders) -9. [Folder Access Permissions](#folder-access-permissions) -10. [Multi-Factor Authentication (MFA)](#multi-factor-authentication-mfa) -11. [Encryption at Rest](#encryption-at-rest) -12. [How It Works](#how-it-works) -13. [Architecture](#architecture) -14. [Project Layout](#project-layout) -15. [Data Model](#data-model) -16. [REST API Reference](#rest-api-reference) -17. [Frontend Interfaces](#frontend-interfaces) -18. [Search Syntax](#search-syntax) -19. [Configuration](#configuration) -20. [Persistence & Backup](#persistence--backup) -21. [Troubleshooting](#troubleshooting) -22. [Performance Notes](#performance-notes) -23. [Security Considerations](#security-considerations) -24. [Extending the App](#extending-the-app) - ---- - -## Features - -### Core -- **Drag-and-drop upload** of `.pst` and `.ost` files through the browser -- **Streaming upload with progress bar** — handles multi-gigabyte archives -- **Background indexing** into SQLite with **FTS5 full-text search** (ranked, prefix-matched, with highlighted snippets) -- **Multi-archive support**: switch between uploaded PSTs; each is searched independently -- **Folder organization**: create folders in the sidebar to group related PST files (e.g. by client, case, year). Move archives between folders, rename folders, or delete folders (any archives inside are safely moved to Uncategorized) -- **Per-folder access permissions**: admins can restrict which non-admin users can view each folder. A single user can be granted access to many folders; a single folder can be shared with many users (true many-to-many) -- **Folder filter**: narrow search to any folder within the archive (Inbox, Sent Items, nested folders) -- **Full message viewer**: subject, sender, recipients, date, folder, attachments, body -- **Persistent storage**: everything lives in a mounted `./data` volume - -### Security -- **First-run setup wizard** forces creation of an initial administrator before any other action is possible -- **Password authentication** using **Argon2id** (winner of the Password Hashing Competition) with constant-time verification -- **TOTP-based MFA** (RFC 6238; compatible with Google Authenticator, Authy, 1Password, Microsoft Authenticator, and every other standard authenticator app) -- **Encryption at rest** for all user PII — usernames, password hashes, and TOTP secrets are stored as Fernet (AES-128-CBC + HMAC-SHA256) ciphertexts -- **Master key** auto-generated on first run and stored with `chmod 600`, or overridable via `MASTER_SECRET` environment variable -- **HMAC-based username lookup** — usernames are never stored in plaintext but are still indexable for login -- **JWT session cookies**, signed with an HKDF-derived sub-key, HttpOnly, SameSite=Lax -- **Rate limiting** on login attempts (10 failures per 5 minutes per IP+username) -- **Admin-only user management**: create, delete, role-change, password-reset, MFA-enroll other users -- **Admin file & folder management**: system-wide view of every uploaded PST and every folder, with create/rename/delete for folders and force-delete for any file regardless of uploader -- **Separate admin panel on a separate port** — lockable behind its own firewall rule or VPN - -### UI -- **Light and dark themes** on both the main app and the admin panel, with a sun/moon toggle in the masthead and on login/setup screens -- Preference persists in `localStorage` per-browser and respects the operating system's `prefers-color-scheme` on first visit -- Theme applied inline in `` before stylesheets load — **no flash of wrong theme** on page load -- Dark mode uses a custom "inked paper" palette (deep charcoal with warm paper-cream text and softened oxblood accent) — intentional character, not generic-dark -- Editorial typography (Fraunces serif + JetBrains Mono), grain overlay, responsive layout down to mobile widths - ---- - -## Quick Start - -### Prerequisites - -- Docker 20.10 or newer -- Docker Compose v2 -- A `.pst` or `.ost` file to index - -### Run (as a daemon — recommended) - -```bash -docker compose up -d --build -``` - -The `-d` flag runs the container in the background (detached). On the first run this takes **3–5 minutes** because `libpff-python` compiles a C extension from source; subsequent startups are nearly instant. - -The container is configured with `restart: unless-stopped`, so it will automatically come back up after a reboot or a crash, and keep running across Docker daemon restarts — until you explicitly stop it. - -Once the container is up: - -- **Main app**: `http://localhost:8000` -- **Admin panel**: `http://localhost:8001` - -### Foreground mode (useful for debugging) - -```bash -docker compose up --build -``` - -This runs the container attached to your terminal so you can see logs inline. Press `Ctrl-C` to stop. - -### Tail the logs - -```bash -docker compose logs -f # follow both streams -docker compose logs -f pst-indexer # explicit service name -``` - -### Check status - -```bash -docker compose ps # is it running? -docker compose top # which processes? -``` - -### Stop - -```bash -docker compose stop # stop, keep data, keep container -docker compose down # stop and remove the container, keep data volume -``` - -### Full reset - -```bash -docker compose down -rm -rf ./data # erases everything including users and the master key -docker compose up -d --build -``` - -### Restart / update - -```bash -# After editing code or pulling new images: -docker compose up -d --build # rebuild & restart with one command -# Or just restart without rebuilding: -docker compose restart -``` - ---- - -## First-Run Setup - -On the very first visit to `http://localhost:8000`, you will be presented with a **setup wizard** that asks you to create the initial administrator: - -1. Choose a username (3–64 characters) -2. Choose a password (8+ characters — use a passphrase you'll remember) -3. Confirm the password - -The setup endpoint is only callable **while the users table is empty**. Once the first admin is created, the endpoint returns `409 Conflict` and is effectively disabled. - -After setup, you are automatically signed in and landed on the main app. - -**Heads up:** the admin panel on port 8001 will refuse to accept any logins until the first admin has been created via the main app's setup wizard. This prevents a race where someone could hit `/api/login` on the admin port before you've set things up. - ---- - -## Running as a Daemon - -By default, this app is designed to **run as a long-lived background service**. The `docker-compose.yml` sets `restart: unless-stopped`, which means once started, the container will: - -- Keep running after you close your terminal -- Automatically restart if the process crashes -- Automatically restart when the host reboots and Docker comes back up -- **Not** restart if you explicitly stop it with `docker compose stop` (hence "unless-stopped") - -### Starting the daemon - -```bash -docker compose up -d --build -``` - -The `-d` flag is short for "detached" — the container is launched in the background and the command returns immediately. Your terminal is free to do other things; the container keeps running. - -### Verifying it's running - -```bash -docker compose ps -``` - -You should see output like: - -``` -NAME IMAGE STATUS PORTS -pst-indexer pst-indexer-pst-indexer Up 2 minutes (healthy) 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp -``` - -The `(healthy)` flag comes from the built-in healthcheck, which probes both `/api/health` endpoints every 30 seconds. - -### Watching logs - -Since the container is detached, you won't see logs in your terminal by default. Attach to them on demand: - -```bash -docker compose logs # print recent logs and exit -docker compose logs -f # follow (live tail), Ctrl-C to detach -docker compose logs -f --tail=100 # follow, starting from the last 100 lines -docker compose logs --since 1h # only logs from the last hour -``` - -Detaching from `-f` does **not** stop the container — it just stops showing you the logs. - -### Stopping - -```bash -docker compose stop # stop the container but keep it around -docker compose start # start it again if previously stopped -docker compose restart # stop and start in one command -docker compose down # stop and remove the container (data volume is kept) -docker compose down -v # stop, remove container, AND remove anonymous volumes -``` - -None of these delete your `./data` directory — that's a bind mount, not a Docker-managed volume, so it's always yours. - -### Survives reboots - -Because `restart: unless-stopped` is set, after a host reboot Docker will automatically start the container as soon as the Docker daemon comes up. Nothing manual required on your part. - -If you ever explicitly stopped it with `docker compose stop`, Docker will *not* auto-start it after reboot (that's the whole point of "unless-stopped"). Run `docker compose start` or `docker compose up -d` to bring it back. - -### Updating to a new version - -```bash -# Pull new source, then: -docker compose up -d --build -``` - -Docker Compose compares the current image to the built one; if they differ, it rebuilds and recreates the container with zero-downtime-style replacement. Your `./data` volume is preserved throughout. - ---- - -## Theming & Dark Mode - -Both the main app and the admin panel support **light and dark themes**, with a sun/moon toggle visible in the masthead (when signed in) and floating in the top-right corner on the login/setup screens. - -### How the toggle works - -- Click the icon to flip between themes -- Choice is saved to `localStorage["pst-theme"]` in your browser -- On a fresh browser (nothing saved), the app respects your operating system's `prefers-color-scheme` setting -- The theme is applied by an inline ` - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/admin_app.py b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/admin_app.py deleted file mode 100644 index e79bf8f..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/admin_app.py +++ /dev/null @@ -1,587 +0,0 @@ -""" -PST Indexer — Admin Panel (port 8001). - -Separate FastAPI instance on its own port so operators can place it behind a -more restrictive firewall rule or VPN than the main app. - -Exposes: -- Admin login (separate session cookie, scoped "admin") -- List, create, delete users -- Toggle admin role -- Reset passwords -- Enroll / confirm / disable MFA for any user (admin-managed flow) -- Self-service MFA for the currently logged-in admin -""" -import io -import os -from pathlib import Path -from typing import Optional - -import qrcode -from fastapi import ( - Depends, FastAPI, HTTPException, Request, Response, status, -) -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import StreamingResponse, JSONResponse -from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel - -import auth -from auth import ( - ADMIN_SESSION_COOKIE_NAME, SESSION_TTL_SECONDS, - User, begin_mfa_enrollment, confirm_mfa_enrollment, count_admins, - count_users, create_session_token, create_user, delete_user, - disable_mfa, find_user_by_id, find_user_by_username, - get_totp_secret, list_users, login_limiter, record_login, - require_admin_user, set_user_role, totp_provisioning_uri, - update_password, verify_password, verify_totp, -) - -ADMIN_FRONTEND_DIR = Path(os.environ.get("ADMIN_FRONTEND_DIR", "/app/admin_frontend")) -COOKIE_SECURE = os.environ.get("COOKIE_SECURE", "false").lower() == "true" - -app = FastAPI(title="PST Indexer Admin Panel") -app.add_middleware( - CORSMiddleware, - allow_origins=[], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.on_event("startup") -def _startup(): - auth.init_auth_schema() - - -def _set_admin_cookie(response: Response, token: str): - response.set_cookie( - key=ADMIN_SESSION_COOKIE_NAME, - value=token, - max_age=SESSION_TTL_SECONDS, - httponly=True, - secure=COOKIE_SECURE, - samesite="lax", - path="/", - ) - - -def _clear_admin_cookie(response: Response): - response.delete_cookie(key=ADMIN_SESSION_COOKIE_NAME, path="/") - - -# --------------------------------------------------------------------------- -# Auth -# --------------------------------------------------------------------------- -class LoginPayload(BaseModel): - username: str - password: str - totp_code: Optional[str] = None - - -@app.get("/api/health") -def health(): - return {"status": "ok", "admins": count_admins(), "users": count_users()} - - -@app.get("/api/setup/status") -def setup_status(): - """True if no users exist. Admin UI redirects to main app to complete setup.""" - return {"needs_setup": count_users() == 0} - - -@app.post("/api/login") -def admin_login(payload: LoginPayload, request: Request, response: Response): - ip = request.client.host if request.client else "unknown" - rate_key = f"admin:{ip}:{payload.username.lower()}" - if not login_limiter.check(rate_key): - raise HTTPException(429, "Too many login attempts. Please wait a few minutes.") - - found = find_user_by_username(payload.username) - if not found: - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - user, pw_hash = found - - if not verify_password(pw_hash, payload.password): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - if not user.is_admin: - raise HTTPException(403, "Admin access required") - - if user.mfa_enabled: - if not payload.totp_code: - return JSONResponse( - status_code=401, - content={"detail": "MFA required", "mfa_required": True}, - ) - secret = get_totp_secret(user.id) - if not secret or not verify_totp(secret, payload.totp_code): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid MFA code") - - login_limiter.reset(rate_key) - record_login(user.id) - token = create_session_token(user, scope="admin") - _set_admin_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/logout") -def admin_logout(response: Response): - _clear_admin_cookie(response) - return {"ok": True} - - -@app.get("/api/me") -def me(user: User = Depends(require_admin_user)): - return {"user": user.public_dict()} - - -# --------------------------------------------------------------------------- -# User management -# --------------------------------------------------------------------------- -class CreateUserPayload(BaseModel): - username: str - password: str - role: str = "user" - - -class UpdatePasswordPayload(BaseModel): - password: str - - -class UpdateRolePayload(BaseModel): - role: str - - -@app.get("/api/users") -def api_list_users(_: User = Depends(require_admin_user)): - return [u.public_dict() for u in list_users()] - - -@app.post("/api/users") -def api_create_user( - payload: CreateUserPayload, - admin: User = Depends(require_admin_user), -): - try: - user = create_user(payload.username, payload.password, role=payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - return user.public_dict() - - -@app.delete("/api/users/{user_id}") -def api_delete_user(user_id: str, admin: User = Depends(require_admin_user)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - # Prevent deleting yourself - if target.id == admin.id: - raise HTTPException(400, "You cannot delete your own account") - - # Prevent deleting the last admin - if target.is_admin and count_admins() <= 1: - raise HTTPException(400, "Cannot delete the last remaining admin") - - delete_user(user_id) - return {"deleted": user_id} - - -@app.put("/api/users/{user_id}/role") -def api_set_role( - user_id: str, - payload: UpdateRolePayload, - admin: User = Depends(require_admin_user), -): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - if target.id == admin.id and payload.role != "admin": - raise HTTPException(400, "You cannot demote your own account") - - if (target.is_admin and payload.role != "admin" - and count_admins() <= 1): - raise HTTPException(400, "Cannot demote the last remaining admin") - - try: - set_user_role(user_id, payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - - return find_user_by_id(user_id).public_dict() - - -@app.put("/api/users/{user_id}/password") -def api_update_password( - user_id: str, - payload: UpdatePasswordPayload, - admin: User = Depends(require_admin_user), -): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - try: - update_password(user_id, payload.password) - except ValueError as e: - raise HTTPException(400, str(e)) - return {"ok": True} - - -# --------------------------------------------------------------------------- -# MFA management -# --------------------------------------------------------------------------- -class ConfirmMfaPayload(BaseModel): - totp_code: str - - -@app.post("/api/users/{user_id}/mfa/begin") -def api_begin_mfa(user_id: str, admin: User = Depends(require_admin_user)): - """Provision a new TOTP secret for the target user (admin action). - Returns the secret + otpauth URI so the admin can show it to the user.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret, uri = begin_mfa_enrollment(user_id) - return { - "secret": secret, - "otpauth_uri": uri, - "username": target.username, - "qr_url": f"/api/users/{user_id}/mfa/qr", - } - - -@app.get("/api/users/{user_id}/mfa/qr") -def api_mfa_qr(user_id: str, admin: User = Depends(require_admin_user)): - """Render a PNG QR code of the target user's current (unconfirmed) TOTP URI.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret = get_totp_secret(user_id) - if not secret: - raise HTTPException(400, "No MFA enrollment in progress") - uri = totp_provisioning_uri(secret, target.username) - - qr = qrcode.QRCode(box_size=6, border=2) - qr.add_data(uri) - qr.make(fit=True) - img = qr.make_image(fill_color="black", back_color="white") - buf = io.BytesIO() - img.save(buf, format="PNG") - buf.seek(0) - return StreamingResponse(buf, media_type="image/png") - - -@app.post("/api/users/{user_id}/mfa/confirm") -def api_confirm_mfa( - user_id: str, - payload: ConfirmMfaPayload, - admin: User = Depends(require_admin_user), -): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - if not confirm_mfa_enrollment(user_id, payload.totp_code): - raise HTTPException(400, "Invalid MFA code — enrollment not confirmed") - return find_user_by_id(user_id).public_dict() - - -@app.post("/api/users/{user_id}/mfa/disable") -def api_disable_mfa(user_id: str, admin: User = Depends(require_admin_user)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - disable_mfa(user_id) - return find_user_by_id(user_id).public_dict() - - -# --------------------------------------------------------------------------- -# Folder management (admin) -# --------------------------------------------------------------------------- -import uuid as _uuid -from datetime import datetime, timezone -from pathlib import Path as _Path -from auth import get_db - - -UPLOAD_DIR = _Path(os.environ.get("DATA_DIR", "/app/data")) / "uploads" - - -class AdminFolderPayload(BaseModel): - name: str - - -def _validate_name(name: str) -> str: - name = (name or "").strip() - if not name: - raise HTTPException(400, "Folder name cannot be empty") - if len(name) > 80: - raise HTTPException(400, "Folder name too long (max 80 characters)") - return name - - -@app.get("/api/folders") -def admin_list_folders(_: User = Depends(require_admin_user)): - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.post("/api/folders") -def admin_create_folder(payload: AdminFolderPayload, - admin: User = Depends(require_admin_user)): - name = _validate_name(payload.name) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE", (name,) - ).fetchone() - if existing: - raise HTTPException(409, "A folder with that name already exists") - folder_id = _uuid.uuid4().hex - conn.execute( - """INSERT INTO pst_folders (id, name, created_at, created_by) - VALUES (?, ?, ?, ?)""", - (folder_id, name, datetime.now(timezone.utc).isoformat(), admin.id), - ) - conn.commit() - return {"id": folder_id, "name": name, "file_count": 0} - - -@app.put("/api/folders/{folder_id}") -def admin_rename_folder(folder_id: str, payload: AdminFolderPayload, - admin: User = Depends(require_admin_user)): - name = _validate_name(payload.name) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - clash = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE AND id != ?", - (name, folder_id), - ).fetchone() - if clash: - raise HTTPException(409, "A folder with that name already exists") - conn.execute("UPDATE pst_folders SET name = ? WHERE id = ?", - (name, folder_id)) - conn.commit() - return {"id": folder_id, "name": name} - - -@app.delete("/api/folders/{folder_id}") -def admin_delete_folder(folder_id: str, - admin: User = Depends(require_admin_user)): - """Delete a folder. PSTs inside it become uncategorized (folder_id = NULL).""" - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = NULL WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM pst_folders WHERE id = ?", (folder_id,)) - conn.commit() - return {"deleted": folder_id} - - -# --------------------------------------------------------------------------- -# PST file management (admin) -# --------------------------------------------------------------------------- -@app.get("/api/pst-files") -def admin_list_pst_files(_: User = Depends(require_admin_user)): - with get_db() as conn: - rows = conn.execute( - """SELECT p.id, p.original_name, p.uploaded_at, p.size_bytes, - p.status, p.message_count, p.error, - p.folder_id, f.name AS folder_name, - p.uploaded_by - FROM pst_files p - LEFT JOIN pst_folders f ON f.id = p.folder_id - ORDER BY p.uploaded_at DESC""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.delete("/api/pst-files/{pst_id}") -def admin_delete_pst(pst_id: str, admin: User = Depends(require_admin_user)): - with get_db() as conn: - row = conn.execute( - "SELECT filename FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - raise HTTPException(404, "PST not found") - conn.execute("DELETE FROM messages WHERE pst_id = ?", (pst_id,)) - conn.execute("DELETE FROM pst_files WHERE id = ?", (pst_id,)) - conn.commit() - try: - (UPLOAD_DIR / row["filename"]).unlink(missing_ok=True) - except Exception: - pass - return {"deleted": pst_id} - - -class AdminAssignPayload(BaseModel): - folder_id: Optional[str] = None - - -@app.put("/api/pst-files/{pst_id}/folder") -def admin_assign_pst_to_folder(pst_id: str, payload: AdminAssignPayload, - admin: User = Depends(require_admin_user)): - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_files WHERE id = ?", - (pst_id,)).fetchone(): - raise HTTPException(404, "PST not found") - if payload.folder_id: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (payload.folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = ? WHERE id = ?", - (payload.folder_id, pst_id)) - conn.commit() - return {"pst_id": pst_id, "folder_id": payload.folder_id} - - -# --------------------------------------------------------------------------- -# Folder permissions (admin-only) -# Controls which user can access which folder. -# Admins ALWAYS have access to every folder regardless of this table — -# these grants are for non-admin users. -# --------------------------------------------------------------------------- -class PermissionToggle(BaseModel): - granted: bool - - -@app.get("/api/permissions") -def admin_list_permissions(_: User = Depends(require_admin_user)): - """Return the full matrix: users, folders, and all grants.""" - with get_db() as conn: - users = conn.execute("SELECT * FROM users ORDER BY created_at ASC").fetchall() - folders = conn.execute( - "SELECT id, name FROM pst_folders ORDER BY name COLLATE NOCASE" - ).fetchall() - grants = conn.execute( - "SELECT user_id, folder_id, granted_at FROM folder_permissions" - ).fetchall() - - from auth import _row_to_user - user_list = [] - for u in users: - pub = _row_to_user(u).public_dict() - user_list.append(pub) - - return { - "users": user_list, - "folders": [dict(f) for f in folders], - "grants": [dict(g) for g in grants], - } - - -@app.get("/api/users/{user_id}/folders") -def admin_user_folders(user_id: str, _: User = Depends(require_admin_user)): - """Folders a given user has been granted.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, p.granted_at - FROM folder_permissions p - JOIN pst_folders f ON f.id = p.folder_id - WHERE p.user_id = ? - ORDER BY f.name COLLATE NOCASE""", - (user_id,), - ).fetchall() - return { - "user": target.public_dict(), - "folders": [dict(r) for r in rows], - } - - -@app.get("/api/folders/{folder_id}/users") -def admin_folder_users(folder_id: str, _: User = Depends(require_admin_user)): - """Users granted on a given folder.""" - with get_db() as conn: - folder = conn.execute( - "SELECT id, name FROM pst_folders WHERE id = ?", (folder_id,) - ).fetchone() - if not folder: - raise HTTPException(404, "Folder not found") - - grant_rows = conn.execute( - """SELECT user_id, granted_at - FROM folder_permissions WHERE folder_id = ?""", - (folder_id,), - ).fetchall() - - # Hydrate user details (usernames are encrypted — need decrypt via find_user_by_id) - users_out = [] - for r in grant_rows: - u = find_user_by_id(r["user_id"]) - if u: - users_out.append({ - **u.public_dict(), - "granted_at": r["granted_at"], - }) - users_out.sort(key=lambda x: x["username"].lower()) - return { - "folder": dict(folder), - "users": users_out, - } - - -@app.put("/api/permissions/{user_id}/{folder_id}") -def admin_toggle_permission( - user_id: str, - folder_id: str, - payload: PermissionToggle, - admin: User = Depends(require_admin_user), -): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - if target.is_admin: - # Admins implicitly have access to everything; refuse explicit grants - # so the UI doesn't confuse admins with checked-but-meaningless rows. - raise HTTPException( - 400, - "Admins have access to all folders automatically; permissions " - "only apply to non-admin users.", - ) - - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - - if payload.granted: - conn.execute( - """INSERT OR IGNORE INTO folder_permissions - (user_id, folder_id, granted_at, granted_by) - VALUES (?, ?, ?, ?)""", - (user_id, folder_id, - datetime.now(timezone.utc).isoformat(), admin.id), - ) - else: - conn.execute( - "DELETE FROM folder_permissions WHERE user_id = ? AND folder_id = ?", - (user_id, folder_id), - ) - conn.commit() - - return {"user_id": user_id, "folder_id": folder_id, "granted": payload.granted} - - -# --------------------------------------------------------------------------- -# Static admin frontend -# --------------------------------------------------------------------------- -if ADMIN_FRONTEND_DIR.exists(): - app.mount("/", StaticFiles(directory=str(ADMIN_FRONTEND_DIR), html=True), name="admin") diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/app.py b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/app.py deleted file mode 100644 index f462edf..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/app.py +++ /dev/null @@ -1,835 +0,0 @@ -""" -PST Indexer — Main application (port 8000). - -Serves: -- The web UI (login, setup wizard, archive browser) -- REST API for PST upload, indexing, search -- All data-access endpoints require an authenticated session - -First-run behavior: -- If no users exist, the UI routes users to a setup wizard. -- /api/setup is only callable while the users table is empty; after the first - admin is created, the endpoint returns 409. -""" -import os -import re -import sqlite3 -import uuid -import asyncio -from datetime import datetime, timezone -from pathlib import Path -from typing import Optional - -import aiofiles -import pypff -from fastapi import ( - BackgroundTasks, Depends, FastAPI, File, HTTPException, - Request, Response, UploadFile, status, -) -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse, FileResponse -from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel - -import auth -from auth import ( - SESSION_COOKIE_NAME, SESSION_TTL_SECONDS, - User, count_users, count_admins, create_user, find_user_by_username, - find_user_by_id, get_totp_secret, verify_password, verify_totp, - record_login, create_session_token, login_limiter, require_app_user, - get_db, -) - -# --------------------------------------------------------------------------- -# Config -# --------------------------------------------------------------------------- -DATA_DIR = Path(os.environ.get("DATA_DIR", "/app/data")) -UPLOAD_DIR = DATA_DIR / "uploads" -FRONTEND_DIR = Path(os.environ.get("FRONTEND_DIR", "/app/frontend")) - -UPLOAD_DIR.mkdir(parents=True, exist_ok=True) -DATA_DIR.mkdir(parents=True, exist_ok=True) - -# Cookie security. Flip to True when serving over HTTPS. -COOKIE_SECURE = os.environ.get("COOKIE_SECURE", "false").lower() == "true" - - -# --------------------------------------------------------------------------- -# App DB schema (messages + pst_files) -# --------------------------------------------------------------------------- -def init_app_schema(): - with get_db() as conn: - conn.executescript(""" - CREATE TABLE IF NOT EXISTS pst_folders ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - created_at TEXT NOT NULL, - created_by TEXT - ); - - CREATE TABLE IF NOT EXISTS folder_permissions ( - user_id TEXT NOT NULL, - folder_id TEXT NOT NULL, - granted_at TEXT NOT NULL, - granted_by TEXT, - PRIMARY KEY (user_id, folder_id) - ); - - CREATE INDEX IF NOT EXISTS idx_folder_perms_user ON folder_permissions(user_id); - CREATE INDEX IF NOT EXISTS idx_folder_perms_folder ON folder_permissions(folder_id); - - CREATE TABLE IF NOT EXISTS pst_files ( - id TEXT PRIMARY KEY, - filename TEXT NOT NULL, - original_name TEXT NOT NULL, - uploaded_at TEXT NOT NULL, - size_bytes INTEGER NOT NULL, - status TEXT NOT NULL DEFAULT 'pending', - message_count INTEGER DEFAULT 0, - error TEXT, - uploaded_by TEXT, - folder_id TEXT - ); - - CREATE TABLE IF NOT EXISTS messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - pst_id TEXT NOT NULL, - folder TEXT, - subject TEXT, - sender TEXT, - recipients TEXT, - sent_date TEXT, - body TEXT, - attachments TEXT, - FOREIGN KEY (pst_id) REFERENCES pst_files(id) ON DELETE CASCADE - ); - - CREATE INDEX IF NOT EXISTS idx_messages_pst ON messages(pst_id); - CREATE INDEX IF NOT EXISTS idx_messages_sent_date ON messages(sent_date); - CREATE INDEX IF NOT EXISTS idx_pst_files_folder ON pst_files(folder_id); - - CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5( - subject, sender, recipients, body, folder, - content='messages', - content_rowid='id', - tokenize='porter unicode61' - ); - - CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN - INSERT INTO messages_fts(rowid, subject, sender, recipients, body, folder) - VALUES (new.id, new.subject, new.sender, new.recipients, new.body, new.folder); - END; - - CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN - INSERT INTO messages_fts(messages_fts, rowid, subject, sender, recipients, body, folder) - VALUES ('delete', old.id, old.subject, old.sender, old.recipients, old.body, old.folder); - END; - """) - # Backfill: add folder_id column to DBs created before this feature existed. - cols = [r["name"] for r in conn.execute("PRAGMA table_info(pst_files)").fetchall()] - if "folder_id" not in cols: - conn.execute("ALTER TABLE pst_files ADD COLUMN folder_id TEXT") - conn.execute("CREATE INDEX IF NOT EXISTS idx_pst_files_folder ON pst_files(folder_id)") - conn.commit() - - -# --------------------------------------------------------------------------- -# Access control helpers — which folders / PSTs is a given user allowed to see? -# -# Rules: -# - Admins see everything. -# - Regular users see only folders they have been explicitly granted, -# plus the implicit "Uncategorized" bucket (folder_id = NULL) — this is -# deliberately shared because otherwise newly-uploaded PSTs would be -# invisible until someone moved them into a permitted folder. -# - A PST is visible iff its folder is visible (or the PST is uncategorized). -# --------------------------------------------------------------------------- -def allowed_folder_ids_for(user) -> set[str]: - """Return the set of folder_ids a user is explicitly permitted on. - For admins this is not used — they see everything unconditionally.""" - with get_db() as conn: - rows = conn.execute( - "SELECT folder_id FROM folder_permissions WHERE user_id = ?", - (user.id,), - ).fetchall() - return {r["folder_id"] for r in rows} - - -def user_can_see_folder(user, folder_id: Optional[str]) -> bool: - """Can this user see content inside this folder? folder_id may be None - (Uncategorized), which is visible to everyone.""" - if user.is_admin: - return True - if folder_id is None: - return True # Uncategorized is shared - return folder_id in allowed_folder_ids_for(user) - - -def user_can_see_pst(user, pst_id: str) -> bool: - if user.is_admin: - return True - with get_db() as conn: - row = conn.execute( - "SELECT folder_id FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - return False - return user_can_see_folder(user, row["folder_id"]) - - -# --------------------------------------------------------------------------- -# PST indexing helpers (unchanged from pre-auth version) -# --------------------------------------------------------------------------- -def _safe_str(value) -> str: - if value is None: - return "" - if isinstance(value, bytes): - try: - return value.decode("utf-8", errors="replace") - except Exception: - return value.decode("latin-1", errors="replace") - return str(value) - - -def _extract_recipients(message) -> str: - parts = [] - try: - headers = _safe_str(getattr(message, "transport_headers", "")) - if headers: - for line in headers.split("\n"): - low = line.lower() - if low.startswith("to:") or low.startswith("cc:") or low.startswith("bcc:"): - parts.append(line.strip()) - except Exception: - pass - return " | ".join(parts) if parts else "" - - -def _extract_body(message) -> str: - for attr in ("plain_text_body", "html_body", "rtf_body"): - try: - body = getattr(message, attr, None) - if body: - text = _safe_str(body) - if attr == "html_body": - text = re.sub(r"<[^>]+>", " ", text) - text = re.sub(r"\s+", " ", text).strip() - if text: - return text - except Exception: - continue - return "" - - -def _extract_sender(message) -> str: - for attr in ("sender_name", "sender_email_address"): - try: - v = _safe_str(getattr(message, attr, "")) - if v: - return v - except Exception: - continue - try: - headers = _safe_str(getattr(message, "transport_headers", "")) - for line in headers.split("\n"): - if line.lower().startswith("from:"): - return line.split(":", 1)[1].strip() - except Exception: - pass - return "" - - -def _extract_date(message) -> Optional[str]: - try: - d = getattr(message, "delivery_time", None) or getattr(message, "client_submit_time", None) - if d: - if isinstance(d, datetime): - return d.isoformat() - return _safe_str(d) - except Exception: - pass - return None - - -def _extract_attachments(message) -> str: - names = [] - try: - count = getattr(message, "number_of_attachments", 0) - for i in range(count): - try: - att = message.get_attachment(i) - name = _safe_str(getattr(att, "name", "") or getattr(att, "long_filename", "")) - if name: - names.append(name) - except Exception: - continue - except Exception: - pass - return " | ".join(names) - - -def _walk_folders(folder, path=""): - try: - name = _safe_str(getattr(folder, "name", "") or "") - except Exception: - name = "" - current_path = f"{path}/{name}" if name else (path or "/") - try: - for i in range(folder.number_of_sub_messages): - try: - msg = folder.get_sub_message(i) - yield current_path, msg - except Exception: - continue - except Exception: - pass - try: - for i in range(folder.number_of_sub_folders): - try: - sub = folder.get_sub_folder(i) - yield from _walk_folders(sub, current_path) - except Exception: - continue - except Exception: - pass - - -def index_pst_file(pst_id: str, file_path: Path): - pff = None - try: - pff = pypff.file() - pff.open(str(file_path)) - root = pff.get_root_folder() - count = 0 - batch = [] - BATCH_SIZE = 500 - - with get_db() as conn: - for folder_path, msg in _walk_folders(root): - try: - batch.append(( - pst_id, folder_path, - _safe_str(getattr(msg, "subject", "")), - _extract_sender(msg), - _extract_recipients(msg), - _extract_date(msg), - _extract_body(msg), - _extract_attachments(msg), - )) - count += 1 - if len(batch) >= BATCH_SIZE: - conn.executemany( - """INSERT INTO messages - (pst_id, folder, subject, sender, recipients, sent_date, body, attachments) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", - batch, - ) - conn.commit() - batch.clear() - except Exception as e: - print(f"[index] skip: {e}") - continue - - if batch: - conn.executemany( - """INSERT INTO messages - (pst_id, folder, subject, sender, recipients, sent_date, body, attachments) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", - batch, - ) - conn.commit() - - conn.execute( - "UPDATE pst_files SET status = ?, message_count = ? WHERE id = ?", - ("ready", count, pst_id), - ) - conn.commit() - - print(f"[index] {pst_id}: {count} messages") - except Exception as e: - print(f"[index] failed: {e}") - with get_db() as conn: - conn.execute( - "UPDATE pst_files SET status = ?, error = ? WHERE id = ?", - ("failed", str(e), pst_id), - ) - conn.commit() - finally: - if pff is not None: - try: - pff.close() - except Exception: - pass - - -# --------------------------------------------------------------------------- -# FastAPI -# --------------------------------------------------------------------------- -app = FastAPI(title="PST Indexer") - -app.add_middleware( - CORSMiddleware, - allow_origins=[], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.on_event("startup") -def _startup(): - auth.init_auth_schema() - init_app_schema() - - -def _set_session_cookie(response: Response, token: str): - response.set_cookie( - key=SESSION_COOKIE_NAME, - value=token, - max_age=SESSION_TTL_SECONDS, - httponly=True, - secure=COOKIE_SECURE, - samesite="lax", - path="/", - ) - - -def _clear_session_cookie(response: Response): - response.delete_cookie(key=SESSION_COOKIE_NAME, path="/") - - -# ----- Setup / auth endpoints ----- - -class SetupRequest(BaseModel): - username: str - password: str - - -class LoginRequest(BaseModel): - username: str - password: str - totp_code: Optional[str] = None - - -@app.get("/api/setup/status") -def setup_status(): - """Lets the frontend decide whether to show the setup wizard.""" - return {"needs_setup": count_users() == 0} - - -@app.post("/api/setup") -def setup_admin(payload: SetupRequest, response: Response): - if count_users() > 0: - raise HTTPException(status.HTTP_409_CONFLICT, "Setup has already been completed") - - try: - user = create_user(payload.username, payload.password, role="admin") - except ValueError as e: - raise HTTPException(400, str(e)) - - record_login(user.id) - token = create_session_token(user, scope="app") - _set_session_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/login") -def login(payload: LoginRequest, request: Request, response: Response): - ip = request.client.host if request.client else "unknown" - rate_key = f"{ip}:{payload.username.lower()}" - if not login_limiter.check(rate_key): - raise HTTPException(429, "Too many login attempts. Please wait a few minutes.") - - found = find_user_by_username(payload.username) - if not found: - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - user, stored_pw_hash = found - if not verify_password(stored_pw_hash, payload.password): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - if user.mfa_enabled: - if not payload.totp_code: - # Tell the client MFA is required - return JSONResponse( - status_code=401, - content={"detail": "MFA required", "mfa_required": True}, - ) - secret = get_totp_secret(user.id) - if not secret or not verify_totp(secret, payload.totp_code): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid MFA code") - - login_limiter.reset(rate_key) - record_login(user.id) - token = create_session_token(user, scope="app") - _set_session_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/logout") -def logout(response: Response): - _clear_session_cookie(response) - return {"ok": True} - - -@app.get("/api/me") -def me(user: User = Depends(require_app_user)): - return {"user": user.public_dict()} - - -# ----- PST endpoints (all require auth) ----- - -@app.get("/api/health") -def health(): - return {"status": "ok"} - - -@app.get("/api/pst-files") -def list_pst_files(user: User = Depends(require_app_user)): - with get_db() as conn: - if user.is_admin: - rows = conn.execute( - """SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files ORDER BY uploaded_at DESC""" - ).fetchall() - else: - allowed = allowed_folder_ids_for(user) - if allowed: - placeholders = ",".join("?" for _ in allowed) - rows = conn.execute( - f"""SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files - WHERE folder_id IS NULL OR folder_id IN ({placeholders}) - ORDER BY uploaded_at DESC""", - list(allowed), - ).fetchall() - else: - rows = conn.execute( - """SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files WHERE folder_id IS NULL - ORDER BY uploaded_at DESC""" - ).fetchall() - return [dict(r) for r in rows] - - -# ----- Folder endpoints (shared with admin panel) ----- - -class FolderCreate(BaseModel): - name: str - - -class FolderRename(BaseModel): - name: str - - -class FolderAssign(BaseModel): - folder_id: Optional[str] = None # null = move to uncategorized - - -def _validate_folder_name(name: str) -> str: - name = (name or "").strip() - if not name: - raise HTTPException(400, "Folder name cannot be empty") - if len(name) > 80: - raise HTTPException(400, "Folder name too long (max 80 characters)") - return name - - -@app.get("/api/folders") -def list_folders(user: User = Depends(require_app_user)): - with get_db() as conn: - if user.is_admin: - rows = conn.execute( - """SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""" - ).fetchall() - else: - allowed = allowed_folder_ids_for(user) - if not allowed: - return [] - placeholders = ",".join("?" for _ in allowed) - rows = conn.execute( - f"""SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - WHERE f.id IN ({placeholders}) - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""", - list(allowed), - ).fetchall() - return [dict(r) for r in rows] - - -@app.post("/api/folders") -def create_folder(payload: FolderCreate, user: User = Depends(require_app_user)): - # Only admins can create folders — the admin panel is the authoritative - # management surface. (We still allow creation from the main app sidebar, - # but only for admin users.) - if not user.is_admin: - raise HTTPException(403, "Only administrators can create folders") - name = _validate_folder_name(payload.name) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE", (name,) - ).fetchone() - if existing: - raise HTTPException(409, "A folder with that name already exists") - folder_id = uuid.uuid4().hex - conn.execute( - """INSERT INTO pst_folders (id, name, created_at, created_by) - VALUES (?, ?, ?, ?)""", - (folder_id, name, datetime.now(timezone.utc).isoformat(), user.id), - ) - conn.commit() - return {"id": folder_id, "name": name, "file_count": 0} - - -@app.put("/api/folders/{folder_id}") -def rename_folder(folder_id: str, payload: FolderRename, - user: User = Depends(require_app_user)): - if not user.is_admin: - raise HTTPException(403, "Only administrators can rename folders") - name = _validate_folder_name(payload.name) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - clash = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE AND id != ?", - (name, folder_id), - ).fetchone() - if clash: - raise HTTPException(409, "A folder with that name already exists") - conn.execute("UPDATE pst_folders SET name = ? WHERE id = ?", - (name, folder_id)) - conn.commit() - return {"id": folder_id, "name": name} - - -@app.delete("/api/folders/{folder_id}") -def delete_folder(folder_id: str, user: User = Depends(require_app_user)): - """Delete a folder. Any PSTs inside it become uncategorized (folder_id = NULL).""" - if not user.is_admin: - raise HTTPException(403, "Only administrators can delete folders") - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = NULL WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM folder_permissions WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM pst_folders WHERE id = ?", (folder_id,)) - conn.commit() - return {"deleted": folder_id} - - -@app.put("/api/pst-files/{pst_id}/folder") -def assign_pst_to_folder(pst_id: str, payload: FolderAssign, - user: User = Depends(require_app_user)): - # Check the user can see the PST's current location AND the destination - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - if payload.folder_id and not user_can_see_folder(user, payload.folder_id): - raise HTTPException(403, "You do not have access to the target folder") - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_files WHERE id = ?", - (pst_id,)).fetchone(): - raise HTTPException(404, "PST not found") - if payload.folder_id: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (payload.folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = ? WHERE id = ?", - (payload.folder_id, pst_id)) - conn.commit() - return {"pst_id": pst_id, "folder_id": payload.folder_id} - - -@app.post("/api/pst-files") -async def upload_pst( - background_tasks: BackgroundTasks, - file: UploadFile = File(...), - folder_id: Optional[str] = None, - user: User = Depends(require_app_user), -): - if not file.filename: - raise HTTPException(400, "No filename provided") - if not file.filename.lower().endswith((".pst", ".ost")): - raise HTTPException(400, "Only .pst and .ost files are supported") - - # Validate folder if provided (and verify user has access to it) - if folder_id: - with get_db() as conn: - exists = conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone() - if not exists: - raise HTTPException(400, "Target folder does not exist") - if not user_can_see_folder(user, folder_id): - raise HTTPException(403, "You do not have access to the target folder") - - pst_id = uuid.uuid4().hex - stored_name = f"{pst_id}_{file.filename}" - stored_path = UPLOAD_DIR / stored_name - - size = 0 - async with aiofiles.open(stored_path, "wb") as out: - while chunk := await file.read(1024 * 1024): - await out.write(chunk) - size += len(chunk) - - with get_db() as conn: - conn.execute( - """INSERT INTO pst_files - (id, filename, original_name, uploaded_at, size_bytes, status, - uploaded_by, folder_id) - VALUES (?, ?, ?, ?, ?, 'indexing', ?, ?)""", - (pst_id, stored_name, file.filename, - datetime.now(timezone.utc).isoformat(), size, user.id, folder_id), - ) - conn.commit() - - background_tasks.add_task(asyncio.to_thread, index_pst_file, pst_id, stored_path) - return {"id": pst_id, "original_name": file.filename, - "status": "indexing", "size_bytes": size, "folder_id": folder_id} - - -@app.delete("/api/pst-files/{pst_id}") -def delete_pst(pst_id: str, user: User = Depends(require_app_user)): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - with get_db() as conn: - row = conn.execute( - "SELECT filename FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - raise HTTPException(404, "PST not found") - conn.execute("DELETE FROM messages WHERE pst_id = ?", (pst_id,)) - conn.execute("DELETE FROM pst_files WHERE id = ?", (pst_id,)) - conn.commit() - try: - (UPLOAD_DIR / row["filename"]).unlink(missing_ok=True) - except Exception: - pass - return {"deleted": pst_id} - - -@app.get("/api/pst-files/{pst_id}/folders") -def get_folders(pst_id: str, user: User = Depends(require_app_user)): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - with get_db() as conn: - rows = conn.execute( - """SELECT folder, COUNT(*) as count FROM messages - WHERE pst_id = ? GROUP BY folder ORDER BY folder""", - (pst_id,), - ).fetchall() - return [dict(r) for r in rows] - - -def _escape_fts(query: str) -> str: - tokens = [] - for raw in query.split(): - if re.fullmatch(r"[A-Za-z0-9]+", raw): - tokens.append(f'"{raw}"*') - else: - sanitized = raw.replace('"', '""') - tokens.append(f'"{sanitized}"') - return " ".join(tokens) - - -@app.get("/api/pst-files/{pst_id}/messages") -def search_messages( - pst_id: str, - q: Optional[str] = None, - folder: Optional[str] = None, - limit: int = 50, - offset: int = 0, - user: User = Depends(require_app_user), -): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - limit = max(1, min(limit, 200)) - offset = max(0, offset) - - with get_db() as conn: - p = conn.execute("SELECT id FROM pst_files WHERE id = ?", (pst_id,)).fetchone() - if not p: - raise HTTPException(404, "PST not found") - - params = [pst_id] - - if q and q.strip(): - fts_q = _escape_fts(q.strip()) - base = """ - FROM messages m - JOIN messages_fts f ON f.rowid = m.id - WHERE m.pst_id = ? AND messages_fts MATCH ? - """ - params.append(fts_q) - if folder: - base += " AND m.folder = ?" - params.append(folder) - - total = conn.execute("SELECT COUNT(*) as c " + base, params).fetchone()["c"] - - data_sql = ( - "SELECT m.id, m.folder, m.subject, m.sender, m.recipients, m.sent_date, " - " m.attachments, snippet(messages_fts, 3, '', '', '…', 24) AS snippet " - + base + " ORDER BY rank LIMIT ? OFFSET ?" - ) - rows = conn.execute(data_sql, params + [limit, offset]).fetchall() - else: - where = ["m.pst_id = ?"] - if folder: - where.append("m.folder = ?") - params.append(folder) - where_sql = " AND ".join(where) - total = conn.execute( - f"SELECT COUNT(*) as c FROM messages m WHERE {where_sql}", params - ).fetchone()["c"] - rows = conn.execute( - f"""SELECT m.id, m.folder, m.subject, m.sender, m.recipients, - m.sent_date, m.attachments, substr(m.body, 1, 200) AS snippet - FROM messages m WHERE {where_sql} - ORDER BY m.sent_date DESC LIMIT ? OFFSET ?""", - params + [limit, offset], - ).fetchall() - - return {"total": total, "limit": limit, "offset": offset, - "items": [dict(r) for r in rows]} - - -@app.get("/api/messages/{message_id}") -def get_message(message_id: int, user: User = Depends(require_app_user)): - with get_db() as conn: - row = conn.execute( - """SELECT id, pst_id, folder, subject, sender, recipients, - sent_date, body, attachments - FROM messages WHERE id = ?""", - (message_id,), - ).fetchone() - if not row: - raise HTTPException(404, "Message not found") - if not user_can_see_pst(user, row["pst_id"]): - raise HTTPException(404, "Message not found") - return dict(row) - - -# --------------------------------------------------------------------------- -# Static frontend (anonymous access — but index.html enforces auth client-side -# AND the APIs enforce it server-side, which is what actually matters) -# --------------------------------------------------------------------------- -if FRONTEND_DIR.exists(): - app.mount("/", StaticFiles(directory=str(FRONTEND_DIR), html=True), name="frontend") diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/auth.py b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/auth.py deleted file mode 100644 index eedd118..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/auth.py +++ /dev/null @@ -1,513 +0,0 @@ -""" -auth.py — Shared authentication & encryption module. - -Responsibilities: -- Derive or generate a master secret key (persisted to disk with chmod 600) -- Provide Fernet-based encryption for user PII at rest -- Argon2id password hashing (constant-time verification) -- TOTP secret generation, QR provisioning URI, 6-digit code verification -- JWT session tokens (signed with master key) -- User CRUD on the shared SQLite database -- FastAPI dependencies to enforce authentication and admin role -""" -from __future__ import annotations - -import base64 -import hashlib -import hmac -import os -import secrets -import sqlite3 -import time -from contextlib import contextmanager -from dataclasses import dataclass -from datetime import datetime, timedelta, timezone -from pathlib import Path -from typing import Optional - -import jwt -import pyotp -from argon2 import PasswordHasher -from argon2.exceptions import VerifyMismatchError, InvalidHashError -from cryptography.fernet import Fernet, InvalidToken -from cryptography.hazmat.primitives import hashes -from cryptography.hazmat.primitives.kdf.hkdf import HKDF -from fastapi import Depends, HTTPException, Request, status - -# --------------------------------------------------------------------------- -# Config -# --------------------------------------------------------------------------- -DATA_DIR = Path(os.environ.get("DATA_DIR", "/app/data")) -DATA_DIR.mkdir(parents=True, exist_ok=True) - -SECRET_KEY_PATH = DATA_DIR / "secret.key" -DB_PATH = DATA_DIR / "pst_index.db" - -SESSION_TTL_SECONDS = int(os.environ.get("SESSION_TTL_SECONDS", 60 * 60 * 8)) # 8 hours -SESSION_COOKIE_NAME = "pst_session" -ADMIN_SESSION_COOKIE_NAME = "pst_admin_session" - -JWT_ALGORITHM = "HS256" - -# --------------------------------------------------------------------------- -# Master secret -# --------------------------------------------------------------------------- -def _load_or_create_master_secret() -> bytes: - """Return a 32-byte master secret. Created on first run, persisted to disk.""" - # Allow overriding via env var (useful for orchestration); still persist so - # restarts without the env var keep working. - env_secret = os.environ.get("MASTER_SECRET") - if env_secret: - return hashlib.sha256(env_secret.encode("utf-8")).digest() - - if SECRET_KEY_PATH.exists(): - data = SECRET_KEY_PATH.read_bytes() - if len(data) == 32: - return data - # Legacy or truncated: rewrap - return hashlib.sha256(data).digest() - - secret = secrets.token_bytes(32) - SECRET_KEY_PATH.write_bytes(secret) - try: - os.chmod(SECRET_KEY_PATH, 0o600) - except Exception: - pass - return secret - - -MASTER_SECRET: bytes = _load_or_create_master_secret() - - -def _derive_subkey(info: bytes, length: int = 32) -> bytes: - """Derive a sub-key from the master secret using HKDF-SHA256.""" - return HKDF( - algorithm=hashes.SHA256(), - length=length, - salt=b"pst-indexer-salt-v1", - info=info, - ).derive(MASTER_SECRET) - - -# Key used for encrypting user PII at rest -_FERNET_KEY = base64.urlsafe_b64encode(_derive_subkey(b"fernet-user-pii")) -_FERNET = Fernet(_FERNET_KEY) - -# Key used for JWT signatures -_JWT_KEY = _derive_subkey(b"jwt-sessions") - -# Key used for deterministic username lookup hashes (so we can index without -# exposing plaintext usernames in the DB). -_USERNAME_HMAC_KEY = _derive_subkey(b"username-lookup") - - -# --------------------------------------------------------------------------- -# Encryption helpers -# --------------------------------------------------------------------------- -def encrypt(plaintext: str) -> str: - """Fernet-encrypt a string; returns base64 ciphertext.""" - if plaintext is None: - return "" - return _FERNET.encrypt(plaintext.encode("utf-8")).decode("utf-8") - - -def decrypt(ciphertext: str) -> str: - """Fernet-decrypt. Returns empty string for empty input.""" - if not ciphertext: - return "" - try: - return _FERNET.decrypt(ciphertext.encode("utf-8")).decode("utf-8") - except InvalidToken: - raise ValueError("Failed to decrypt — master key may have changed") - - -def username_lookup_hash(username: str) -> str: - """Deterministic HMAC-SHA256 over the normalized username, hex-encoded.""" - normalized = username.strip().lower().encode("utf-8") - return hmac.new(_USERNAME_HMAC_KEY, normalized, hashlib.sha256).hexdigest() - - -# --------------------------------------------------------------------------- -# Password hashing -# --------------------------------------------------------------------------- -_hasher = PasswordHasher( - time_cost=3, - memory_cost=64 * 1024, # 64 MiB - parallelism=2, -) - - -def hash_password(password: str) -> str: - return _hasher.hash(password) - - -def verify_password(stored_hash: str, password: str) -> bool: - try: - _hasher.verify(stored_hash, password) - return True - except (VerifyMismatchError, InvalidHashError): - return False - except Exception: - return False - - -# --------------------------------------------------------------------------- -# TOTP (MFA) -# --------------------------------------------------------------------------- -def generate_totp_secret() -> str: - return pyotp.random_base32() - - -def totp_provisioning_uri(secret: str, username: str, issuer: str = "PST Archive") -> str: - return pyotp.TOTP(secret).provisioning_uri(name=username, issuer_name=issuer) - - -def verify_totp(secret: str, code: str) -> bool: - if not secret or not code: - return False - try: - return pyotp.TOTP(secret).verify(code.strip(), valid_window=1) - except Exception: - return False - - -# --------------------------------------------------------------------------- -# Database -# --------------------------------------------------------------------------- -@contextmanager -def get_db(): - conn = sqlite3.connect(str(DB_PATH)) - conn.row_factory = sqlite3.Row - conn.execute("PRAGMA foreign_keys = ON") - try: - yield conn - finally: - conn.close() - - -def init_auth_schema(): - with get_db() as conn: - conn.executescript(""" - CREATE TABLE IF NOT EXISTS users ( - id TEXT PRIMARY KEY, - username_hash TEXT NOT NULL UNIQUE, - username_enc TEXT NOT NULL, - password_hash_enc TEXT NOT NULL, - totp_secret_enc TEXT, - mfa_enabled INTEGER NOT NULL DEFAULT 0, - role TEXT NOT NULL DEFAULT 'user', - created_at TEXT NOT NULL, - last_login TEXT - ); - - CREATE INDEX IF NOT EXISTS idx_users_username_hash ON users(username_hash); - CREATE INDEX IF NOT EXISTS idx_users_role ON users(role); - """) - conn.commit() - - -# --------------------------------------------------------------------------- -# User model -# --------------------------------------------------------------------------- -@dataclass -class User: - id: str - username: str - role: str - mfa_enabled: bool - created_at: str - last_login: Optional[str] - - @property - def is_admin(self) -> bool: - return self.role == "admin" - - def public_dict(self) -> dict: - return { - "id": self.id, - "username": self.username, - "role": self.role, - "mfa_enabled": self.mfa_enabled, - "created_at": self.created_at, - "last_login": self.last_login, - } - - -def _row_to_user(row: sqlite3.Row) -> User: - return User( - id=row["id"], - username=decrypt(row["username_enc"]), - role=row["role"], - mfa_enabled=bool(row["mfa_enabled"]), - created_at=row["created_at"], - last_login=row["last_login"], - ) - - -def count_users() -> int: - with get_db() as conn: - return conn.execute("SELECT COUNT(*) AS c FROM users").fetchone()["c"] - - -def count_admins() -> int: - with get_db() as conn: - return conn.execute("SELECT COUNT(*) AS c FROM users WHERE role='admin'").fetchone()["c"] - - -def find_user_by_username(username: str) -> Optional[tuple[User, str]]: - """Return (User, decrypted_password_hash) if found, else None.""" - uh = username_lookup_hash(username) - with get_db() as conn: - row = conn.execute( - "SELECT * FROM users WHERE username_hash = ?", (uh,) - ).fetchone() - if not row: - return None - user = _row_to_user(row) - try: - pw_hash = decrypt(row["password_hash_enc"]) - except ValueError: - return None - return user, pw_hash - - -def find_user_by_id(user_id: str) -> Optional[User]: - with get_db() as conn: - row = conn.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone() - if not row: - return None - return _row_to_user(row) - - -def get_totp_secret(user_id: str) -> Optional[str]: - with get_db() as conn: - row = conn.execute( - "SELECT totp_secret_enc FROM users WHERE id = ?", (user_id,) - ).fetchone() - if not row or not row["totp_secret_enc"]: - return None - try: - return decrypt(row["totp_secret_enc"]) - except ValueError: - return None - - -def list_users() -> list[User]: - with get_db() as conn: - rows = conn.execute( - "SELECT * FROM users ORDER BY created_at ASC" - ).fetchall() - return [_row_to_user(r) for r in rows] - - -def create_user(username: str, password: str, role: str = "user") -> User: - username = username.strip() - if not username or len(username) < 3: - raise ValueError("Username must be at least 3 characters") - if len(username) > 64: - raise ValueError("Username too long") - if role not in ("user", "admin"): - raise ValueError("Invalid role") - if len(password) < 8: - raise ValueError("Password must be at least 8 characters") - - uh = username_lookup_hash(username) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM users WHERE username_hash = ?", (uh,) - ).fetchone() - if existing: - raise ValueError("Username already taken") - - user_id = secrets.token_hex(16) - now = datetime.now(timezone.utc).isoformat() - pw_hash = hash_password(password) - - conn.execute( - """INSERT INTO users - (id, username_hash, username_enc, password_hash_enc, - totp_secret_enc, mfa_enabled, role, created_at, last_login) - VALUES (?, ?, ?, ?, NULL, 0, ?, ?, NULL)""", - (user_id, uh, encrypt(username), encrypt(pw_hash), role, now), - ) - conn.commit() - - return User( - id=user_id, username=username, role=role, mfa_enabled=False, - created_at=now, last_login=None, - ) - - -def delete_user(user_id: str) -> None: - with get_db() as conn: - # Also clean up any folder permission grants this user had - conn.execute("DELETE FROM folder_permissions WHERE user_id = ?", (user_id,)) - conn.execute("DELETE FROM users WHERE id = ?", (user_id,)) - conn.commit() - - -def set_user_role(user_id: str, role: str) -> None: - if role not in ("user", "admin"): - raise ValueError("Invalid role") - with get_db() as conn: - conn.execute("UPDATE users SET role = ? WHERE id = ?", (role, user_id)) - conn.commit() - - -def update_password(user_id: str, new_password: str) -> None: - if len(new_password) < 8: - raise ValueError("Password must be at least 8 characters") - pw_hash = hash_password(new_password) - with get_db() as conn: - conn.execute( - "UPDATE users SET password_hash_enc = ? WHERE id = ?", - (encrypt(pw_hash), user_id), - ) - conn.commit() - - -def begin_mfa_enrollment(user_id: str) -> tuple[str, str]: - """Generate a new TOTP secret (not yet enabled) and return (secret, provisioning_uri).""" - user = find_user_by_id(user_id) - if not user: - raise ValueError("User not found") - secret = generate_totp_secret() - # Stash it but leave mfa_enabled = 0 until confirmed - with get_db() as conn: - conn.execute( - "UPDATE users SET totp_secret_enc = ?, mfa_enabled = 0 WHERE id = ?", - (encrypt(secret), user_id), - ) - conn.commit() - uri = totp_provisioning_uri(secret, user.username) - return secret, uri - - -def confirm_mfa_enrollment(user_id: str, code: str) -> bool: - secret = get_totp_secret(user_id) - if not secret or not verify_totp(secret, code): - return False - with get_db() as conn: - conn.execute("UPDATE users SET mfa_enabled = 1 WHERE id = ?", (user_id,)) - conn.commit() - return True - - -def disable_mfa(user_id: str) -> None: - with get_db() as conn: - conn.execute( - "UPDATE users SET mfa_enabled = 0, totp_secret_enc = NULL WHERE id = ?", - (user_id,), - ) - conn.commit() - - -def record_login(user_id: str) -> None: - with get_db() as conn: - conn.execute( - "UPDATE users SET last_login = ? WHERE id = ?", - (datetime.now(timezone.utc).isoformat(), user_id), - ) - conn.commit() - - -# --------------------------------------------------------------------------- -# JWT sessions -# --------------------------------------------------------------------------- -def create_session_token(user: User, scope: str = "app") -> str: - """scope='app' for main app, scope='admin' for admin panel.""" - now = datetime.now(timezone.utc) - payload = { - "sub": user.id, - "role": user.role, - "scope": scope, - "iat": int(now.timestamp()), - "exp": int((now + timedelta(seconds=SESSION_TTL_SECONDS)).timestamp()), - } - return jwt.encode(payload, _JWT_KEY, algorithm=JWT_ALGORITHM) - - -def verify_session_token(token: str, expected_scope: str) -> Optional[dict]: - try: - payload = jwt.decode(token, _JWT_KEY, algorithms=[JWT_ALGORITHM]) - if payload.get("scope") != expected_scope: - return None - return payload - except jwt.PyJWTError: - return None - - -# --------------------------------------------------------------------------- -# FastAPI dependencies -# --------------------------------------------------------------------------- -def _extract_token(request: Request, cookie_name: str) -> Optional[str]: - # Prefer cookie, fall back to Authorization header - token = request.cookies.get(cookie_name) - if token: - return token - auth = request.headers.get("authorization", "") - if auth.lower().startswith("bearer "): - return auth[7:].strip() - return None - - -def require_user(scope: str, cookie_name: str): - def _dep(request: Request) -> User: - token = _extract_token(request, cookie_name) - if not token: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Not authenticated") - payload = verify_session_token(token, expected_scope=scope) - if not payload: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid or expired session") - user = find_user_by_id(payload["sub"]) - if not user: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "User no longer exists") - return user - return _dep - - -def require_admin(scope: str, cookie_name: str): - base = require_user(scope, cookie_name) - def _dep(request: Request) -> User: - user = base(request) - if not user.is_admin: - raise HTTPException(status.HTTP_403_FORBIDDEN, "Admin role required") - return user - return _dep - - -# Pre-wired dependencies for the two app scopes -require_app_user = require_user("app", SESSION_COOKIE_NAME) -require_admin_user = require_admin("admin", ADMIN_SESSION_COOKIE_NAME) - - -# --------------------------------------------------------------------------- -# Simple rate limiter (per-IP, per-username) to slow brute-force attempts -# --------------------------------------------------------------------------- -class RateLimiter: - def __init__(self, window_seconds: int = 300, max_attempts: int = 10): - self.window = window_seconds - self.max = max_attempts - self._attempts: dict[str, list[float]] = {} - - def check(self, key: str) -> bool: - now = time.time() - cutoff = now - self.window - arr = [t for t in self._attempts.get(key, []) if t > cutoff] - if len(arr) >= self.max: - self._attempts[key] = arr - return False - return True - - def record(self, key: str) -> None: - now = time.time() - cutoff = now - self.window - arr = [t for t in self._attempts.get(key, []) if t > cutoff] - arr.append(now) - self._attempts[key] = arr - - def reset(self, key: str) -> None: - self._attempts.pop(key, None) - - -login_limiter = RateLimiter(window_seconds=300, max_attempts=10) diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/requirements.txt b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/requirements.txt deleted file mode 100644 index 9cbd286..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/backend/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -fastapi==0.115.0 -uvicorn[standard]==0.32.0 -python-multipart==0.0.12 -libpff-python==20231205 -aiofiles==24.1.0 -argon2-cffi==23.1.0 -pyotp==2.9.0 -cryptography==43.0.1 -PyJWT==2.9.0 -qrcode[pil]==7.4.2 diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/docker-compose.yml b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/docker-compose.yml deleted file mode 100644 index 61385c9..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -services: - pst-indexer: - build: . - container_name: pst-indexer - ports: - - "8000:8000" # Main app - - "8001:8001" # Admin panel - volumes: - - ./data:/app/data - restart: unless-stopped - environment: - - DATA_DIR=/app/data - # Set to "true" when serving over HTTPS - - COOKIE_SECURE=false - # Session lifetime in seconds (default 8 hours) - - SESSION_TTL_SECONDS=28800 - # Optional: provide your own master secret. If set, this becomes the - # root key for all encryption. If omitted, a random key is generated - # on first run and persisted in ./data/secret.key (chmod 600). - # - MASTER_SECRET=change-me-to-a-long-random-string diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/entrypoint.sh b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/entrypoint.sh deleted file mode 100644 index fb9fe33..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/entrypoint.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Start both the main app (port 8000) and the admin panel (port 8001). -# If either exits, kill the whole container so Docker's restart policy fires. - -set -e - -cleanup() { - echo "Shutting down…" - kill -TERM "$MAIN_PID" "$ADMIN_PID" 2>/dev/null || true - wait - exit 0 -} -trap cleanup SIGINT SIGTERM - -cd /app/backend - -echo "[start] Main app on :8000" -uvicorn app:app --host 0.0.0.0 --port 8000 --proxy-headers & -MAIN_PID=$! - -echo "[start] Admin panel on :8001" -uvicorn admin_app:app --host 0.0.0.0 --port 8001 --proxy-headers & -ADMIN_PID=$! - -# Wait for either to exit -wait -n "$MAIN_PID" "$ADMIN_PID" -EXIT_CODE=$? -echo "[exit] One of the services exited with code $EXIT_CODE; stopping the other" -kill -TERM "$MAIN_PID" "$ADMIN_PID" 2>/dev/null || true -wait -exit $EXIT_CODE diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/app.js b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/app.js deleted file mode 100644 index fdc6cd8..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/app.js +++ /dev/null @@ -1,869 +0,0 @@ -/* ============================================================ - PST Archive — frontend logic - - Setup wizard (first run) - - Login (+ MFA) - - Main app: upload, index, search, view - ============================================================ */ - -const API = "/api"; - -const state = { - activePstId: null, - activePstName: "", - folder: "", - query: "", - limit: 25, - offset: 0, - total: 0, - refreshTimer: null, - user: null, - folders: [], // [{id, name, file_count}, ...] - psts: [], // last loaded pst list - collapsedFolders: new Set(), // folder IDs (or "__uncat__") that are collapsed - movePstId: null, // currently being moved -}; - -const $ = (id) => document.getElementById(id); - -// ---------- helpers ---------- -function fmtBytes(n) { - if (!n) return "0 B"; - const units = ["B", "KB", "MB", "GB", "TB"]; - let i = 0; - while (n >= 1024 && i < units.length - 1) { n /= 1024; i++; } - return `${n.toFixed(i ? 1 : 0)} ${units[i]}`; -} - -function fmtDate(iso) { - if (!iso) return "—"; - try { - const d = new Date(iso); - if (isNaN(d)) return iso; - return d.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric" }); - } catch { return iso; } -} - -function fmtDateTime(iso) { - if (!iso) return "—"; - try { - const d = new Date(iso); - if (isNaN(d)) return iso; - return d.toLocaleString("en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }); - } catch { return iso; } -} - -function toast(msg, ms = 3000) { - const el = $("toast"); - el.textContent = msg; - el.classList.remove("hidden"); - clearTimeout(toast._t); - toast._t = setTimeout(() => el.classList.add("hidden"), ms); -} - -function escapeHtml(s) { - if (s == null) return ""; - return String(s) - .replace(/&/g, "&").replace(//g, ">") - .replace(/"/g, """).replace(/'/g, "'"); -} - -function renderSnippet(snippet) { - if (!snippet) return ""; - return escapeHtml(snippet) - .replace(/<mark>/g, "") - .replace(/<\/mark>/g, ""); -} - -function debounce(fn, ms) { - let t; - return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); }; -} - -// ---------- API ---------- -async function api(path, opts = {}) { - const res = await fetch(API + path, { - credentials: "same-origin", - ...opts, - }); - let body = null; - try { body = await res.json(); } catch {} - if (!res.ok) { - const err = new Error((body && body.detail) || res.statusText); - err.status = res.status; - err.body = body || {}; - throw err; - } - return body; -} - -// ---------- Screen switching ---------- -function showScreen(screen) { - ["setupScreen", "loginScreen", "mainApp"].forEach((id) => { - $(id).classList.toggle("hidden", id !== screen); - }); -} - -// ---------- Bootstrap ---------- -async function bootstrap() { - // 1. Try to fetch current user - try { - const { user } = await api("/me"); - state.user = user; - enterApp(); - return; - } catch (e) { - if (e.status !== 401) { - showLogin(); - toast("Connection problem — please retry."); - return; - } - } - - // 2. Not logged in — check setup status - try { - const { needs_setup } = await api("/setup/status"); - if (needs_setup) showSetup(); - else showLogin(); - } catch { - showLogin(); - } -} - -// ---------- Setup ---------- -function showSetup() { - showScreen("setupScreen"); - $("setupForm").reset(); - $("setupError").classList.add("hidden"); - setTimeout(() => $("setupForm").username?.focus(), 50); -} - -async function handleSetup(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("setupError"); - errEl.classList.add("hidden"); - - const username = form.username.value.trim(); - const password = form.password.value; - const password2 = form.password2.value; - - if (password !== password2) { - errEl.textContent = "Passwords do not match."; - errEl.classList.remove("hidden"); - return; - } - - try { - const { user } = await api("/setup", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ username, password }), - }); - state.user = user; - toast("Welcome — admin account created."); - enterApp(); - } catch (err) { - errEl.textContent = err.message || "Setup failed."; - errEl.classList.remove("hidden"); - } -} - -// ---------- Login ---------- -function showLogin() { - showScreen("loginScreen"); - $("loginForm").reset(); - $("mfaField").classList.add("hidden"); - $("loginError").classList.add("hidden"); - setTimeout(() => $("loginForm").username?.focus(), 50); -} - -async function handleLogin(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("loginError"); - errEl.classList.add("hidden"); - - const payload = { - username: form.username.value.trim(), - password: form.password.value, - }; - const mfaInput = form.totp_code.value.trim(); - if (mfaInput) payload.totp_code = mfaInput; - - try { - const { user } = await api("/login", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(payload), - }); - state.user = user; - toast(`Welcome, ${user.username}.`); - enterApp(); - } catch (err) { - if (err.status === 401 && err.body && err.body.mfa_required) { - $("mfaField").classList.remove("hidden"); - const f = $("loginForm").totp_code; - f.value = ""; - setTimeout(() => f.focus(), 50); - errEl.textContent = "Enter your authenticator code to continue."; - errEl.classList.remove("hidden"); - return; - } - errEl.textContent = err.message || "Login failed."; - errEl.classList.remove("hidden"); - } -} - -async function handleLogout() { - try { await api("/logout", { method: "POST" }); } catch {} - state.user = null; - state.activePstId = null; - resetReader(); - showLogin(); -} - -// ---------- Enter the app ---------- -function enterApp() { - showScreen("mainApp"); - $("userChip").textContent = `${state.user.username}${state.user.role === "admin" ? " · admin" : ""}`; - checkHealth(); - loadPstList(); - setInterval(checkHealth, 30000); -} - -// ---------- Health ---------- -async function checkHealth() { - const dot = $("statusDot"); - const text = $("statusText"); - try { - await api("/health"); - dot.className = "status-dot ok"; - text.textContent = "connected"; - } catch { - dot.className = "status-dot err"; - text.textContent = "offline"; - } -} - -// ---------- PST list ---------- -async function loadPstList() { - try { - const [folders, items] = await Promise.all([ - api("/folders"), - api("/pst-files"), - ]); - state.folders = folders; - state.psts = items; - renderPstList(); - if (items.some((i) => i.status === "indexing")) { - clearTimeout(state.refreshTimer); - state.refreshTimer = setTimeout(loadPstList, 2500); - } - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Failed to load archives: ${e.message}`); - } -} - -function pstItemHtml(i) { - const active = i.id === state.activePstId ? "active" : ""; - const disabled = i.status !== "ready"; - const statusText = i.status === "indexing" ? "indexing…" : - i.status === "ready" ? `${i.message_count.toLocaleString()} msgs` : - i.status === "failed" ? "failed" : i.status; - return ` -
  1. -
    - ${escapeHtml(i.original_name)} - -
    -
    - ${fmtBytes(i.size_bytes)} · ${fmtDate(i.uploaded_at)} - ${statusText} -
    -
  2. - `; -} - -function renderPstList() { - const ul = $("pstList"); - const { folders, psts } = state; - - if (!folders.length && !psts.length) { - ul.innerHTML = '
  3. No archives yet.
  4. '; - return; - } - - // Group PSTs by folder_id - const byFolder = new Map(); - byFolder.set(null, []); // uncategorized bucket - folders.forEach((f) => byFolder.set(f.id, [])); - psts.forEach((p) => { - const bucket = byFolder.has(p.folder_id) ? p.folder_id : null; - byFolder.get(bucket).push(p); - }); - - const parts = []; - - // Render user-defined folders first (sorted alphabetically — server does this) - for (const f of folders) { - const items = byFolder.get(f.id) || []; - const collapsed = state.collapsedFolders.has(f.id) ? "collapsed" : ""; - parts.push(` -
  5. -
    -
    - - ${escapeHtml(f.name)} - ${items.length} -
    - -
    -
      - ${items.length - ? items.map(pstItemHtml).join("") - : '
    • — empty —
    • '} -
    -
  6. - `); - } - - // Uncategorized group — only shown if it has items OR there are no folders - const uncat = byFolder.get(null) || []; - if (uncat.length || !folders.length) { - const collapsed = state.collapsedFolders.has("__uncat__") ? "collapsed" : ""; - parts.push(` -
  7. -
    -
    - - Uncategorized - ${uncat.length} -
    -
    -
      - ${uncat.length - ? uncat.map(pstItemHtml).join("") - : '
    • — empty —
    • '} -
    -
  8. - `); - } - - ul.innerHTML = parts.join(""); - - // PST click - ul.querySelectorAll(".pst-item").forEach((el) => { - el.addEventListener("click", (e) => { - if (e.target.closest("[data-pst-menu]")) return; - if (el.dataset.disabled) { - toast(el.dataset.status === "indexing" ? "Still indexing — one moment…" : "This archive is unavailable."); - return; - } - selectPst(el.dataset.id, el.dataset.name); - }); - }); - - // PST action menu - ul.querySelectorAll("[data-pst-menu]").forEach((btn) => { - btn.addEventListener("click", (e) => { - e.stopPropagation(); - openPstMenu(e, btn.dataset.pstMenu); - }); - }); - - // Folder header toggle (collapse/expand) - ul.querySelectorAll("[data-folder-header]").forEach((el) => { - el.addEventListener("click", (e) => { - if (e.target.closest("[data-folder-menu]")) return; - const id = el.dataset.folderHeader; - if (state.collapsedFolders.has(id)) state.collapsedFolders.delete(id); - else state.collapsedFolders.add(id); - const group = el.closest(".folder-group"); - group.classList.toggle("collapsed"); - }); - }); - - // Folder action menu - ul.querySelectorAll("[data-folder-menu]").forEach((btn) => { - btn.addEventListener("click", (e) => { - e.stopPropagation(); - openFolderMenu(e, btn.dataset.folderMenu); - }); - }); -} - -// ---------- Context menus ---------- -function closeContextMenu() { - document.querySelectorAll(".context-menu").forEach((el) => el.remove()); -} - -function openContextMenu(x, y, items) { - closeContextMenu(); - const menu = document.createElement("div"); - menu.className = "context-menu"; - items.forEach((it) => { - if (it.divider) { - menu.appendChild(document.createElement("hr")); - return; - } - const btn = document.createElement("button"); - btn.textContent = it.label; - if (it.danger) btn.classList.add("danger"); - btn.addEventListener("click", () => { - closeContextMenu(); - it.onClick(); - }); - menu.appendChild(btn); - }); - document.body.appendChild(menu); - - // Position, keeping menu inside viewport - const rect = menu.getBoundingClientRect(); - const maxX = window.innerWidth - rect.width - 4; - const maxY = window.innerHeight - rect.height - 4; - menu.style.left = Math.min(x, maxX) + "px"; - menu.style.top = Math.min(y, maxY) + "px"; - - // Close on outside click or escape - setTimeout(() => { - document.addEventListener("click", closeContextMenu, { once: true }); - }, 0); -} - -function openPstMenu(event, pstId) { - const p = state.psts.find((x) => x.id === pstId); - if (!p) return; - const r = event.currentTarget.getBoundingClientRect(); - openContextMenu(r.left, r.bottom + 4, [ - { - label: "Move to folder…", - onClick: () => openMoveModal(p), - }, - { divider: true }, - { - label: "Delete archive", - danger: true, - onClick: () => deletePst(p), - }, - ]); -} - -function openFolderMenu(event, folderId) { - const f = state.folders.find((x) => x.id === folderId); - if (!f) return; - const r = event.currentTarget.getBoundingClientRect(); - openContextMenu(r.left, r.bottom + 4, [ - { - label: "Rename folder…", - onClick: () => renameFolder(f), - }, - { divider: true }, - { - label: "Delete folder", - danger: true, - onClick: () => deleteFolder(f), - }, - ]); -} - -// ---------- Folder operations ---------- -function openFolderModal() { - $("folderForm").reset(); - $("folderError").classList.add("hidden"); - $("folderModal").classList.remove("hidden"); - setTimeout(() => $("folderForm").name.focus(), 50); -} - -async function handleCreateFolder(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("folderError"); - errEl.classList.add("hidden"); - try { - await api("/folders", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ name: form.name.value }), - }); - toast("Folder created."); - closeModals(); - loadPstList(); - } catch (err) { - errEl.textContent = err.message || "Create failed."; - errEl.classList.remove("hidden"); - } -} - -async function renameFolder(f) { - const newName = prompt(`Rename "${f.name}" to:`, f.name); - if (!newName || newName.trim() === f.name) return; - try { - await api(`/folders/${f.id}`, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ name: newName }), - }); - toast("Folder renamed."); - loadPstList(); - } catch (err) { - toast(`Rename failed: ${err.message}`); - } -} - -async function deleteFolder(f) { - if (!confirm(`Delete folder "${f.name}"?\n\nAny archives inside will be moved to Uncategorized.`)) return; - try { - await api(`/folders/${f.id}`, { method: "DELETE" }); - toast("Folder deleted."); - loadPstList(); - } catch (err) { - toast(`Delete failed: ${err.message}`); - } -} - -async function deletePst(p) { - if (!confirm(`Remove "${p.original_name}" and all indexed messages?`)) return; - try { - await api(`/pst-files/${p.id}`, { method: "DELETE" }); - if (state.activePstId === p.id) { state.activePstId = null; resetReader(); } - toast("Archive removed."); - loadPstList(); - } catch (err) { - toast(`Delete failed: ${err.message}`); - } -} - -function openMoveModal(p) { - state.movePstId = p.id; - $("moveSubject").textContent = p.original_name; - - const sel = $("moveFolderSelect"); - sel.innerHTML = '' + - state.folders.map((f) => - `` - ).join(""); - if (!p.folder_id) sel.value = ""; - - $("moveError").classList.add("hidden"); - $("moveModal").classList.remove("hidden"); -} - -async function handleMovePst(e) { - e.preventDefault(); - const errEl = $("moveError"); - errEl.classList.add("hidden"); - const folderId = $("moveFolderSelect").value || null; - try { - await api(`/pst-files/${state.movePstId}/folder`, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ folder_id: folderId }), - }); - toast("Moved."); - closeModals(); - loadPstList(); - } catch (err) { - errEl.textContent = err.message || "Move failed."; - errEl.classList.remove("hidden"); - } -} - -function closeModals() { - document.querySelectorAll(".modal").forEach((m) => m.classList.add("hidden")); -} - -// ---------- Selection + folders ---------- -async function selectPst(id, name) { - state.activePstId = id; - state.activePstName = name; - state.folder = ""; - state.query = ""; - state.offset = 0; - - $("searchInput").value = ""; - $("searchInput").disabled = false; - $("folderFilter").disabled = false; - - document.querySelectorAll(".pst-item").forEach((el) => { - el.classList.toggle("active", el.dataset.id === id); - }); - $("readerTitle").textContent = name; - $("readerMeta").textContent = "Loading messages…"; - hideMessageView(); - await Promise.all([loadFolders(), loadMessages()]); -} - -async function loadFolders() { - if (!state.activePstId) return; - try { - const folders = await api(`/pst-files/${state.activePstId}/folders`); - const sel = $("folderFilter"); - sel.innerHTML = - '' + - folders.map((f) => ``).join(""); - sel.value = state.folder || ""; - } catch (e) { console.warn("folders", e); } -} - -// ---------- Messages ---------- -async function loadMessages() { - if (!state.activePstId) return; - const params = new URLSearchParams(); - if (state.query) params.set("q", state.query); - if (state.folder) params.set("folder", state.folder); - params.set("limit", state.limit); - params.set("offset", state.offset); - - try { - const res = await api(`/pst-files/${state.activePstId}/messages?${params}`); - state.total = res.total; - renderMessages(res.items); - renderPaginator(); - $("readerMeta").textContent = - `${state.total.toLocaleString()} message${state.total === 1 ? "" : "s"}` + - (state.query ? ` matching "${state.query}"` : "") + - (state.folder ? ` in ${state.folder}` : ""); - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Search failed: ${e.message}`); - } -} - -function renderMessages(items) { - const list = $("messageList"); - if (!items.length) { - list.innerHTML = ` -
    -
    -

    No messages match.

    -
    `; - return; - } - list.innerHTML = items.map((m) => { - const hasAtt = m.attachments && m.attachments.trim().length > 0; - return ` -
    -
    ${escapeHtml(m.sender || "(unknown sender)")}
    -
    -
    ${escapeHtml(m.subject || "(no subject)")} ${hasAtt ? '' : ""}
    -
    ${renderSnippet(m.snippet || "")}
    -
    -
    -
    ${fmtDate(m.sent_date)}
    -
    ${escapeHtml((m.folder || "").split("/").filter(Boolean).pop() || "inbox")}
    -
    -
    `; - }).join(""); - list.querySelectorAll(".message-row").forEach((el) => { - el.addEventListener("click", () => openMessage(el.dataset.id)); - }); -} - -function renderPaginator() { - const p = $("paginator"); - if (state.total <= state.limit) { p.classList.add("hidden"); return; } - p.classList.remove("hidden"); - const from = state.offset + 1; - const to = Math.min(state.offset + state.limit, state.total); - $("pageInfo").textContent = `${from}–${to} of ${state.total.toLocaleString()}`; - $("prevBtn").disabled = state.offset === 0; - $("nextBtn").disabled = state.offset + state.limit >= state.total; -} - -// ---------- Message view ---------- -async function openMessage(id) { - try { - const m = await api(`/messages/${id}`); - $("mvSubject").textContent = m.subject || "(no subject)"; - $("mvSender").textContent = m.sender || "—"; - $("mvRecipients").textContent = m.recipients || "—"; - $("mvDate").textContent = fmtDateTime(m.sent_date); - $("mvFolder").textContent = m.folder || "—"; - if (m.attachments && m.attachments.trim()) { - $("mvAttLabel").classList.remove("hidden"); - $("mvAttachments").classList.remove("hidden"); - $("mvAttachments").textContent = m.attachments.split(" | ").join(", "); - } else { - $("mvAttLabel").classList.add("hidden"); - $("mvAttachments").classList.add("hidden"); - } - $("mvBody").textContent = m.body || "(empty body)"; - $("messageView").classList.remove("hidden"); - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Could not open message: ${e.message}`); - } -} - -function hideMessageView() { $("messageView").classList.add("hidden"); } - -function resetReader() { - $("readerTitle").textContent = "Select an archive"; - $("readerMeta").textContent = "Upload a PST file or select one from the left to begin."; - $("searchInput").disabled = true; - $("folderFilter").disabled = true; - $("messageList").innerHTML = ` -
    -
    -

    The archive awaits.

    -
    `; - $("paginator").classList.add("hidden"); - hideMessageView(); -} - -// ---------- Upload ---------- -function uploadFile(file) { - if (!file) return; - const lower = file.name.toLowerCase(); - if (!lower.endsWith(".pst") && !lower.endsWith(".ost")) { - toast("Only .pst and .ost files are accepted."); - return; - } - const progress = $("uploadProgress"); - const bar = $("progressBar"); - const pct = $("progressPct"); - const nm = $("progressName"); - progress.classList.remove("hidden"); - nm.textContent = file.name; - bar.style.width = "0%"; - pct.textContent = "0%"; - - const form = new FormData(); - form.append("file", file); - - const xhr = new XMLHttpRequest(); - xhr.open("POST", API + "/pst-files"); - xhr.withCredentials = true; - xhr.upload.onprogress = (e) => { - if (e.lengthComputable) { - const p = Math.round((e.loaded / e.total) * 100); - bar.style.width = p + "%"; - pct.textContent = p + "%"; - } - }; - xhr.onload = () => { - if (xhr.status >= 200 && xhr.status < 300) { - pct.textContent = "indexing…"; - bar.style.width = "100%"; - toast("Upload complete. Indexing started in background."); - setTimeout(() => progress.classList.add("hidden"), 2500); - loadPstList(); - } else if (xhr.status === 401) { - handleLogout(); - } else { - let msg = "Upload failed"; - try { msg = JSON.parse(xhr.responseText).detail || msg; } catch {} - toast(msg); - progress.classList.add("hidden"); - } - }; - xhr.onerror = () => { toast("Upload failed (network)."); progress.classList.add("hidden"); }; - xhr.send(form); -} - -// ---------- Theme ---------- -function initTheme() { - // Preference order: localStorage → prefers-color-scheme → light - let theme = "light"; - try { - const saved = localStorage.getItem("pst-theme"); - if (saved === "light" || saved === "dark") { - theme = saved; - } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { - theme = "dark"; - } - } catch { /* ignore storage errors */ } - document.documentElement.dataset.theme = theme; -} - -function toggleTheme() { - const current = document.documentElement.dataset.theme === "dark" ? "dark" : "light"; - const next = current === "dark" ? "light" : "dark"; - document.documentElement.dataset.theme = next; - try { localStorage.setItem("pst-theme", next); } catch {} -} - -// Apply theme immediately so there's no flash of wrong theme -initTheme(); - -// ---------- Wire up ---------- -function init() { - $("setupForm").addEventListener("submit", handleSetup); - $("loginForm").addEventListener("submit", handleLogin); - $("logoutBtn").addEventListener("click", handleLogout); - - // Theme toggles (both the in-masthead and floating variants) - ["themeToggle", "themeToggleFloat"].forEach((id) => { - const el = document.getElementById(id); - if (el) el.addEventListener("click", toggleTheme); - }); - - $("fileInput").addEventListener("change", (e) => { - const f = e.target.files[0]; - if (f) uploadFile(f); - e.target.value = ""; - }); - - const dz = $("dropzone"); - ["dragenter", "dragover"].forEach((ev) => { - dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.add("drag-over"); }); - }); - ["dragleave", "drop"].forEach((ev) => { - dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.remove("drag-over"); }); - }); - dz.addEventListener("drop", (e) => { - const f = e.dataTransfer.files?.[0]; - if (f) uploadFile(f); - }); - - $("refreshBtn").addEventListener("click", loadPstList); - $("newFolderBtn").addEventListener("click", openFolderModal); - $("folderForm").addEventListener("submit", handleCreateFolder); - $("moveForm").addEventListener("submit", handleMovePst); - - // Modal close buttons + backdrop clicks + Escape - document.querySelectorAll("[data-close]").forEach((el) => { - el.addEventListener("click", closeModals); - }); - document.querySelectorAll(".modal").forEach((m) => { - m.addEventListener("click", (e) => { - if (e.target === m) closeModals(); - }); - }); - - const searchHandler = debounce(() => { - state.query = $("searchInput").value.trim(); - state.offset = 0; - loadMessages(); - }, 250); - $("searchInput").addEventListener("input", searchHandler); - - $("folderFilter").addEventListener("change", () => { - state.folder = $("folderFilter").value; - state.offset = 0; - loadMessages(); - }); - - $("prevBtn").addEventListener("click", () => { - state.offset = Math.max(0, state.offset - state.limit); - loadMessages(); - }); - $("nextBtn").addEventListener("click", () => { - state.offset += state.limit; - loadMessages(); - }); - - $("closeMessageBtn").addEventListener("click", hideMessageView); - document.addEventListener("keydown", (e) => { - if (e.key === "Escape") { - hideMessageView(); - closeModals(); - closeContextMenu(); - } - }); - - bootstrap(); -} - -document.addEventListener("DOMContentLoaded", init); diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/index.html b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/index.html deleted file mode 100644 index 1e0be42..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/index.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - -PST Archive · Mail Indexer - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/styles.css b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/styles.css deleted file mode 100644 index 8aa34f3..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.0/pst-indexer/frontend/styles.css +++ /dev/null @@ -1,1136 +0,0 @@ -/* ============================================================ - PST ARCHIVE — aesthetic: editorial/forensic archive - Warm paper palette, serif display, mono accents, grain overlay - Supports light (default) and dark themes via [data-theme] - ============================================================ */ - -:root, -:root[data-theme="light"] { - --paper: #f2ede3; - --paper-deep: #e8e1d3; - --ink: #1b1814; - --ink-soft: #3a332a; - --ink-muted: #6b6258; - --rule: #c9bfad; - --rule-soft: #dcd3c1; - --accent: #a8341f; /* oxblood red */ - --accent-soft: #c95a42; - --highlight: #e8d67a; /* faded yellow marker */ - --ok: #2e6f3a; - --warn: #a86b1e; - --shadow: 0 1px 0 rgba(27, 24, 20, 0.04), 0 20px 40px -20px rgba(27, 24, 20, 0.25); - --grain-opacity: 0.35; - - --font-display: "Fraunces", "Iowan Old Style", "Palatino", Georgia, serif; - --font-mono: "JetBrains Mono", "SFMono-Regular", ui-monospace, monospace; -} - -:root[data-theme="dark"] { - --paper: #17140f; /* deep inked paper */ - --paper-deep: #201c16; /* slightly lighter ink-pool for surfaces */ - --ink: #e9e0cb; /* warm paper-cream as the ink color */ - --ink-soft: #c4b99f; - --ink-muted: #8a8170; - --rule: #3a3226; - --rule-soft: #2a251d; - --accent: #d06347; /* softened oxblood that holds up on dark */ - --accent-soft: #e4876c; - --highlight: #d8b64a; /* brass-yellow marker */ - --ok: #6fae7c; - --warn: #d99a4a; - --shadow: 0 1px 0 rgba(0, 0, 0, 0.4), 0 20px 40px -20px rgba(0, 0, 0, 0.9); - --grain-opacity: 0.12; -} - -* { box-sizing: border-box; } - -html, body { - margin: 0; - padding: 0; - height: 100%; - background: var(--paper); - color: var(--ink); - font-family: var(--font-display); - font-feature-settings: "ss01", "onum"; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -body { - display: flex; - flex-direction: column; - min-height: 100vh; - background-image: - radial-gradient(circle at 10% 10%, rgba(168, 52, 31, 0.04), transparent 40%), - radial-gradient(circle at 90% 90%, rgba(74, 58, 42, 0.05), transparent 50%); -} - -:root[data-theme="dark"] body { - background-image: - radial-gradient(circle at 10% 10%, rgba(208, 99, 71, 0.06), transparent 40%), - radial-gradient(circle at 90% 90%, rgba(216, 182, 74, 0.03), transparent 50%); -} - -/* grain overlay */ -.grain { - pointer-events: none; - position: fixed; - inset: 0; - z-index: 9999; - opacity: var(--grain-opacity); - mix-blend-mode: multiply; - background-image: url("data:image/svg+xml;utf8,"); -} - -:root[data-theme="dark"] .grain { - mix-blend-mode: screen; -} - -/* ============================================================ - MASTHEAD - ============================================================ */ -.masthead { - display: flex; - justify-content: space-between; - align-items: flex-end; - padding: 28px 40px 18px; - border-bottom: 1px solid var(--ink); - position: relative; -} - -.masthead::after { - content: ""; - position: absolute; - bottom: -4px; - left: 40px; - right: 40px; - height: 1px; - background: var(--ink); -} - -.masthead-left { display: flex; align-items: center; gap: 18px; } - -.logo-mark { - color: var(--ink); - display: flex; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - border: 1px solid var(--ink); - background: var(--paper); -} - -.masthead-title h1 { - margin: 0; - font-size: 2.5rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1; - font-variation-settings: "SOFT" 30, "WONK" 1; -} - -.tagline { - margin: 6px 0 0; - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.masthead-right { - display: flex; - align-items: center; - gap: 10px; - font-family: var(--font-mono); - font-size: 0.72rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.status-dot { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--warn); - box-shadow: 0 0 0 3px color-mix(in srgb, var(--warn) 25%, transparent); -} -.status-dot.ok { background: var(--ok); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 25%, transparent); } -.status-dot.err { background: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 25%, transparent); } - -/* ============================================================ - WORKSPACE - ============================================================ */ -.workspace { - display: grid; - grid-template-columns: 340px 1fr; - flex: 1; - min-height: 0; -} - -/* ============================================================ - SIDEBAR - ============================================================ */ -.sidebar { - border-right: 1px solid var(--rule); - padding: 28px 24px; - display: flex; - flex-direction: column; - gap: 36px; - overflow-y: auto; - background: linear-gradient(180deg, rgba(232, 225, 211, 0.4), transparent 40%); -} - -.section-heading { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--ink-soft); - margin: 0 0 14px; - padding-bottom: 8px; - border-bottom: 1px solid var(--rule); - display: flex; - align-items: baseline; - justify-content: space-between; -} - -.dropzone { - display: block; - border: 1.5px dashed var(--ink-muted); - background: var(--paper-deep); - padding: 28px 18px; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - position: relative; -} -.dropzone:hover, -.dropzone.drag-over { - border-color: var(--accent); - background: var(--rule-soft); - transform: translateY(-1px); -} -.dropzone-inner { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - color: var(--ink-soft); -} -.dropzone-title { - font-family: var(--font-display); - font-size: 1.1rem; - font-style: italic; - font-weight: 400; -} -.dropzone-title em { - font-style: normal; - font-family: var(--font-mono); - font-size: 0.9rem; - color: var(--accent); -} -.dropzone-hint { - font-family: var(--font-mono); - font-size: 0.65rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.upload-progress { margin-top: 14px; } -.progress-label { - display: flex; - justify-content: space-between; - font-family: var(--font-mono); - font-size: 0.7rem; - color: var(--ink-muted); - margin-bottom: 6px; -} -.progress-track { - height: 4px; - background: var(--rule-soft); - overflow: hidden; -} -.progress-bar { - height: 100%; - width: 0%; - background: var(--accent); - transition: width 0.2s ease; -} - -.archive-head { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 14px; -} -.archive-head .section-heading { - margin: 0; - border: none; - padding: 0; -} - -.icon-btn { - background: transparent; - border: 1px solid var(--rule); - padding: 5px 8px; - cursor: pointer; - color: var(--ink-soft); - transition: all 0.15s ease; - display: flex; - align-items: center; - justify-content: center; -} -.icon-btn:hover { - border-color: var(--ink); - color: var(--accent); -} - -.pst-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; } - -.pst-item { - padding: 14px 14px; - border: 1px solid var(--rule); - background: var(--paper); - cursor: pointer; - transition: all 0.15s ease; - position: relative; -} -.pst-item:hover { - border-color: var(--ink); - transform: translateX(2px); -} -.pst-item.active { - border-color: var(--ink); - background: var(--ink); - color: var(--paper); - box-shadow: 4px 4px 0 var(--accent); -} -.pst-item.active .pst-meta { color: color-mix(in srgb, var(--paper) 65%, transparent); } - -.pst-name { - font-size: 1rem; - font-weight: 500; - letter-spacing: -0.01em; - margin: 0 0 6px; - display: flex; - justify-content: space-between; - align-items: baseline; - gap: 8px; -} -.pst-name-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - flex: 1; -} -.pst-menu { - background: none; - border: none; - color: inherit; - opacity: 0.4; - cursor: pointer; - font-size: 1.1rem; - line-height: 1; - padding: 0 4px; - letter-spacing: 0.1em; - transition: opacity 0.15s, color 0.15s; -} -.pst-menu:hover { opacity: 1; color: var(--accent); } -.pst-item.active .pst-menu:hover { color: var(--accent-soft); } - -.pst-meta { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.08em; - color: var(--ink-muted); - display: flex; - justify-content: space-between; - gap: 8px; -} - -.pst-status { - text-transform: uppercase; - letter-spacing: 0.12em; -} -.pst-status.indexing { color: var(--warn); } -.pst-status.ready { color: var(--ok); } -.pst-status.failed { color: var(--accent); } -.pst-item.active .pst-status.indexing { color: color-mix(in srgb, var(--warn) 70%, var(--paper) 30%); } -.pst-item.active .pst-status.ready { color: color-mix(in srgb, var(--ok) 70%, var(--paper) 30%); } -.pst-item.active .pst-status.failed { color: var(--accent-soft); } - -.empty-state { - color: var(--ink-muted); - font-style: italic; - text-align: center; - padding: 20px 0; - font-size: 0.9rem; -} - -/* ============================================================ - FOLDER GROUPS IN SIDEBAR - ============================================================ */ -.archive-actions { - display: flex; - gap: 4px; -} - -.folder-group { - list-style: none; - padding: 0; - margin: 0; -} - -.folder-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 6px 4px; - margin: 14px 0 6px; - cursor: pointer; - user-select: none; - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-soft); - border-bottom: 1px solid var(--rule); - transition: color 0.15s; -} -.folder-group:first-child .folder-header { margin-top: 4px; } - -.folder-header:hover { color: var(--accent); } - -.folder-header-left { - display: flex; - align-items: center; - gap: 6px; - overflow: hidden; -} - -.folder-caret { - display: inline-block; - width: 8px; - transition: transform 0.2s; - color: var(--ink-muted); -} -.folder-group.collapsed .folder-caret { transform: rotate(-90deg); } - -.folder-name { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.folder-count { - color: var(--ink-muted); - font-size: 0.65rem; - margin-left: 4px; -} - -.folder-menu-btn { - background: none; - border: none; - color: var(--ink-muted); - cursor: pointer; - padding: 2px 6px; - font-size: 0.9rem; - line-height: 1; - opacity: 0; - transition: opacity 0.15s, color 0.15s; -} -.folder-header:hover .folder-menu-btn { opacity: 1; } -.folder-menu-btn:hover { color: var(--accent); } - -.folder-items { - display: flex; - flex-direction: column; - gap: 8px; - overflow: hidden; - transition: max-height 0.25s ease-out; - max-height: 2000px; -} -.folder-group.collapsed .folder-items { - max-height: 0; -} - -.folder-empty { - font-style: italic; - font-size: 0.8rem; - color: var(--ink-muted); - padding: 6px 4px; -} - -/* Context menu for folder/PST actions */ -.context-menu { - position: fixed; - background: var(--paper); - border: 1px solid var(--ink); - box-shadow: 4px 4px 0 var(--rule); - z-index: 500; - min-width: 160px; - padding: 4px 0; -} -.context-menu button { - display: block; - width: 100%; - text-align: left; - background: none; - border: none; - padding: 8px 14px; - font-family: var(--font-display); - font-size: 0.9rem; - color: var(--ink); - cursor: pointer; -} -.context-menu button:hover { - background: var(--paper-deep); - color: var(--accent); -} -.context-menu button.danger:hover { - color: var(--accent); -} -.context-menu hr { - border: none; - border-top: 1px solid var(--rule-soft); - margin: 4px 0; -} - -/* ============================================================ - MODAL - ============================================================ */ -.modal { - position: fixed; - inset: 0; - background: color-mix(in srgb, var(--ink) 40%, transparent); - display: flex; - align-items: center; - justify-content: center; - padding: 20px; - z-index: 200; - animation: fadeIn 0.2s ease-out; -} - -.modal-card { - background: var(--paper); - border: 1px solid var(--ink); - padding: 36px 36px 30px; - max-width: 420px; - width: 100%; - box-shadow: 8px 8px 0 var(--accent); - position: relative; -} -.modal-card h2 { - margin: 0 0 4px; - font-size: 1.5rem; - font-weight: 500; - letter-spacing: -0.015em; -} -.modal-subtitle { - margin: 0 0 24px; - font-family: var(--font-mono); - font-size: 0.75rem; - color: var(--ink-muted); - letter-spacing: 0.06em; -} -.modal-close { - position: absolute; - top: 10px; - right: 14px; - background: none; - border: none; - font-size: 1.8rem; - line-height: 1; - cursor: pointer; - color: var(--ink-muted); - transition: color 0.15s, transform 0.15s; -} -.modal-close:hover { - color: var(--accent); - transform: rotate(90deg); -} - -.auth-label select { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 12px; - border: 1px solid var(--ink); - background: var(--paper-deep); - color: var(--ink); - outline: none; - cursor: pointer; -} -.auth-label select:focus { - background: var(--paper); - box-shadow: 3px 3px 0 var(--accent); -} - -/* ============================================================ - READER - ============================================================ */ -.reader { - display: flex; - flex-direction: column; - min-height: 0; - min-width: 0; -} - -.reader-head { - padding: 28px 40px 20px; - border-bottom: 1px solid var(--rule); - background: - linear-gradient(180deg, rgba(232, 225, 211, 0.3), transparent); -} - -.reader-title h2 { - margin: 0; - font-size: 2rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1.1; -} - -.reader-meta { - margin: 6px 0 20px; - font-family: var(--font-mono); - font-size: 0.72rem; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.search-wrap { - display: grid; - grid-template-columns: 1fr 200px; - gap: 10px; -} - -#searchInput, #folderFilter { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 14px; - border: 1px solid var(--ink); - background: var(--paper); - color: var(--ink); - outline: none; - transition: box-shadow 0.15s; -} -#searchInput:focus, #folderFilter:focus { - box-shadow: 3px 3px 0 var(--accent); -} -#searchInput:disabled, #folderFilter:disabled { - border-color: var(--rule); - color: var(--ink-muted); - background: var(--paper-deep); - cursor: not-allowed; -} -#searchInput::placeholder { - color: var(--ink-muted); - font-style: italic; -} -#folderFilter { cursor: pointer; font-family: var(--font-mono); font-size: 0.8rem; } - -.reader-body { - flex: 1; - overflow-y: auto; - padding: 20px 40px; - position: relative; -} - -.reader-placeholder { - text-align: center; - padding: 80px 20px; - color: var(--ink-muted); -} -.placeholder-ornament { - font-size: 2rem; - color: var(--accent); - margin-bottom: 16px; -} -.reader-placeholder p { - font-style: italic; - font-size: 1.1rem; - margin: 0; -} - -/* ============================================================ - MESSAGE LIST - ============================================================ */ -.message-list { - display: flex; - flex-direction: column; -} - -.message-row { - padding: 16px 0; - border-bottom: 1px solid var(--rule-soft); - cursor: pointer; - transition: all 0.12s ease; - display: grid; - grid-template-columns: 180px 1fr 140px; - gap: 20px; - align-items: baseline; -} -.message-row:hover { - background: color-mix(in srgb, var(--paper-deep) 70%, transparent); - padding-left: 8px; - padding-right: 8px; -} - -.mr-sender { - font-weight: 500; - color: var(--ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 0.95rem; -} - -.mr-main { - min-width: 0; - overflow: hidden; -} -.mr-subject { - font-size: 1.05rem; - font-weight: 500; - margin: 0 0 4px; - color: var(--ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.mr-snippet { - font-size: 0.85rem; - color: var(--ink-muted); - line-height: 1.5; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - line-clamp: 2; - -webkit-box-orient: vertical; -} -.mr-snippet mark { - background: var(--highlight); - color: var(--ink); - padding: 0 2px; - font-weight: 500; -} - -.mr-meta { - text-align: right; - font-family: var(--font-mono); - font-size: 0.7rem; - color: var(--ink-muted); - letter-spacing: 0.04em; -} -.mr-folder { - margin-top: 4px; - font-size: 0.65rem; - text-transform: uppercase; - letter-spacing: 0.12em; - color: var(--accent); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.mr-attached { - display: inline-block; - margin-left: 4px; - color: var(--accent); -} - -/* ============================================================ - MESSAGE VIEW - ============================================================ */ -.message-view { - position: absolute; - inset: 20px 40px; - background: var(--paper); - border: 1px solid var(--ink); - box-shadow: 8px 8px 0 var(--rule); - overflow-y: auto; - padding: 40px 50px; - animation: slideIn 0.25s ease-out; -} - -@keyframes slideIn { - from { opacity: 0; transform: translateY(8px); } - to { opacity: 1; transform: translateY(0); } -} - -.close-btn { - position: absolute; - top: 14px; - right: 18px; - background: none; - border: none; - font-size: 2rem; - line-height: 1; - cursor: pointer; - color: var(--ink-muted); - transition: color 0.15s, transform 0.15s; -} -.close-btn:hover { - color: var(--accent); - transform: rotate(90deg); -} - -.message-header { - border-bottom: 2px solid var(--ink); - padding-bottom: 20px; - margin-bottom: 24px; -} - -.message-subject { - font-size: 1.75rem; - font-weight: 500; - line-height: 1.2; - letter-spacing: -0.015em; - margin-bottom: 16px; -} - -.message-meta { - display: grid; - grid-template-columns: 80px 1fr; - gap: 4px 20px; - margin: 0; -} -.message-meta dt { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); - padding-top: 2px; -} -.message-meta dd { - margin: 0; - font-size: 0.95rem; - color: var(--ink-soft); - word-break: break-word; -} - -.message-body { - font-family: var(--font-display); - font-size: 1rem; - line-height: 1.7; - color: var(--ink); - white-space: pre-wrap; - word-wrap: break-word; - max-width: 70ch; -} - -/* ============================================================ - PAGINATOR - ============================================================ */ -.paginator { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 40px; - border-top: 1px solid var(--rule); - font-family: var(--font-mono); - font-size: 0.8rem; - color: var(--ink-soft); - background: var(--paper-deep); -} -.paginator button { - background: none; - border: 1px solid var(--ink); - padding: 6px 14px; - cursor: pointer; - font-family: inherit; - font-size: inherit; - color: var(--ink); - transition: all 0.15s; -} -.paginator button:hover:not(:disabled) { - background: var(--ink); - color: var(--paper); -} -.paginator button:disabled { - opacity: 0.3; - cursor: not-allowed; -} - -/* ============================================================ - TOAST - ============================================================ */ -.toast { - position: fixed; - bottom: 24px; - left: 50%; - transform: translateX(-50%); - background: var(--ink); - color: var(--paper); - padding: 12px 20px; - font-family: var(--font-mono); - font-size: 0.8rem; - letter-spacing: 0.06em; - border-left: 3px solid var(--accent); - box-shadow: var(--shadow); - z-index: 1000; - animation: toastSlide 0.3s ease-out; -} -@keyframes toastSlide { - from { opacity: 0; transform: translate(-50%, 20px); } - to { opacity: 1; transform: translate(-50%, 0); } -} - -.hidden { display: none !important; } - -/* ============================================================ - AUTH SCREENS (login + setup) - ============================================================ */ -.auth-screen { - position: fixed; - inset: 0; - display: flex; - align-items: center; - justify-content: center; - padding: 20px; - background: - radial-gradient(circle at 30% 20%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 45%), - radial-gradient(circle at 70% 80%, color-mix(in srgb, var(--ink) 10%, transparent), transparent 55%), - var(--paper); - z-index: 100; - animation: fadeIn 0.3s ease-out; -} -@keyframes fadeIn { - from { opacity: 0; } - to { opacity: 1; } -} - -.auth-card { - width: 100%; - max-width: 440px; - background: var(--paper); - border: 1px solid var(--ink); - padding: 44px 40px 36px; - box-shadow: 8px 8px 0 var(--rule); - position: relative; -} -.auth-card::before { - content: ""; - position: absolute; - top: -6px; - left: -6px; - right: 6px; - bottom: 6px; - border: 1px solid var(--ink); - pointer-events: none; - z-index: -1; - background: var(--paper-deep); -} - -.auth-brand { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid var(--rule); -} -.auth-brand svg { color: var(--ink); margin: 0 auto 12px; display: block; } -.auth-brand h1 { - margin: 0; - font-size: 2rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1; -} -.auth-tagline { - margin: 8px 0 0; - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.auth-form { display: flex; flex-direction: column; gap: 16px; } - -.auth-intro { - margin: 0 0 6px; - font-size: 0.92rem; - color: var(--ink-soft); - line-height: 1.5; - font-style: italic; -} - -.auth-label { - display: flex; - flex-direction: column; - gap: 6px; -} -.auth-label > span { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-soft); -} -.auth-label small { - font-family: var(--font-mono); - font-size: 0.66rem; - color: var(--ink-muted); - letter-spacing: 0.04em; -} -.auth-label input { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 12px; - border: 1px solid var(--ink); - background: var(--paper-deep); - color: var(--ink); - outline: none; - transition: box-shadow 0.15s, background 0.15s; -} -.auth-label input:focus { - background: var(--paper); - box-shadow: 3px 3px 0 var(--accent); -} - -.auth-btn { - margin-top: 8px; - padding: 12px 18px; - font-family: var(--font-display); - font-size: 1.05rem; - font-weight: 500; - letter-spacing: -0.01em; - background: var(--ink); - color: var(--paper); - border: 1px solid var(--ink); - cursor: pointer; - transition: all 0.15s; -} -.auth-btn:hover { - background: var(--accent); - border-color: var(--accent); - transform: translate(-1px, -1px); - box-shadow: 3px 3px 0 var(--ink); -} - -.auth-error { - padding: 10px 14px; - background: color-mix(in srgb, var(--accent) 10%, transparent); - border-left: 3px solid var(--accent); - color: var(--accent); - font-size: 0.88rem; - font-family: var(--font-mono); - letter-spacing: 0.02em; -} - -/* ============================================================ - USER CHIP in masthead - ============================================================ */ -.user-chip { - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--ink-soft); - padding: 4px 10px; - border: 1px solid var(--rule); - background: var(--paper-deep); - margin-left: 12px; -} - -.logout-btn { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-soft); - background: transparent; - border: 1px solid var(--rule); - padding: 5px 10px; - cursor: pointer; - transition: all 0.15s; - margin-left: 8px; -} -.logout-btn:hover { - border-color: var(--accent); - color: var(--accent); -} - -/* ============================================================ - THEME TOGGLE - ============================================================ */ -.theme-toggle { - display: inline-flex; - align-items: center; - justify-content: center; - width: 32px; - height: 32px; - border: 1px solid var(--rule); - background: var(--paper-deep); - color: var(--ink-soft); - cursor: pointer; - padding: 0; - transition: all 0.2s ease; - position: relative; - overflow: hidden; -} -.theme-toggle:hover { - border-color: var(--accent); - color: var(--accent); - transform: translateY(-1px); -} -.theme-toggle svg { - width: 16px; - height: 16px; - transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); -} -.theme-toggle:hover svg { - transform: rotate(25deg); -} -:root[data-theme="dark"] .theme-toggle:hover svg { - transform: rotate(-25deg); -} - -/* Icon visibility — show sun in light mode, moon in dark mode */ -.theme-toggle .icon-sun { display: inline-block; } -.theme-toggle .icon-moon { display: none; } -:root[data-theme="dark"] .theme-toggle .icon-sun { display: none; } -:root[data-theme="dark"] .theme-toggle .icon-moon { display: inline-block; } - -/* Floating variant shown on auth/setup screens */ -.theme-toggle-float { - position: fixed; - top: 20px; - right: 20px; - z-index: 200; -} -/* Hide the floating toggle once the main app is visible (in-masthead toggle takes over) */ -body:has(#mainApp:not(.hidden)) .theme-toggle-float { display: none; } - -/* ============================================================ - SCROLLBARS - ============================================================ */ -::-webkit-scrollbar { width: 10px; height: 10px; } -::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { - background: var(--rule); - border: 2px solid var(--paper); -} -::-webkit-scrollbar-thumb:hover { background: var(--ink-muted); } - -/* ============================================================ - RESPONSIVE - ============================================================ */ -@media (max-width: 900px) { - .workspace { grid-template-columns: 1fr; } - .sidebar { border-right: none; border-bottom: 1px solid var(--rule); max-height: 50vh; } - .masthead { padding: 20px 24px 14px; flex-wrap: wrap; gap: 16px; } - .reader-head, .reader-body, .paginator { padding-left: 24px; padding-right: 24px; } - .search-wrap { grid-template-columns: 1fr; } - .message-row { grid-template-columns: 1fr; gap: 6px; } - .mr-meta { text-align: left; } - .message-view { inset: 12px; padding: 24px 20px; } - .message-meta { grid-template-columns: 60px 1fr; } -} diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.1 b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.1 deleted file mode 160000 index a95f71d..0000000 --- a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.1 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a95f71dc2a9a621e6bf24a525b27d6c6833d6b3a diff --git a/Forensic-Mail-Indexer/OLD_VERSIONS/v2.2/pst-indexer.zip b/Forensic-Mail-Indexer/OLD_VERSIONS/v2.2/pst-indexer.zip deleted file mode 100644 index 674bbddb3cf014bfa9f710ad9bf71b917bb83f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74484 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

    e(QZn}ZTs5I=SOYEPSwPk_NaGAVF-ullBmHW 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 diff --git a/Forensic-Mail-Indexer/README.md b/Forensic-Mail-Indexer/README.md deleted file mode 100644 index 842fd15..0000000 --- a/Forensic-Mail-Indexer/README.md +++ /dev/null @@ -1,1172 +0,0 @@ -# PST Archive — Mail Indexer - -A self-hosted, Dockerized application for **uploading Microsoft Outlook PST/OST files**, **indexing every email inside them**, and **searching the contents through a web browser** — with full **user authentication**, **multi-factor authentication (MFA)**, **encrypted-at-rest credentials**, and a **built-in administration section** for admin users. - -Designed for **forensic review, e-discovery, personal archive browsing, and migration audits** — any situation where you need to crack open a PST and actually find things inside it without loading it into Outlook. - ---- - -## What's new in v2.2 - -- **Administration now runs inside the main application** — there is no longer a - separate admin process or admin port (previously the panel ran on its own - port, e.g. mapped to `9001`). Everything is served on the single app port - (`8000` by default). -- **"Administration" button** — admin users see an **ADMINISTRATION** button in - the top-right of the masthead, next to their username. It opens the - administration section at `/admin`. The button is not shown to non-admin - users. -- **Access is restricted to admins** — the administration UI and every - `/api/admin/*` endpoint require an authenticated session **and** the `admin` - role. Non-admins receive `403`; unauthenticated requests receive `401`. -- **Footer** — every in-app page (the archive view and the administration view) - now shows `© 2026 Martinhal IT - Joao Vaz - Version 2.2`. The login/setup - screen has no footer. -- **Updating is drop-in** — extract this release over your existing install and - rebuild; see [Updating to a new version](#updating-to-a-new-version). Your - `./data` directory (database, uploaded PSTs, encryption key) is never touched. - -> Historical note: some deep-dive sections below still describe the original -> two-port design (main app + separate admin panel) for reference. Operationally, -> as of v2.2 both are the same process on one port, with administration at -> `/admin`. - ---- - -## Table of Contents - -1. [Features](#features) -2. [Quick Start](#quick-start) -3. [First-Run Setup](#first-run-setup) -4. [Running as a Daemon](#running-as-a-daemon) -5. [Theming & Dark Mode](#theming--dark-mode) -6. [Authentication & Security Model](#authentication--security-model) -7. [Admin Panel](#admin-panel) -8. [Organizing PSTs with Folders](#organizing-psts-with-folders) -9. [Folder Access Permissions](#folder-access-permissions) -10. [Multi-Factor Authentication (MFA)](#multi-factor-authentication-mfa) -11. [Encryption at Rest](#encryption-at-rest) -12. [How It Works](#how-it-works) -13. [Architecture](#architecture) -14. [Project Layout](#project-layout) -15. [Data Model](#data-model) -16. [REST API Reference](#rest-api-reference) -17. [Frontend Interfaces](#frontend-interfaces) -18. [Search Syntax](#search-syntax) -19. [Configuration](#configuration) -20. [Persistence & Backup](#persistence--backup) -21. [Troubleshooting](#troubleshooting) -22. [Performance Notes](#performance-notes) -23. [Security Considerations](#security-considerations) -24. [Extending the App](#extending-the-app) - ---- - -## Features - -### Core -- **Drag-and-drop upload** of `.pst` and `.ost` files through the browser -- **Streaming upload with progress bar** — handles multi-gigabyte archives -- **Background indexing** into SQLite with **FTS5 full-text search** (ranked, prefix-matched, with highlighted snippets) -- **Multi-archive support**: switch between uploaded PSTs; each is searched independently -- **Folder organization**: create folders in the sidebar to group related PST files (e.g. by client, case, year). Move archives between folders, rename folders, or delete folders (any archives inside are safely moved to Uncategorized) -- **Per-folder access permissions**: admins can restrict which non-admin users can view each folder. A single user can be granted access to many folders; a single folder can be shared with many users (true many-to-many) -- **Folder filter**: narrow search to any folder within the archive (Inbox, Sent Items, nested folders) -- **Full message viewer**: subject, sender, recipients, date, folder, attachments, body -- **Persistent storage**: everything lives in a mounted `./data` volume - -### Security -- **First-run setup wizard** forces creation of an initial administrator before any other action is possible -- **Password authentication** using **Argon2id** (winner of the Password Hashing Competition) with constant-time verification -- **TOTP-based MFA** (RFC 6238; compatible with Google Authenticator, Authy, 1Password, Microsoft Authenticator, and every other standard authenticator app) -- **Encryption at rest** for all user PII — usernames, password hashes, and TOTP secrets are stored as Fernet (AES-128-CBC + HMAC-SHA256) ciphertexts -- **Master key** auto-generated on first run and stored with `chmod 600`, or overridable via `MASTER_SECRET` environment variable -- **HMAC-based username lookup** — usernames are never stored in plaintext but are still indexable for login -- **JWT session cookies**, signed with an HKDF-derived sub-key, HttpOnly, SameSite=Lax -- **Rate limiting** on login attempts (10 failures per 5 minutes per IP+username) -- **Admin-only user management**: create, delete, role-change, password-reset, MFA-enroll other users -- **Admin file & folder management**: system-wide view of every uploaded PST and every folder, with create/rename/delete for folders and force-delete for any file regardless of uploader -- **Built-in administration section** for admins (at `/admin`) — restricted to the `admin` role, and lockable at the path level behind a reverse proxy/VPN - -### UI -- **Light and dark themes** on both the main app and the admin panel, with a sun/moon toggle in the masthead and on login/setup screens -- Preference persists in `localStorage` per-browser and respects the operating system's `prefers-color-scheme` on first visit -- Theme applied inline in `` before stylesheets load — **no flash of wrong theme** on page load -- Dark mode uses a custom "inked paper" palette (deep charcoal with warm paper-cream text and softened oxblood accent) — intentional character, not generic-dark -- Editorial typography (Fraunces serif + JetBrains Mono), grain overlay, responsive layout down to mobile widths - ---- - -## Quick Start - -### Prerequisites - -- Docker 20.10 or newer -- Docker Compose v2 -- A `.pst` or `.ost` file to index - -### Run (as a daemon — recommended) - -```bash -docker compose up -d --build -``` - -The `-d` flag runs the container in the background (detached). On the first run this takes **3–5 minutes** because `libpff-python` compiles a C extension from source; subsequent startups are nearly instant. - -The container is configured with `restart: unless-stopped`, so it will automatically come back up after a reboot or a crash, and keep running across Docker daemon restarts — until you explicitly stop it. - -Once the container is up: - -- **App**: `http://localhost:8000` -- **Administration**: `http://localhost:8000/admin` — or just click the - **ADMINISTRATION** button in the top-right after signing in as an admin. - (Non-admin users do not see the button and cannot reach `/admin`.) - -### Foreground mode (useful for debugging) - -```bash -docker compose up --build -``` - -This runs the container attached to your terminal so you can see logs inline. Press `Ctrl-C` to stop. - -### Tail the logs - -```bash -docker compose logs -f # follow both streams -docker compose logs -f pst-indexer # explicit service name -``` - -### Check status - -```bash -docker compose ps # is it running? -docker compose top # which processes? -``` - -### Stop - -```bash -docker compose stop # stop, keep data, keep container -docker compose down # stop and remove the container, keep data volume -``` - -### Full reset - -```bash -docker compose down -rm -rf ./data # erases everything including users and the master key -docker compose up -d --build -``` - -### Restart / update - -```bash -# After editing code or pulling new images: -docker compose up -d --build # rebuild & restart with one command -# Or just restart without rebuilding: -docker compose restart -``` - ---- - -## First-Run Setup - -On the very first visit to `http://localhost:8000`, you will be presented with a **setup wizard** that asks you to create the initial administrator: - -1. Choose a username (3–64 characters) -2. Choose a password (8+ characters — use a passphrase you'll remember) -3. Confirm the password - -The setup endpoint is only callable **while the users table is empty**. Once the first admin is created, the endpoint returns `409 Conflict` and is effectively disabled. - -After setup, you are automatically signed in and landed on the main app. - -**Heads up:** the very first account created through the setup wizard is an **administrator**. After that, sign in normally and use the **ADMINISTRATION** button (top-right) to manage users, folders, files, and permissions. The administration section and its API are only accessible to admin users. - ---- - -## Running as a Daemon - -By default, this app is designed to **run as a long-lived background service**. The `docker-compose.yml` sets `restart: unless-stopped`, which means once started, the container will: - -- Keep running after you close your terminal -- Automatically restart if the process crashes -- Automatically restart when the host reboots and Docker comes back up -- **Not** restart if you explicitly stop it with `docker compose stop` (hence "unless-stopped") - -### Starting the daemon - -```bash -docker compose up -d --build -``` - -The `-d` flag is short for "detached" — the container is launched in the background and the command returns immediately. Your terminal is free to do other things; the container keeps running. - -### Verifying it's running - -```bash -docker compose ps -``` - -You should see output like: - -``` -NAME IMAGE STATUS PORTS -pst-indexer pst-indexer-pst-indexer Up 2 minutes (healthy) 0.0.0.0:8000->8000/tcp -``` - -The `(healthy)` flag comes from the built-in healthcheck, which probes both `/api/health` endpoints every 30 seconds. - -### Watching logs - -Since the container is detached, you won't see logs in your terminal by default. Attach to them on demand: - -```bash -docker compose logs # print recent logs and exit -docker compose logs -f # follow (live tail), Ctrl-C to detach -docker compose logs -f --tail=100 # follow, starting from the last 100 lines -docker compose logs --since 1h # only logs from the last hour -``` - -Detaching from `-f` does **not** stop the container — it just stops showing you the logs. - -### Stopping - -```bash -docker compose stop # stop the container but keep it around -docker compose start # start it again if previously stopped -docker compose restart # stop and start in one command -docker compose down # stop and remove the container (data volume is kept) -docker compose down -v # stop, remove container, AND remove anonymous volumes -``` - -None of these delete your `./data` directory — that's a bind mount, not a Docker-managed volume, so it's always yours. - -### Survives reboots - -Because `restart: unless-stopped` is set, after a host reboot Docker will automatically start the container as soon as the Docker daemon comes up. Nothing manual required on your part. - -If you ever explicitly stopped it with `docker compose stop`, Docker will *not* auto-start it after reboot (that's the whole point of "unless-stopped"). Run `docker compose start` or `docker compose up -d` to bring it back. - -### Updating to a new version - -This release is a **drop-in update**: extract the archive over your existing -installation directory (the one containing `docker-compose.yml` and your -`data/` folder) and rebuild. The archive contains only application code — it -has **no `data/` directory**, so your database, uploaded PSTs, and encryption -key are never overwritten. - -```bash -# From the parent directory that holds your existing install folder: -# (the folder with docker-compose.yml and data/ inside it) -7z x pst-archive-v2.2.7z # extract, overwriting code files in place - -# Then rebuild and recreate the container: -cd -docker compose up -d --build -``` - -Docker Compose compares the current image to the built one; if they differ, it rebuilds and recreates the container with zero-downtime-style replacement. Your `./data` volume is preserved throughout. - -**Notes for this update (v2.2):** - -- The separate admin port is gone. If your `docker-compose.yml` previously - published a second port for the admin panel (for example `"9001:8001"` or - `"8001:8001"`), that line has been removed in the shipped compose file. If you - maintain a customized compose file, simply delete the admin-port line — the - administration section is now served on the main port at `/admin`. -- No database migration is required. The schema is unchanged, so all existing - users, folders, files, permissions, and MFA enrollments carry over as-is. -- A rebuild (`--build`) is required so the updated backend and frontend are - baked into the image. - ---- - -## Theming & Dark Mode - -Both the main app and the admin panel support **light and dark themes**, with a sun/moon toggle visible in the masthead (when signed in) and floating in the top-right corner on the login/setup screens. - -### How the toggle works - -- Click the icon to flip between themes -- Choice is saved to `localStorage["pst-theme"]` in your browser -- On a fresh browser (nothing saved), the app respects your operating system's `prefers-color-scheme` setting -- The theme is applied by an inline ` - - -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Forensic-Mail-Indexer/backend/admin_app.py b/Forensic-Mail-Indexer/backend/admin_app.py deleted file mode 100644 index 917217b..0000000 --- a/Forensic-Mail-Indexer/backend/admin_app.py +++ /dev/null @@ -1,597 +0,0 @@ -""" -PST Indexer — Admin Panel (DEPRECATED / no longer launched). - -As of v2.2 the administration section runs inside the main application -(app.py), served at /admin and reachable via the "Administration" button that -is shown to admin users. The entrypoint no longer starts this module, and no -separate admin port is exposed. This file is retained only for reference and -for backwards compatibility with any custom tooling that imported it; it is -safe to ignore. See app.py for the live administration endpoints -(namespaced under /api/admin). - -Original description below. - -Separate FastAPI instance on its own port so operators can place it behind a -more restrictive firewall rule or VPN than the main app. - -Exposes: -- Admin login (separate session cookie, scoped "admin") -- List, create, delete users -- Toggle admin role -- Reset passwords -- Enroll / confirm / disable MFA for any user (admin-managed flow) -- Self-service MFA for the currently logged-in admin -""" -import io -import os -from pathlib import Path -from typing import Optional - -import qrcode -from fastapi import ( - Depends, FastAPI, HTTPException, Request, Response, status, -) -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import StreamingResponse, JSONResponse -from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel - -import auth -from auth import ( - ADMIN_SESSION_COOKIE_NAME, SESSION_TTL_SECONDS, - User, begin_mfa_enrollment, confirm_mfa_enrollment, count_admins, - count_users, create_session_token, create_user, delete_user, - disable_mfa, find_user_by_id, find_user_by_username, - get_totp_secret, list_users, login_limiter, record_login, - require_admin_user, set_user_role, totp_provisioning_uri, - update_password, verify_password, verify_totp, -) - -ADMIN_FRONTEND_DIR = Path(os.environ.get("ADMIN_FRONTEND_DIR", "/app/admin_frontend")) -COOKIE_SECURE = os.environ.get("COOKIE_SECURE", "false").lower() == "true" - -app = FastAPI(title="PST Indexer Admin Panel") -app.add_middleware( - CORSMiddleware, - allow_origins=[], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.on_event("startup") -def _startup(): - auth.init_auth_schema() - - -def _set_admin_cookie(response: Response, token: str): - response.set_cookie( - key=ADMIN_SESSION_COOKIE_NAME, - value=token, - max_age=SESSION_TTL_SECONDS, - httponly=True, - secure=COOKIE_SECURE, - samesite="lax", - path="/", - ) - - -def _clear_admin_cookie(response: Response): - response.delete_cookie(key=ADMIN_SESSION_COOKIE_NAME, path="/") - - -# --------------------------------------------------------------------------- -# Auth -# --------------------------------------------------------------------------- -class LoginPayload(BaseModel): - username: str - password: str - totp_code: Optional[str] = None - - -@app.get("/api/health") -def health(): - return {"status": "ok", "admins": count_admins(), "users": count_users()} - - -@app.get("/api/setup/status") -def setup_status(): - """True if no users exist. Admin UI redirects to main app to complete setup.""" - return {"needs_setup": count_users() == 0} - - -@app.post("/api/login") -def admin_login(payload: LoginPayload, request: Request, response: Response): - ip = request.client.host if request.client else "unknown" - rate_key = f"admin:{ip}:{payload.username.lower()}" - if not login_limiter.check(rate_key): - raise HTTPException(429, "Too many login attempts. Please wait a few minutes.") - - found = find_user_by_username(payload.username) - if not found: - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - user, pw_hash = found - - if not verify_password(pw_hash, payload.password): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - if not user.is_admin: - raise HTTPException(403, "Admin access required") - - if user.mfa_enabled: - if not payload.totp_code: - return JSONResponse( - status_code=401, - content={"detail": "MFA required", "mfa_required": True}, - ) - secret = get_totp_secret(user.id) - if not secret or not verify_totp(secret, payload.totp_code): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid MFA code") - - login_limiter.reset(rate_key) - record_login(user.id) - token = create_session_token(user, scope="admin") - _set_admin_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/logout") -def admin_logout(response: Response): - _clear_admin_cookie(response) - return {"ok": True} - - -@app.get("/api/me") -def me(user: User = Depends(require_admin_user)): - return {"user": user.public_dict()} - - -# --------------------------------------------------------------------------- -# User management -# --------------------------------------------------------------------------- -class CreateUserPayload(BaseModel): - username: str - password: str - role: str = "user" - - -class UpdatePasswordPayload(BaseModel): - password: str - - -class UpdateRolePayload(BaseModel): - role: str - - -@app.get("/api/users") -def api_list_users(_: User = Depends(require_admin_user)): - return [u.public_dict() for u in list_users()] - - -@app.post("/api/users") -def api_create_user( - payload: CreateUserPayload, - admin: User = Depends(require_admin_user), -): - try: - user = create_user(payload.username, payload.password, role=payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - return user.public_dict() - - -@app.delete("/api/users/{user_id}") -def api_delete_user(user_id: str, admin: User = Depends(require_admin_user)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - # Prevent deleting yourself - if target.id == admin.id: - raise HTTPException(400, "You cannot delete your own account") - - # Prevent deleting the last admin - if target.is_admin and count_admins() <= 1: - raise HTTPException(400, "Cannot delete the last remaining admin") - - delete_user(user_id) - return {"deleted": user_id} - - -@app.put("/api/users/{user_id}/role") -def api_set_role( - user_id: str, - payload: UpdateRolePayload, - admin: User = Depends(require_admin_user), -): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - if target.id == admin.id and payload.role != "admin": - raise HTTPException(400, "You cannot demote your own account") - - if (target.is_admin and payload.role != "admin" - and count_admins() <= 1): - raise HTTPException(400, "Cannot demote the last remaining admin") - - try: - set_user_role(user_id, payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - - return find_user_by_id(user_id).public_dict() - - -@app.put("/api/users/{user_id}/password") -def api_update_password( - user_id: str, - payload: UpdatePasswordPayload, - admin: User = Depends(require_admin_user), -): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - try: - update_password(user_id, payload.password) - except ValueError as e: - raise HTTPException(400, str(e)) - return {"ok": True} - - -# --------------------------------------------------------------------------- -# MFA management -# --------------------------------------------------------------------------- -class ConfirmMfaPayload(BaseModel): - totp_code: str - - -@app.post("/api/users/{user_id}/mfa/begin") -def api_begin_mfa(user_id: str, admin: User = Depends(require_admin_user)): - """Provision a new TOTP secret for the target user (admin action). - Returns the secret + otpauth URI so the admin can show it to the user.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret, uri = begin_mfa_enrollment(user_id) - return { - "secret": secret, - "otpauth_uri": uri, - "username": target.username, - "qr_url": f"/api/users/{user_id}/mfa/qr", - } - - -@app.get("/api/users/{user_id}/mfa/qr") -def api_mfa_qr(user_id: str, admin: User = Depends(require_admin_user)): - """Render a PNG QR code of the target user's current (unconfirmed) TOTP URI.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret = get_totp_secret(user_id) - if not secret: - raise HTTPException(400, "No MFA enrollment in progress") - uri = totp_provisioning_uri(secret, target.username) - - qr = qrcode.QRCode(box_size=6, border=2) - qr.add_data(uri) - qr.make(fit=True) - img = qr.make_image(fill_color="black", back_color="white") - buf = io.BytesIO() - img.save(buf, format="PNG") - buf.seek(0) - return StreamingResponse(buf, media_type="image/png") - - -@app.post("/api/users/{user_id}/mfa/confirm") -def api_confirm_mfa( - user_id: str, - payload: ConfirmMfaPayload, - admin: User = Depends(require_admin_user), -): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - if not confirm_mfa_enrollment(user_id, payload.totp_code): - raise HTTPException(400, "Invalid MFA code — enrollment not confirmed") - return find_user_by_id(user_id).public_dict() - - -@app.post("/api/users/{user_id}/mfa/disable") -def api_disable_mfa(user_id: str, admin: User = Depends(require_admin_user)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - disable_mfa(user_id) - return find_user_by_id(user_id).public_dict() - - -# --------------------------------------------------------------------------- -# Folder management (admin) -# --------------------------------------------------------------------------- -import uuid as _uuid -from datetime import datetime, timezone -from pathlib import Path as _Path -from auth import get_db - - -UPLOAD_DIR = _Path(os.environ.get("DATA_DIR", "/app/data")) / "uploads" - - -class AdminFolderPayload(BaseModel): - name: str - - -def _validate_name(name: str) -> str: - name = (name or "").strip() - if not name: - raise HTTPException(400, "Folder name cannot be empty") - if len(name) > 80: - raise HTTPException(400, "Folder name too long (max 80 characters)") - return name - - -@app.get("/api/folders") -def admin_list_folders(_: User = Depends(require_admin_user)): - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.post("/api/folders") -def admin_create_folder(payload: AdminFolderPayload, - admin: User = Depends(require_admin_user)): - name = _validate_name(payload.name) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE", (name,) - ).fetchone() - if existing: - raise HTTPException(409, "A folder with that name already exists") - folder_id = _uuid.uuid4().hex - conn.execute( - """INSERT INTO pst_folders (id, name, created_at, created_by) - VALUES (?, ?, ?, ?)""", - (folder_id, name, datetime.now(timezone.utc).isoformat(), admin.id), - ) - conn.commit() - return {"id": folder_id, "name": name, "file_count": 0} - - -@app.put("/api/folders/{folder_id}") -def admin_rename_folder(folder_id: str, payload: AdminFolderPayload, - admin: User = Depends(require_admin_user)): - name = _validate_name(payload.name) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - clash = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE AND id != ?", - (name, folder_id), - ).fetchone() - if clash: - raise HTTPException(409, "A folder with that name already exists") - conn.execute("UPDATE pst_folders SET name = ? WHERE id = ?", - (name, folder_id)) - conn.commit() - return {"id": folder_id, "name": name} - - -@app.delete("/api/folders/{folder_id}") -def admin_delete_folder(folder_id: str, - admin: User = Depends(require_admin_user)): - """Delete a folder. PSTs inside it become uncategorized (folder_id = NULL).""" - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = NULL WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM pst_folders WHERE id = ?", (folder_id,)) - conn.commit() - return {"deleted": folder_id} - - -# --------------------------------------------------------------------------- -# PST file management (admin) -# --------------------------------------------------------------------------- -@app.get("/api/pst-files") -def admin_list_pst_files(_: User = Depends(require_admin_user)): - with get_db() as conn: - rows = conn.execute( - """SELECT p.id, p.original_name, p.uploaded_at, p.size_bytes, - p.status, p.message_count, p.error, - p.folder_id, f.name AS folder_name, - p.uploaded_by - FROM pst_files p - LEFT JOIN pst_folders f ON f.id = p.folder_id - ORDER BY p.uploaded_at DESC""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.delete("/api/pst-files/{pst_id}") -def admin_delete_pst(pst_id: str, admin: User = Depends(require_admin_user)): - with get_db() as conn: - row = conn.execute( - "SELECT filename FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - raise HTTPException(404, "PST not found") - conn.execute("DELETE FROM messages WHERE pst_id = ?", (pst_id,)) - conn.execute("DELETE FROM pst_files WHERE id = ?", (pst_id,)) - conn.commit() - try: - (UPLOAD_DIR / row["filename"]).unlink(missing_ok=True) - except Exception: - pass - return {"deleted": pst_id} - - -class AdminAssignPayload(BaseModel): - folder_id: Optional[str] = None - - -@app.put("/api/pst-files/{pst_id}/folder") -def admin_assign_pst_to_folder(pst_id: str, payload: AdminAssignPayload, - admin: User = Depends(require_admin_user)): - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_files WHERE id = ?", - (pst_id,)).fetchone(): - raise HTTPException(404, "PST not found") - if payload.folder_id: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (payload.folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = ? WHERE id = ?", - (payload.folder_id, pst_id)) - conn.commit() - return {"pst_id": pst_id, "folder_id": payload.folder_id} - - -# --------------------------------------------------------------------------- -# Folder permissions (admin-only) -# Controls which user can access which folder. -# Admins ALWAYS have access to every folder regardless of this table — -# these grants are for non-admin users. -# --------------------------------------------------------------------------- -class PermissionToggle(BaseModel): - granted: bool - - -@app.get("/api/permissions") -def admin_list_permissions(_: User = Depends(require_admin_user)): - """Return the full matrix: users, folders, and all grants.""" - with get_db() as conn: - users = conn.execute("SELECT * FROM users ORDER BY created_at ASC").fetchall() - folders = conn.execute( - "SELECT id, name FROM pst_folders ORDER BY name COLLATE NOCASE" - ).fetchall() - grants = conn.execute( - "SELECT user_id, folder_id, granted_at FROM folder_permissions" - ).fetchall() - - from auth import _row_to_user - user_list = [] - for u in users: - pub = _row_to_user(u).public_dict() - user_list.append(pub) - - return { - "users": user_list, - "folders": [dict(f) for f in folders], - "grants": [dict(g) for g in grants], - } - - -@app.get("/api/users/{user_id}/folders") -def admin_user_folders(user_id: str, _: User = Depends(require_admin_user)): - """Folders a given user has been granted.""" - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, p.granted_at - FROM folder_permissions p - JOIN pst_folders f ON f.id = p.folder_id - WHERE p.user_id = ? - ORDER BY f.name COLLATE NOCASE""", - (user_id,), - ).fetchall() - return { - "user": target.public_dict(), - "folders": [dict(r) for r in rows], - } - - -@app.get("/api/folders/{folder_id}/users") -def admin_folder_users(folder_id: str, _: User = Depends(require_admin_user)): - """Users granted on a given folder.""" - with get_db() as conn: - folder = conn.execute( - "SELECT id, name FROM pst_folders WHERE id = ?", (folder_id,) - ).fetchone() - if not folder: - raise HTTPException(404, "Folder not found") - - grant_rows = conn.execute( - """SELECT user_id, granted_at - FROM folder_permissions WHERE folder_id = ?""", - (folder_id,), - ).fetchall() - - # Hydrate user details (usernames are encrypted — need decrypt via find_user_by_id) - users_out = [] - for r in grant_rows: - u = find_user_by_id(r["user_id"]) - if u: - users_out.append({ - **u.public_dict(), - "granted_at": r["granted_at"], - }) - users_out.sort(key=lambda x: x["username"].lower()) - return { - "folder": dict(folder), - "users": users_out, - } - - -@app.put("/api/permissions/{user_id}/{folder_id}") -def admin_toggle_permission( - user_id: str, - folder_id: str, - payload: PermissionToggle, - admin: User = Depends(require_admin_user), -): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - - if target.is_admin: - # Admins implicitly have access to everything; refuse explicit grants - # so the UI doesn't confuse admins with checked-but-meaningless rows. - raise HTTPException( - 400, - "Admins have access to all folders automatically; permissions " - "only apply to non-admin users.", - ) - - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - - if payload.granted: - conn.execute( - """INSERT OR IGNORE INTO folder_permissions - (user_id, folder_id, granted_at, granted_by) - VALUES (?, ?, ?, ?)""", - (user_id, folder_id, - datetime.now(timezone.utc).isoformat(), admin.id), - ) - else: - conn.execute( - "DELETE FROM folder_permissions WHERE user_id = ? AND folder_id = ?", - (user_id, folder_id), - ) - conn.commit() - - return {"user_id": user_id, "folder_id": folder_id, "granted": payload.granted} - - -# --------------------------------------------------------------------------- -# Static admin frontend -# --------------------------------------------------------------------------- -if ADMIN_FRONTEND_DIR.exists(): - app.mount("/", StaticFiles(directory=str(ADMIN_FRONTEND_DIR), html=True), name="admin") diff --git a/Forensic-Mail-Indexer/backend/app.py b/Forensic-Mail-Indexer/backend/app.py deleted file mode 100644 index 10cbd89..0000000 --- a/Forensic-Mail-Indexer/backend/app.py +++ /dev/null @@ -1,1234 +0,0 @@ -""" -PST Indexer — Main application (port 8000). - -Serves: -- The web UI (login, setup wizard, archive browser) -- REST API for PST upload, indexing, search -- All data-access endpoints require an authenticated session - -First-run behavior: -- If no users exist, the UI routes users to a setup wizard. -- /api/setup is only callable while the users table is empty; after the first - admin is created, the endpoint returns 409. -""" -import io -import os -import re -import sqlite3 -import uuid -import asyncio -from datetime import datetime, timezone -from pathlib import Path -from typing import Optional - -import aiofiles -import pypff -import qrcode -from fastapi import ( - BackgroundTasks, Depends, FastAPI, File, HTTPException, - Request, Response, UploadFile, status, -) -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import JSONResponse, FileResponse, StreamingResponse -from fastapi.staticfiles import StaticFiles -from pydantic import BaseModel - -import auth -from auth import ( - SESSION_COOKIE_NAME, SESSION_TTL_SECONDS, - User, count_users, count_admins, create_user, find_user_by_username, - find_user_by_id, get_totp_secret, verify_password, verify_totp, - record_login, create_session_token, login_limiter, require_app_user, - require_app_admin, get_db, - # Administration (merged in from the former standalone admin panel) - begin_mfa_enrollment, confirm_mfa_enrollment, delete_user, disable_mfa, - list_users, set_user_role, totp_provisioning_uri, update_password, -) - -# --------------------------------------------------------------------------- -# Config -# --------------------------------------------------------------------------- -DATA_DIR = Path(os.environ.get("DATA_DIR", "/app/data")) -UPLOAD_DIR = DATA_DIR / "uploads" -FRONTEND_DIR = Path(os.environ.get("FRONTEND_DIR", "/app/frontend")) -ADMIN_FRONTEND_DIR = Path(os.environ.get("ADMIN_FRONTEND_DIR", "/app/admin_frontend")) - -UPLOAD_DIR.mkdir(parents=True, exist_ok=True) -DATA_DIR.mkdir(parents=True, exist_ok=True) - -# Cookie security. Flip to True when serving over HTTPS. -COOKIE_SECURE = os.environ.get("COOKIE_SECURE", "false").lower() == "true" - - -# --------------------------------------------------------------------------- -# App DB schema (messages + pst_files) -# --------------------------------------------------------------------------- -def init_app_schema(): - with get_db() as conn: - conn.executescript(""" - CREATE TABLE IF NOT EXISTS pst_folders ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - created_at TEXT NOT NULL, - created_by TEXT - ); - - CREATE TABLE IF NOT EXISTS folder_permissions ( - user_id TEXT NOT NULL, - folder_id TEXT NOT NULL, - granted_at TEXT NOT NULL, - granted_by TEXT, - PRIMARY KEY (user_id, folder_id) - ); - - CREATE INDEX IF NOT EXISTS idx_folder_perms_user ON folder_permissions(user_id); - CREATE INDEX IF NOT EXISTS idx_folder_perms_folder ON folder_permissions(folder_id); - - CREATE TABLE IF NOT EXISTS pst_files ( - id TEXT PRIMARY KEY, - filename TEXT NOT NULL, - original_name TEXT NOT NULL, - uploaded_at TEXT NOT NULL, - size_bytes INTEGER NOT NULL, - status TEXT NOT NULL DEFAULT 'pending', - message_count INTEGER DEFAULT 0, - error TEXT, - uploaded_by TEXT, - folder_id TEXT - ); - - CREATE TABLE IF NOT EXISTS messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - pst_id TEXT NOT NULL, - folder TEXT, - subject TEXT, - sender TEXT, - recipients TEXT, - sent_date TEXT, - body TEXT, - attachments TEXT, - FOREIGN KEY (pst_id) REFERENCES pst_files(id) ON DELETE CASCADE - ); - - CREATE INDEX IF NOT EXISTS idx_messages_pst ON messages(pst_id); - CREATE INDEX IF NOT EXISTS idx_messages_sent_date ON messages(sent_date); - CREATE INDEX IF NOT EXISTS idx_pst_files_folder ON pst_files(folder_id); - - CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5( - subject, sender, recipients, body, folder, - content='messages', - content_rowid='id', - tokenize='porter unicode61' - ); - - CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN - INSERT INTO messages_fts(rowid, subject, sender, recipients, body, folder) - VALUES (new.id, new.subject, new.sender, new.recipients, new.body, new.folder); - END; - - CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN - INSERT INTO messages_fts(messages_fts, rowid, subject, sender, recipients, body, folder) - VALUES ('delete', old.id, old.subject, old.sender, old.recipients, old.body, old.folder); - END; - """) - # Backfill: add folder_id column to DBs created before this feature existed. - cols = [r["name"] for r in conn.execute("PRAGMA table_info(pst_files)").fetchall()] - if "folder_id" not in cols: - conn.execute("ALTER TABLE pst_files ADD COLUMN folder_id TEXT") - conn.execute("CREATE INDEX IF NOT EXISTS idx_pst_files_folder ON pst_files(folder_id)") - conn.commit() - - -# --------------------------------------------------------------------------- -# Access control helpers — which folders / PSTs is a given user allowed to see? -# -# Rules: -# - Admins see everything. -# - Regular users see only folders they have been explicitly granted, -# plus the implicit "Uncategorized" bucket (folder_id = NULL) — this is -# deliberately shared because otherwise newly-uploaded PSTs would be -# invisible until someone moved them into a permitted folder. -# - A PST is visible iff its folder is visible (or the PST is uncategorized). -# --------------------------------------------------------------------------- -def allowed_folder_ids_for(user) -> set[str]: - """Return the set of folder_ids a user is explicitly permitted on. - For admins this is not used — they see everything unconditionally.""" - with get_db() as conn: - rows = conn.execute( - "SELECT folder_id FROM folder_permissions WHERE user_id = ?", - (user.id,), - ).fetchall() - return {r["folder_id"] for r in rows} - - -def user_can_see_folder(user, folder_id: Optional[str]) -> bool: - """Can this user see content inside this folder? folder_id may be None - (Uncategorized), which is visible to everyone.""" - if user.is_admin: - return True - if folder_id is None: - return True # Uncategorized is shared - return folder_id in allowed_folder_ids_for(user) - - -def user_can_see_pst(user, pst_id: str) -> bool: - if user.is_admin: - return True - with get_db() as conn: - row = conn.execute( - "SELECT folder_id FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - return False - return user_can_see_folder(user, row["folder_id"]) - - -# --------------------------------------------------------------------------- -# PST indexing helpers (unchanged from pre-auth version) -# --------------------------------------------------------------------------- -def _safe_str(value) -> str: - if value is None: - return "" - if isinstance(value, bytes): - try: - return value.decode("utf-8", errors="replace") - except Exception: - return value.decode("latin-1", errors="replace") - return str(value) - - -def _extract_recipients(message) -> str: - parts = [] - try: - headers = _safe_str(getattr(message, "transport_headers", "")) - if headers: - for line in headers.split("\n"): - low = line.lower() - if low.startswith("to:") or low.startswith("cc:") or low.startswith("bcc:"): - parts.append(line.strip()) - except Exception: - pass - return " | ".join(parts) if parts else "" - - -def _extract_body(message) -> str: - for attr in ("plain_text_body", "html_body", "rtf_body"): - try: - body = getattr(message, attr, None) - if body: - text = _safe_str(body) - if attr == "html_body": - text = re.sub(r"<[^>]+>", " ", text) - text = re.sub(r"\s+", " ", text).strip() - if text: - return text - except Exception: - continue - return "" - - -def _extract_sender(message) -> str: - for attr in ("sender_name", "sender_email_address"): - try: - v = _safe_str(getattr(message, attr, "")) - if v: - return v - except Exception: - continue - try: - headers = _safe_str(getattr(message, "transport_headers", "")) - for line in headers.split("\n"): - if line.lower().startswith("from:"): - return line.split(":", 1)[1].strip() - except Exception: - pass - return "" - - -def _extract_date(message) -> Optional[str]: - try: - d = getattr(message, "delivery_time", None) or getattr(message, "client_submit_time", None) - if d: - if isinstance(d, datetime): - return d.isoformat() - return _safe_str(d) - except Exception: - pass - return None - - -def _extract_attachments(message) -> str: - names = [] - try: - count = getattr(message, "number_of_attachments", 0) - for i in range(count): - try: - att = message.get_attachment(i) - name = _safe_str(getattr(att, "name", "") or getattr(att, "long_filename", "")) - if name: - names.append(name) - except Exception: - continue - except Exception: - pass - return " | ".join(names) - - -def _walk_folders(folder, path=""): - try: - name = _safe_str(getattr(folder, "name", "") or "") - except Exception: - name = "" - current_path = f"{path}/{name}" if name else (path or "/") - try: - for i in range(folder.number_of_sub_messages): - try: - msg = folder.get_sub_message(i) - yield current_path, msg - except Exception: - continue - except Exception: - pass - try: - for i in range(folder.number_of_sub_folders): - try: - sub = folder.get_sub_folder(i) - yield from _walk_folders(sub, current_path) - except Exception: - continue - except Exception: - pass - - -def index_pst_file(pst_id: str, file_path: Path): - pff = None - try: - pff = pypff.file() - pff.open(str(file_path)) - root = pff.get_root_folder() - count = 0 - batch = [] - BATCH_SIZE = 500 - - with get_db() as conn: - for folder_path, msg in _walk_folders(root): - try: - batch.append(( - pst_id, folder_path, - _safe_str(getattr(msg, "subject", "")), - _extract_sender(msg), - _extract_recipients(msg), - _extract_date(msg), - _extract_body(msg), - _extract_attachments(msg), - )) - count += 1 - if len(batch) >= BATCH_SIZE: - conn.executemany( - """INSERT INTO messages - (pst_id, folder, subject, sender, recipients, sent_date, body, attachments) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", - batch, - ) - conn.commit() - batch.clear() - except Exception as e: - print(f"[index] skip: {e}") - continue - - if batch: - conn.executemany( - """INSERT INTO messages - (pst_id, folder, subject, sender, recipients, sent_date, body, attachments) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", - batch, - ) - conn.commit() - - conn.execute( - "UPDATE pst_files SET status = ?, message_count = ? WHERE id = ?", - ("ready", count, pst_id), - ) - conn.commit() - - print(f"[index] {pst_id}: {count} messages") - except Exception as e: - print(f"[index] failed: {e}") - with get_db() as conn: - conn.execute( - "UPDATE pst_files SET status = ?, error = ? WHERE id = ?", - ("failed", str(e), pst_id), - ) - conn.commit() - finally: - if pff is not None: - try: - pff.close() - except Exception: - pass - - -# --------------------------------------------------------------------------- -# FastAPI -# --------------------------------------------------------------------------- -app = FastAPI(title="PST Indexer") - -app.add_middleware( - CORSMiddleware, - allow_origins=[], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.on_event("startup") -def _startup(): - auth.init_auth_schema() - init_app_schema() - - -def _set_session_cookie(response: Response, token: str): - response.set_cookie( - key=SESSION_COOKIE_NAME, - value=token, - max_age=SESSION_TTL_SECONDS, - httponly=True, - secure=COOKIE_SECURE, - samesite="lax", - path="/", - ) - - -def _clear_session_cookie(response: Response): - response.delete_cookie(key=SESSION_COOKIE_NAME, path="/") - - -# ----- Setup / auth endpoints ----- - -class SetupRequest(BaseModel): - username: str - password: str - - -class LoginRequest(BaseModel): - username: str - password: str - totp_code: Optional[str] = None - - -@app.get("/api/setup/status") -def setup_status(): - """Lets the frontend decide whether to show the setup wizard.""" - return {"needs_setup": count_users() == 0} - - -@app.post("/api/setup") -def setup_admin(payload: SetupRequest, response: Response): - if count_users() > 0: - raise HTTPException(status.HTTP_409_CONFLICT, "Setup has already been completed") - - try: - user = create_user(payload.username, payload.password, role="admin") - except ValueError as e: - raise HTTPException(400, str(e)) - - record_login(user.id) - token = create_session_token(user, scope="app") - _set_session_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/login") -def login(payload: LoginRequest, request: Request, response: Response): - ip = request.client.host if request.client else "unknown" - rate_key = f"{ip}:{payload.username.lower()}" - if not login_limiter.check(rate_key): - raise HTTPException(429, "Too many login attempts. Please wait a few minutes.") - - found = find_user_by_username(payload.username) - if not found: - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - user, stored_pw_hash = found - if not verify_password(stored_pw_hash, payload.password): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid credentials") - - if user.mfa_enabled: - if not payload.totp_code: - # Tell the client MFA is required - return JSONResponse( - status_code=401, - content={"detail": "MFA required", "mfa_required": True}, - ) - secret = get_totp_secret(user.id) - if not secret or not verify_totp(secret, payload.totp_code): - login_limiter.record(rate_key) - raise HTTPException(401, "Invalid MFA code") - - login_limiter.reset(rate_key) - record_login(user.id) - token = create_session_token(user, scope="app") - _set_session_cookie(response, token) - return {"user": user.public_dict()} - - -@app.post("/api/logout") -def logout(response: Response): - _clear_session_cookie(response) - return {"ok": True} - - -@app.get("/api/me") -def me(user: User = Depends(require_app_user)): - return {"user": user.public_dict()} - - -# ----- PST endpoints (all require auth) ----- - -@app.get("/api/health") -def health(): - return {"status": "ok"} - - -@app.get("/api/pst-files") -def list_pst_files(user: User = Depends(require_app_user)): - with get_db() as conn: - if user.is_admin: - rows = conn.execute( - """SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files ORDER BY uploaded_at DESC""" - ).fetchall() - else: - allowed = allowed_folder_ids_for(user) - if allowed: - placeholders = ",".join("?" for _ in allowed) - rows = conn.execute( - f"""SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files - WHERE folder_id IS NULL OR folder_id IN ({placeholders}) - ORDER BY uploaded_at DESC""", - list(allowed), - ).fetchall() - else: - rows = conn.execute( - """SELECT id, original_name, uploaded_at, size_bytes, status, - message_count, error, folder_id - FROM pst_files WHERE folder_id IS NULL - ORDER BY uploaded_at DESC""" - ).fetchall() - return [dict(r) for r in rows] - - -# ----- Folder endpoints (shared with admin panel) ----- - -class FolderCreate(BaseModel): - name: str - - -class FolderRename(BaseModel): - name: str - - -class FolderAssign(BaseModel): - folder_id: Optional[str] = None # null = move to uncategorized - - -def _validate_folder_name(name: str) -> str: - name = (name or "").strip() - if not name: - raise HTTPException(400, "Folder name cannot be empty") - if len(name) > 80: - raise HTTPException(400, "Folder name too long (max 80 characters)") - return name - - -@app.get("/api/folders") -def list_folders(user: User = Depends(require_app_user)): - with get_db() as conn: - if user.is_admin: - rows = conn.execute( - """SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""" - ).fetchall() - else: - allowed = allowed_folder_ids_for(user) - if not allowed: - return [] - placeholders = ",".join("?" for _ in allowed) - rows = conn.execute( - f"""SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - WHERE f.id IN ({placeholders}) - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""", - list(allowed), - ).fetchall() - return [dict(r) for r in rows] - - -@app.post("/api/folders") -def create_folder(payload: FolderCreate, user: User = Depends(require_app_user)): - # Only admins can create folders — the admin panel is the authoritative - # management surface. (We still allow creation from the main app sidebar, - # but only for admin users.) - if not user.is_admin: - raise HTTPException(403, "Only administrators can create folders") - name = _validate_folder_name(payload.name) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE", (name,) - ).fetchone() - if existing: - raise HTTPException(409, "A folder with that name already exists") - folder_id = uuid.uuid4().hex - conn.execute( - """INSERT INTO pst_folders (id, name, created_at, created_by) - VALUES (?, ?, ?, ?)""", - (folder_id, name, datetime.now(timezone.utc).isoformat(), user.id), - ) - conn.commit() - return {"id": folder_id, "name": name, "file_count": 0} - - -@app.put("/api/folders/{folder_id}") -def rename_folder(folder_id: str, payload: FolderRename, - user: User = Depends(require_app_user)): - if not user.is_admin: - raise HTTPException(403, "Only administrators can rename folders") - name = _validate_folder_name(payload.name) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - clash = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE AND id != ?", - (name, folder_id), - ).fetchone() - if clash: - raise HTTPException(409, "A folder with that name already exists") - conn.execute("UPDATE pst_folders SET name = ? WHERE id = ?", - (name, folder_id)) - conn.commit() - return {"id": folder_id, "name": name} - - -@app.delete("/api/folders/{folder_id}") -def delete_folder(folder_id: str, user: User = Depends(require_app_user)): - """Delete a folder. Any PSTs inside it become uncategorized (folder_id = NULL).""" - if not user.is_admin: - raise HTTPException(403, "Only administrators can delete folders") - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = NULL WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM folder_permissions WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM pst_folders WHERE id = ?", (folder_id,)) - conn.commit() - return {"deleted": folder_id} - - -@app.put("/api/pst-files/{pst_id}/folder") -def assign_pst_to_folder(pst_id: str, payload: FolderAssign, - user: User = Depends(require_app_user)): - # Check the user can see the PST's current location AND the destination - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - if payload.folder_id and not user_can_see_folder(user, payload.folder_id): - raise HTTPException(403, "You do not have access to the target folder") - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_files WHERE id = ?", - (pst_id,)).fetchone(): - raise HTTPException(404, "PST not found") - if payload.folder_id: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (payload.folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = ? WHERE id = ?", - (payload.folder_id, pst_id)) - conn.commit() - return {"pst_id": pst_id, "folder_id": payload.folder_id} - - -@app.post("/api/pst-files") -async def upload_pst( - background_tasks: BackgroundTasks, - file: UploadFile = File(...), - folder_id: Optional[str] = None, - user: User = Depends(require_app_user), -): - if not file.filename: - raise HTTPException(400, "No filename provided") - if not file.filename.lower().endswith((".pst", ".ost")): - raise HTTPException(400, "Only .pst and .ost files are supported") - - # Validate folder if provided (and verify user has access to it) - if folder_id: - with get_db() as conn: - exists = conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone() - if not exists: - raise HTTPException(400, "Target folder does not exist") - if not user_can_see_folder(user, folder_id): - raise HTTPException(403, "You do not have access to the target folder") - - pst_id = uuid.uuid4().hex - stored_name = f"{pst_id}_{file.filename}" - stored_path = UPLOAD_DIR / stored_name - - size = 0 - async with aiofiles.open(stored_path, "wb") as out: - while chunk := await file.read(1024 * 1024): - await out.write(chunk) - size += len(chunk) - - with get_db() as conn: - conn.execute( - """INSERT INTO pst_files - (id, filename, original_name, uploaded_at, size_bytes, status, - uploaded_by, folder_id) - VALUES (?, ?, ?, ?, ?, 'indexing', ?, ?)""", - (pst_id, stored_name, file.filename, - datetime.now(timezone.utc).isoformat(), size, user.id, folder_id), - ) - conn.commit() - - background_tasks.add_task(asyncio.to_thread, index_pst_file, pst_id, stored_path) - return {"id": pst_id, "original_name": file.filename, - "status": "indexing", "size_bytes": size, "folder_id": folder_id} - - -@app.delete("/api/pst-files/{pst_id}") -def delete_pst(pst_id: str, user: User = Depends(require_app_user)): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - with get_db() as conn: - row = conn.execute( - "SELECT filename FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - raise HTTPException(404, "PST not found") - conn.execute("DELETE FROM messages WHERE pst_id = ?", (pst_id,)) - conn.execute("DELETE FROM pst_files WHERE id = ?", (pst_id,)) - conn.commit() - try: - (UPLOAD_DIR / row["filename"]).unlink(missing_ok=True) - except Exception: - pass - return {"deleted": pst_id} - - -@app.get("/api/pst-files/{pst_id}/folders") -def get_folders(pst_id: str, user: User = Depends(require_app_user)): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - with get_db() as conn: - rows = conn.execute( - """SELECT folder, COUNT(*) as count FROM messages - WHERE pst_id = ? GROUP BY folder ORDER BY folder""", - (pst_id,), - ).fetchall() - return [dict(r) for r in rows] - - -def _escape_fts(query: str) -> str: - tokens = [] - for raw in query.split(): - if re.fullmatch(r"[A-Za-z0-9]+", raw): - tokens.append(f'"{raw}"*') - else: - sanitized = raw.replace('"', '""') - tokens.append(f'"{sanitized}"') - return " ".join(tokens) - - -@app.get("/api/pst-files/{pst_id}/messages") -def search_messages( - pst_id: str, - q: Optional[str] = None, - folder: Optional[str] = None, - limit: int = 50, - offset: int = 0, - user: User = Depends(require_app_user), -): - if not user_can_see_pst(user, pst_id): - raise HTTPException(404, "PST not found") - limit = max(1, min(limit, 200)) - offset = max(0, offset) - - with get_db() as conn: - p = conn.execute("SELECT id FROM pst_files WHERE id = ?", (pst_id,)).fetchone() - if not p: - raise HTTPException(404, "PST not found") - - params = [pst_id] - - if q and q.strip(): - fts_q = _escape_fts(q.strip()) - base = """ - FROM messages m - JOIN messages_fts f ON f.rowid = m.id - WHERE m.pst_id = ? AND messages_fts MATCH ? - """ - params.append(fts_q) - if folder: - base += " AND m.folder = ?" - params.append(folder) - - total = conn.execute("SELECT COUNT(*) as c " + base, params).fetchone()["c"] - - data_sql = ( - "SELECT m.id, m.folder, m.subject, m.sender, m.recipients, m.sent_date, " - " m.attachments, snippet(messages_fts, 3, '', '', '…', 24) AS snippet " - + base + " ORDER BY rank LIMIT ? OFFSET ?" - ) - rows = conn.execute(data_sql, params + [limit, offset]).fetchall() - else: - where = ["m.pst_id = ?"] - if folder: - where.append("m.folder = ?") - params.append(folder) - where_sql = " AND ".join(where) - total = conn.execute( - f"SELECT COUNT(*) as c FROM messages m WHERE {where_sql}", params - ).fetchone()["c"] - rows = conn.execute( - f"""SELECT m.id, m.folder, m.subject, m.sender, m.recipients, - m.sent_date, m.attachments, substr(m.body, 1, 200) AS snippet - FROM messages m WHERE {where_sql} - ORDER BY m.sent_date DESC LIMIT ? OFFSET ?""", - params + [limit, offset], - ).fetchall() - - return {"total": total, "limit": limit, "offset": offset, - "items": [dict(r) for r in rows]} - - -@app.get("/api/messages/{message_id}") -def get_message(message_id: int, user: User = Depends(require_app_user)): - with get_db() as conn: - row = conn.execute( - """SELECT id, pst_id, folder, subject, sender, recipients, - sent_date, body, attachments - FROM messages WHERE id = ?""", - (message_id,), - ).fetchone() - if not row: - raise HTTPException(404, "Message not found") - if not user_can_see_pst(user, row["pst_id"]): - raise HTTPException(404, "Message not found") - return dict(row) - - -# =========================================================================== -# ADMINISTRATION SECTION -# -# Previously a separate FastAPI process (admin_app.py) on its own port. It now -# runs inside the main application. Every endpoint below is namespaced under -# /api/admin and protected by `require_app_admin`, which authenticates against -# the main app session cookie AND requires the admin role. Non-admin users -# receive 403; unauthenticated requests receive 401. -# -# The administration UI is served at /admin (static files), and the main app -# shows an "ADMINISTRATION" button (admins only) that links to it. -# =========================================================================== - -# ----- Admin: user management ----- - -class CreateUserPayload(BaseModel): - username: str - password: str - role: str = "user" - - -class UpdatePasswordPayload(BaseModel): - password: str - - -class UpdateRolePayload(BaseModel): - role: str - - -@app.get("/api/admin/me") -def admin_me(user: User = Depends(require_app_admin)): - return {"user": user.public_dict()} - - -@app.get("/api/admin/users") -def admin_list_users(_: User = Depends(require_app_admin)): - return [u.public_dict() for u in list_users()] - - -@app.post("/api/admin/users") -def admin_create_user(payload: CreateUserPayload, - admin: User = Depends(require_app_admin)): - try: - user = create_user(payload.username, payload.password, role=payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - return user.public_dict() - - -@app.delete("/api/admin/users/{user_id}") -def admin_delete_user(user_id: str, admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - if target.id == admin.id: - raise HTTPException(400, "You cannot delete your own account") - if target.is_admin and count_admins() <= 1: - raise HTTPException(400, "Cannot delete the last remaining admin") - delete_user(user_id) - return {"deleted": user_id} - - -@app.put("/api/admin/users/{user_id}/role") -def admin_set_role(user_id: str, payload: UpdateRolePayload, - admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - if target.id == admin.id and payload.role != "admin": - raise HTTPException(400, "You cannot demote your own account") - if (target.is_admin and payload.role != "admin" and count_admins() <= 1): - raise HTTPException(400, "Cannot demote the last remaining admin") - try: - set_user_role(user_id, payload.role) - except ValueError as e: - raise HTTPException(400, str(e)) - return find_user_by_id(user_id).public_dict() - - -@app.put("/api/admin/users/{user_id}/password") -def admin_update_password(user_id: str, payload: UpdatePasswordPayload, - admin: User = Depends(require_app_admin)): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - try: - update_password(user_id, payload.password) - except ValueError as e: - raise HTTPException(400, str(e)) - return {"ok": True} - - -# ----- Admin: MFA management ----- - -class ConfirmMfaPayload(BaseModel): - totp_code: str - - -@app.post("/api/admin/users/{user_id}/mfa/begin") -def admin_begin_mfa(user_id: str, admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret, uri = begin_mfa_enrollment(user_id) - return { - "secret": secret, - "otpauth_uri": uri, - "username": target.username, - "qr_url": f"/api/admin/users/{user_id}/mfa/qr", - } - - -@app.get("/api/admin/users/{user_id}/mfa/qr") -def admin_mfa_qr(user_id: str, admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - secret = get_totp_secret(user_id) - if not secret: - raise HTTPException(400, "No MFA enrollment in progress") - uri = totp_provisioning_uri(secret, target.username) - - qr = qrcode.QRCode(box_size=6, border=2) - qr.add_data(uri) - qr.make(fit=True) - img = qr.make_image(fill_color="black", back_color="white") - buf = io.BytesIO() - img.save(buf, format="PNG") - buf.seek(0) - return StreamingResponse(buf, media_type="image/png") - - -@app.post("/api/admin/users/{user_id}/mfa/confirm") -def admin_confirm_mfa(user_id: str, payload: ConfirmMfaPayload, - admin: User = Depends(require_app_admin)): - if not find_user_by_id(user_id): - raise HTTPException(404, "User not found") - if not confirm_mfa_enrollment(user_id, payload.totp_code): - raise HTTPException(400, "Invalid MFA code — enrollment not confirmed") - return find_user_by_id(user_id).public_dict() - - -@app.post("/api/admin/users/{user_id}/mfa/disable") -def admin_disable_mfa(user_id: str, admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - disable_mfa(user_id) - return find_user_by_id(user_id).public_dict() - - -# ----- Admin: folder management (sees ALL folders unconditionally) ----- - -class AdminFolderPayload(BaseModel): - name: str - - -@app.get("/api/admin/folders") -def admin_list_all_folders(_: User = Depends(require_app_admin)): - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, f.created_at, f.created_by, - COUNT(p.id) AS file_count - FROM pst_folders f - LEFT JOIN pst_files p ON p.folder_id = f.id - GROUP BY f.id - ORDER BY f.name COLLATE NOCASE""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.post("/api/admin/folders") -def admin_create_folder(payload: AdminFolderPayload, - admin: User = Depends(require_app_admin)): - name = _validate_folder_name(payload.name) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE", (name,) - ).fetchone() - if existing: - raise HTTPException(409, "A folder with that name already exists") - folder_id = uuid.uuid4().hex - conn.execute( - """INSERT INTO pst_folders (id, name, created_at, created_by) - VALUES (?, ?, ?, ?)""", - (folder_id, name, datetime.now(timezone.utc).isoformat(), admin.id), - ) - conn.commit() - return {"id": folder_id, "name": name, "file_count": 0} - - -@app.put("/api/admin/folders/{folder_id}") -def admin_rename_folder(folder_id: str, payload: AdminFolderPayload, - admin: User = Depends(require_app_admin)): - name = _validate_folder_name(payload.name) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - clash = conn.execute( - "SELECT id FROM pst_folders WHERE name = ? COLLATE NOCASE AND id != ?", - (name, folder_id), - ).fetchone() - if clash: - raise HTTPException(409, "A folder with that name already exists") - conn.execute("UPDATE pst_folders SET name = ? WHERE id = ?", - (name, folder_id)) - conn.commit() - return {"id": folder_id, "name": name} - - -@app.delete("/api/admin/folders/{folder_id}") -def admin_delete_folder(folder_id: str, admin: User = Depends(require_app_admin)): - """Delete a folder. PSTs inside it become uncategorized (folder_id = NULL).""" - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = NULL WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM folder_permissions WHERE folder_id = ?", - (folder_id,)) - conn.execute("DELETE FROM pst_folders WHERE id = ?", (folder_id,)) - conn.commit() - return {"deleted": folder_id} - - -# ----- Admin: PST file management (sees ALL files unconditionally) ----- - -@app.get("/api/admin/pst-files") -def admin_list_pst_files(_: User = Depends(require_app_admin)): - with get_db() as conn: - rows = conn.execute( - """SELECT p.id, p.original_name, p.uploaded_at, p.size_bytes, - p.status, p.message_count, p.error, - p.folder_id, f.name AS folder_name, - p.uploaded_by - FROM pst_files p - LEFT JOIN pst_folders f ON f.id = p.folder_id - ORDER BY p.uploaded_at DESC""" - ).fetchall() - return [dict(r) for r in rows] - - -@app.delete("/api/admin/pst-files/{pst_id}") -def admin_delete_pst(pst_id: str, admin: User = Depends(require_app_admin)): - with get_db() as conn: - row = conn.execute( - "SELECT filename FROM pst_files WHERE id = ?", (pst_id,) - ).fetchone() - if not row: - raise HTTPException(404, "PST not found") - conn.execute("DELETE FROM messages WHERE pst_id = ?", (pst_id,)) - conn.execute("DELETE FROM pst_files WHERE id = ?", (pst_id,)) - conn.commit() - try: - (UPLOAD_DIR / row["filename"]).unlink(missing_ok=True) - except Exception: - pass - return {"deleted": pst_id} - - -class AdminAssignPayload(BaseModel): - folder_id: Optional[str] = None - - -@app.put("/api/admin/pst-files/{pst_id}/folder") -def admin_assign_pst_to_folder(pst_id: str, payload: AdminAssignPayload, - admin: User = Depends(require_app_admin)): - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_files WHERE id = ?", - (pst_id,)).fetchone(): - raise HTTPException(404, "PST not found") - if payload.folder_id: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (payload.folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - conn.execute("UPDATE pst_files SET folder_id = ? WHERE id = ?", - (payload.folder_id, pst_id)) - conn.commit() - return {"pst_id": pst_id, "folder_id": payload.folder_id} - - -# ----- Admin: folder access permissions ----- - -class PermissionToggle(BaseModel): - granted: bool - - -@app.get("/api/admin/permissions") -def admin_list_permissions(_: User = Depends(require_app_admin)): - """Return the full matrix: users, folders, and all grants.""" - with get_db() as conn: - users = conn.execute("SELECT * FROM users ORDER BY created_at ASC").fetchall() - folders = conn.execute( - "SELECT id, name FROM pst_folders ORDER BY name COLLATE NOCASE" - ).fetchall() - grants = conn.execute( - "SELECT user_id, folder_id, granted_at FROM folder_permissions" - ).fetchall() - - from auth import _row_to_user - user_list = [_row_to_user(u).public_dict() for u in users] - return { - "users": user_list, - "folders": [dict(f) for f in folders], - "grants": [dict(g) for g in grants], - } - - -@app.get("/api/admin/users/{user_id}/folders") -def admin_user_folders(user_id: str, _: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - with get_db() as conn: - rows = conn.execute( - """SELECT f.id, f.name, p.granted_at - FROM folder_permissions p - JOIN pst_folders f ON f.id = p.folder_id - WHERE p.user_id = ? - ORDER BY f.name COLLATE NOCASE""", - (user_id,), - ).fetchall() - return {"user": target.public_dict(), "folders": [dict(r) for r in rows]} - - -@app.get("/api/admin/folders/{folder_id}/users") -def admin_folder_users(folder_id: str, _: User = Depends(require_app_admin)): - with get_db() as conn: - folder = conn.execute( - "SELECT id, name FROM pst_folders WHERE id = ?", (folder_id,) - ).fetchone() - if not folder: - raise HTTPException(404, "Folder not found") - grant_rows = conn.execute( - """SELECT user_id, granted_at - FROM folder_permissions WHERE folder_id = ?""", - (folder_id,), - ).fetchall() - - users_out = [] - for r in grant_rows: - u = find_user_by_id(r["user_id"]) - if u: - users_out.append({**u.public_dict(), "granted_at": r["granted_at"]}) - users_out.sort(key=lambda x: x["username"].lower()) - return {"folder": dict(folder), "users": users_out} - - -@app.put("/api/admin/permissions/{user_id}/{folder_id}") -def admin_toggle_permission(user_id: str, folder_id: str, - payload: PermissionToggle, - admin: User = Depends(require_app_admin)): - target = find_user_by_id(user_id) - if not target: - raise HTTPException(404, "User not found") - if target.is_admin: - raise HTTPException( - 400, - "Admins have access to all folders automatically; permissions " - "only apply to non-admin users.", - ) - with get_db() as conn: - if not conn.execute("SELECT id FROM pst_folders WHERE id = ?", - (folder_id,)).fetchone(): - raise HTTPException(404, "Folder not found") - if payload.granted: - conn.execute( - """INSERT OR IGNORE INTO folder_permissions - (user_id, folder_id, granted_at, granted_by) - VALUES (?, ?, ?, ?)""", - (user_id, folder_id, - datetime.now(timezone.utc).isoformat(), admin.id), - ) - else: - conn.execute( - "DELETE FROM folder_permissions WHERE user_id = ? AND folder_id = ?", - (user_id, folder_id), - ) - conn.commit() - return {"user_id": user_id, "folder_id": folder_id, "granted": payload.granted} - - -# --------------------------------------------------------------------------- -# Static frontends -# -# The administration UI is mounted at /admin and MUST be registered before the -# catch-all "/" mount so that /admin/* resolves to the admin assets. Both are -# served from the same origin/port, so they share the main session cookie. -# --------------------------------------------------------------------------- -if ADMIN_FRONTEND_DIR.exists(): - app.mount("/admin", StaticFiles(directory=str(ADMIN_FRONTEND_DIR), html=True), name="admin") - -# --------------------------------------------------------------------------- -# Static frontend (anonymous access — but index.html enforces auth client-side -# AND the APIs enforce it server-side, which is what actually matters) -# --------------------------------------------------------------------------- -if FRONTEND_DIR.exists(): - app.mount("/", StaticFiles(directory=str(FRONTEND_DIR), html=True), name="frontend") diff --git a/Forensic-Mail-Indexer/backend/auth.py b/Forensic-Mail-Indexer/backend/auth.py deleted file mode 100644 index 9937c82..0000000 --- a/Forensic-Mail-Indexer/backend/auth.py +++ /dev/null @@ -1,520 +0,0 @@ -""" -auth.py — Shared authentication & encryption module. - -Responsibilities: -- Derive or generate a master secret key (persisted to disk with chmod 600) -- Provide Fernet-based encryption for user PII at rest -- Argon2id password hashing (constant-time verification) -- TOTP secret generation, QR provisioning URI, 6-digit code verification -- JWT session tokens (signed with master key) -- User CRUD on the shared SQLite database -- FastAPI dependencies to enforce authentication and admin role -""" -from __future__ import annotations - -import base64 -import hashlib -import hmac -import os -import secrets -import sqlite3 -import time -from contextlib import contextmanager -from dataclasses import dataclass -from datetime import datetime, timedelta, timezone -from pathlib import Path -from typing import Optional - -import jwt -import pyotp -from argon2 import PasswordHasher -from argon2.exceptions import VerifyMismatchError, InvalidHashError -from cryptography.fernet import Fernet, InvalidToken -from cryptography.hazmat.primitives import hashes -from cryptography.hazmat.primitives.kdf.hkdf import HKDF -from fastapi import Depends, HTTPException, Request, status - -# --------------------------------------------------------------------------- -# Config -# --------------------------------------------------------------------------- -DATA_DIR = Path(os.environ.get("DATA_DIR", "/app/data")) -DATA_DIR.mkdir(parents=True, exist_ok=True) - -SECRET_KEY_PATH = DATA_DIR / "secret.key" -DB_PATH = DATA_DIR / "pst_index.db" - -SESSION_TTL_SECONDS = int(os.environ.get("SESSION_TTL_SECONDS", 60 * 60 * 8)) # 8 hours -SESSION_COOKIE_NAME = "pst_session" -ADMIN_SESSION_COOKIE_NAME = "pst_admin_session" - -JWT_ALGORITHM = "HS256" - -# --------------------------------------------------------------------------- -# Master secret -# --------------------------------------------------------------------------- -def _load_or_create_master_secret() -> bytes: - """Return a 32-byte master secret. Created on first run, persisted to disk.""" - # Allow overriding via env var (useful for orchestration); still persist so - # restarts without the env var keep working. - env_secret = os.environ.get("MASTER_SECRET") - if env_secret: - return hashlib.sha256(env_secret.encode("utf-8")).digest() - - if SECRET_KEY_PATH.exists(): - data = SECRET_KEY_PATH.read_bytes() - if len(data) == 32: - return data - # Legacy or truncated: rewrap - return hashlib.sha256(data).digest() - - secret = secrets.token_bytes(32) - SECRET_KEY_PATH.write_bytes(secret) - try: - os.chmod(SECRET_KEY_PATH, 0o600) - except Exception: - pass - return secret - - -MASTER_SECRET: bytes = _load_or_create_master_secret() - - -def _derive_subkey(info: bytes, length: int = 32) -> bytes: - """Derive a sub-key from the master secret using HKDF-SHA256.""" - return HKDF( - algorithm=hashes.SHA256(), - length=length, - salt=b"pst-indexer-salt-v1", - info=info, - ).derive(MASTER_SECRET) - - -# Key used for encrypting user PII at rest -_FERNET_KEY = base64.urlsafe_b64encode(_derive_subkey(b"fernet-user-pii")) -_FERNET = Fernet(_FERNET_KEY) - -# Key used for JWT signatures -_JWT_KEY = _derive_subkey(b"jwt-sessions") - -# Key used for deterministic username lookup hashes (so we can index without -# exposing plaintext usernames in the DB). -_USERNAME_HMAC_KEY = _derive_subkey(b"username-lookup") - - -# --------------------------------------------------------------------------- -# Encryption helpers -# --------------------------------------------------------------------------- -def encrypt(plaintext: str) -> str: - """Fernet-encrypt a string; returns base64 ciphertext.""" - if plaintext is None: - return "" - return _FERNET.encrypt(plaintext.encode("utf-8")).decode("utf-8") - - -def decrypt(ciphertext: str) -> str: - """Fernet-decrypt. Returns empty string for empty input.""" - if not ciphertext: - return "" - try: - return _FERNET.decrypt(ciphertext.encode("utf-8")).decode("utf-8") - except InvalidToken: - raise ValueError("Failed to decrypt — master key may have changed") - - -def username_lookup_hash(username: str) -> str: - """Deterministic HMAC-SHA256 over the normalized username, hex-encoded.""" - normalized = username.strip().lower().encode("utf-8") - return hmac.new(_USERNAME_HMAC_KEY, normalized, hashlib.sha256).hexdigest() - - -# --------------------------------------------------------------------------- -# Password hashing -# --------------------------------------------------------------------------- -_hasher = PasswordHasher( - time_cost=3, - memory_cost=64 * 1024, # 64 MiB - parallelism=2, -) - - -def hash_password(password: str) -> str: - return _hasher.hash(password) - - -def verify_password(stored_hash: str, password: str) -> bool: - try: - _hasher.verify(stored_hash, password) - return True - except (VerifyMismatchError, InvalidHashError): - return False - except Exception: - return False - - -# --------------------------------------------------------------------------- -# TOTP (MFA) -# --------------------------------------------------------------------------- -def generate_totp_secret() -> str: - return pyotp.random_base32() - - -def totp_provisioning_uri(secret: str, username: str, issuer: str = "PST Archive") -> str: - return pyotp.TOTP(secret).provisioning_uri(name=username, issuer_name=issuer) - - -def verify_totp(secret: str, code: str) -> bool: - if not secret or not code: - return False - try: - return pyotp.TOTP(secret).verify(code.strip(), valid_window=1) - except Exception: - return False - - -# --------------------------------------------------------------------------- -# Database -# --------------------------------------------------------------------------- -@contextmanager -def get_db(): - conn = sqlite3.connect(str(DB_PATH)) - conn.row_factory = sqlite3.Row - conn.execute("PRAGMA foreign_keys = ON") - try: - yield conn - finally: - conn.close() - - -def init_auth_schema(): - with get_db() as conn: - conn.executescript(""" - CREATE TABLE IF NOT EXISTS users ( - id TEXT PRIMARY KEY, - username_hash TEXT NOT NULL UNIQUE, - username_enc TEXT NOT NULL, - password_hash_enc TEXT NOT NULL, - totp_secret_enc TEXT, - mfa_enabled INTEGER NOT NULL DEFAULT 0, - role TEXT NOT NULL DEFAULT 'user', - created_at TEXT NOT NULL, - last_login TEXT - ); - - CREATE INDEX IF NOT EXISTS idx_users_username_hash ON users(username_hash); - CREATE INDEX IF NOT EXISTS idx_users_role ON users(role); - """) - conn.commit() - - -# --------------------------------------------------------------------------- -# User model -# --------------------------------------------------------------------------- -@dataclass -class User: - id: str - username: str - role: str - mfa_enabled: bool - created_at: str - last_login: Optional[str] - - @property - def is_admin(self) -> bool: - return self.role == "admin" - - def public_dict(self) -> dict: - return { - "id": self.id, - "username": self.username, - "role": self.role, - "mfa_enabled": self.mfa_enabled, - "created_at": self.created_at, - "last_login": self.last_login, - } - - -def _row_to_user(row: sqlite3.Row) -> User: - return User( - id=row["id"], - username=decrypt(row["username_enc"]), - role=row["role"], - mfa_enabled=bool(row["mfa_enabled"]), - created_at=row["created_at"], - last_login=row["last_login"], - ) - - -def count_users() -> int: - with get_db() as conn: - return conn.execute("SELECT COUNT(*) AS c FROM users").fetchone()["c"] - - -def count_admins() -> int: - with get_db() as conn: - return conn.execute("SELECT COUNT(*) AS c FROM users WHERE role='admin'").fetchone()["c"] - - -def find_user_by_username(username: str) -> Optional[tuple[User, str]]: - """Return (User, decrypted_password_hash) if found, else None.""" - uh = username_lookup_hash(username) - with get_db() as conn: - row = conn.execute( - "SELECT * FROM users WHERE username_hash = ?", (uh,) - ).fetchone() - if not row: - return None - user = _row_to_user(row) - try: - pw_hash = decrypt(row["password_hash_enc"]) - except ValueError: - return None - return user, pw_hash - - -def find_user_by_id(user_id: str) -> Optional[User]: - with get_db() as conn: - row = conn.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone() - if not row: - return None - return _row_to_user(row) - - -def get_totp_secret(user_id: str) -> Optional[str]: - with get_db() as conn: - row = conn.execute( - "SELECT totp_secret_enc FROM users WHERE id = ?", (user_id,) - ).fetchone() - if not row or not row["totp_secret_enc"]: - return None - try: - return decrypt(row["totp_secret_enc"]) - except ValueError: - return None - - -def list_users() -> list[User]: - with get_db() as conn: - rows = conn.execute( - "SELECT * FROM users ORDER BY created_at ASC" - ).fetchall() - return [_row_to_user(r) for r in rows] - - -def create_user(username: str, password: str, role: str = "user") -> User: - username = username.strip() - if not username or len(username) < 3: - raise ValueError("Username must be at least 3 characters") - if len(username) > 64: - raise ValueError("Username too long") - if role not in ("user", "admin"): - raise ValueError("Invalid role") - if len(password) < 8: - raise ValueError("Password must be at least 8 characters") - - uh = username_lookup_hash(username) - with get_db() as conn: - existing = conn.execute( - "SELECT id FROM users WHERE username_hash = ?", (uh,) - ).fetchone() - if existing: - raise ValueError("Username already taken") - - user_id = secrets.token_hex(16) - now = datetime.now(timezone.utc).isoformat() - pw_hash = hash_password(password) - - conn.execute( - """INSERT INTO users - (id, username_hash, username_enc, password_hash_enc, - totp_secret_enc, mfa_enabled, role, created_at, last_login) - VALUES (?, ?, ?, ?, NULL, 0, ?, ?, NULL)""", - (user_id, uh, encrypt(username), encrypt(pw_hash), role, now), - ) - conn.commit() - - return User( - id=user_id, username=username, role=role, mfa_enabled=False, - created_at=now, last_login=None, - ) - - -def delete_user(user_id: str) -> None: - with get_db() as conn: - # Also clean up any folder permission grants this user had - conn.execute("DELETE FROM folder_permissions WHERE user_id = ?", (user_id,)) - conn.execute("DELETE FROM users WHERE id = ?", (user_id,)) - conn.commit() - - -def set_user_role(user_id: str, role: str) -> None: - if role not in ("user", "admin"): - raise ValueError("Invalid role") - with get_db() as conn: - conn.execute("UPDATE users SET role = ? WHERE id = ?", (role, user_id)) - conn.commit() - - -def update_password(user_id: str, new_password: str) -> None: - if len(new_password) < 8: - raise ValueError("Password must be at least 8 characters") - pw_hash = hash_password(new_password) - with get_db() as conn: - conn.execute( - "UPDATE users SET password_hash_enc = ? WHERE id = ?", - (encrypt(pw_hash), user_id), - ) - conn.commit() - - -def begin_mfa_enrollment(user_id: str) -> tuple[str, str]: - """Generate a new TOTP secret (not yet enabled) and return (secret, provisioning_uri).""" - user = find_user_by_id(user_id) - if not user: - raise ValueError("User not found") - secret = generate_totp_secret() - # Stash it but leave mfa_enabled = 0 until confirmed - with get_db() as conn: - conn.execute( - "UPDATE users SET totp_secret_enc = ?, mfa_enabled = 0 WHERE id = ?", - (encrypt(secret), user_id), - ) - conn.commit() - uri = totp_provisioning_uri(secret, user.username) - return secret, uri - - -def confirm_mfa_enrollment(user_id: str, code: str) -> bool: - secret = get_totp_secret(user_id) - if not secret or not verify_totp(secret, code): - return False - with get_db() as conn: - conn.execute("UPDATE users SET mfa_enabled = 1 WHERE id = ?", (user_id,)) - conn.commit() - return True - - -def disable_mfa(user_id: str) -> None: - with get_db() as conn: - conn.execute( - "UPDATE users SET mfa_enabled = 0, totp_secret_enc = NULL WHERE id = ?", - (user_id,), - ) - conn.commit() - - -def record_login(user_id: str) -> None: - with get_db() as conn: - conn.execute( - "UPDATE users SET last_login = ? WHERE id = ?", - (datetime.now(timezone.utc).isoformat(), user_id), - ) - conn.commit() - - -# --------------------------------------------------------------------------- -# JWT sessions -# --------------------------------------------------------------------------- -def create_session_token(user: User, scope: str = "app") -> str: - """scope='app' for main app, scope='admin' for admin panel.""" - now = datetime.now(timezone.utc) - payload = { - "sub": user.id, - "role": user.role, - "scope": scope, - "iat": int(now.timestamp()), - "exp": int((now + timedelta(seconds=SESSION_TTL_SECONDS)).timestamp()), - } - return jwt.encode(payload, _JWT_KEY, algorithm=JWT_ALGORITHM) - - -def verify_session_token(token: str, expected_scope: str) -> Optional[dict]: - try: - payload = jwt.decode(token, _JWT_KEY, algorithms=[JWT_ALGORITHM]) - if payload.get("scope") != expected_scope: - return None - return payload - except jwt.PyJWTError: - return None - - -# --------------------------------------------------------------------------- -# FastAPI dependencies -# --------------------------------------------------------------------------- -def _extract_token(request: Request, cookie_name: str) -> Optional[str]: - # Prefer cookie, fall back to Authorization header - token = request.cookies.get(cookie_name) - if token: - return token - auth = request.headers.get("authorization", "") - if auth.lower().startswith("bearer "): - return auth[7:].strip() - return None - - -def require_user(scope: str, cookie_name: str): - def _dep(request: Request) -> User: - token = _extract_token(request, cookie_name) - if not token: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Not authenticated") - payload = verify_session_token(token, expected_scope=scope) - if not payload: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid or expired session") - user = find_user_by_id(payload["sub"]) - if not user: - raise HTTPException(status.HTTP_401_UNAUTHORIZED, "User no longer exists") - return user - return _dep - - -def require_admin(scope: str, cookie_name: str): - base = require_user(scope, cookie_name) - def _dep(request: Request) -> User: - user = base(request) - if not user.is_admin: - raise HTTPException(status.HTTP_403_FORBIDDEN, "Admin role required") - return user - return _dep - - -# Pre-wired dependencies for the two app scopes -require_app_user = require_user("app", SESSION_COOKIE_NAME) -require_admin_user = require_admin("admin", ADMIN_SESSION_COOKIE_NAME) - -# App-scoped admin dependency: authenticates against the MAIN app session -# cookie (scope "app") but additionally requires the admin role. This lets the -# administration section run inside the main application (served at /admin) -# instead of as a separate process on its own port, while still being strictly -# limited to admin users. -require_app_admin = require_admin("app", SESSION_COOKIE_NAME) - - -# --------------------------------------------------------------------------- -# Simple rate limiter (per-IP, per-username) to slow brute-force attempts -# --------------------------------------------------------------------------- -class RateLimiter: - def __init__(self, window_seconds: int = 300, max_attempts: int = 10): - self.window = window_seconds - self.max = max_attempts - self._attempts: dict[str, list[float]] = {} - - def check(self, key: str) -> bool: - now = time.time() - cutoff = now - self.window - arr = [t for t in self._attempts.get(key, []) if t > cutoff] - if len(arr) >= self.max: - self._attempts[key] = arr - return False - return True - - def record(self, key: str) -> None: - now = time.time() - cutoff = now - self.window - arr = [t for t in self._attempts.get(key, []) if t > cutoff] - arr.append(now) - self._attempts[key] = arr - - def reset(self, key: str) -> None: - self._attempts.pop(key, None) - - -login_limiter = RateLimiter(window_seconds=300, max_attempts=10) diff --git a/Forensic-Mail-Indexer/backend/requirements.txt b/Forensic-Mail-Indexer/backend/requirements.txt deleted file mode 100644 index 9cbd286..0000000 --- a/Forensic-Mail-Indexer/backend/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -fastapi==0.115.0 -uvicorn[standard]==0.32.0 -python-multipart==0.0.12 -libpff-python==20231205 -aiofiles==24.1.0 -argon2-cffi==23.1.0 -pyotp==2.9.0 -cryptography==43.0.1 -PyJWT==2.9.0 -qrcode[pil]==7.4.2 diff --git a/Forensic-Mail-Indexer/docker-compose.yml b/Forensic-Mail-Indexer/docker-compose.yml deleted file mode 100644 index d5504cc..0000000 --- a/Forensic-Mail-Indexer/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -services: - pst-indexer: - build: . - container_name: pst-indexer - ports: - - "8000:8000" # App + built-in administration (at /admin) - volumes: - - ./data:/app/data - restart: unless-stopped - environment: - - DATA_DIR=/app/data - # Set to "true" when serving over HTTPS - - COOKIE_SECURE=false - # Session lifetime in seconds (default 8 hours) - - SESSION_TTL_SECONDS=28800 - # Optional: provide your own master secret. If set, this becomes the - # root key for all encryption. If omitted, a random key is generated - # on first run and persisted in ./data/secret.key (chmod 600). - # - MASTER_SECRET=change-me-to-a-long-random-string diff --git a/Forensic-Mail-Indexer/entrypoint.sh b/Forensic-Mail-Indexer/entrypoint.sh deleted file mode 100644 index 8e6b790..0000000 --- a/Forensic-Mail-Indexer/entrypoint.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Start the application (port 8000). The administration section now runs inside -# this same app (served at /admin), so there is no longer a separate admin -# process or port. - -set -e - -cleanup() { - echo "Shutting down…" - kill -TERM "$MAIN_PID" 2>/dev/null || true - wait - exit 0 -} -trap cleanup SIGINT SIGTERM - -cd /app/backend - -echo "[start] App (with built-in administration) on :8000" -uvicorn app:app --host 0.0.0.0 --port 8000 --proxy-headers & -MAIN_PID=$! - -wait "$MAIN_PID" -EXIT_CODE=$? -echo "[exit] Service exited with code $EXIT_CODE" -exit $EXIT_CODE diff --git a/Forensic-Mail-Indexer/frontend/app.js b/Forensic-Mail-Indexer/frontend/app.js deleted file mode 100644 index 49cac5f..0000000 --- a/Forensic-Mail-Indexer/frontend/app.js +++ /dev/null @@ -1,877 +0,0 @@ -/* ============================================================ - PST Archive — frontend logic - - Setup wizard (first run) - - Login (+ MFA) - - Main app: upload, index, search, view - ============================================================ */ - -const API = "/api"; - -const state = { - activePstId: null, - activePstName: "", - folder: "", - query: "", - limit: 25, - offset: 0, - total: 0, - refreshTimer: null, - user: null, - folders: [], // [{id, name, file_count}, ...] - psts: [], // last loaded pst list - collapsedFolders: new Set(), // folder IDs (or "__uncat__") that are collapsed - movePstId: null, // currently being moved -}; - -const $ = (id) => document.getElementById(id); - -// ---------- helpers ---------- -function fmtBytes(n) { - if (!n) return "0 B"; - const units = ["B", "KB", "MB", "GB", "TB"]; - let i = 0; - while (n >= 1024 && i < units.length - 1) { n /= 1024; i++; } - return `${n.toFixed(i ? 1 : 0)} ${units[i]}`; -} - -function fmtDate(iso) { - if (!iso) return "—"; - try { - const d = new Date(iso); - if (isNaN(d)) return iso; - return d.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "numeric" }); - } catch { return iso; } -} - -function fmtDateTime(iso) { - if (!iso) return "—"; - try { - const d = new Date(iso); - if (isNaN(d)) return iso; - return d.toLocaleString("en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }); - } catch { return iso; } -} - -function toast(msg, ms = 3000) { - const el = $("toast"); - el.textContent = msg; - el.classList.remove("hidden"); - clearTimeout(toast._t); - toast._t = setTimeout(() => el.classList.add("hidden"), ms); -} - -function escapeHtml(s) { - if (s == null) return ""; - return String(s) - .replace(/&/g, "&").replace(//g, ">") - .replace(/"/g, """).replace(/'/g, "'"); -} - -function renderSnippet(snippet) { - if (!snippet) return ""; - return escapeHtml(snippet) - .replace(/<mark>/g, "") - .replace(/<\/mark>/g, ""); -} - -function debounce(fn, ms) { - let t; - return (...args) => { clearTimeout(t); t = setTimeout(() => fn(...args), ms); }; -} - -// ---------- API ---------- -async function api(path, opts = {}) { - const res = await fetch(API + path, { - credentials: "same-origin", - ...opts, - }); - let body = null; - try { body = await res.json(); } catch {} - if (!res.ok) { - const err = new Error((body && body.detail) || res.statusText); - err.status = res.status; - err.body = body || {}; - throw err; - } - return body; -} - -// ---------- Screen switching ---------- -function showScreen(screen) { - ["setupScreen", "loginScreen", "mainApp"].forEach((id) => { - $(id).classList.toggle("hidden", id !== screen); - }); -} - -// ---------- Bootstrap ---------- -async function bootstrap() { - // 1. Try to fetch current user - try { - const { user } = await api("/me"); - state.user = user; - enterApp(); - return; - } catch (e) { - if (e.status !== 401) { - showLogin(); - toast("Connection problem — please retry."); - return; - } - } - - // 2. Not logged in — check setup status - try { - const { needs_setup } = await api("/setup/status"); - if (needs_setup) showSetup(); - else showLogin(); - } catch { - showLogin(); - } -} - -// ---------- Setup ---------- -function showSetup() { - showScreen("setupScreen"); - $("setupForm").reset(); - $("setupError").classList.add("hidden"); - setTimeout(() => $("setupForm").username?.focus(), 50); -} - -async function handleSetup(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("setupError"); - errEl.classList.add("hidden"); - - const username = form.username.value.trim(); - const password = form.password.value; - const password2 = form.password2.value; - - if (password !== password2) { - errEl.textContent = "Passwords do not match."; - errEl.classList.remove("hidden"); - return; - } - - try { - const { user } = await api("/setup", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ username, password }), - }); - state.user = user; - toast("Welcome — admin account created."); - enterApp(); - } catch (err) { - errEl.textContent = err.message || "Setup failed."; - errEl.classList.remove("hidden"); - } -} - -// ---------- Login ---------- -function showLogin() { - showScreen("loginScreen"); - $("loginForm").reset(); - $("mfaField").classList.add("hidden"); - $("loginError").classList.add("hidden"); - setTimeout(() => $("loginForm").username?.focus(), 50); -} - -async function handleLogin(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("loginError"); - errEl.classList.add("hidden"); - - const payload = { - username: form.username.value.trim(), - password: form.password.value, - }; - const mfaInput = form.totp_code.value.trim(); - if (mfaInput) payload.totp_code = mfaInput; - - try { - const { user } = await api("/login", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(payload), - }); - state.user = user; - toast(`Welcome, ${user.username}.`); - enterApp(); - } catch (err) { - if (err.status === 401 && err.body && err.body.mfa_required) { - $("mfaField").classList.remove("hidden"); - const f = $("loginForm").totp_code; - f.value = ""; - setTimeout(() => f.focus(), 50); - errEl.textContent = "Enter your authenticator code to continue."; - errEl.classList.remove("hidden"); - return; - } - errEl.textContent = err.message || "Login failed."; - errEl.classList.remove("hidden"); - } -} - -async function handleLogout() { - try { await api("/logout", { method: "POST" }); } catch {} - state.user = null; - state.activePstId = null; - resetReader(); - showLogin(); -} - -// ---------- Enter the app ---------- -function enterApp() { - showScreen("mainApp"); - $("userChip").textContent = `${state.user.username}${state.user.role === "admin" ? " · admin" : ""}`; - // Show the ADMINISTRATION button only for admins. - const adminBtn = $("adminNavBtn"); - if (adminBtn) adminBtn.classList.toggle("hidden", state.user.role !== "admin"); - checkHealth(); - loadPstList(); - setInterval(checkHealth, 30000); -} - -// ---------- Health ---------- -async function checkHealth() { - const dot = $("statusDot"); - const text = $("statusText"); - try { - await api("/health"); - dot.className = "status-dot ok"; - text.textContent = "connected"; - } catch { - dot.className = "status-dot err"; - text.textContent = "offline"; - } -} - -// ---------- PST list ---------- -async function loadPstList() { - try { - const [folders, items] = await Promise.all([ - api("/folders"), - api("/pst-files"), - ]); - state.folders = folders; - state.psts = items; - renderPstList(); - if (items.some((i) => i.status === "indexing")) { - clearTimeout(state.refreshTimer); - state.refreshTimer = setTimeout(loadPstList, 2500); - } - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Failed to load archives: ${e.message}`); - } -} - -function pstItemHtml(i) { - const active = i.id === state.activePstId ? "active" : ""; - const disabled = i.status !== "ready"; - const statusText = i.status === "indexing" ? "indexing…" : - i.status === "ready" ? `${i.message_count.toLocaleString()} msgs` : - i.status === "failed" ? "failed" : i.status; - return ` -
  9. -
    - ${escapeHtml(i.original_name)} - -
    -
    - ${fmtBytes(i.size_bytes)} · ${fmtDate(i.uploaded_at)} - ${statusText} -
    -
  10. - `; -} - -function renderPstList() { - const ul = $("pstList"); - const { folders, psts } = state; - - if (!folders.length && !psts.length) { - ul.innerHTML = '
  11. No archives yet.
  12. '; - return; - } - - // Group PSTs by folder_id - const byFolder = new Map(); - byFolder.set(null, []); // uncategorized bucket - folders.forEach((f) => byFolder.set(f.id, [])); - psts.forEach((p) => { - const bucket = byFolder.has(p.folder_id) ? p.folder_id : null; - byFolder.get(bucket).push(p); - }); - - const parts = []; - - // Render user-defined folders first (sorted alphabetically — server does this) - for (const f of folders) { - const items = byFolder.get(f.id) || []; - const collapsed = state.collapsedFolders.has(f.id) ? "collapsed" : ""; - parts.push(` -
  13. -
    -
    - - ${escapeHtml(f.name)} - ${items.length} -
    - -
    -
      - ${items.length - ? items.map(pstItemHtml).join("") - : '
    • — empty —
    • '} -
    -
  14. - `); - } - - // Uncategorized group — only shown if it has items OR there are no folders - const uncat = byFolder.get(null) || []; - if (uncat.length || !folders.length) { - const collapsed = state.collapsedFolders.has("__uncat__") ? "collapsed" : ""; - parts.push(` -
  15. -
    -
    - - Uncategorized - ${uncat.length} -
    -
    -
      - ${uncat.length - ? uncat.map(pstItemHtml).join("") - : '
    • — empty —
    • '} -
    -
  16. - `); - } - - ul.innerHTML = parts.join(""); - - // PST click - ul.querySelectorAll(".pst-item").forEach((el) => { - el.addEventListener("click", (e) => { - if (e.target.closest("[data-pst-menu]")) return; - if (el.dataset.disabled) { - toast(el.dataset.status === "indexing" ? "Still indexing — one moment…" : "This archive is unavailable."); - return; - } - selectPst(el.dataset.id, el.dataset.name); - }); - }); - - // PST action menu - ul.querySelectorAll("[data-pst-menu]").forEach((btn) => { - btn.addEventListener("click", (e) => { - e.stopPropagation(); - openPstMenu(e, btn.dataset.pstMenu); - }); - }); - - // Folder header toggle (collapse/expand) - ul.querySelectorAll("[data-folder-header]").forEach((el) => { - el.addEventListener("click", (e) => { - if (e.target.closest("[data-folder-menu]")) return; - const id = el.dataset.folderHeader; - if (state.collapsedFolders.has(id)) state.collapsedFolders.delete(id); - else state.collapsedFolders.add(id); - const group = el.closest(".folder-group"); - group.classList.toggle("collapsed"); - }); - }); - - // Folder action menu - ul.querySelectorAll("[data-folder-menu]").forEach((btn) => { - btn.addEventListener("click", (e) => { - e.stopPropagation(); - openFolderMenu(e, btn.dataset.folderMenu); - }); - }); -} - -// ---------- Context menus ---------- -function closeContextMenu() { - document.querySelectorAll(".context-menu").forEach((el) => el.remove()); -} - -function openContextMenu(x, y, items) { - closeContextMenu(); - const menu = document.createElement("div"); - menu.className = "context-menu"; - items.forEach((it) => { - if (it.divider) { - menu.appendChild(document.createElement("hr")); - return; - } - const btn = document.createElement("button"); - btn.textContent = it.label; - if (it.danger) btn.classList.add("danger"); - btn.addEventListener("click", () => { - closeContextMenu(); - it.onClick(); - }); - menu.appendChild(btn); - }); - document.body.appendChild(menu); - - // Position, keeping menu inside viewport - const rect = menu.getBoundingClientRect(); - const maxX = window.innerWidth - rect.width - 4; - const maxY = window.innerHeight - rect.height - 4; - menu.style.left = Math.min(x, maxX) + "px"; - menu.style.top = Math.min(y, maxY) + "px"; - - // Close on outside click or escape - setTimeout(() => { - document.addEventListener("click", closeContextMenu, { once: true }); - }, 0); -} - -function openPstMenu(event, pstId) { - const p = state.psts.find((x) => x.id === pstId); - if (!p) return; - const r = event.currentTarget.getBoundingClientRect(); - openContextMenu(r.left, r.bottom + 4, [ - { - label: "Move to folder…", - onClick: () => openMoveModal(p), - }, - { divider: true }, - { - label: "Delete archive", - danger: true, - onClick: () => deletePst(p), - }, - ]); -} - -function openFolderMenu(event, folderId) { - const f = state.folders.find((x) => x.id === folderId); - if (!f) return; - const r = event.currentTarget.getBoundingClientRect(); - openContextMenu(r.left, r.bottom + 4, [ - { - label: "Rename folder…", - onClick: () => renameFolder(f), - }, - { divider: true }, - { - label: "Delete folder", - danger: true, - onClick: () => deleteFolder(f), - }, - ]); -} - -// ---------- Folder operations ---------- -function openFolderModal() { - $("folderForm").reset(); - $("folderError").classList.add("hidden"); - $("folderModal").classList.remove("hidden"); - setTimeout(() => $("folderForm").name.focus(), 50); -} - -async function handleCreateFolder(e) { - e.preventDefault(); - const form = e.target; - const errEl = $("folderError"); - errEl.classList.add("hidden"); - try { - await api("/folders", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ name: form.name.value }), - }); - toast("Folder created."); - closeModals(); - loadPstList(); - } catch (err) { - errEl.textContent = err.message || "Create failed."; - errEl.classList.remove("hidden"); - } -} - -async function renameFolder(f) { - const newName = prompt(`Rename "${f.name}" to:`, f.name); - if (!newName || newName.trim() === f.name) return; - try { - await api(`/folders/${f.id}`, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ name: newName }), - }); - toast("Folder renamed."); - loadPstList(); - } catch (err) { - toast(`Rename failed: ${err.message}`); - } -} - -async function deleteFolder(f) { - if (!confirm(`Delete folder "${f.name}"?\n\nAny archives inside will be moved to Uncategorized.`)) return; - try { - await api(`/folders/${f.id}`, { method: "DELETE" }); - toast("Folder deleted."); - loadPstList(); - } catch (err) { - toast(`Delete failed: ${err.message}`); - } -} - -async function deletePst(p) { - if (!confirm(`Remove "${p.original_name}" and all indexed messages?`)) return; - try { - await api(`/pst-files/${p.id}`, { method: "DELETE" }); - if (state.activePstId === p.id) { state.activePstId = null; resetReader(); } - toast("Archive removed."); - loadPstList(); - } catch (err) { - toast(`Delete failed: ${err.message}`); - } -} - -function openMoveModal(p) { - state.movePstId = p.id; - $("moveSubject").textContent = p.original_name; - - const sel = $("moveFolderSelect"); - sel.innerHTML = '' + - state.folders.map((f) => - `` - ).join(""); - if (!p.folder_id) sel.value = ""; - - $("moveError").classList.add("hidden"); - $("moveModal").classList.remove("hidden"); -} - -async function handleMovePst(e) { - e.preventDefault(); - const errEl = $("moveError"); - errEl.classList.add("hidden"); - const folderId = $("moveFolderSelect").value || null; - try { - await api(`/pst-files/${state.movePstId}/folder`, { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ folder_id: folderId }), - }); - toast("Moved."); - closeModals(); - loadPstList(); - } catch (err) { - errEl.textContent = err.message || "Move failed."; - errEl.classList.remove("hidden"); - } -} - -function closeModals() { - document.querySelectorAll(".modal").forEach((m) => m.classList.add("hidden")); -} - -// ---------- Selection + folders ---------- -async function selectPst(id, name) { - state.activePstId = id; - state.activePstName = name; - state.folder = ""; - state.query = ""; - state.offset = 0; - - $("searchInput").value = ""; - $("searchInput").disabled = false; - $("folderFilter").disabled = false; - - document.querySelectorAll(".pst-item").forEach((el) => { - el.classList.toggle("active", el.dataset.id === id); - }); - $("readerTitle").textContent = name; - $("readerMeta").textContent = "Loading messages…"; - hideMessageView(); - await Promise.all([loadFolders(), loadMessages()]); -} - -async function loadFolders() { - if (!state.activePstId) return; - try { - const folders = await api(`/pst-files/${state.activePstId}/folders`); - const sel = $("folderFilter"); - sel.innerHTML = - '' + - folders.map((f) => ``).join(""); - sel.value = state.folder || ""; - } catch (e) { console.warn("folders", e); } -} - -// ---------- Messages ---------- -async function loadMessages() { - if (!state.activePstId) return; - const params = new URLSearchParams(); - if (state.query) params.set("q", state.query); - if (state.folder) params.set("folder", state.folder); - params.set("limit", state.limit); - params.set("offset", state.offset); - - try { - const res = await api(`/pst-files/${state.activePstId}/messages?${params}`); - state.total = res.total; - renderMessages(res.items); - renderPaginator(); - $("readerMeta").textContent = - `${state.total.toLocaleString()} message${state.total === 1 ? "" : "s"}` + - (state.query ? ` matching "${state.query}"` : "") + - (state.folder ? ` in ${state.folder}` : ""); - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Search failed: ${e.message}`); - } -} - -function renderMessages(items) { - const list = $("messageList"); - if (!items.length) { - list.innerHTML = ` -
    -
    -

    No messages match.

    -
    `; - return; - } - list.innerHTML = items.map((m) => { - const hasAtt = m.attachments && m.attachments.trim().length > 0; - return ` -
    -
    ${escapeHtml(m.sender || "(unknown sender)")}
    -
    -
    ${escapeHtml(m.subject || "(no subject)")} ${hasAtt ? '' : ""}
    -
    ${renderSnippet(m.snippet || "")}
    -
    -
    -
    ${fmtDate(m.sent_date)}
    -
    ${escapeHtml((m.folder || "").split("/").filter(Boolean).pop() || "inbox")}
    -
    -
    `; - }).join(""); - list.querySelectorAll(".message-row").forEach((el) => { - el.addEventListener("click", () => openMessage(el.dataset.id)); - }); -} - -function renderPaginator() { - const p = $("paginator"); - if (state.total <= state.limit) { p.classList.add("hidden"); return; } - p.classList.remove("hidden"); - const from = state.offset + 1; - const to = Math.min(state.offset + state.limit, state.total); - $("pageInfo").textContent = `${from}–${to} of ${state.total.toLocaleString()}`; - $("prevBtn").disabled = state.offset === 0; - $("nextBtn").disabled = state.offset + state.limit >= state.total; -} - -// ---------- Message view ---------- -async function openMessage(id) { - try { - const m = await api(`/messages/${id}`); - $("mvSubject").textContent = m.subject || "(no subject)"; - $("mvSender").textContent = m.sender || "—"; - $("mvRecipients").textContent = m.recipients || "—"; - $("mvDate").textContent = fmtDateTime(m.sent_date); - $("mvFolder").textContent = m.folder || "—"; - if (m.attachments && m.attachments.trim()) { - $("mvAttLabel").classList.remove("hidden"); - $("mvAttachments").classList.remove("hidden"); - $("mvAttachments").textContent = m.attachments.split(" | ").join(", "); - } else { - $("mvAttLabel").classList.add("hidden"); - $("mvAttachments").classList.add("hidden"); - } - $("mvBody").textContent = m.body || "(empty body)"; - $("messageView").classList.remove("hidden"); - } catch (e) { - if (e.status === 401) { handleLogout(); return; } - toast(`Could not open message: ${e.message}`); - } -} - -function hideMessageView() { $("messageView").classList.add("hidden"); } - -function resetReader() { - $("readerTitle").textContent = "Select an archive"; - $("readerMeta").textContent = "Upload a PST file or select one from the left to begin."; - $("searchInput").disabled = true; - $("folderFilter").disabled = true; - $("messageList").innerHTML = ` -
    -
    -

    The archive awaits.

    -
    `; - $("paginator").classList.add("hidden"); - hideMessageView(); -} - -// ---------- Upload ---------- -function uploadFile(file) { - if (!file) return; - const lower = file.name.toLowerCase(); - if (!lower.endsWith(".pst") && !lower.endsWith(".ost")) { - toast("Only .pst and .ost files are accepted."); - return; - } - const progress = $("uploadProgress"); - const bar = $("progressBar"); - const pct = $("progressPct"); - const nm = $("progressName"); - progress.classList.remove("hidden"); - nm.textContent = file.name; - bar.style.width = "0%"; - pct.textContent = "0%"; - - const form = new FormData(); - form.append("file", file); - - const xhr = new XMLHttpRequest(); - xhr.open("POST", API + "/pst-files"); - xhr.withCredentials = true; - xhr.upload.onprogress = (e) => { - if (e.lengthComputable) { - const p = Math.round((e.loaded / e.total) * 100); - bar.style.width = p + "%"; - pct.textContent = p + "%"; - } - }; - xhr.onload = () => { - if (xhr.status >= 200 && xhr.status < 300) { - pct.textContent = "indexing…"; - bar.style.width = "100%"; - toast("Upload complete. Indexing started in background."); - setTimeout(() => progress.classList.add("hidden"), 2500); - loadPstList(); - } else if (xhr.status === 401) { - handleLogout(); - } else { - let msg = "Upload failed"; - try { msg = JSON.parse(xhr.responseText).detail || msg; } catch {} - toast(msg); - progress.classList.add("hidden"); - } - }; - xhr.onerror = () => { toast("Upload failed (network)."); progress.classList.add("hidden"); }; - xhr.send(form); -} - -// ---------- Theme ---------- -function initTheme() { - // Preference order: localStorage → prefers-color-scheme → light - let theme = "light"; - try { - const saved = localStorage.getItem("pst-theme"); - if (saved === "light" || saved === "dark") { - theme = saved; - } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { - theme = "dark"; - } - } catch { /* ignore storage errors */ } - document.documentElement.dataset.theme = theme; -} - -function toggleTheme() { - const current = document.documentElement.dataset.theme === "dark" ? "dark" : "light"; - const next = current === "dark" ? "light" : "dark"; - document.documentElement.dataset.theme = next; - try { localStorage.setItem("pst-theme", next); } catch {} -} - -// Apply theme immediately so there's no flash of wrong theme -initTheme(); - -// ---------- Wire up ---------- -function init() { - $("setupForm").addEventListener("submit", handleSetup); - $("loginForm").addEventListener("submit", handleLogin); - $("logoutBtn").addEventListener("click", handleLogout); - - const adminNavBtn = $("adminNavBtn"); - if (adminNavBtn) { - adminNavBtn.addEventListener("click", () => { window.location.href = "/admin/"; }); - } - - // Theme toggles (both the in-masthead and floating variants) - ["themeToggle", "themeToggleFloat"].forEach((id) => { - const el = document.getElementById(id); - if (el) el.addEventListener("click", toggleTheme); - }); - - $("fileInput").addEventListener("change", (e) => { - const f = e.target.files[0]; - if (f) uploadFile(f); - e.target.value = ""; - }); - - const dz = $("dropzone"); - ["dragenter", "dragover"].forEach((ev) => { - dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.add("drag-over"); }); - }); - ["dragleave", "drop"].forEach((ev) => { - dz.addEventListener(ev, (e) => { e.preventDefault(); dz.classList.remove("drag-over"); }); - }); - dz.addEventListener("drop", (e) => { - const f = e.dataTransfer.files?.[0]; - if (f) uploadFile(f); - }); - - $("refreshBtn").addEventListener("click", loadPstList); - $("newFolderBtn").addEventListener("click", openFolderModal); - $("folderForm").addEventListener("submit", handleCreateFolder); - $("moveForm").addEventListener("submit", handleMovePst); - - // Modal close buttons + backdrop clicks + Escape - document.querySelectorAll("[data-close]").forEach((el) => { - el.addEventListener("click", closeModals); - }); - document.querySelectorAll(".modal").forEach((m) => { - m.addEventListener("click", (e) => { - if (e.target === m) closeModals(); - }); - }); - - const searchHandler = debounce(() => { - state.query = $("searchInput").value.trim(); - state.offset = 0; - loadMessages(); - }, 250); - $("searchInput").addEventListener("input", searchHandler); - - $("folderFilter").addEventListener("change", () => { - state.folder = $("folderFilter").value; - state.offset = 0; - loadMessages(); - }); - - $("prevBtn").addEventListener("click", () => { - state.offset = Math.max(0, state.offset - state.limit); - loadMessages(); - }); - $("nextBtn").addEventListener("click", () => { - state.offset += state.limit; - loadMessages(); - }); - - $("closeMessageBtn").addEventListener("click", hideMessageView); - document.addEventListener("keydown", (e) => { - if (e.key === "Escape") { - hideMessageView(); - closeModals(); - closeContextMenu(); - } - }); - - bootstrap(); -} - -document.addEventListener("DOMContentLoaded", init); diff --git a/Forensic-Mail-Indexer/frontend/index.html b/Forensic-Mail-Indexer/frontend/index.html deleted file mode 100644 index 76b9585..0000000 --- a/Forensic-Mail-Indexer/frontend/index.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - -PST Archive · Mail Indexer - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Forensic-Mail-Indexer/frontend/styles.css b/Forensic-Mail-Indexer/frontend/styles.css deleted file mode 100644 index 63db6c0..0000000 --- a/Forensic-Mail-Indexer/frontend/styles.css +++ /dev/null @@ -1,1182 +0,0 @@ -/* ============================================================ - PST ARCHIVE — aesthetic: editorial/forensic archive - Warm paper palette, serif display, mono accents, grain overlay - Supports light (default) and dark themes via [data-theme] - ============================================================ */ - -:root, -:root[data-theme="light"] { - --paper: #f2ede3; - --paper-deep: #e8e1d3; - --ink: #1b1814; - --ink-soft: #3a332a; - --ink-muted: #6b6258; - --rule: #c9bfad; - --rule-soft: #dcd3c1; - --accent: #a8341f; /* oxblood red */ - --accent-soft: #c95a42; - --highlight: #e8d67a; /* faded yellow marker */ - --ok: #2e6f3a; - --warn: #a86b1e; - --shadow: 0 1px 0 rgba(27, 24, 20, 0.04), 0 20px 40px -20px rgba(27, 24, 20, 0.25); - --grain-opacity: 0.35; - - --font-display: "Fraunces", "Iowan Old Style", "Palatino", Georgia, serif; - --font-mono: "JetBrains Mono", "SFMono-Regular", ui-monospace, monospace; -} - -:root[data-theme="dark"] { - --paper: #17140f; /* deep inked paper */ - --paper-deep: #201c16; /* slightly lighter ink-pool for surfaces */ - --ink: #e9e0cb; /* warm paper-cream as the ink color */ - --ink-soft: #c4b99f; - --ink-muted: #8a8170; - --rule: #3a3226; - --rule-soft: #2a251d; - --accent: #d06347; /* softened oxblood that holds up on dark */ - --accent-soft: #e4876c; - --highlight: #d8b64a; /* brass-yellow marker */ - --ok: #6fae7c; - --warn: #d99a4a; - --shadow: 0 1px 0 rgba(0, 0, 0, 0.4), 0 20px 40px -20px rgba(0, 0, 0, 0.9); - --grain-opacity: 0.12; -} - -* { box-sizing: border-box; } - -html, body { - margin: 0; - padding: 0; - height: 100%; - background: var(--paper); - color: var(--ink); - font-family: var(--font-display); - font-feature-settings: "ss01", "onum"; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -body { - display: flex; - flex-direction: column; - min-height: 100vh; - background-image: - radial-gradient(circle at 10% 10%, rgba(168, 52, 31, 0.04), transparent 40%), - radial-gradient(circle at 90% 90%, rgba(74, 58, 42, 0.05), transparent 50%); -} - -:root[data-theme="dark"] body { - background-image: - radial-gradient(circle at 10% 10%, rgba(208, 99, 71, 0.06), transparent 40%), - radial-gradient(circle at 90% 90%, rgba(216, 182, 74, 0.03), transparent 50%); -} - -/* grain overlay */ -.grain { - pointer-events: none; - position: fixed; - inset: 0; - z-index: 9999; - opacity: var(--grain-opacity); - mix-blend-mode: multiply; - background-image: url("data:image/svg+xml;utf8,"); -} - -:root[data-theme="dark"] .grain { - mix-blend-mode: screen; -} - -/* ============================================================ - MASTHEAD - ============================================================ */ -.masthead { - display: flex; - justify-content: space-between; - align-items: flex-end; - padding: 28px 40px 18px; - border-bottom: 1px solid var(--ink); - position: relative; -} - -.masthead::after { - content: ""; - position: absolute; - bottom: -4px; - left: 40px; - right: 40px; - height: 1px; - background: var(--ink); -} - -.masthead-left { display: flex; align-items: center; gap: 18px; } - -.logo-mark { - color: var(--ink); - display: flex; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - border: 1px solid var(--ink); - background: var(--paper); -} - -.masthead-title h1 { - margin: 0; - font-size: 2.5rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1; - font-variation-settings: "SOFT" 30, "WONK" 1; -} - -.tagline { - margin: 6px 0 0; - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.masthead-right { - display: flex; - align-items: center; - gap: 10px; - font-family: var(--font-mono); - font-size: 0.72rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.status-dot { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--warn); - box-shadow: 0 0 0 3px color-mix(in srgb, var(--warn) 25%, transparent); -} -.status-dot.ok { background: var(--ok); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok) 25%, transparent); } -.status-dot.err { background: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 25%, transparent); } - -/* ============================================================ - WORKSPACE - ============================================================ */ -.workspace { - display: grid; - grid-template-columns: 340px 1fr; - flex: 1; - min-height: 0; -} - -/* ============================================================ - SIDEBAR - ============================================================ */ -.sidebar { - border-right: 1px solid var(--rule); - padding: 28px 24px; - display: flex; - flex-direction: column; - gap: 36px; - overflow-y: auto; - background: linear-gradient(180deg, rgba(232, 225, 211, 0.4), transparent 40%); -} - -.section-heading { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--ink-soft); - margin: 0 0 14px; - padding-bottom: 8px; - border-bottom: 1px solid var(--rule); - display: flex; - align-items: baseline; - justify-content: space-between; -} - -.dropzone { - display: block; - border: 1.5px dashed var(--ink-muted); - background: var(--paper-deep); - padding: 28px 18px; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - position: relative; -} -.dropzone:hover, -.dropzone.drag-over { - border-color: var(--accent); - background: var(--rule-soft); - transform: translateY(-1px); -} -.dropzone-inner { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - color: var(--ink-soft); -} -.dropzone-title { - font-family: var(--font-display); - font-size: 1.1rem; - font-style: italic; - font-weight: 400; -} -.dropzone-title em { - font-style: normal; - font-family: var(--font-mono); - font-size: 0.9rem; - color: var(--accent); -} -.dropzone-hint { - font-family: var(--font-mono); - font-size: 0.65rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.upload-progress { margin-top: 14px; } -.progress-label { - display: flex; - justify-content: space-between; - font-family: var(--font-mono); - font-size: 0.7rem; - color: var(--ink-muted); - margin-bottom: 6px; -} -.progress-track { - height: 4px; - background: var(--rule-soft); - overflow: hidden; -} -.progress-bar { - height: 100%; - width: 0%; - background: var(--accent); - transition: width 0.2s ease; -} - -.archive-head { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 14px; -} -.archive-head .section-heading { - margin: 0; - border: none; - padding: 0; -} - -.icon-btn { - background: transparent; - border: 1px solid var(--rule); - padding: 5px 8px; - cursor: pointer; - color: var(--ink-soft); - transition: all 0.15s ease; - display: flex; - align-items: center; - justify-content: center; -} -.icon-btn:hover { - border-color: var(--ink); - color: var(--accent); -} - -.pst-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; } - -.pst-item { - padding: 14px 14px; - border: 1px solid var(--rule); - background: var(--paper); - cursor: pointer; - transition: all 0.15s ease; - position: relative; -} -.pst-item:hover { - border-color: var(--ink); - transform: translateX(2px); -} -.pst-item.active { - border-color: var(--ink); - background: var(--ink); - color: var(--paper); - box-shadow: 4px 4px 0 var(--accent); -} -.pst-item.active .pst-meta { color: color-mix(in srgb, var(--paper) 65%, transparent); } - -.pst-name { - font-size: 1rem; - font-weight: 500; - letter-spacing: -0.01em; - margin: 0 0 6px; - display: flex; - justify-content: space-between; - align-items: baseline; - gap: 8px; -} -.pst-name-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - flex: 1; -} -.pst-menu { - background: none; - border: none; - color: inherit; - opacity: 0.4; - cursor: pointer; - font-size: 1.1rem; - line-height: 1; - padding: 0 4px; - letter-spacing: 0.1em; - transition: opacity 0.15s, color 0.15s; -} -.pst-menu:hover { opacity: 1; color: var(--accent); } -.pst-item.active .pst-menu:hover { color: var(--accent-soft); } - -.pst-meta { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.08em; - color: var(--ink-muted); - display: flex; - justify-content: space-between; - gap: 8px; -} - -.pst-status { - text-transform: uppercase; - letter-spacing: 0.12em; -} -.pst-status.indexing { color: var(--warn); } -.pst-status.ready { color: var(--ok); } -.pst-status.failed { color: var(--accent); } -.pst-item.active .pst-status.indexing { color: color-mix(in srgb, var(--warn) 70%, var(--paper) 30%); } -.pst-item.active .pst-status.ready { color: color-mix(in srgb, var(--ok) 70%, var(--paper) 30%); } -.pst-item.active .pst-status.failed { color: var(--accent-soft); } - -.empty-state { - color: var(--ink-muted); - font-style: italic; - text-align: center; - padding: 20px 0; - font-size: 0.9rem; -} - -/* ============================================================ - FOLDER GROUPS IN SIDEBAR - ============================================================ */ -.archive-actions { - display: flex; - gap: 4px; -} - -.folder-group { - list-style: none; - padding: 0; - margin: 0; -} - -.folder-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 6px 4px; - margin: 14px 0 6px; - cursor: pointer; - user-select: none; - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-soft); - border-bottom: 1px solid var(--rule); - transition: color 0.15s; -} -.folder-group:first-child .folder-header { margin-top: 4px; } - -.folder-header:hover { color: var(--accent); } - -.folder-header-left { - display: flex; - align-items: center; - gap: 6px; - overflow: hidden; -} - -.folder-caret { - display: inline-block; - width: 8px; - transition: transform 0.2s; - color: var(--ink-muted); -} -.folder-group.collapsed .folder-caret { transform: rotate(-90deg); } - -.folder-name { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.folder-count { - color: var(--ink-muted); - font-size: 0.65rem; - margin-left: 4px; -} - -.folder-menu-btn { - background: none; - border: none; - color: var(--ink-muted); - cursor: pointer; - padding: 2px 6px; - font-size: 0.9rem; - line-height: 1; - opacity: 0; - transition: opacity 0.15s, color 0.15s; -} -.folder-header:hover .folder-menu-btn { opacity: 1; } -.folder-menu-btn:hover { color: var(--accent); } - -.folder-items { - display: flex; - flex-direction: column; - gap: 8px; - overflow: hidden; - transition: max-height 0.25s ease-out; - max-height: 2000px; -} -.folder-group.collapsed .folder-items { - max-height: 0; -} - -.folder-empty { - font-style: italic; - font-size: 0.8rem; - color: var(--ink-muted); - padding: 6px 4px; -} - -/* Context menu for folder/PST actions */ -.context-menu { - position: fixed; - background: var(--paper); - border: 1px solid var(--ink); - box-shadow: 4px 4px 0 var(--rule); - z-index: 500; - min-width: 160px; - padding: 4px 0; -} -.context-menu button { - display: block; - width: 100%; - text-align: left; - background: none; - border: none; - padding: 8px 14px; - font-family: var(--font-display); - font-size: 0.9rem; - color: var(--ink); - cursor: pointer; -} -.context-menu button:hover { - background: var(--paper-deep); - color: var(--accent); -} -.context-menu button.danger:hover { - color: var(--accent); -} -.context-menu hr { - border: none; - border-top: 1px solid var(--rule-soft); - margin: 4px 0; -} - -/* ============================================================ - MODAL - ============================================================ */ -.modal { - position: fixed; - inset: 0; - background: color-mix(in srgb, var(--ink) 40%, transparent); - display: flex; - align-items: center; - justify-content: center; - padding: 20px; - z-index: 200; - animation: fadeIn 0.2s ease-out; -} - -.modal-card { - background: var(--paper); - border: 1px solid var(--ink); - padding: 36px 36px 30px; - max-width: 420px; - width: 100%; - box-shadow: 8px 8px 0 var(--accent); - position: relative; -} -.modal-card h2 { - margin: 0 0 4px; - font-size: 1.5rem; - font-weight: 500; - letter-spacing: -0.015em; -} -.modal-subtitle { - margin: 0 0 24px; - font-family: var(--font-mono); - font-size: 0.75rem; - color: var(--ink-muted); - letter-spacing: 0.06em; -} -.modal-close { - position: absolute; - top: 10px; - right: 14px; - background: none; - border: none; - font-size: 1.8rem; - line-height: 1; - cursor: pointer; - color: var(--ink-muted); - transition: color 0.15s, transform 0.15s; -} -.modal-close:hover { - color: var(--accent); - transform: rotate(90deg); -} - -.auth-label select { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 12px; - border: 1px solid var(--ink); - background: var(--paper-deep); - color: var(--ink); - outline: none; - cursor: pointer; -} -.auth-label select:focus { - background: var(--paper); - box-shadow: 3px 3px 0 var(--accent); -} - -/* ============================================================ - READER - ============================================================ */ -.reader { - display: flex; - flex-direction: column; - min-height: 0; - min-width: 0; -} - -.reader-head { - padding: 28px 40px 20px; - border-bottom: 1px solid var(--rule); - background: - linear-gradient(180deg, rgba(232, 225, 211, 0.3), transparent); -} - -.reader-title h2 { - margin: 0; - font-size: 2rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1.1; -} - -.reader-meta { - margin: 6px 0 20px; - font-family: var(--font-mono); - font-size: 0.72rem; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.search-wrap { - display: grid; - grid-template-columns: 1fr 200px; - gap: 10px; -} - -#searchInput, #folderFilter { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 14px; - border: 1px solid var(--ink); - background: var(--paper); - color: var(--ink); - outline: none; - transition: box-shadow 0.15s; -} -#searchInput:focus, #folderFilter:focus { - box-shadow: 3px 3px 0 var(--accent); -} -#searchInput:disabled, #folderFilter:disabled { - border-color: var(--rule); - color: var(--ink-muted); - background: var(--paper-deep); - cursor: not-allowed; -} -#searchInput::placeholder { - color: var(--ink-muted); - font-style: italic; -} -#folderFilter { cursor: pointer; font-family: var(--font-mono); font-size: 0.8rem; } - -.reader-body { - flex: 1; - overflow-y: auto; - padding: 20px 40px; - position: relative; -} - -.reader-placeholder { - text-align: center; - padding: 80px 20px; - color: var(--ink-muted); -} -.placeholder-ornament { - font-size: 2rem; - color: var(--accent); - margin-bottom: 16px; -} -.reader-placeholder p { - font-style: italic; - font-size: 1.1rem; - margin: 0; -} - -/* ============================================================ - MESSAGE LIST - ============================================================ */ -.message-list { - display: flex; - flex-direction: column; -} - -.message-row { - padding: 16px 0; - border-bottom: 1px solid var(--rule-soft); - cursor: pointer; - transition: all 0.12s ease; - display: grid; - grid-template-columns: 180px 1fr 140px; - gap: 20px; - align-items: baseline; -} -.message-row:hover { - background: color-mix(in srgb, var(--paper-deep) 70%, transparent); - padding-left: 8px; - padding-right: 8px; -} - -.mr-sender { - font-weight: 500; - color: var(--ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 0.95rem; -} - -.mr-main { - min-width: 0; - overflow: hidden; -} -.mr-subject { - font-size: 1.05rem; - font-weight: 500; - margin: 0 0 4px; - color: var(--ink); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.mr-snippet { - font-size: 0.85rem; - color: var(--ink-muted); - line-height: 1.5; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - line-clamp: 2; - -webkit-box-orient: vertical; -} -.mr-snippet mark { - background: var(--highlight); - color: var(--ink); - padding: 0 2px; - font-weight: 500; -} - -.mr-meta { - text-align: right; - font-family: var(--font-mono); - font-size: 0.7rem; - color: var(--ink-muted); - letter-spacing: 0.04em; -} -.mr-folder { - margin-top: 4px; - font-size: 0.65rem; - text-transform: uppercase; - letter-spacing: 0.12em; - color: var(--accent); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.mr-attached { - display: inline-block; - margin-left: 4px; - color: var(--accent); -} - -/* ============================================================ - MESSAGE VIEW - ============================================================ */ -.message-view { - position: absolute; - inset: 20px 40px; - background: var(--paper); - border: 1px solid var(--ink); - box-shadow: 8px 8px 0 var(--rule); - overflow-y: auto; - padding: 40px 50px; - animation: slideIn 0.25s ease-out; -} - -@keyframes slideIn { - from { opacity: 0; transform: translateY(8px); } - to { opacity: 1; transform: translateY(0); } -} - -.close-btn { - position: absolute; - top: 14px; - right: 18px; - background: none; - border: none; - font-size: 2rem; - line-height: 1; - cursor: pointer; - color: var(--ink-muted); - transition: color 0.15s, transform 0.15s; -} -.close-btn:hover { - color: var(--accent); - transform: rotate(90deg); -} - -.message-header { - border-bottom: 2px solid var(--ink); - padding-bottom: 20px; - margin-bottom: 24px; -} - -.message-subject { - font-size: 1.75rem; - font-weight: 500; - line-height: 1.2; - letter-spacing: -0.015em; - margin-bottom: 16px; -} - -.message-meta { - display: grid; - grid-template-columns: 80px 1fr; - gap: 4px 20px; - margin: 0; -} -.message-meta dt { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); - padding-top: 2px; -} -.message-meta dd { - margin: 0; - font-size: 0.95rem; - color: var(--ink-soft); - word-break: break-word; -} - -.message-body { - font-family: var(--font-display); - font-size: 1rem; - line-height: 1.7; - color: var(--ink); - white-space: pre-wrap; - word-wrap: break-word; - max-width: 70ch; -} - -/* ============================================================ - PAGINATOR - ============================================================ */ -.paginator { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 40px; - border-top: 1px solid var(--rule); - font-family: var(--font-mono); - font-size: 0.8rem; - color: var(--ink-soft); - background: var(--paper-deep); -} -.paginator button { - background: none; - border: 1px solid var(--ink); - padding: 6px 14px; - cursor: pointer; - font-family: inherit; - font-size: inherit; - color: var(--ink); - transition: all 0.15s; -} -.paginator button:hover:not(:disabled) { - background: var(--ink); - color: var(--paper); -} -.paginator button:disabled { - opacity: 0.3; - cursor: not-allowed; -} - -/* ============================================================ - TOAST - ============================================================ */ -.toast { - position: fixed; - bottom: 24px; - left: 50%; - transform: translateX(-50%); - background: var(--ink); - color: var(--paper); - padding: 12px 20px; - font-family: var(--font-mono); - font-size: 0.8rem; - letter-spacing: 0.06em; - border-left: 3px solid var(--accent); - box-shadow: var(--shadow); - z-index: 1000; - animation: toastSlide 0.3s ease-out; -} -@keyframes toastSlide { - from { opacity: 0; transform: translate(-50%, 20px); } - to { opacity: 1; transform: translate(-50%, 0); } -} - -.hidden { display: none !important; } - -/* ============================================================ - AUTH SCREENS (login + setup) - ============================================================ */ -.auth-screen { - position: fixed; - inset: 0; - display: flex; - align-items: center; - justify-content: center; - padding: 20px; - background: - radial-gradient(circle at 30% 20%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 45%), - radial-gradient(circle at 70% 80%, color-mix(in srgb, var(--ink) 10%, transparent), transparent 55%), - var(--paper); - z-index: 100; - animation: fadeIn 0.3s ease-out; -} -@keyframes fadeIn { - from { opacity: 0; } - to { opacity: 1; } -} - -.auth-card { - width: 100%; - max-width: 440px; - background: var(--paper); - border: 1px solid var(--ink); - padding: 44px 40px 36px; - box-shadow: 8px 8px 0 var(--rule); - position: relative; -} -.auth-card::before { - content: ""; - position: absolute; - top: -6px; - left: -6px; - right: 6px; - bottom: 6px; - border: 1px solid var(--ink); - pointer-events: none; - z-index: -1; - background: var(--paper-deep); -} - -.auth-brand { - text-align: center; - margin-bottom: 28px; - padding-bottom: 20px; - border-bottom: 1px solid var(--rule); -} -.auth-brand svg { color: var(--ink); margin: 0 auto 12px; display: block; } -.auth-brand h1 { - margin: 0; - font-size: 2rem; - font-weight: 500; - letter-spacing: -0.02em; - line-height: 1; -} -.auth-tagline { - margin: 8px 0 0; - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.15em; - text-transform: uppercase; - color: var(--ink-muted); -} - -.auth-form { display: flex; flex-direction: column; gap: 16px; } - -.auth-intro { - margin: 0 0 6px; - font-size: 0.92rem; - color: var(--ink-soft); - line-height: 1.5; - font-style: italic; -} - -.auth-label { - display: flex; - flex-direction: column; - gap: 6px; -} -.auth-label > span { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--ink-soft); -} -.auth-label small { - font-family: var(--font-mono); - font-size: 0.66rem; - color: var(--ink-muted); - letter-spacing: 0.04em; -} -.auth-label input { - font-family: var(--font-display); - font-size: 1rem; - padding: 10px 12px; - border: 1px solid var(--ink); - background: var(--paper-deep); - color: var(--ink); - outline: none; - transition: box-shadow 0.15s, background 0.15s; -} -.auth-label input:focus { - background: var(--paper); - box-shadow: 3px 3px 0 var(--accent); -} - -.auth-btn { - margin-top: 8px; - padding: 12px 18px; - font-family: var(--font-display); - font-size: 1.05rem; - font-weight: 500; - letter-spacing: -0.01em; - background: var(--ink); - color: var(--paper); - border: 1px solid var(--ink); - cursor: pointer; - transition: all 0.15s; -} -.auth-btn:hover { - background: var(--accent); - border-color: var(--accent); - transform: translate(-1px, -1px); - box-shadow: 3px 3px 0 var(--ink); -} - -.auth-error { - padding: 10px 14px; - background: color-mix(in srgb, var(--accent) 10%, transparent); - border-left: 3px solid var(--accent); - color: var(--accent); - font-size: 0.88rem; - font-family: var(--font-mono); - letter-spacing: 0.02em; -} - -/* ============================================================ - USER CHIP in masthead - ============================================================ */ -.user-chip { - font-family: var(--font-mono); - font-size: 0.7rem; - letter-spacing: 0.08em; - text-transform: uppercase; - color: var(--ink-soft); - padding: 4px 10px; - border: 1px solid var(--rule); - background: var(--paper-deep); - margin-left: 12px; -} - -.logout-btn { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--ink-soft); - background: transparent; - border: 1px solid var(--rule); - padding: 5px 10px; - cursor: pointer; - transition: all 0.15s; - margin-left: 8px; -} -.logout-btn:hover { - border-color: var(--accent); - color: var(--accent); -} - -/* ADMINISTRATION button — shown next to the username for admin users only */ -.admin-nav-btn { - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--paper); - background: var(--accent); - border: 1px solid var(--accent); - padding: 5px 12px; - cursor: pointer; - transition: all 0.15s; - margin-left: 8px; - font-weight: 500; -} -.admin-nav-btn:hover { - background: var(--accent-soft); - border-color: var(--accent-soft); - transform: translateY(-1px); -} - -/* ============================================================ - SITE FOOTER (shown on the app view, not on login/setup) - ============================================================ */ -#mainApp:not(.hidden) { - display: flex; - flex-direction: column; - min-height: 100vh; -} - -.site-footer { - flex-shrink: 0; - padding: 14px 40px; - border-top: 1px solid var(--ink); - font-family: var(--font-mono); - font-size: 0.68rem; - letter-spacing: 0.1em; - text-transform: uppercase; - color: var(--ink-muted); - text-align: center; - background: var(--paper-deep); -} -@media (max-width: 900px) { - .site-footer { padding: 12px 20px; font-size: 0.62rem; } -} - -/* ============================================================ - THEME TOGGLE - ============================================================ */ -.theme-toggle { - display: inline-flex; - align-items: center; - justify-content: center; - width: 32px; - height: 32px; - border: 1px solid var(--rule); - background: var(--paper-deep); - color: var(--ink-soft); - cursor: pointer; - padding: 0; - transition: all 0.2s ease; - position: relative; - overflow: hidden; -} -.theme-toggle:hover { - border-color: var(--accent); - color: var(--accent); - transform: translateY(-1px); -} -.theme-toggle svg { - width: 16px; - height: 16px; - transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); -} -.theme-toggle:hover svg { - transform: rotate(25deg); -} -:root[data-theme="dark"] .theme-toggle:hover svg { - transform: rotate(-25deg); -} - -/* Icon visibility — show sun in light mode, moon in dark mode */ -.theme-toggle .icon-sun { display: inline-block; } -.theme-toggle .icon-moon { display: none; } -:root[data-theme="dark"] .theme-toggle .icon-sun { display: none; } -:root[data-theme="dark"] .theme-toggle .icon-moon { display: inline-block; } - -/* Floating variant shown on auth/setup screens */ -.theme-toggle-float { - position: fixed; - top: 20px; - right: 20px; - z-index: 200; -} -/* Hide the floating toggle once the main app is visible (in-masthead toggle takes over) */ -body:has(#mainApp:not(.hidden)) .theme-toggle-float { display: none; } - -/* ============================================================ - SCROLLBARS - ============================================================ */ -::-webkit-scrollbar { width: 10px; height: 10px; } -::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { - background: var(--rule); - border: 2px solid var(--paper); -} -::-webkit-scrollbar-thumb:hover { background: var(--ink-muted); } - -/* ============================================================ - RESPONSIVE - ============================================================ */ -@media (max-width: 900px) { - .workspace { grid-template-columns: 1fr; } - .sidebar { border-right: none; border-bottom: 1px solid var(--rule); max-height: 50vh; } - .masthead { padding: 20px 24px 14px; flex-wrap: wrap; gap: 16px; } - .reader-head, .reader-body, .paginator { padding-left: 24px; padding-right: 24px; } - .search-wrap { grid-template-columns: 1fr; } - .message-row { grid-template-columns: 1fr; gap: 6px; } - .mr-meta { text-align: left; } - .message-view { inset: 12px; padding: 24px 20px; } - .message-meta { grid-template-columns: 60px 1fr; } -} diff --git a/ISDSS - Internal Survailance Data Storage System/v1.0/martinhal-datahub.zip b/ISDSS - Internal Survailance Data Storage System/v1.0/martinhal-datahub.zip deleted file mode 100644 index b2cff28e537644e7d4529a5468af3058c3bf9262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58595 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∋x56J`8- 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

    d9k%c@%n!bgAfHdF!Tc*>{*!rK* zCasOVvGu>>n!Vlsl-#AZWpbfZ$G4xq=*Zi-!eunF<29^`f}p6VV`ke4m~_J!S#$)m zv)>1hR@yRUr9~zG_US2GvP@pciSNT!()Wq~*Xx~j{`+og@6YR$`oSWk%~CK7tLl}^ z$CdrkE$~nzGT0K#BdD+7w0gI~PG%f<$_0gG*o`k-NnqZ1<({H`7SLg?_%KImw8=x4g zQMm<*H*T1bKBpuWI=!G#_vCbj7ClD8(`L{m4*GIeuR*6E6pi}i<@oGXsz{?*m%)-} zA%KqzV*Hxm^>5=%Kb@JlfYOeT4o^_V>sxvo2^8=zZMwa3jb zFnH772alP#G|l5OYfi^&`?O7YbI8li|83cx?hqv4KDBVSf%Pu1mEq+ZV4zW7otp*I zHY9Uiet8bU^D=}vGgO#Q)|-NPUpSxse1c;h1U2!pIui*F=P8)c$k9HGD%;>wF=o3((+$lfeS><%Y-Wj*j6Yd%m{967 zqi-k(e7P;&Z&h?pKo3ln2j=OU7K-DJjaWlQ)1QK!NV$Kc4+!C=RRaq z&dLJ9@pi;tLpY@D^bw`S>}Vk@%2Yjm58m4ZMyplApdqKBYFdU&gOk@YlZjoxD2R~c zc4rN51QX;(Pyp3*M3ffM+1{cV&39kDzLjB49NMnb&D>TLult;&@}Gti6@XtW7s@Hi&>0ihsa1tK$XREiB1!15t-wfj1mGNE*DKi%~D_Q({KFjBmI+vM`h=+ix%1N_`#=b1@NJ+!-@%_njUtqI9A zQ9_I9J+=4e-*?CtFKP8(B_^(!BZjryfU8q3=R>TDYF%Xl!9lz1s3~ptac!v_;1(EB z{5C1Upt`aN3k?XdtvU{dwPv{jMJFuB;@U#N54vaZ;gpSd5oJO4&MvzDxk}a=y5H&0^%U z{f6wjp{E(mO4!uT;mSm{i@$lBbg3;{A%PSjUjjr`p(6 zccg(&=tf_BfbKqn+jm*Q&kH4u%y)NpBkKBd1&w21LxI#<5D5#*0-J!1tx2U=`V*gZ zL4GI7dkZ0<&qh5-H$GdyV#L+)<_z@sj*_731tpd$kcd8c*QJKGqZ2>xu0Dm0R$MI{ zESa$jc@E))(uRPJ6!9jMZn?ybUtl(z?j6)))V5k-VzZ17;2~?L=H}D5<+FrH^&0hp zF2lY);T;>xpS7two(qaF`--YVRL5_m$vizO{@$-1o3NACj#YA9PcQBt&*S=9Sm&n* zV#CMu1(OD=!(hubv(SwxI8r%|7?Wvy+(L8Kb$v9dI71=5>8d1Z%uqz+K2)fm86T;-JaTvGZQ@AbO_;5mhS|i zX}&Hjr-un5;QxNA#Xllx^2#K0ZM~TOXge0;Pwrk!NZnt7EfcduAcB1~;<%cOh}(RD zvjZ=7E3&BnCFUMJW&mO=G;%Y2LO_yHh&yvz-@#M8+*am+o2oH?U=(WrBJ7Bmc)d^E z9NdZNt8e}B({;4Rv@@=qwHlYr(+)*;=bnuUB#=C0TK5^uuBJO0Bm9#L1@~O^z1(Im zrSo)t4!bOntbL*Bo;Q(I!KKU1tH526uI(kw-NFUwIx1qwa678&5yD+jwl@9V^hdH? z;uI+iHD@KBq5Pt=-H84+(7!3lk{@A`yzwv1oE7prBkv;fo*1kqvodQw){(UmM&=(& zw3yY#=lZ_%WKr-n2SKJY3+e^7Gf%9XLd5P>*BnuEyWvJQ|HWYBYKTbikg|v}4NTl+ zIkKsj8g_?KU+a#s>w&|Ob@w<}r2OFy-=+FL?A@jn;Yw3P(b1Kk5w4${#Z?H@^OgD# z_9YRwLq+HSOUELUt_YjpRuZ9F#3mW>dMZ zEfd<(Yaus^2NFddBv%;UzpT_v?2bnI3uWn^q$;M+30R_fz-xWfAj>13koUjq;g>1O z{TP(gJFye!#Vs&1pdy@4uMU$dD}x*l8w`X7E(YoLKxr`DJ)Grn6Wi*{p<*oSG9G}0 zpBxY2=gUdB>4;l49O$wM(`iYjW`=hrwWO9jqcgu>Co-MR2%egx0xDa3>`*Qyt7a2z_ED_{67-pX@NKQSiF>ZNA$|ekR-3 zah*sDH~2zWx%IPW+OJt0Ey;u9u`r{sdH2AbQ0|fm91W3@Qvf=P5eq3W!LBv8uab9P zq8xLijXSokC*7kcd!%Cs$EyRGSNWArd9SiFu6~ItGfm%BpY!0uXVF(e>@>4mw9gdv z9s`WJhP6rMT&`MkeTBCZE*0K0VZGI$U^^>9r=pt-FXblxO=>MwpY}1to>bUk zrjNQ+3aOAW@5rHET}G{m^6iTsFr|+-k;!?Y-*@$}Z;Nto(BGQq+xnqapS7$(`~g=+ zNl(rpv+;NrRZYplxoDRV&o%~?)V7IQdSt7=C!5E%{c`Aiv;lyt->Pe<6Q`fEcsaux zM~1)QI&*Sv+^bc-OC+ULkOk~h?HgS1_!mRNm#n^1kho?@7uOa?6+DU5n*E#7mo2B0ReO#b9GCAc6m zH+DCQDCx0!q0l2GtBe-UT&~lfux)b2$J3sfC(UCu95-4Cu#T_DpmB%mfE$_3lk6u- zEbDvdNnH)?SqT4TMv)0)W`$kRDP2t(9)}w0M!WnH-P{|6V=U02*nep*Yt5jc1`ny8r684^z6M~w;WPki}XTfY>ZXiURh#+sfw0?fY$@thh zxMVhMugcnV(&ll`oM<@DFoDdOo(jsmz#7aE+D&qrZCyCy4lzRS2VieBz5EFD{bKmz zTb&nPd_@Ps3V&Me4CH>o@q&5tHN^GMEp=?&?azzzp%K)2Vj2soL8vxg=~sYtU_EB3 zoAqEMtPpBYQNMsT9(s0Mw?l>n=Mq1OTVb5$9|}0eIiam&Z5?thui*wkuX zVX=4 z%8~&AYL9(-0L*qCwxOaye=II1b_No@v9}5NK-!`Wt0H*l?o^8Ycuc!x4_*B{srTVr zgOLSJ;*`tg(76-y;xpp@sQq2x@!9Sip|74Mozqtqg0i8>EDcHofir<|qd0};d9H8< z){6Go3{E%|mo7HH%aO8pHjLphz;iV{xvj8PVg_e^oM8!wl199Gb8wjVeVv^#e_;Ki zH1EQHs2&+#-R{VP>2zi#hxlW7BbBAH)bgm`uK2gY{7@9jlE~^;SpWpY>RvvP1!$4| zZ=B7YZ-K_SNf!8#$&YR9#nEm=^w;XC^-A)UzPAv3VexzM6p5nNQ>kmg_YBf4L>}Wz z4d1I{UbOntU(H$d=rjAgl1!4rBrf&G1DV-0Z~|xx?pi2WEKyo(#TEnoY&yb;(hl;?JL7p+6*qfhWm(#8&E7NgBFV z{D&+*2Qf*~bepthly@n1BCeuu}x{FU%tP-*kj)%aVfljN?nRd)anOpCrdgg%ms#vjEb2@(3*v!6EIatR{P}Z z7~Z`6T@fS!`x=bAr2@Mr6e&+Xm~ou#su=%jR*fi?re+)B4)UKAF2A6>QvrJC&X*(* z{>Y=}IUG8H#oY5*^SKt3t4qqUeWGupHNL(K>H%Eunv#>^jbL#e@?UcvVq;P5)nNlZ zSJz}AOC3j~T_`OFk^DQ6-#LQe$aRdt(i#*qW9Z znlL?<2cJ|O-pN!?(Fossa(YBBv+l+{FPt{5Y1QdRFGlL|s?*&FwwxbKm)i8Lh!qJL zo#Rw^HfkM2aB)(cnk6uD4j;PvHL7<8vM()x$5af0MK+U>8iBhkmg-cUtcqChHs&!8 zUCFU=SWsA*IGeurJ!lec7$5rTOb77g&gw4Q0o!Ks9y9q7=ho!T#8QW|H44Hj$T5DCbA;|4Xfgq5DYSmw=%2QwDL@RlzYXb0TC7Ib6%)S$d8N# zTW?Y{A4JA}a(lkT>w6DO*Ol+%gAoR(@Q`zwV-D7{d0=~vVuqb#9dwWx6CuOMP9;mW z%!Xt(a^pQ>>@r$xaa}vruoyfYlYZEodqOC!hPaa8q2u47bM78}CQT?!Mk{s6j6cY-J-L-~fZN#g zmM26?T4E4j*}%x{0j~2lSqwuSwo`LXixN9B6_Lab#XBOsUV&%{y?4nl@M;EFvBgf6Ny8eaeUC*(Qs= zQt)pQ)e0uQVEH1`C=5%}hC`&7D!Tw$$jn+hef&*@-dBw3*jwFTc<>OB=oRQT^asw! z@pwW;Covikwa{hH>Egz2Is%Ck?$bsFrmokERw;CWX<65pIjA=Mhh^Q!nim& ziJEg4XOAXx%INDAk19G-s*9fu0beJCv9P_3e;No$_W+=_fo2}rxM0s~?QioeQ9Px=l5u&VE2Sz^f*4EeqwNmqAMLHqG;u~SRNoSiZdx= zcY-_YKMIf`eaLCCKyst4^2!ntZ*EIf;qCURk}0^+_6ZC!i>m&uowonM691a637Wk{Z}q39>oL7J%Y3+3U}1~b=fif-&2`<}nbY$d z`%2WVX0Bqz^`S^x?fIR(?&7Am3@mp2$G!8>ZswI`?&AGJn&rwzeW>%(n48-T)5ptE z^5~{c(7u1{YX1`WBF*~pb0u6r++FJ9gQ;}~!^QbcAEgRSFM&Td^L4K2>@XvbRb9th zfch6dZSdE|J(He^qkXyW($j5RhYXKV#3oX2(muT|1zm_g?Nqo~4Kz3zE{>~xD~zh3 z0bDg7;aQm5Z%7MU7C@8aBr!XR1fw)q1h~P}Ap`a?7^fq)^7CJzlg#Af*J(AoWiT;c zZrg+0kPt6PiA!b3w-sH)H^t?qvi24`UT*oHj;n27(wYnUf6lB_bI z%y5;FqA%PR6kJ*$=vZtVz6_ygq=Msk1pqVqDK(fzZC!+S+5TxtJylE4xyE_ZPU)xL z+DYaUc5dtCruL|C?}DV56>8ZZW`~I;$#~$@UL0ylDEb^l#)`JOQeQ&j4$R(IB5Yev znYl>pOy>-skgBFlR$m8h&X{i%E*c20TwDAqnYij%f6%=;&ZZg&$GsOb`jS})Xb(8 zwiR?cKmLm7_O!2>qv~b0_VSRAH^$~!ync6K`pI&c?r4+(#q5Gqp`hU^DP3gs_ZkCh z4^YHXQqRPmkSkGWL|dg6k-`c*)HtR>Me7~QP|<0^fvFsW90?#d7Io-L zlM=d2xDG8@50@oS(QetE8W`kShD(&w_=k(uv_ea3(?M*E_!9-T)5mzK->yhCokkz8 zz+dgDhj1&@miWG0gQbpAsd0j5v-R}hLKfj*{GD{V+8W}gq?n}1Mgu6G6Q!^RH2JcY z%ECFIEo>R`X_e{GqMphf4hpgwrIr2U6bM^xoS&&`GUuxQF*oksr2V*q%h`$NEkZLgKg(|e%7?p+L^uVf6$3wn(BT~aOzOhCQ00sk2ls7bF){P+R&#V_A zo?qS5EX@lWyX`dFv<=!hnfOe0{megGB)9Q0{3w=Pd8pL8wn~aW<@+;x)An|E+8*f% zA6d#~147?VOj6T=C?fGTTp^67O6A7Gf#>rYv4JQjwFp;5f$3nWgojzwg#%wO2)2d* zpaM2n6E*h`lZjK@V|AgBjJFh;ncqEeI_3_-<+>8zv3c8yQrAJ@s48JRqa8CUr*&gq zt&WhYx&Q_!CY^`_3)2+Zq%D-3pBOB$7(a4IyHu}=mpTqxM`dxEC4?77J>5A&96ujyVZ&ALhP)_ zzhf-DYoDPx;n{<;0og2+QkJTUZJXG$lCxLXj22$e2Ygb&qVb#Her030uEF1&)%EUt z?F!uwrw#0VEVP*W{BYNgdgzusvIF$sj0y_0w0l8hJ_h#jLk?47yn~G<|8#a^gz9tvD z_S|2IS*3Mq52r-H&*hZln>5m4<%uThn5?v ztM!^!&CUCP|Ih1Jdh8ROg`YKtxBSJMFX5d`qw$of%d)Q*1o(uFlDp4l5K9o)MsB;@ zSqQ!iv|!>28hHc-gPWKiT<*S8YAMWc!CTWaR2-f`*Rb$!d)s18>(n93xWfesy$QvN zpC4@P@8jtaU0}3NrGO`Zly`D5e<@)X!qxKnLtSl}15jK{k0=oB?A}y4;^~1>+P`5s z^&=|#(GC>o_}-kx(l;;>D=)<{jjXdNAFL{QY{c>kD)!=R2SP1iin>)qJ9+5BTQ<$QzxZz- zE;Xnw!Un=cYh;QbmvJ(m^x!vfDcJUe9DI#dC5`fLtP$9INS!(Tsf%bGRxP^$OJRbXy+=yvx;|5euJF5q89o#A zcc)poy7+&NA+JyHIam!juu_6^rk7-y$&?gZzgT(l@N~1-LALMZviP)9X(9*5H`(hX zXfsC}EYdjPwgv-M7^Db-eT*MQ$G86`vv#EV|N7$VpWEQLI?>g^7yO8_i@sgD{1lqu z)0Oy<+)8z!tgt=nO}dD!K%1bRKd(TPASRNC=kRDg{au7A(kJ-!j1)TxLp<0Of|+`= zM4&va*qh*s^}IIKdRLc;ier#>E~aCbg~5v*T?pMi$Qb~qg+xB_1Sb=lrizPi1~nS- zS$(lo*xahFvTX>cGK0=ElXZ*A4(%h~H+;`tZZdM|O!VKxS)R#|4v!g|8D6Vxr0N>% ziJ9umD_9O?Y~|#F#r+E{dwyDSz^*Ymyj+56mf1LhfE0mboH;cDB^CtuWr_&m);Hjw z#vyv0XpEC2qR7#ZcgX;@LDINXnD^OVRJ`~?^nu0sNr4C9Gd^|?){1@|zYKwMY;XtH z*DrsViAxXVo*M(QrO>pzyUbXh!vaNvOb)I{Wn3%gOl%5)&< zP`fO2+~f2Pw|ERnghm8k6E?eCo-4U^)!jv9;BSdbwCq;P*Tv8yY}|H;R&-nPl7u;$zSh%$@cuZOqtUttI|PUJqL` z@=3}ZGQS#@lEn5b0Y_y>GK;S}oWoQlv#mV5{R*N6c@Gw(_eH!8Px1+qDhIy=VCZIs zf+vzU=O@ZmP8iphrzf+P>RIx(cKBOn4ogCD5KOPa>Skzy%6J0#@h_&|m@n&(v@ zNo=w@INHK3MpiJ2sVaxlz63jKkWF9iy%9(FH%ZP@_h$GYz^~@IO?XZUX6MXx@aXev zgI;pxU@ZcI<>wRE`*^82ai>f-SgwM86>~wsG8Q^k6XRg2PNiifH>$MCUF1(5xf+k% zXQihtaGuQeg)GOI0`ML$cAr`!x4rrG+vI_>H9vYh^^a~9A<$ky{!0Lh)Jq7{}s-=XBAfz)(i{P-6 zBXCV??)K1&xKyVg`4MvKW*Mhz_ynzndJIuLM1AB^YMrPwbPDkOeaj+K~0Wj-!Z7N*6~E=?o_E6>87s?Bg{9rD#2alx1&kY&@iD0@IkSMGJK1S+|Bg7RIg^VcBL{NU*tI zPEuSD8rg2uwW>TKWM)15NF}V~7VV4sukImvZO^uQ9N^~Y^!=so<7Im#r45k2<$EYw zvd^#2gv$T*>7ze%wKHa)u_nsWp}N#lqU(27;SKMX>2%W>RwI$-CPnS$219pPm>aGz z)SxUf>SpZRNi4W*d?uB_W}agg?bapruYfNf-+0+{$ZiFUFO^bh5e|-+ZZgP&`7qVt zrE&khLe2CL{E4xa{_r-)i{ots{{y@cedc{IF2-$e19rNtNM20^yc$2V&9ix3X%j5> z%S4$jgSFMtZEZ7QRU~eN5lh7F@?LdodIhe05u>=IvCCrEx=KpM{0y{!h5+sj-1WVO zu_0Id8uPUl^L`S>NAODY-HEe95Z1s$xOE@v2sKiqc~wd?IEyjE6{3=0jb?`B7$2H^ zDF9b&!UahzyS}ELg3GZ{%21vfZQE6wD}xp*TMFP3Z#IR*IpeqBp#64sR&2%Umx=mE z9t`&oaEe`y%R9|54|;w#MWpg(-DjIp%~mQx#GVVYcJSm_AQIuB&OA8Nn{&nrOay&e82{)e*rW49 zWF{UzeiV6P57v%fgJ0_}^)^rxH!G2%##3m?%J`s`SA@u9k%i&5J|{jc4Xeh9iv zA2YS7sga@F-`@}iW7hs=XUc?f=~JT0h+O2Eeu}0AhDxsZ8)1Juf4u~#OLlyxwmSyE zAkXQ6;Q)=5)r^{4cChS_i%32XFKpO!79(qJXyx~vir6lI`wM{>xkGh5tR8bQ4zw`u zb%}K^m@rPwo@ErPgTj1Li5c}ZU02eft>ANF5&(=+L@XcMruUh@+t4SYY4mHvW*PW5 zJ$Q0UV#?_@Ea#_ZV#N`PT66@3%#)BIZaJaR%TSB()F=@@y7;)8#>c9b*g%L@^kGb^RcFt0SRUt#T&5!6lrd(eB7 zDo?X#yr8Nb5ti1lqoBqI?eqC3`GQ`NzBzfq#$!7~<%;L_+F{yuZMqR<1)XFzZLmae zk*8;@gPuUDk{CFzk`szH(oo8-R?WkDfudpH9ABE8T<>iaPO#0%G%ZV*)u{LFMH_*E zO^tCgMZ~j5nA1?&JJc$DZDSFFR3ZbI+l5Vi>^T$G+Wf+q0F(i*ISwP*bUNjg%~B;& z>!3;iwt7RH{;g#&_#;IQ5K1>4t0AM-)KZzWq=-Hu>c+v|BDo!d@*Y#=kJa<}KlXXa zm+qJ9dww?$&AWU`nTiAJ+(?^EqiV${4XUOeX^*GeN;YD zVH0X)^_ddT&`P>YwD_K4MRR(Z)UdemvT^)8=J`|&yM_uU&Vml=Lwamq7qflrzf)uv z8<3SY$2iw1)v#FGT!&fm*rhmz%s3>3&|v$x+skBHU7nH8x?r^YIWrZby5K>>)7!M_ zN=S|EH!ZVHBJWU@YuMTPg5@qm&vtB573H}SdDhA9w)sCj3wl6qjy`IvT|~dV73D*5 z54pg$G<%)|LdzA~&^ujG z>S#?L5XId!HS^V5atH6980>lU?mqNVH~OX>YwV-%Eq*?F(fNMc*54@_YNh_smN&EP z9I+pn{V`h^VW96l>a?zWME)@`AF8f3=R2t z$E7{&k(vc>`TFx_!Cz+i>6muYnX+x){pYKb_$lqcZ-(`4`(*{4Pwa;OA&~Mr82@Wn zZXMm(JAG1r(emzoy7MOW`bGa=30YkOrkYgx^AuFD%-ZLRaj-) zwr$(CZQHhO+qPY|`kcPe(I>urcHjF4Mr6dydf)2pa1z=EU zU1~-s+jz?jLm-Zo1y%u(t7so%eMWNlL`g-c+$+?tt3q|1F$7N4(^UVjds(yUuQ2k_6g>ws|J6iC2>3qb) zOCGCi7Ym0xOnGT{nvywKOOjI|e|`Det7o|$&v*JB7+RLpl!UW9+mMTBMq|5Vw86qb zipO3iu>Ms@gy3-@ccFD~cwz1kpb@-f9AlqBdy@qpUCOR89~JnE&i{kP+iFA&bEHOI zFd6+S$myHuql<{Uo4Ly|;fw8B$aU72rY&+F8#hRvYk2bs<%NNKizV2uS&-BNIcx|+ z;AU`DPKQRnhR^v?EG|EgM8bfBmo#C#>@f*H-#{;%z! zP2zX2dI9AtY#PuOyrZ|~-nIHpxE%cG(67xRr(v=g zd$a9ZFpqb8q{c)2yB1?V`Ef3;I)`A;0;igOP%tmp@q*>548@FMQJkUTuoO@n_*1*Q zxbX-mXLKGhOP@b9pswG0AUu z++v+y$9R#4RR&MzwHKEwTJt&91q0n&gI)P6Wchjx)pr&Su1f`8P97Z2Us}zrnY`PF zsvmkgp6ln80Nph7VBdj%V?XX;+OrX!|K?L(0bumHX&BCSH0VGucZMmU9D_vG#4vAT z*`XLV1ma8{hm5fiH`ywy&jHR(WzBwU-R-YpSS}0H8^iV(oYoTM?%hc^-fwF>S&u4s zHJLo*r+|EKCbvCn>4kdjy`MwF($Jd7*~ zM=z#RGSZ-8k*{+mzJn#rAa|SW*jq&thwI2xDY@F8&DlUOI%#lw`&YHE_TuGojdiM^;p;p!y!QXt2-lCF8k!8o~THfT`U5aa^eYPf2?Aaob z7F+hvu%M{TE3Dezi)ZD81E_j$iD>Vx9-yv%%ddd02$QdShY@r9WOO}xg^^UvszyhZ zjfCy&NB9yE`F8ap*rYilCNgOa^og@VlUOi=;1CMovC`6-mOV_jHGvtH@*F7GQo*j& zfw0hi=@*5tPfPAiH>1f8=%4hs@8;sAV7aTSj2LH`trOC?w5TCCH0o1FPb^2Sy&l>3 zi)pj^!il_C;EwL z@Y26O(;RyG0yHhLo{l^YlnouHdaze+Vw?H>l9KS)dqvD_rpv)VV2dS zoK-MB45=nb7O5iD1BuyG&%@=M11ezam^NkKBPWh=%A6w8tBQ+#Xtece_P2nQwoE4s zXb@(j`aSQCgVe#!`V?FU&<3&OSoDlT8=&AMCw$;LlJN!3|Jc^Tx2rB^$oZEq!o~Mg zlw^jii$)$!C^Mp3mUHeF$H4(zA75Spoj_jHbKBid49dD{QXnojk~I?8SY>xu7UF6lE3lf?->LZf zgk*C`PG90t(cDJjtDwe;pFH~RE&Gp#=C5pEM`q6Br{_OfyzV20xj_3zW4*&7E{q(X!4`dB4+}m7) zx|K&>`ch`f$!J!KdS+mJB@_!QfzIe9)X(8|(1S|j+4X7ti4FEEigvVgXZ- zHDbD_hJpsW1ab6c!8W@Zh(ii2$;e`V`5rxXHr#E?{-uHV3U1i{?NyC6tnTT^uWo@# z>D`~`#9E5PiWw#Eu5RnIjDpgDTtcJ_NE?Yn$YW=x#6d!b0LPZTB=0BC`J1PitvYeV zZ#>B!uR=D7#No8vQ*HXMRoz=;#;3k|dbPuGSNROF#IGmW>TOczukReKYx5IAWcNLT z&rzVO#f!%$)kQa~j%7b68E9e(A+f+ihIHF0m_ip43`BTGPW=H_#CFYCx6y^W0S^q7 zU4wZ=-c_p{k3VAv5}~{WHg_>8)}ghU5y!JH+bWB1mKonH5Ux@Poi~ObH+s&29!kCC zw%dkNv7u%(3UYAPm?lE?{XDZ0wmt7JRF460WE3Q(ypH0oYQ@OtUHT5X3JAeritV#f z*ca*j1)yTvI!Q|w5bHMV+L7P;&tKh-?%K!1+!O__YTHpY*JDm@)5V`mlQbBAz?L!1 zS|kOE&{ENk>d|Q3&mWC?ehB!enUlY2=tXpgd0x31N(_Sw-osY%?Eman?2gnQ*GJ+; zm|5{&yr^xne(z3xqnfDEa$nvKXNTHXnO=O|N}p`;+9&I{*Dq|-Bs^1(bj>_}v~0U6 zz5aRnOdvf(JriB`)_i`<9XP-B(C`yy5eRDv(yfLbS34|snQaAzBg&g#T-R77U!NV) z5Gs$WBG#=jUN`8XVggY$1OMHFL*W@20_&Q;&EmN`NdRKog_)7p7&`rM+t1 zvJnd^iJ=8jz7?`be^%S6yv_+!E%e$NP}n=Oep8w9`p(&FM$`$&GxlIHvMZ_%DaOB{ zmoFs8Lj69yW(4%y0uv$FNan|JO18v)hO<}MK0>u=RSq3=kt_>?x~+zv$oMESc;5;` zHgkp?Fb0dL`;*3gPI7MOr|9a??YyS6+-XMS&4Qlf76U#-P9fc_HOqrSIj#K_&r<&^ zj`eFUC{jTKI~H*OJ#iNT0c0c%d@Mqo3<-a}!{H!6{~&@ViBnTST!b9%Sd32>A3T%Z{{OFl=B1`=J-Jh$P)OAe5+ut*DZ+r*j%(w~@Q2^0k zY*kR8b|h3GgSoMSw7t!$N8)%j;{j=eAY3m_QpA`gni*10MmzCU(Ck`tjtI1eZrmh= zIzTNEHu0=X`_APlW#|6dJ6rn(R(jO4>57p5XtlMq*E_u+y}gqI#Y%>#F{tL6Ee++C zi6~JXRw)O$S^z(UR9r=NQ;i(IJqybjtkr%_Our~FSOC+W%jB7{?dhbJ9%Hqu)3lsF z5_Z+w)ap>Z_9DN-XM38jjRyzBz4gyA*ux0l-lc?XEYU6?qB{5*&t@15$N5UDqejON z3L}}&C6k1Z$DvefDQ>iXlP#m><~*n%*+Lo!$!0(ego01-WPvFn!_o70!)7L)`8*i- zFf2rY^@d|~c)E05tFA5fqgm!1#d^BCHTPYt;^TW`4C=@}k`~RBl0vlF$bOT-HH;D} zsYGF6`6TbHL6-nsubJKY$_|JQY$P#Ygs4}Y@r{pED3J~u^B}sd`4Tu}J-aBdS@1+a zp21Qra_*WvdNu3aCtFvh^NRAPmt^PlXotLYXXd4gy~DiS5svYkiG=PDTDbfo)&#>w zt?&i!tcO2DeQp>(4S2Mi$qB(q%1^N&c~Ke8$NiPo;fFa-C^VkH*o_|DNDJaK4=bvi zop8BD%!#di6;D`Dr!`K&Wryyax%^$LvG-8KDIc;zYW!W5dp7MFQ0*&iX3KnW4m;H& zhoZu{27pFggG_yGV7kDn#~*{9VlyZahwVr`1dHC^ISBt6c2Bif+c&p2sQt#8)`(I^`s5@d{r z+}3-~ZjTx+Tc@C@t_6((+7>`qWT50Q1{u;eNY~*=7-F8QyHArW_^XO+395yS7In_W zaA}XYpRHyekO!tLQ>dPlH}{sTO_4k_=G~gZ7LVmV}f*Y&<=9^FZG;D()(tp&vF8KKmv;&n++9k=&WasLi$&2nzilv4=O z@5$XOEBVzhArm15vw(yS!aY#Nd3lI#QW30JIqgWx`3on|_3dQ68BR0y$?deAUmBT; zBg8>bJV?Eu3KRS~0bl}S6mWya{Fei3vt*Gv6puFc3|K5Tk^Pg-1(d1Ocq&qh9{sHe zBHY6!EIrqQYw|jtgJ1IaiSS?53e? zW?rLI4jg?MJxNn!OkHqwd8I$LPdPQSEqq|m7Kzcju1AZz?q|lmAiB@arJ)2Y#YhmGd6+Ubvs=w);buGLeQ}&QMUL+WvAsh4gvkq@q z67Q2fprDdI7HhYY8odO#+*jS5)mwXLbX!!Z8*h=RXQt_mih8p4V#F0mxDar$O!=#wee=Llw= zZ<_=M=-+%6woDOZiBOTU`!JHtShSWJCD1dQC9oV?uxwTPV)pAK|AN%hsbcw}5w;*8 zo8seoYNK=i(7M?B`?L8Q4CWaI^h3wrT+yFY((u975c$UI{aWJasDx|&Hsj${99g$Va%k}4`4Fj znlmtwU%FB7MgA01CRAQFS|qAoQ37$@1zRD^<+(~9?9KkcqkVt1RRWDN;v&bzNRZTX zrYM%W+Au~^8#x+2yC=ViL@FTvfcl^a7T z5?&n`N#^~N!2Z-5-ueOg`-}?irB+45g`^j8=OP3Y40?0A=3L(@v|pX3@#L@gHPOEV zyf;Yd5q4o=0yGa1d^sJqGbgPh5));@%d0+V)7OR&aQ#m#5?&n!M{#OcVN^;o|=*rm&X zR732jjl4%rGMofo9at~lk_Zki>f3R|bF|hcl=P^_27gCu!B1I<+s@DWegK3XU$7E) zuWTK#zk>dE&`qKeZ%)V0*V+7+Ux&uf%8AC%Mc2~C;{S@e(TwZ0%BO=1y5<}dX>E|p z6e?3{4>oLU$c0!V!NW5?=mD7!dL$0bHlAa&AsjNtB-nQCSyk8TMMDM z^}9i>vV&@(j%*8A^(8K-b-S62I;<|XO{h1r&QDZiHm)i#wk=Oeg+*+6OC0MvwC{F@ z3;HwPg1WB*MJLvG(&wg`_tL4#1%!!x<-j%0b!*Qod~^gOH+e&)B|i(<+CB0hUw$5|dW|FiX?oFR!< zDRT~25O+rel*u%gDLE)Sk0}`D+NVCst+R&Upj93W87eEEI#=%># zq-cX9%u?BVyw55GosY^1cbMb;%J{mwIWc(OPYH_&1&R5ibceb72{ZJkM%fbq_pz3O z97T8%=~L=tl~E9!OCn^d&N$EeI04Ohg%1ERC^pwtjLDZ)AO<9|gonIfE+BnT0}4WpS7Z<) zUsX{B#u{mALc27*c4Fjyp|+Yqu|26$ri4KBCEE(wQK@%&sL`wNCoc*a)2Fi3lV-zo+Y#|X3$^D$&lGFY)@J5Ck#h^ z_I-&CnN5b5#xt#OwkIiy8n9Q4CEDdS@O$sN^s;~o^-^QZjQa4|8#5?l)ctW%8ybSw!gR08I51Yy|?wX$zU=6^y7|3?Q{1S`<4c{Usw8rCVNTti}ztsy7o5P2gG0{RiY8*Z09_M1jc#( zVc{@lEF{)TV;E%w11%+ee8}_a#bP{K&x~bF+6AV9uwEZEB8JpO8}AxHB*=k?KeX!g zfnaL^Vs#B6vS5`IL0TS`jER!<*7cplhRyYMMVs#9-AhfUWJeUP7DQYePBg650np2* zU7Rf_&=|eA)>Xorug@hv5w_rc2HD!ZUsjUEduyi6yJHAqHxd;@ENgqWEqZR?No#U; zRK&h)`x{Ixzh|vVOBp1s$Dn{roX_Tp$@h0>MpD<6le1YvPKPy%&yuKfz$*1{$T+)} zGhnuaT7IRjEHhkvIiPVr70KaOR>kHiAm180fXD7$Kp z9?q!-E+qa#MsytwOdbA>gjmYW zTCLF`c}^>56qC@IZSl(cvy|cII#FC|6_q;fsox0gO*pZTqb`LI9U^A$?=?jMp=PT9D72)K@nq%t#0oZ(P^Z&P$V9YtO75T?cfY; z?0M8<^Y(aY>&W!v8ir-?rL`Q4*Vh~moBHKW=wmMKaB6z|8ckVg)#pJH5r5otmAos# zkmSM@`0FWy7uO~M2N!^brVk%$9Z@aAD-0lmq0$?^ugMXmEl1j8jJ_O98OVS4n^*TxCAg8alaiM9nyxcubT%%YV^bn8ixL=eAgF-gysNlfeCocs zAxxoU4%ZijIPDI#mZ&VEI92Y}7fTIht8(df{XDLKp=>iQN3-9RgT)&6LWosT>wj6W z{#VK|U(Yw*`YCDBe%!nNxtjfty<(|rYGG*iZ#GMyf~NKQA2^Ta>J%Ud5g3Kn(v#lO zd1+MgnT+`n-uES$If^4}!L|<@j6ZMJ%?a4brt%M>F;0Kl(^3r)uzFo7DYLPnDSoV( zSeP66DC$yr=bG`T3rC}?M_+JS1vT?9^X@$4lKFiYmbvjs2o~mqCq!a{oB7%sYrCwA z{pB=F{Hi*bFbreLw6^%?=$i<6SVX?n)a7IC*-j<3GN`A!vuMH&Q{G>69<#uLm-}yA z4Mknvc+tUq6K%c1gxTtG;A-VR5ZB@?-XO0$Y-orRxN@C)_F#w_<+0J42s6}yk?huld0%1O}zcbYEY*B%5i#YBAq-D z$pdT36EZK>S`QC7`9TbBH4{tp-O^yLDbFz_saLJ9jC{@&$;1OuwY`|TeK$eIT5STFI5KAMZHnwj3%<` z{TlOWHF7DZEk-(uNcUL$Q&M#enr*5sq7StVcIitlryfP?UH)%74+x|Zp$Bwn=^KM{ z$zTqzE9A4Pq2a&1UdJzXf5@V^_D=}#j-)nzzv?{R`<}^;UQDmSF1_=XxA4}=v$hBc zY>NGj&Tn@xNn>V>`gsBFF`4wcE4wP}b@+AtkY@U1G92^h=G9^9-HeUR1Md_(zT9@o zsi0q$Kz}RDF|E$N9&x3^c#T@o{49s8`1-b3fBzESa@A(&&)4^Vmsp>k^)Yo|0D!Td zM)RLR@AigvPXG4ER4U0@ud~4Y7+19f|B3?@cUp2H!!qDsGBT+lhS@t{D=e&^j37{q zv&(4xx^B-$Qn%d*28M)NU%>8uziQu?mA!<^Xl8hxwVmE;R#S_}?{irgCmXfPH@3qe z9sc`v$f?jry93-5)e+UCq@jqCdCuMt?Zg$OG zxe*pvg?ay7)k(_G1Tg02qfQv=G+%UD0({)7Da*hG{=kGl2F;n350+3VoC8gXc zNneoG{jfDZuP7froqFB&{KUUn&j5VnLOHj&>is%^BZ&f%vZZ9YlDQ%TfSU2(ftE9^ zItqt{GN@L-!nixeFODL(!u`8&EFJdoH^u!M1i7+pY=}i&lO)FRqpvS_R(4OPZx^6l z-oa$rzyA(53@Dr>c!aY*ZCD|J+1nP#+-V;*H69Lq5RSHv8t!^B zFP+sMVr8+(?giM9XeO!%Uh+?vCmHY=OHS|8tV{3TY9AX*JUzWp#X$Gw0ZU0q`ILuJ zi;yc7+XI4QG`IysM|+|{?fmfDPoLA;X8aSrb{@{KDoRT&``@6w*Aaw)WJinK-#3@6 zcGjD&m}K|0A*hdBY=q78{w836RJfKM>Mm5;rmrtRNYW7#UzA{9#POgycsM7v5g<;0T)XR+qM7y0?4bTm zKtGhFrwDe+%CU!wYGI>8mh&6Ns=hta?eC&7FP>h!#AWhy=`(&7I(xaQicylcf5tC6 zD~)@dUr4=QK#zf;2k$lebGEtt!jbPU*>{jdt;#{5!VTHY&!i&eA=0X|+LufL$j;#3 z)27P(c$--GPWB8fNh5_3c7J%ZcOAqKGK4k&7AUT;6Y1O1gC0p+aK`JKs7-|3g~e*g zUQ^(^5ODGBl5<_S3dZ4`TiuaP3;%;Msd*($^H|rPiXl{Gusr}P&z3}Tbdl_u2y=P1D_Yv9!%=Y`P zI~stR`2{A}VbaLBd{2TIs(b`d0g7<)P=5pid7W`R1qmQ;R!z4w>&X~cf@6zY10zH| zPuyQqLZ6IUKLtA^5H;3ZEpe0j>PndP<|u3e+@Su0Q*6AP$QMdVQLZc$53oRbJxt1O zOsr>?cGURt+ehfhpz*ehJWr=o5Xeh!VP%E%V>zLkwfrXttj9`jM44tjREC_}Ha(&j=N9+s(}VE6XDB<$9(F=~)C|@Lm#IQ{Dv<_6Gn4?? zibWN!x|R^rbDS00E__P*`>-8Z~ct&712tcb<(GefKUm9TsW%~LKsKCZp$4~{ynbvi!A!3z0YaXU#Oc1e& z-TK+o20wbj3Mu20*3VuJuo!(EL6u#zLMYL48fUD2z1x8Fv`}t8@s>kvZXUP{We(sM z;ud9IL_hcaY}fL|H}V(CI0~tIffYcy4G4}j%+nZMCg^1wz)*IFoA=RbZ7FYBtx6@< z9+52av}ay}0VHw*l1R?nQkiHg1f`boJAMBd5lRJol1N$9Rb|lM4;hf+g9Utb=+clv zO>hw-4-y(;;c_TOV39U^3i{+H?PNj2?AplC{FHK9AJzNHJiGB-$&sM@PlAIzWeh0H zQI1t5wQ;gcf@6QkJyzN;G&lMNA2)ZBI$`mHwymnF0o<2zHu8mi)uQ$8cnWFYxOmDF zrf=yT<`kxRO&{}#!0j)5Q*ZtfFA`1=fnC_6nFFmT+#(W*q*X4cAcPs`=~gd$o;+1m z??^;VYS_v@s28nzoskJ<>fJsPzPkzU0!fz+Yw>stL;P}YzuBej{|&k(Nyc7` zKRdgO;cp(Blc-PK9hmT@0H!V~)tU~_e$r3h>WnpL+{Z{TeayL!222tf!k8LDWOi}1 zajNwQ2J76v1>NBe*3Oa5(ZBnZxusa_tvV+^0Vnnj;C2t!*9C1CRyh$bp>)~WdmZSU z?8E&_*c$aclO~$NN?ZB-5(BqP@NbF_Kvj#aoTLlHf?M_-{KxwHve74*{fa2Oxm zMlQ;1$w-9>^j!NMx+Yn~G}{&$(|~`}boB6KzJm6~Z6rn^UIHz1@n>Ibmq z<-rBNejME2bq?>s$9Gk%z)!W{<=SWgT8^=!i!>sWOR%dH%Z(=Hr3TUpYgm=Df72{A z`>dZPcH-Ag0=c;#t=t?{y)-2EIibcwmG@mPho67{Wmu5M_mhL}HZV-iLDI{b3qtKr zpIIr4v$J;mnQ;Aon4L*yeDzL)0szP${40~D{|sqw=-^=bV_o-el&(_w zQ|V`V_MKfULw>wsg-9&Z^cXM)o#vpwZ!UTwHNC1TV-fh6YE6^Q|ScE8NW zRqG-uDM1*yQ$`Yzy1d=W5Fg%HLtZh_h7vLqJuJvXE3u~q9=aS*L#tB6hQ%U=O0SI~ z1rp1^O@k6QFC`TDF+~u**jYffMo!WxsH)^@{?D$!JO+kQgm7jGofdz$BiGZ?P_Dgg zxP+DP=mc?=e`LE;FD*8<6Rgy_|C21L0Rk~UA^#w?R)zPM1uUqxILSvZo}O3?njT;? z&IdLH0l~g)!rlw0le;|pTcO+J9=s8SVRJ)Z!x&i_?Vfm}!abH96 z0D?3#k`N=gh8S4#<(Uv$8(bKmhHn%uk62ru!Uwbkp2?9Ey5-Xz7PS*itI0J043xVm z*rUhF)O{Eh)6o|j2$#2Q5S4KpI5myetrV#aoi673oS9G-D-V5K@xdxQB`YPrS7KlW zTH7R6;aYJAOCG~Nk=-e=@Ab1iJE|Q0^x>shBur$JhTzFW6uS4uAaPT7?nX-Lfy)?s zR7UKUy}BuvIPbtC7Oc)rv*CkaF=JU0`Mzg2{#4sCqZI8gmfV<8UT7^B?#NzCI9&vd zSh#rQf3^F6B{LY`7;n$v4inveVzM_9#Bh34;z!sX&b3^&`a+?bzpy6)3XGGfE$L03 z^f^11^Q`d23}+gM+p?3^s>tgrk!h|B<}pBJhj9HIj_#`&6yH16l~!$_a}|7n;z%6$*qkAbSPpl zfk&_AdS1^$awl$P7^_XS8n*^ntlMAjunebw-pEjJ`hByqxQnyZaUu`C9)8uhWKhI% zIhGxtMX?=^Nu}nU#~!AKH7|*Pr@uaqG=PHZcjd^Nbd(k0IwySVVwA7^FPnmmc6gdz zxeFJo9Mp|ZO;L%X^(|V}VKzhjSDM`lA&~ zor<4f&;$rMRe zN_T@QWWl8Nq_p|U>@(55_K2o+*IzJE^@J%rSjK~bpCsJRj@=FPX!+jOIWYQ4QBXvF zm9Z9WtE{#WpCzTV3nLXDxP_$_4N*;UQd}gAu{X7)mNqs|-5t|El4!OZSkJKlx$hv!y|^A@3-4D$=R#JrITe~eWiy0A}B-qVonbfl?3u@(M zWt?9NLXX}Lm@L(6nU=V0^2m-$)rFY6mx%FI|6Muw2QhY6jwdY=0cX=(V>+$I0szN~ zfp~^8nj;1trx^gT3OJMgUBkobSGsK03h{Gp;1`0i?su~eOA)NZjBMXcN`8KX0*a2~ zk_t1%B?}a^_-;e}6F@hQSYwtrGGYrx|Dz#lK~H_ERAGqj6g|jO0VfE(=?k4GMI*RB z%TYpj4hTL*i>2hB@BTqWqI#&Dn*~6^>=ZINaUlk+p6BZtfs{e6c1Z1ELcdmtQpvBH z=%jE;2cqsi2&k&J^6XJJ^kO&8H5gA2jTGo zc1D}fs00v@Jx`u+FPjA_9w~BvE!|*xmy)D;XSzQf9Pe#bJI|hJ0N*o=Pi_%-@lk2? z>5?F}J{zcRDz^Tzi=5l_NFZ32j5@r$kDA7NEXoCl>xhXi`tFE%s=!o0X_r3@z)Ngx1hq1!wgOw}qp3e}HsGx#Js;qnoHc02O=X@|^c2N*h)Xo2opwlfCokFC$2KP$a~%TU#4Wg@GXk2``-bJ=Ty+kuJ>| zzw_s(< zW3WSpvrJIJc#dT?e~&>SI*j(R5;gx1jq@o>${h^rcr084E=j#J@5am44FHc*(UfA*F&v z+j5<=3&$?iklyyFY?bGfHrr!k8YzPuM2>-VpiT#y%GHB7>{53>o{B2nw+7@eo<3So zO=N}Qu!VuV&NrkIdW4(niAXaM+mWL7ks?ENO>r?(47lpnaJY7BeS>m$UUbJh+Fj6w zTJF5}63^Ah5HKXrFxJo38l=)C1Er-?TW<{=q_{n*sFQDYp8t%A-n2pzO^8x9=CviV z+UDqelB7_-p%NXEAR0@Gb6771;l;i`beZ1lZx=qxk%=IqcC7%Tjn<2$lw3)! zG!Tnb7O0a3NsfTon87PqvLNhyLfv^bVzIQ8>h!Gb*f!gpUW+vvEE-{o|AOF{t5}IO z5Eb(lM2m_m?8ZYZ_eVz8j>;q0UDG~6$v|=YThUE~nT2byeM2<5qDh3VQmd1ROb&5g z8!q>U5vYOd=;-rx@pN_1g56(Gom@|2;BGpX_4ctm)byozhfR|Tf#%+%KL|Jqr>A?6 z1yNQHFtyC)9{%X~*;N7)lHZ?%reH67HN`}gPL4&2g4&=#Z^sAPIK}4C)(Y(ODkLU= zeDYqzJ~kR0qsL6gNL_9)30fbQMnIL5rJw1XMaSQ*Ou@9k)|PzU z*AEwCdE7BF>4BrkPNT3dqyV)E-{{vcn5BzxJhEtK61t1eH8mI7tBj1}(OvJ;RhfVHk&VZ+G}?yDXPL$? z@V`Uku@PZLd8_Y3W<(JCXOM=AwA)AaK9%asa-hKlc~ivl?`6dEH$&QMyv2GQ^L+Tj zT?@KVA_c8szwk6TgY7y55@>`S;8fpM2_SJ2KX7P-@gGIQsdVP@0)#u_+xyF(ilByd z{b2*An2->|A2!gbO`WGGBHry8$hiwVEzqd{oRdZaa30Pd)VH;mXL` zmN*LN!a?|ewh%Ljm7li9W%8*@#)zdXF_vMu2^xtZ9pW$PVF~beRz8lo7+haHcyRM; zgbL#kpvl9kIsl#Mow-y$55G_H@b2ihAHN0i%YrGdlYG~6gje0w~ z)QLZ1C(*{jj8t}qbLz55{l$)}o?2U4(WI3s$!<-o@2#(<@jv-4zsbfO_GjkG7CK%i;mI+t+rJ{uEMH7)^0#lH&? zo5uFEQW+3Lhun+naw|(|YEU+6)aT~>_rni;CaKU-={F17??dB1fffVC7f767rbJhE z7lZWU@np-5>Kd7g{z%o=zS+Eiew?%O%}cz0GGa^a*4|_Hw`fDK_1hHBX>zCvv9c>2{QPRNia{?OSq-DYI@1_;JgDvq6iEP<|L(VJm7DgKx! z7InBV^nvCoVb0wC9^CNfi)uSEByS&O%+9*~&&o;TrOg zS)ntOg5|BMerRLrl3CmqSWzjJ?d*)8lEo5yAkD@j-%-eNHOdil8w~$pEG=zN2x+wFe7S(ow z`%S;Y>B%wep`2X~jA{eL4BFyU zUhSz?M`Dd@VX~j_^}(aAW;)?7Qn#%wV}n&Hzi){C??NJR4?n0HgvI1sqcOzr4)-}U z){Yb8h?c8vvR9qsUB7F^wl6!_@GOms+ks&NJ^RczT`arGW&UDV&**E!gFYOyqH#; z*0z57xPxZHgSr(CcQFu5>oD9jxDvu|K88tlUT&=SdtBW{J=#T*Ht2XHfHcT)HhEIly|!Wk41apR!Us&s&7}M=bJ#=tP5hw4R&dWNY5_xEd)D;y$ zfN=UQFkqKyMad7lx9yFFo_wIwt@1SuqK&7IRuCB$K`8BGM!N&Qw`W|xLL@j z8BX}dzLi4~+M`tMI_#!{4k_J%HkYN7!Ge>Q*pg_J_EL*qILY^3ur)M$<%Zy^1n!7K ziNhH-26m-uS8skB0KSIxGi>>(0J<9y7~QA%Q?jidTLt3YY97QJi;Eh zE3G9&xu;YTAZTVygYG2IeqEGoKoQ-4Q4^4z(4Nsr&?Btzk071JPCEz6&)>zUu2=ee z2q=D9b;aKk$u#*JbN@(U#HQSm#$QTh2T~5MNT&p8Mf`aC<+N}v{q9e1wN_xqo9=S= zLn`}v69-{=Arst_DvlLFY&zn~(F5}ij|_{R3$uNP`QABJ=+c2`rCQ}9$wI*K4F035 zRG77Pv)T=5>3TC@zuY<|KZX5G2S~FuD|f{EOuC{8kU}Nz%3q2y3FP3`|2tpQ1#^qj zC&XiBXx=VPS`hepIKTaD!DIt=_~yRaEO{SJRWUS=8}4GL~fb=k9`mEBZe zD_f+)Q>q>=^p|C$mJj3@T|H|-eQCEuoVRx9c$HG@7@KvVUhTbEV`15;euhjP^y*C`PC?-55Jl%BpHjYr=YzxnD#*0xr-OAA#@+@IjgnAZU8?#>-A8-X7ME zam}uHts}?$AW1^){-V(H^h9p<)LFCv$BDwXlv?lX_1~AeV`#W;R7+l&e&}sO$#~~4 z4=fkT|D}yzvEf{R2kT6N$We1<=UZb54W!e3%QLHYIrsK-hTcCDS^$NWMJU=NH9wf+ zKu5ahYd2a6NRj?HQd!gUPvmWBe9#8|@l&y}EY zBpPV*rX^1La%H*fG3NGZaLRaN9p~qa7o?q^l%EYv4fMJ!9W(#PIVNqAS37J>j*BWE z@RS2Xx~Y!IyYR~>q9pmwa7g-7+U40SJ-4ILEQ(H-VGZ&H!a>wcmCBHQWKNG4}LK(45JrShPuJb+Pe=qlZ zO0j7G3OPQZ(J6l4a?iyWnv>GfA9GGz8byW4^sMZIx4doUHpoe7Z`Dsj#h|RqABBTi zCZu1_DenmZUA7Lc->+V?Cqwr|Z0!veuG7Is-qRI8*_m9DX$+PPB}#B}x9Cc_^tJ3} zg3cgm+!+u7T9q>+A1}1P#T)6ZIcTsd8PwcmBh*PDommDY)##K*hS`8Df@T|`o9qVV$N^g-74f@<4j$e z0)`zrxQQFu`7wl+vMhijD2eLh<2^r`zz2<5N@y0L6UI{|9bvwquuN=HyO_tT-tpWY z=2r_)l8UGmyC5$uP@1boUtvOy8kRB2oIyLF)HP!Kd{v(*qT^ZT7pBV(RWaQ^T4hzR zLiTnnE7X+wVe6vPsixQ^)`tQpB(J`KlbJj-2m0nZn!VGaOn0TDklN}-9#~C=qr6?x z!>`}f1#9E0jw_Jiu8`tVq$V$oaasPAxrp z&@S*bo<(=3;|dMX7RkKMBYC6!G}xf-(0kTVb3B90SPq>k;~$U5pmG`#A8O9rm`{Z1 zBpNZ&0P8M zb>FxrYeG~ZSw-#*X%kfH^!{i*?s;|XMbYy?oGD0*0{!SpZKRZn@lO* zLukeMH+kSLoQT8fK=B$^?y1ELT}IiAn}?*-M{el1(Au#vmpxzadT|jeJQnWlG3$%J z`PnY(p5Y6GJKmxG!@>dK_{UR1H0;JkjQ#p4jHgR`v=X!Q-Y5482bl~$=Xa-M6=EGu z8@?-1zC3Pm;m`x0cg%&Szc5xdMij+-iHb!)uYDl#M}~0s{XMDDRp0B2Sdi#Q0jbmQ4$-$$0dtt}DlVkJ07{1SNHqjG4@iD_zr8CJ8 z(JI@O5$vbceD7g_&gj5F5ZfZ<>Yz9;Lx)QD^}Sv-2wE5CV`aP`aR;pbVUUFWmpC&PP@qX+Pj1 zTv%_Chv+q)_8CKeS7#Y;dfMRq&kg&+-8iQL%DAwmbkE2yvV0O(F)`zp&XdORAHr0g{4zN;bv^qWRQ=&G z*vBMhpnr(bEJ2{vEKQlPccYR&WJiujq-sR}rGDDAs9&vE#liSUUv3}?Eli5sN2ViD zFFK~tre8?eZlPxcYHKg1dZN5o8XIIxSH!JJL$#N2vWJTPeJtE~Qr|lw$WY{ST>i@* z{UnPgq$vKzum>k+^PaN3W-)A|cuw76i)?qvcM~LQmyy~w?chD7 zwMG_7-PsOfdp8_(I(5ItiedHZ7Ze49B`iAYkjCJBNIU)4?1#it6eY^O!55yaPc+{i z=!!KnHG~|t>02IVK!_b=5}dqYeMN%Y=30?i%I9Trv+(2lq*)S25_{SDhM%-1^^Hpf zwFMrvVkGwtOq-PBNpF`wcM-U^#Y%!Ogw)9s!+ZbR9|B zX$n}{S1GFMchpm*JatVXP1qiX$w~>gxZWG>?0Vx??;;rZoWV!*Jh#T&9tNs@fv{Va zujRTBB<1Pq*HV?)4Gl|3Nn4JXVROVHUn*AldNyWh6(yi=u@)a_U|Rb=s9o51BAy`v zO=-`Rda>BoITGT~Pus||A8{@vusLG#ZS}wp3ttZQ7w6VtqFAV z!{jK!mv%l!lH3(H@xf8?!38`HGBnnczm{v%)OpIe3|S{g*g-R$sDugh~Nsc z7%-OEdEcmfq|hz7m2h#r8DZH8idy8&aw8}Sc-7}XMr!Ng#irr2@dKVrnJJ8y)>#gxgeHpMO=t&vY5ne?sjTNoMh^`rX(Vp^(Nn zzMIor)q$%*58lbP79!pXYDnC1%C%7YE0NYb!w1?3dzo0$yA)i18-A=D3D24gPHZXi zH<$rE5)0&6%^b}&{xJf7ls_~f@G-<7B+l(u*3|}$= zUPAx-!w3R)YJYy{L6eFbf7rvFfyfUVI6`FOkUxIMaf^(<&5_OvMC~fDdWH|yFh{kC=01U(C)7|I>5NbPR4f%hS^?d2vC^+Ewq!H z8N$|lv+O&X-zxhM=9whzeh{cZ1q2eoE4wo>^BYwpvbmRSZ|UGFYU65;_*q>$A_*(v z!fS@Vfrs@S6~SGA*qn`+A7b^kCG2fzv7Zw#kB0+?n1}I%DFT(aBgNg;(&MKC>_XBO zY@M1@zY%~b(1JibcrZpzA~0YHVe9a(K=f|7`UW75DVToaoMF=&HeC(MOC03#uQ-Qu zMoYQ?L8X8oK0J=TFcA*i+}zRa|KScCzfd61Mz6dhP6TD{vU^{+jLI{M1v=+V5fF$U zPtDMu5H7A>2uo1_M%?cRdpA3toUW5Z#wlM?j0j7Ze9c(tOZ(RaFOvBbF6My^K^;7^_&a#nKvc2;g z6Qt;YEds`CZ^dLnQvSI@;{Rg*pMe;tHK4`g zh}z#>n-kXY&)Q;hbetu~`E^|dvDP4L9P+!8Hbf|;5UQk~#&@S+%c<}$uGsFi$pj(z z*H{n}vcl$-KoJpINZ*`H4))#42^$WTWzVq-(}oRA!{W<`Mu}3lNNH| T*SU diff --git a/ISDSS - Internal Survailance Data Storage System/v1.1/martinhal-datahub.zip b/ISDSS - Internal Survailance Data Storage System/v1.1/martinhal-datahub.zip deleted file mode 100644 index 6bcea2c122f9ca24409bdb86b44ad7408a9b0204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62863 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

    -{3vTl1giSPW)rp6#l(sH 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 z z8nGQwr9$Q`Aq3yEc5&1aotId>DKaJr#43|fy49xUek+0(r`386Lk}z($AX$rGy%Wm zKu_FL6Xzs&e)<)nu0Cvsd8g|r%|n!YX=gYy$v^eOkF1JoFyxXo5ifYkcbjt^_-W9| zy&Y@_jy?#JQs+uLO4ZI+VH6T+q9V8kq>NNrAhn>`C>DY}`jr_GlSLUldm%0$SB4UJ(i}{P~!=sDyM*z(bZIhS>jJjK_1Q;?7&4p+nU-W?= zw7xcD8dzg>io&TF*C8(7%pX0(yuBNB7lNFCC1cgQhiACcDUjm4q=&mxG z5_Q!_ZWX6UzUxxI`ZbHFUg0u;w-KCuwfAo{cQdVe*+NSI=x8++p$?A-ZUU%bFhX0= zn2!aRtRSeF1-1`qru6*P&?Y#g*NPKdPjH|*Y3=Xf92=}A7#5ouB`~+smJkdW;8;3LTWVEjE2V5xiOke)wSv*lJwlxc)pD?nCtH@BvI`s?W0if5p&Ko@1bQp*VUv4$i$S;rvUXaD^I2EOoyHJ43ergY^cuX>YrQT{BpYtr|c z;X7FMB%Lt#r_%+0*WO_nHSAM#9Bp9^1(qJ3UcW!Qs$>*bg>OP-rqLjWAxLr;dKa)u z13U3z!IN|dr%DzmUzdOznNC^7#o%LVbK5g86xw@fi1DkP6$5*S>)Q6PZSR~Hxgu`&2QL*`Om#q+UkiFS}ESOy7Ka| z)<(NSyM<#>V^MvA!t{`g6XYUJ-%l=MndK%Kcq@N2w@~Ea*bd>hgWG40v%H_`p7f%K zsQ70?4~DAd<5eWv%8Ww5(`^1Y0h=h$IqX1+8~pO1kEjaGw~17`N8va(gxF@ae%YM- zijsE?_Dot{It9Hnokw{Unhv4AXcHe;H)^a`@su}#TqR{ukK}U?xe*z{pRuM03z0l-s#+50o=xmx%`nQ}AwTg|)5hgFHdjfl4die&5{^w7-q``H z_19gxTB)<`^c?&{O3j$Upa$7#7Zz(LKh`n{jD4h&GeP*fkgLC>Y)Wj!xwf7^HGhxt zM&*E`g$!q|M6Au8Gdvdd%(&okUQek>;6&HydXJ! zpFwdnb*s9`adk6MC+9JNR8*luqu38nX3R`3qlqDTPGkxjb{GOuDKcJGR@=Id`K~TF z%UY2O6-Or2ohBF#CLr^&818A=v*mU?)d}O10q@;XvK%~rZH)=@JiGmmEFK+N7%r{m z^zjqxv3tK)?!!{XoS|qkKQ_c80Ak`2Ks2$p&@_qryhKXOLFV89zvy5zp$51QXU#pz zmik!EwTkCZ>;Z!8ug?rh-i3fe{S%fIu8DnxmivCl??CM}pW2i4sqar^;m`cBV}W6= z9*Fp_Zqer?Tz|Hv;T?)~Ku;y9yO~M$V;-)5j5IBO3NNfZ#P>Wpxc6q`efGZ9wpL znP>5JR|01NJozg>gfu7u{=V!^_opiX~IsX*f%ZG7_Y`WsJoLBX%h zuPfy2Tu6t+3QNm?ql3l))SwT&?!P9LPt$Ppo9pLm_aF%v+nQOCq{3LvSa5TV!%;<; zyOq4qTFzj%@~>0Utz`v6sYhi?JE^atIvYWX*!#C!b}endTo7j#?vtlyb{&4tG2?vT zgX0PRw3LEY#wY8gJaD`LHpK?cFCTZ-;un!}?WK#=JB?h;rd++u1}ekCIJwxo14fWi z$3kMUX4r(|PS85vxy?Pn_PMncrgp=X?iAsV>(6(>31{xXlixi{9x6_sQ??EC-xmP} zx#5TMMwgx)ZX&&^V=n_~vz6quYbAZNu>MlY#nr&)3{sjG@Vgix<%yhzzvAy0st!tL z@%dJYZOySkD9M|#Jk!I$Lft~R`g7n~-HjxngqG#xalZVIAG@3GcjSN5LVkrd9sKgC z#U9o4b{5pMLZk8>Om<-_M`pu{QS{Wb_gg_lZ9*v{Rt2JqMkeBOa8ThQrALJ4$Xr$o z5bFNL*UC|wyc#f>;)q`*pF-+%*6FP=^V_E3EjsJdP&2dE>7=J}mP88hNxpW6%=PO# zPv^$+lnBLh-{^B3_CHOpn-$Vs2C@6r z_~X{VHP}m~ztVokcsf4Zf>ucZ-WJPDq;ZgMPRhRT{e}852%emh)STa0(p{qz1*6B% zNnZ&uG(x#^P6p>PbFc_ZVn;7!*$Q&Qj#D@K`{4Pj_t8`LgoKx}$X#P6rtW6K#bc)Q zlX;33lO22o%c4zMs02M7{kRdG&hz5Yr0>TPg_b=9SjQlyKg##Y(^O_0TJ#>VTHwfj zP_;MKc+wb+7iD3?fBB-Z!}h&5^^InxLC1S_H<}ynSYv+qbtike&F`41=h?WpL!0zW zGuAWv{L!}Kq4LW9^qE9lR`OC+)!2qZ9_X$v1&n(7NR{T6`$afe%dRpm^2q!#0J z(DZpWC;y%b{GpJ-ec;Ih^!L=*#gV&!$EuoIpeufvG(B=nq0$7{LL3>&EU%48eNdAD zs+mnv2$tfm!}YIe#(hpRLEvmUbgzPu11<3r33QOMcnNWUsJ zd)$QPzA;UEm@m{T&-%LiVADTdocjPTle5tH=1?oeE9lvKwnh&v=DbFvGjT!`5h2<* zgWs@idv2XI8`jO(&?$^

    StPErxTtE|m=~U>e~!wm_o3*^OJOR5$moKC|L3z~1qP zOVK?s4ajkUP5lC4c~+VanRR1e7gkt^p(b)aR#y2k$64-vRmUjxmNf+ouqE;wOqz~5 zL1NS6=+FZjO!@3t3ZOV_;@(eM$9d`bk)NWgOTYVu%6hjIi9ZKsidO>U3?+?htKOmj z8uhFmFp;(KSrQv?J|tR63nw0F2qSq95)pJP17addk{p>}q08wo$nY?VFNIrMN$d)! zTF!W*CM#ifcf9XI-G}ZZ2N{m0{f?tjx*|ujD71#N zgrgM0<>KVP^d?AP$}$2(6K32rYjb1;u3B|i%I;%V;ST;5zedw!=T?;s5tRsfX1G4r zSI2~dNCyfYo(;IMP#JSL%_uL0N7wPyrWo*5Hp$~>wm&(N@9%*;wPfxSTE2na+53~b zpy#GFSV%%hMiXnoLiJlrZDdb-Uk1*75Ce9di+H0v)5yZm-$1UmR|K|R~qPr(0<3G81<*~b&_0U>EZtn+O} zz;a!zwmWNeji54-i(D~FiFh5!w3p+>2DaEUX>Ton36n2ofRb(n)j=xxg-#WjBQYL7 z?=)>?<6AC(LyW>f7TIn($3|w#Hni*8<2+hq-&1a6dfM{d$16X+H^-rk9U$w_POB)z zYK$GU7~R0Cppi)x7gtX4-x>7?(f3<8Y^?5r>cK^m07Z%WG??D{$%GT@aj*Q}-;G7HLyF!^HGfI%S0QT!ax>6PDm4K}kiN8y<%^D2>@WVsb@QXOQPva2<8 z=zwgNj}i+p#YgGrf8caPi_0K?UmwA}TRbahiY%>lmi*awZD1%-27lO%(>L zAzy}WAzQ`93Raga%RRyBI%3y1{Gq4m7=!Bw_x_`7>kaBJd6sUf zx3#KDUP5^bh_;j|++e)M0d0WZm)~!v@?_9^hvUM2JFxnTR~-{+gu+o44YSUQ_%`!7 zR3`#)t20{FO~f$8$@xP%##2v=zuL(kc(m@`RMnsD79UWD=B(3b-c+{_)@&`&e6*Im z+M`xf?166kRlABiHEF@;gR^!RS+T-@V)CuQ(Cgu4kg)1mEsAL1ll)kWl<~S`)UJxk zvSb4UABjvGdJ?+mj6T|lBQ#GFjcjfHN@w+fLT^S}bQ3*E^^m8W4PX>2b!1w(K@CVT zJ03fU#iB^+{L#1Wk5U3VsG8d66Md^tg2BUTM}-2A1VxMY7TW+-=FrVv>_Js|b+{II zDJ0!Oxvosp5%q@Y$YM$kiAjp*lKa)r|Dt_-FVlq=aY4Qw6t{1J+Mtf#BRhT4IY`a> zE22HewMAP&Da5cZf4`y(u<4Inlnm@5G6pE`PzCqZ5r$b+sB-m;GaWY|Zm|2?=|(HO zcKnmaS*M^Z3N=@lld@!pW>F0m#7z>wAIx!}O046U7T6)cwS=1C%sE( zbD7C>mk(Na4Z8k@C0lo1}B$8p;_+o1x=K z_dEWcmQ`BP^)$%ksO-(p0r`9J272zQK$oXxC+A>$&T!=fp)=^zG1}Ir4X19EOUH&$ z@5I`ye2s<*JjQL^@^_+Q6~huBnU_AY&C*>3r()HGQPm0M@j2=X$!E3Ue19_JEB^JG z*5R&F{(fcqkyp_9V}$3+v2z9V-kI^C=Eep^_6WPLXnrz6y))=m1Pd-nLn=RfQg~n) zWWuXNG?TC2+InOpfP1~Nn4?_Z5B1f&vlbgDdp%PNnOHO z;7fI6tDe;MQIC4~YFtf5U`hFiR|D21lGXML09Se-;QId4kRZFwq`MIuBJk{}_~^k1 z3c$CGc8E~?;k7N?)aQf!u1x#~bv-`fwK@jRX4ND**tkB$e>amg-}KLW7GF=O`Y4<) zlZ?+%Oa%hjMmMcV4#@tZqLDq8>UNTuyac&D)ZCvp+IneqU4PYdZv91yT0y%^EWRs% zziCeY#wIW&I+m^ScAa@s>W(j!pskJHY5G75N1d;QW%~IMh2Vff9b8I1j15OpYFTdc z?9JZTFI!>28QikaJ_Q~qu=PA*g)+n%u_|rv?^rHV$$EN>P~TjR&`NmGicS5C1>kAn zC7HKN)yicvTv1Ri<;TtRX7|C7ZK?0~XX`iUzknbA44B6JN1Tweot3S=(SKI){Bumg z|2F3T6kGkzvC;l9wvoP*{{JOm8}Gjk_&mP|1q%L{|hbo zkGvA&xG9?-2z$^CcW|w zNI;8_JP$Z(55{t2{04B+?1v|zgXuT?jYEp}Sv9;XovNlwX&;jAB}iykjMhx;`GGZ< zfCg>TDZs>a@!v!Ix5%1N4iOPTw11-n^1AG2S20&_%m>y_xuW58R1uK6k1uf2Fr(&g z2b&eXE(ZuGhkZy<4R|nB;DOv?MpeMm;JT=Xxl>rj}Wh;Tz!yIT#e8*0+T!dep*sk7E2oEnCJ8>oRbT3(COE#MKt_#K zVr5$r`#XH#ZkGq~fU_QbWsow+ZD#9DJeJ5kb|DTjgU9h6c+! z)um8ebPmWvlEJB6p(KQ5f=^`$F6dZwf6}- z!d|E9jfnSHPf39)I)(fxbBDM&6(SOJNBy8DPN|2P!rUALmZPI^SP`xvN9~A1gt`b3 z@yx{$;6t{(=cH`PpU%c448bE6Hr-%a;CqsU?z$=ffD{s+Z!f{@PbU-y8ePUmQ8XWv zxugXRslYEbj9I9ztOjd~JpD(vJhT4K*u!FdEu(U0O0`@Wq4-O#4T`f$|IF$`x&v+N z$8#>Fo_NxlbZ{_RtzF?+34@nJc^OZId&)LoNk~`~{}@V;14$b(L0y40j6YV$Z|kYB zxd9U1;ueYfT+_NlR9UUJ) zE|#*)(FQTYB)6j{drPylaJ#F2>Jg(Mki~2Z*XFYtBj;`{piR*ZCduq*315pdeXbI~ z*~m^-1`*mudD3!E@YAG2B?2=~x|($_JmVbOn&1Ji4TsJ4QyiBbB4YF%?RE}Hz{_gH zqbxZt_=*Wl3j!k|VJ%omZI>r7D+q_$$_4~b7BovG_;j9`Dq3`l%!T26KI+7bX-YQV zwL(Zyf{}iVE*nFkwn8MDS|a43YH7lBe5_f2$~M|Jc9Wa7HaeBs z@Nl`&vDb#cuAcUAx1qt}3=-Pch;F|=mjlE&LJt__>-Pa|q)YeL&0F^-5G8JXl`vW1tyr zh6+HiCTdk&cg7BBb+;pX@apfFKlkCYF{Yn@_3`=+?u8EK-gzlxgp=e*{s?_SbxGpw z1bYsyU?`1+*nh!Z9^Wk0+(3^P2x3lI2Tza{;zT%$E&VOd@C=r5X;EV%!YIiC`#Xo7 zX5wen5)!qOv`H8D8KTPb!TP~@o}!5=ZGNemc<}#YvdQ2i2rT{_RYpIl5;u>RI^G+=`FVT6$4o-2=ZMhuXIYvo%c0wMfU%=u##r@-ZTSS z#=G51drfygXB{*-gPc^;dUHxkD00RAR`Q3%(?4^qq%kgsH&iYPG`O{m*&W0#^I!bu*X9K&o-UY|6O3@s{dgAChMl6qr0K+jvJp#NaWg*D#)P%ff@=a zBE0A+?UbB;sBMZ+Dx1giMB2xbw%>fZeWMzT3D+C}OPGO32e5bmwBV z#k&+?lhy(J_p-)vqtJBwr=-aM1pxTxYW81i#ajOd4(jk97E7>_w(SNxyw`JW8Ze|7 ztkP@wX@B{GEE>gZ*1{P7`?B0T(X3vRoxb^%twy_Z6&pdaH3F99jx;=Je|vG~wd zfzIao9^2AD1ue6Hnl5Hcq3<&>Zd!GnVjz(Pgdc_Z<^#rRosB16#`k^hHoX=0Mu0gJffMN>B zWfk3TkAk$`?yj^^CUK&qLZhfPtB|1$zVR3VkX{d?l1T%fxfTCZYI-a)-@u7F)al;} z+`ih#r%%L+AliyVEKBvaqa#j*bAp;aE&ena*f`O4K>@b^Q-r8Bu5y4Nvo>VCJDB**AjSt>XPa!)idi^R`vK}gy$V?el8Rsxf8m0mD? zr8`YF8r$W6q*CVUA897@yU|rBORjUJRKy<8p2Ixr7l&x%c7NU8UA#vQtJ^+s?G2lg z-~B+aQ zV#vzg8eK?-a`{}NoY#zu{_giVd2wJTkKs8uCB#3L+5GjY_xRv{EnuyoY*Nr3EnbWCAtmE5Pr|EYK4h}E; zGl;}W`)QY=L3u*M?Fi?L2FFIE)h^R@8fDA#Jo3_;yHdl0D+22^yAk%U?|PTSs4>^j9 z8>gZOl@lDY+P`i(3z0SLH$y?7;5Qa=df%@*59H;q;Imp8pXcmn_FFYHq6!Dx7AMKa z9SThyaLGo0za4Qa4bbg^w8V79w5Vt)qh??Hh=5#pVpQf&fqBd=*I#9ND9-Hnqlat0 zk-J4RJM_Gtn`oRb(Maq&Ns~}bV1}FE6eQs?X=PZ+OFH!|3qpoXv%)ppTW`t_op$T1 zl5S5sGBt7+*6H3hgyki=W923a z98y;Q0oI_NKQmm!#Cc=CZ#h;_Z}fl34_L z#<{GLKP~MK+I|qR9^ez>C!p7;-&vUaTjv=-fI=kiE?;v{4`?h|NczXjq%WN>MhK*x z2oY>O+pec{R4j*P10ssIYx?3Wh9^3>2hZB&n0Q+{xJj5V-@$=Y(lbSBnmGRYa&P1C zboO=$*5eyWuKVlvXw#6=d6HKo=kul|G=F#m$y_$X5xw60y^5oKk=(uRaZB^j$OqAQ z`?&F*H_P&Q{SkH!hx~q!1F3ehn(&q2AIlUY0aNLj1KJJQgFD?5Q>mw?H|jW;{sIsg z85zIIa2hcRl~P9_2+Ssrpx9V%bm-lK0OhmijE>pBq_5q-=h#){<<^65FuogzqQLUw zC7$nF%Qm|kE!WKQ2fC0n$8L6_mIc3)a1c=UcF_@$4HlUU9jVLUvZ(3T1ZjfMz!?Jf zNT7_5uk(EAnW1-;sZXoiD~|LRtL-y479pkSNk}fsa4r-0(44$nlRF5J{(#J?;GlkgI2*IOG% zr3B(+4D9Pr=Y70OE`BF}hLNU~!Hjq~I^MqtVGJ8V9|8}SRN9U9Z|lQ|rYkz<_fOU( z#_7Rkv*xTT@?Q+P{C3N`DPDnwoe)R!mB<+7$`@l#IK}r$;7*M4y!npl9E9#~BRbSt zpqYCLxER`5@Qod+9JuDcBB8wBT;!d7QP$4^BpJ`|tUhymI%yPrz2U5YYj^Z+EB!u3 zzl7a+-}6KV(6GG30zXO_n^f#evOrUeA}&G|O&uAGVx(v=ZKNax;?Jq;m1R4f08esm z^Jrp%Y~)M$ZBFEuRUe?_fDEd^maije)>vB&yU`khLx>kLczA|`pBMc?MJ3LYgX#qy z%wT{;)r*Dw%-V^TSb6sdGZiw~kyYUBk`4-WA3CF*>`Pf|SCemvm2F%I8As=<*bxzh&WYfz!{S*A(^OZtLPU7}Y zzM_HtuQ0vlHs($=Mh5@kj89hi|9VP@h=_CUVTh1Vv0WFN%YqTa(y(k8L8hW8p$#kI zc>;<~e|PcD+aCqg9V3#DsTJyMCCebE?9^!=4@q zrWB{OwBz!*4Jt(+Un4bE$#Q*KzmVa^x#j9hSHrBxRXYm5bMX7sAPQMTQg|CF#VG+b zR)C0G#gm~?tl<|EHC^cIRBb$~``(G-jSnyMa5`KD6 zFGWTpEJQ*KGz%OaHoeZ%fG_A_a8%SH6LCeS3W5yOh_dAs>1`zJL5kNm;J*SIEk=NR zU~PnFgLYNgO}8zYeIUQ0+QJsN_1A$zH1$QHhGA6Dr3YEC2L*n&-frBz&ye-L^{P~2 z=@G}WX0Y)WtwKwRDPgt;lt@YaVXm@MJ(?8ZC!&Z8PGc6iYOIBZKV>joXI)@T_+x%f z)exMgMtX7?U|Gbd$Yq8~CPUIP(DQD>Ue#D&j-Daw{+b)33lJ>({-a;}wIoXjrqDe1 z%%0L-Hz09ch>;Sd5d!Cl*8PBxrMm?!awz?a!KP`0l}Kh&>FqvKXp9|YLEgq4$s zAbu`Y19XL$pGr`}22%1|0mq7jqtFEMunSIfxjSEs2PJ2Hzdh>&`A1-mU_XtNA{4!q z#kDp0wR>%{+8MG^tM7WOXv)6HyU=<0mu}+z<@Zp@C$z@{N02wtGKEAsDMsyKyZnyh z2`ykN5UeiEGnY1wO0&0mZL8-;wvHDcid6nPE-H2=zVI7}rPNg2&JVZ5lp@yt+tokh zc1G8i3s0})4+4VOrC9#+M`*N1PTLH;qTSW*f!kguQGCZ<|qmhds|E~x^n>-CE_x5U9=CC#XLSVr9j>o z$6%)|8*hK+q5b7>WunBuYJ^mLGv(nH8okpLGeMLQdj4T09ac)Wt{S~;H-GCPl641$ zVv1GkCqti`^>Y*e!Si6@_tJ zD@(^Fk!Q0X{U+zC<2LR}jQY!`;Z28X=~3tY;nZLq_m%~V&bvKkeJu3rp}1VbUTT#R zgaScHdA6MqJG*)I2ewthNQQ5+(z^b8@6763jg@s(r`KS%{~p5$n@Z}sxxK(HP5wQM z4LHCB_~=Sq&HOjezjEe3e>uST$LXGft@F`ah)OYSmAbpAp}8ZmAr_$*K(!iCoKL&^%0rli`7-_^Hgyn!21-@GqnBL}Rgx zWB(^i&jxMrmV>xih3Pz!dM94rx3g_aI!OwNW`q2vCsqLph3Hdad1mQ39)-U*Q55H% zuL)?#j1Y4N6@KnImoX_xqA1;R(nvIwoi@e<2&P(!%E@+AP~jL6A!a(seQgLZl|WiL z)naz6R&mq@9h7NM*hU^&RConx;V6%3!U(0VLh^MA(k>x2W!DSrdqNACm?lx8*=h7T zg1yc>Ps=0uj`opKHlpKyNOA(BJ6-zeaBy7UWHthy?mgkT%lTR5#q!Lr=KbV3h zOy7H&sAvYSVD3|!a9a24r(NN`gN#|Rxw_0n4ui){B~B-dCrm^vMBb*g)4PvUFoS{$mb`x)NGV_+{EmPhM0qg>HHS{Bt^@U#C+#X&2B|G2OK%zN=qzO3+N`F?%`8q}NiHJ2 z5W*_y(N^Nw`H|(JhHPihjvWrZ!~upxg@G3&5Mcl-B+Pw^aGX!km>6BKkED`DBNaRk z^|nAQIZmdu-9Zd?2+@&7qHDH*GOi#a>a@ci8E3tSJ-K16NiwrM-?P6t5I$=H_5fhF z7YEz(JFN%Yr)W^rEwd^#$`l7Q5Z6@p&BYYnITx4QwPtNbwaG%n6dD`T%-_fbP!|EH z;`k(&i8|bFHbc-Yvx&1W6X-hz`4vXy@E)8^ML zuZ#TD_U0mbR0-JN<5x=qpJx$;Qx6NwwU&CVJEI)7ov(K|#xo#a6li$EfjN1+rMcP! zvA_Oa0kwGK&?E|Z)?J?^@m-H8<(AziUgk%2FUde>fFH+Nz@d$M3KT7Rs><-)fBYNb zRIdZCT0%{B`C49iiRU(MVzqtldozq>zln@(a@Afy<6Y_?Ze9DV-cyHf2Hs zH@DSWx6TR%W0lKYN}plTh1s8PR$xn)CU~`HOoc~7O=j{0r~p12;uT;_y^@c`*;-7X zRRc10GdT2`J3ApC(DOFif)(us03j>)K`#KBycZXdm`s1SIOjM@`*25(NL$+o+c&TcHG|47r<7 z;F!CnVaYE{49t}V=j7os<6ZUtBhLqeOG_Jd#=Crm#wiDrw$ZQ#Y*fyJC>P?ax{blZ zD^{3{Or4x!jw~;uzeydoXjXq(-g<5Ene17AOxwN}D4eW*${ZOg=S3+<8X4fg=>c}U z@?h^89DA)SET*`|RFA%0QQu6!npWO}nN9%G##)b#q#->eDHg%hpWaqa7a6%SIbm5i zSAGkN=&yoqlVQ6T(hg0v@)|a?&(_b#P+2sa~;svKH4^H?45`snk!LIN^m2 z$pNfOVUaW_EhaQ4|Cly1#%B9!myLdMWERyFly;ci{wj`GRk{o#3n_u;*#NttCW4{G!s%Z>*@Mka{KWbN{O>(WRx>Qj+E32{1qT4| z&noNxby)rnwB*&Q@{apIgO(FjD;rM31;qF!Z^FcFJ2Zz>j07zLb6w8FUz&cjA`Zl_ zEZ!L$xj=fF1;xHB^YLfZbku(BE-S0eP7Zj3z*aV^(RqOs9>)O zv(#21@ft-X7W=9_DppPtr$~h!@+_KkDK0-=UWQ7{*W`Hvh`V1Z%1{F9cV!lFW8zbU zdxfl11~wHT?fh&^3+o{mu?Im@ zo@IJ^hsaNWMr%l)0=fO!M15Pe{hL$l!l6$J(YkEh>E(UgJke`OAxKhBLVU@8SHi0h zB6f1@u8k!guxe9ZtQ~HCuVzsYaGj*jUcSoeWyV|O?8Z+XV{)by_fmHz&1)d4Rx=gd zT;V>Nf=4H4cr8QNt*e$Nbd;{?enm=8(vhM6MMSA_#|I{Y4b~96Qg!cQmWWgh4I)}? z^-HvsEbTN;J#D5v?5GR4)F+?sVjx-8xQfJF?YWcuozHLuQO1ihDW22T)_6Js94SO} z@hsr6j&z!AdCv4*urMtTX56!YlHg_ZYL&7#8oz}g@EFNIcr18SCtridJ;1x%^?aL# z=Ur13&W`Dn8k0*l`E=BCBYrnAyegbws{p4o&w`;ZViI~QjU|B_}?1ts7qsvC9< z?HN6_1pESFUNb_Lh8%Z=u#D*f+h*YblY;zqbab@FAlCPC6!$S4;{Pe_tiz(*y1!3| zAPv&p-6;+rsWb}GAe|01bST}OLx*%pBOOvQv>+wY-K{9`8;|Ea%6T{(pZA3eF8F7C z=DYXWaqqp>x^wgOMGm_<_4ij{+_3B=5WF&Vmxyv%L@jPDD>J2noXLq}(y;Q9RMn{*q~9M$dvlFyrzb6hc~{tvKsmQl~7aXt5x` z^R5u36E_mWo;4Y9AkzSOxmn9?bs)T8(Hah5I=C{b5yy`Tuti7N%`#?rc#QeJH8jag zW=?_CQ-J~BCBfN3#doJg+kV%z?klRB(+4+-mHAO!)bXanm$I4KDH6t1+NOr-&pKK3 z8E&(4Xnw2<>SWqqDXvg{<1}&}8S%*qM>;lK%~aHu#%dPOb|TNDwZ}PbUG(KxXwRde zoQ#K3`}l04`lt-h16~jbPtCvyky}PT&2~;>+aF!>0Y8v*^h2|?8ExX~_ zG?4gc`;U1DqNIn*&V!%Y8y;Jxj+WIFP?}pl9ut1BnXerX`#4VzQcK=)9WUVcoe0QH1z$F&i9Ad4kes+-~ zMiKX+W6NGhpG+{*;85aIU}80@GMMv3Gfl8LwzWcB-wBNLW$ZtcvWtqigRmqXeSj($ z2!?ez=5`-yd{>bfKu7RaSljotqoud`dtjr`OsZs(UtMjM=;@iWsWLf)L9t_{zsV%{ z0>@Xg&nx0I7=3K3mx3X}iH>6{q|1GFvbNeba3swowe@+$!v;&2bGMU<3K zTAvj95UB>cu(p!|yBe z+xt;z2QQJ8?!T765u`l=Xa|e0L}02nWs1UtI8fU8D6dQ52RGjnxWm*ZCqvn7q*tCe z!jwxp-`bIJ;I~?^2I)Tn2`B2rtS=v{q?*>RI>sa}zYq~lNt=~h@ogrV+i=^)o&u``P^>I>Ljoj+|IJtD>>RpW*EF!`7isbdu?Y_35 zZLQ6a!+3X(#&)~j-8+7j;Z8_AeN;Jl0wkHH3*q#}HVumS`@>^RltUo7dOlv9!UM8( z=T9^*c~*Mhdsfv|*+TlUA;@q6&Jx5bq9>(>pDo?Tn%!D1xDw@yhsSM>_i6yj{z8r# z{JPJM4kR;BB%250^7h9_Eu}txDpI?(RTjI-az_qF3T3qa8}~c2Fcaar8XyACw;}X| zB^$>*BfdJprnSYMzN(}o`qt2FiJFPsOzQr_bmH3@(Xr_2KFxPY*=*NK)Zh^G7+(r+ z&!njibUq31@!Z=)I)awSiO+FRMdBksS~k7s2kbE2!VyF?r`Z8*b#nH`FpO7gX{Ubh z!71JKN*DF>791XVGbVa3B`W`5>T4u7m6H8rZC3EI9oTsA@_^CT3~r`9I6V6OU|2{I z#*4mM7@UZGxX8&xBn#x-X)hcx42VB7spN8oJq?Rt(s|2sL>qgA1(X#aViz%W&@(%g zQ{-up7vAM@eUBOApe5vWT!)^Bbx`%H7q2?PTf*-~5xzkeWV&ajlH2Ia_4anAD)G=h zQs=afSa?lr5-KW(;6oJ*{|q{xkD8XgloGmx>}SsDZBeZY0k6V3BriFIZL=2`^wFC@ zY0|cNk4aFZ^L+yOA#%4RBpDlexYInc&DZodcT&bO$!5|C@r1kFA5U-?D`1GeEWxYs+0_l_>5NXo!?UBkS&sT88}roM{5N8`9|Zo`An`4L7uQr-k8E zZ*|^#SEc>}gb|Xay|v%bZDe4V`jy zNoXhu0Rx%z)|cA8bp$7=i_3=#XR{MCANLvtN~eUj4gviB=UyveiSC-4JH0FXRV%!` zHJ1nSQkqMg&F9qnNv1sjHGw$gHDxC>?NNX(uY-B+LsP|7x`g~jix|~B>2{iNBbmXd z8Uu;jYF6s^VP(s0Ki(;Q;lZTdc4D$KMqpwA4TZ6A8mtvrwp{&?l$TWhas7CXz(xdr zCIoYL;oG-;$@nAvy}(P{>Nj^6VJ9+@ zvFlsc!qTvsA^K^8#G(n1tgJ98Jf0ycnkCJF4u=jwEagb|G405R!7~2r8 z0cr#d`Y$uP!G9W81S1B3#{}ZpR2LHSz6dfdd?D4=X;bRLdM$B48$=tzHQh0W`6@i=#V?u?Px^F+^kNOD%X~uVhe?w*;j^;liApO~&yRfbP9|L_7o<|n zgdz`*=}ZLFYLmnZSU?CxcT_l3QLJc>_b(hrHx7BAj7>=n)bY9PvKb_8a=;-0IV2J>)u;Nin)KY_b;t_w-eB(x&z%TTm=r z_B!mw>mbSlq?a6UY%{}3E25w2Cv;#Epf6k(FTm@Ew|8wv%93^_o)Pp6bRX&(0YxiH z-rDWXYS4*R>?YBMff_8SF^^(tu}Q;-|PiPqj?&$_xU^ zQoAEK8jQ`{=^U02Y=ni6)t!x>C^p=KLqH-A0pTDKhk^!_d{MXxf){OJP~zumjQj8f z0vkbaiZ!Pk+`?v@Bkm2NBmHQJ3cX+$(0`Lxog>%A%jT)g^gs~z6m&^H4QQCo@mg+gHe?Mn zd*GIbt~YBl%W&HA;_D}$gWwIOp|nD_s(9owgcan*KwrU6iym?fbB1(xozzUiOU2j0 zwuzCg;rn_K!rR+l36kf`Np#h)w-G8t;mgHB#}=vdC;2o|SmHhfse`v^6MD^LmrM86 zBF|SM)1Q8xvR(b$YGk^i`M!~hgK;o~=ZUAe`X}<4=3|*X=OjoK`~ZcE2`3XDqZ~He zqqf|AwuVU*A`^2jt2Zc96ggX8wfjFJVH`RYecVex^zj1^Y_O3)0ci{W_)ILZTwp@>qyK;q5*=sy{~7BHZoq*b$brjOk=a68o)E9rSC09NdAoI`V$z(*OrjN_4h4)OP!l9O$?62sdsU+p2vRAG3x zh@>y~?N?KS0ko+vrQS9d3#6d3IXSMktEqo`IC#OVf>^l4=H&YXvyz3JhJlv67axc= zQ@l|to*1&M8e^YZKcFOtTad&h^XizXBR!FdBy~SWgY;h6dqjm%OVtn6j(KPlFPeFD zc8lE15V6CMoSG=WK0RjMm6`{>P6T@itQ>~8AkX!LPPpCKuY2baWOt^=)LU>sniFZKs@P@1zz6q@(glddX%)9|98R&)quk8oCYol|uRf1gRs-&TEvg9kq zju%QNU6liYmCG^gJ|V-blMu{Z#~s-vO4;aYBU{LL2RHsn;_cGT{EXcRx8XF|x`1wR z>+&-MNL1atvmg=qBnr2X9o>CVFc0lRQXU_~=f!3x9naC^E27iy6ZmJ_ntQVslLED~?H&HK@@YvADfQ)kHf{qK9JH1bnMhE&tQ zF<{fW(oiD2O@V;}iCcj%TBZT*cV$~{WhlRkZGC}9As)c;0pm3<365Pdn#Na6t}4iZ zCq^}es>1U<|A$^^j#xlng@(PA=_mdAoL!ivq-af&btjm6&a=BhzGy(Yd2s<^ryzu| z&~r3jNgfd-z>svPwv37qI+A;6uvz@B3V2>cRtfr(9 zcBj6Xjlyq+7O%lPqTsXV{w@kIY4&onWeNE*P1sR}Sc<;Y_Td|k8)x-^V{gZ|aI}gZ z|kQoJ^Y*5p4KlxZ4uK)s0DM5@&I>|6Odub>>) z$CigL4inXsk~z#rq#@Z|^Y?e9qad{ zLdj%Gc3G2^xaMe;gw}@96UqYjQQR`|E$oJ_@QRqNs8}Gc?MGN2uRyBV)!p-%EHUIx zQS(IKB>OjFQH*G3d|++HHLoQ#Nh$%_4|w|)iL?^R49QfYL*cpdUQheTrLudf`hyvU z<=bTD@`uV>T!ZkWPefisNj!mACoGvscFR)-n+_AoDv>8V*=DyX;rq%@uTAtxMk83v zE+|?hzHP|rajeZFSZ|33ggKl%%oUI6seFpOdja*n%%SZ&Um`07KI_wUzC~osIMS;_ znA4u^&;}j3pXN49^(GpjR8Ps7h?G9=?z!!fX&}QugpYkY@4@lBfHo@S0?|kzpP<}p zuEiz#h&N!h<;5V3V`Kyfq&DQR8SzcX6Tuei;%HrBjyp4I{BFsyC0m*wGC;a2%=e}< z%q7Q@G=W2aiHrbmh2G4f*Gg;i#4v=%i06x(G+1MjldgAMT7c+ks zC<%B&tM#hQBssC!QjhFu`q+c+6Q!puzFO!+4s{^g@vWt3(rW|Bi@cZ(^~Z2=bd-4w!du%rJFdCX zys|~yYST%$(DA{Jc0$hEjMtr|HoC_14Y0z(l`0pFBr9%TF(*?gY4wa{w$Kk2U5yXH z{r*^@N_0$@*&LI^^P{O1UUN(KNB8O~1)BVyVN_7bqoLfv-kw6i{1B`EY+KbW++UM* zA+DrnN;S!-1`bTu6^U;Kt}08exHb_eR1xz~tYi3212h#(iowqXd6DF1bhE~Ryv z197I84!?^vzREG<}%(lWHW#KD=K`1}60AAus;tb*Ja?McE z>;|9zupfsBHiDa9+O{Bd`iPM9Q)qD!Ta&j{Ci;!7F>HN%CcP8hpEa>YSlDs_{wsiw zy?1k6B7=xG;$Z8a^ZN8s1#9tUG6xR(K;Pf!{BBeS@4_h~kE-4WgIrJJ9V$|5+s_MRd8_qECx;a?2$d9jULWj*$Nd2Ii3WS_?)0XsP6)$Q~c(FgGubPk~o zs(J@-J7r~vTJSqya5Z^Zl6$BrfWt_2utvz;vV*!_ofZALvGPs&Yz_M51xf^FLH#td%;cJ%gk(XgfHCM(!vHkvzK*v={NR=;T_vCL%+g@)f?jA3g;Vq4G*Y? zk0ENp1tG5qMKXB`o`rI%>@fp2Z?}5AtkdR&B|3M<&qy6Qe%c*f>Aome4|bk7G--VjhyB_vc(cx(2&E1pXhRv$nmyL*xVG8Vu zqkXwc(d>85R4@t{Dg(Y}l;aAsDKwHnN<=rzaOdq(>q)GdISFVF(dVx7($C%wNbIlh z(b$72W%r{#&sr;d_H9MKv}9?MVLDJFFki}L?tc44vc9Q;)8^ljGxp?EH#VWk8SK#H z47zKhN{pbdq&Eh!8e7?eTx_h(t?b$C%x-!+{r4n|kw20&NGgPR%5vdmm?(#phUm}| zn4HCsKHcLFD=>UiQ&}SS&FS@sRS_n8(2ExX<+}o(w>lf&JCaRpp^~SBWwW}Kg}s~w zSW*+M?kBpB*3kO!O4bt;Dh-vQ*jE|)ws9Nuu1zA6zOs4pe30pWsetEhwlkYAKf;;b zqx{!(o1b8rf^iWFG)Q>~&mZliGY#VSkv#1soyR5G7Qgi&wMG)#O)G;|tDP6^6|p41 z1>m}i6X03kP~8}Ij`r=qi2=f5(-F!&Z*}jU9d+J;*c4Z&GEQ~nTZ?xDPqQ5(Ue(J6 zCJ__K$#HFdC{+ZjkDEXI{=qz z4>RZ)dvZ*muUcj;Zl{n=2^CxDp}Rf3G2xwo8uN(0hqfV)$&VhM&YFrRO+4gS1`b1d zlcF@m@<`RBl#N@pMEqjW#lk~aeq>^BBs9)A(R9&BFgfl#LYRnl6oHQYFmzWv=ydmR zi~X@IEF2m9^&v{wFwjH)KfW+wwne}HVW|&-1`(O*16jYHE|@udPenw4f&T)~w{UPq zfq{kIt-`?k@#}}(pNWW1mC540p$-}j-F@KyX&36VFxg&m*V_FvZWL<#^S>J}P^@Bq z1vN7V{UN_%oE-XL{`*6-{TLADrdHM<<3AMqBjoy)A-vKuM9^K;e?x2>41nf_KN{#C z&HrqmrM$O1=yzdYIwheowO2G)-emrJKd}C|d$EL$Z#FY~OW^;DB8n@D7N8yfkBao| zps{4%W7K}HbKVD4dfPxHghDUf>8}VAB)oy*Xm0HEhnM|^q@S&LiAtv01%-*A!@y8q zfuWJ#0E2FM&8_|?5T*m9y%QRD7l8TwUhKy>`QgtTv^Rt7{wEH7{#w-pR8Tck5bYJt z6P6n|`i6$q4*wtSK>8;N2Il+F59GQ5WoY;NzMuszHi(7J054g;FIB&`+U&m}?Cf2D z#%xg7&3Rax8vdjq9V&mda3|I?3OCfKlXTg1(K-A4jt{jiBq5T-~=0-+9V<&x(@ox`OpLS$R3aI~PK@<0Au5=8$?7txX6D#w-iy^quEhW&E;J+sw z1CYLz(ZA@pzNvmrY2TNb%Nwl!tgLa9hM%*HiW^KY33NanLFW|WE3Ks=f1L&;Nl^)T zNj6KPn|=2upwq$s>pHY6?m}mntK9+7x(@K?2G7vi(#G1(n9b$i)_|WRice$hNYF)c z6ndrb*C_chk74OvN0RtsD`^5v-uzuHh5V77(BS|h1^u~7ur|Do@VzsBXJ!7WLCnRs z>Ou?#M&tDFlRkpcb%Z~Qp0EO;TA;(w+UjO0*LxSy72nm%yAJfTZp}@8b-n$+78Pi# zLA|%?M*F|#zt?mA+Kl~}=`r)K)A46LoBv(JUz@QXBJ}^+`0pwB+2vO&+x)ta)L#p^ zTIc2_AwL;c>$CjIP%pf$m9AE6xruRoPvBkgC}8n*j33oMZnFLJ^Ixs~@$2Vr{72hY zD}nqT=W20)UpesQ|D@q(ses>OTumzfmBC*5PmEtu%zqDZH3j!qh)KeeOf p{~qP)ann!AwpYf&b(HH5pZ diff --git a/ISDSS - Internal Survailance Data Storage System/v1.2/martinhal-datahub.zip b/ISDSS - Internal Survailance Data Storage System/v1.2/martinhal-datahub.zip deleted file mode 100644 index 43ced2883a9bd5c9ef1ee44c7bfa534dd5a002b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70596 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

    OE%3-#WORY%J2hvcOXVOx==wBfmc*%UmPOy!v* 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 VfkP1p#0LDO11Hzbi+ek={{z=Y{k{MI diff --git a/ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.2/martinhal-isdss-v1.3-patch0.2.zip b/ISDSS - Internal Survailance Data Storage System/v1.3 Patch 0.2/martinhal-isdss-v1.3-patch0.2.zip deleted file mode 100644 index 03ee395333e01d017ee0dd6fc08aef568310e29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86346 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

    AZWzDJ$%%4bTIjcjbNFIoc$UrlGnD1g%zj% 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 RNJzxtZxqh?oA#^x^&cBvRYU*) diff --git a/ISDSS - Internal Survailance Data Storage System/v1.3/martinhal-isdss-v1.3.zip b/ISDSS - Internal Survailance Data Storage System/v1.3/martinhal-isdss-v1.3.zip deleted file mode 100644 index 5fdf4762269a37f2132bf17c045804a26b39988e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75517 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 diff --git a/ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.1/martinhal-isdss-v1.4-patch0.1.zip b/ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.1/martinhal-isdss-v1.4-patch0.1.zip deleted file mode 100644 index 4fc0c3a830093602e53c98ad2a8c7c1e9cfe8132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98473 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 q1cgQhiA7@t-vWqV=&mxG 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 diff --git a/ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.3/martinhal-isdss-v1.4-patch0.3.zip b/ISDSS - Internal Survailance Data Storage System/v1.4 Patch 0.3/martinhal-isdss-v1.4-patch0.3.zip deleted file mode 100644 index 3b37b3f35d4f36ad6a9f46371a07d126f6ded465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110819 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