bemserver-ui 0.9.2
BEMServer web interface
Requires Python: >=3.9

============
BEMServer UI
============

.. image:: https://img.shields.io/pypi/v/bemserver-ui.svg
    :target: https://pypi.org/project/bemserver-ui/
    :alt: Latest version

.. image:: https://img.shields.io/pypi/pyversions/bemserver-ui.svg
    :target: https://pypi.org/project/bemserver-ui/
    :alt: Python versions

.. image:: https://github.com/BEMServer/bemserver-ui/actions/workflows/build-release.yaml/badge.svg
    :target: https://github.com/bemserver/bemserver-ui/actions?query=workflow%3Abuild
    :alt: Build status

.. image:: https://results.pre-commit.ci/badge/github/BEMServer/bemserver-ui/main.svg
   :target: https://results.pre-commit.ci/latest/github/BEMServer/bemserver-ui/main
   :alt: pre-commit.ci status


BEMServer is a free Building Energy Management software platform.

Its purpose is to store data collected in buildings and produce useful information such as performance indicators or alerts.


Installation
============

Settings
--------

Flask custom var config available:

    **BEMSERVER_API_HOST = "localhost"**
        API host name (and port)
    **BEMSERVER_API_USE_SSL = True**
        Is API published through SSL?
    **BEMSERVER_API_AUTH_METHOD = "jwt"**
        API authentication method: "jwt" (preferred and default, fastest) or "http_basic"
    **BEMSERVER_UI_TIMEZONE_NAME = "UTC"**
        Default application timezone name, when not overrided campaign timezone
    **BEMSERVER_UI_NOTIFICATION_UPDATER_DELAY = 60000**
        Delay, in milliseconds, between each check of new notifications
    **BEMSERVER_UI_USER_GUIDE_URL = https://bemserver-docs.readthedocs.io/en/latest/user_guide.html**
        User guide URL
    *(optional)* **BEMSERVER_UI_PARTNERS_FILE = None**
        Absolute path of json file that describes the project's partners

        Example of ``BEMSERVER_UI_PARTNERS_FILE`` file structure::

            [
                {
                    "Nobatek": {
                        "use_as_project_logo": true,
                        "url": "https://www.nobatek.com",
                        "logo": {
                            "style": "height: 50px;",
                            "src": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MzlweCIgaGVpZ2h0PSIxNzJweCIgdmlld0JveD0iMCAwIDUzOSAxNzIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUzOSAxNzIiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI1MzkiIGhlaWdodD0iMTcyIiB4PSIwIiB5PSIwIgogICAgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFoc0FBQUNzQ0FNQUFBRGxxWjVyQUFBQmZHbERRMUJwWTJNQUFDaVJmWkU5U01OUUZJVlAKVTBXUnFvTkZSQVF6VkNlN3FJaGpyVUlSS29SYW9WVUhrNWYrUVpPR0pNWEZVWEF0T1BpeldIVndjZGJWd1ZVUUJIOUEzQVVuUlJjcAo4YjZrMENMR0M0LzNjZDQ5aC9mdUE0UjZtV2xXUnd6UWROdE1KZUppSnJzcWRyMGlnRUgwWVJRUm1WbkduQ1FsNFZ0Zjk5Uk5kUmZsCldmNTlmMWF2bXJNWUVCQ0pZOHd3YmVJTjRwbE4yK0M4VHh4bVJWa2xQaWVlTU9tQ3hJOWNWengrNDF4d1dlQ1pZVE9kbWljT0U0dUYKTmxiYW1CVk5qWGlhT0tKcU91VUxHWTlWemx1Y3RYS1ZOZS9KWHhqSzZTdkxYS2MxZ2dRV3NRUUpJaFJVVVVJWk5xSzA2NlJZU05GNQozTWMvN1BvbGNpbmtLb0dSWXdFVmFKQmRQL2dmL0o2dGxaK2E5SkpDY2FEenhYRSt4b0N1WGFCUmM1enZZOGRwbkFEQlorQktiL2tyCmRXRDJrL1JhUzRzY0FmM2J3TVYxUzFQMmdNc2RZT2pKa0UzWmxZSzBoSHdlZUQramI4b0NBN2RBejVvM3QrWTVUaCtBTk0wcWVRTWMKSEFMakJjcGU5M2wzZC92Yy91MXB6dThIby94eXVveEo0SVFBQUFBZ1kwaFNUUUFBZWlZQUFJQ0VBQUQ2QUFBQWdPZ0FBSFV3QUFEcQpZQUFBT3BnQUFCZHduTHBSUEFBQUFHeFFURlJGQUFBQXNiZTFzYmUxc2JlMXNiZTFzYmUxc2JlMXNiZTFzYmUxc2JlMXNiZTFzYmUxCnNiZTFzYmUxc2JlMXNiZTEzbXNDM21zQzNtc0MzbXNDM21zQzNtc0MzbXNDM21zQzNtc0MzbXNDM21zQzNtc0MzbXNDM21zQzNtc0MKc2JlMTNtc0NzYmUxM21zQy8vLy9qbHRBTlFBQUFDRjBVazVUQUorL2dGQXdBa0RmanlDdjcyRFBjRUFDTUlDUDMxQ2Y3MkN2SUw5dwp6eEFRNW9kV3lBQUFBQUZpUzBkRUl5cGliRG9BQUFBSmNFaFpjd0FBdUl3QUFMaU1BY3oydXk4QUFBQUhkRWxOUlFmcEFSWU9LZ293CnJja2xBQUFCdzNwVVdIUlNZWGNnY0hKdlptbHNaU0IwZVhCbElHbGpZd0FBT0kybFUxdU9IQ0VNL09jVU9ZTHhzemxPRHpSUzduK0IKR0F6ejJ0bEltMWd6UWwxQXVXd1g2WGV0NmRjSU5Vd3dBay9RcXFUTkNKZ25wRTB2WTBOQk5rWUVPYVRJaVFCMkZkL08vbE5mTDErNwpFM0RTckdSa3dGbEFnQ3Y4UTNUUG1vSTlvaEcydTdJZlJ2cmgrYWFzWXFTUktPT0NHWklYQm9ZV2pabGxqeUExOHc3Qnhzc1JlR2JYCmUzZzdGbjZ1Vm1CTjNzN1p4dGhvandzditGWHZ1RDNoVzVEamc0aDlNaUVWTTY4TTRCYys0OStjVDBPcW9iYjRwcjNCM2dzM3dDckIKMWIzZ3ZISGJwZm40ZlU0bStqNmxQY21xb3BlSTBMNnd0cDNBV3dqc25tSVhJV05xbzFBZFRoTmZmVVA5MEdneXR2Vjl4WmxoQ2NGRgpnTzhDMHQ4VjVQT2hRR0FsdzBnMmsxQWtZWFlpN2VOQitEOC9GTURqU1R6RmNEQzhHZGc5cFVTRXo0Yk1VRGx1U3J2NkNFS1ozMWFtCnd0NEtUUHgyNXJtMmxZbGFuVVRWVlh4U29EMHFvNk1ISVpXUFNwRkxEMFg5bU5PNGFlV1BoRmhzN3RzeDEzdzBCelM3YmU1bERxTGQKZVZTUHlZdW5SUk9reklzVU5vTlRiaSsraTZCTkJDZTFlVkU0RE1hMXpvT2xsSE5sQ09JdTlUdmY3V2EvalIzMm0vdGl2UDhnZWpWaQorZ1BRRENCWkxORUF2Z0FBRUg1SlJFRlVlTnJ0WGVsQzhqb1FwUllwSUVnQlJWQ0VDKy8va0Jmd1E1clpNbW5UQlpuemx6UnBtTlBKClpFNldYbzlCOGhRZlNkcC83aG51SFlORFhYaEtqUi8zamF3MmJwd3dISTNiN3AraFBOSTZ1WEgySHYyMmUyZ29pNWVhdVhGeUhzYU8KTzhXd2RtNmNmRWZXZGk4TkpUQnVnQm9uakFadGQ5UVFqSDR6M0RnTXpYWGNIZW9PUlc5STIrNnFJUkJQalhIajhHVGp5bjJoT1dxYwp4aFhMaGQwVG5wdmt4bUZpNUxnalRCdmx4bUV5YmJ2REJqV1Nacmx4T0JnNTdnYXZUWFBEeUhFM2FKd2FoNE1sT3U0RHRZcXdEQ3dnCnZRODBsL2t5Y3R3YjZoZGhLUXd0Q1hZSGFFS0VKZkRhZHI4Tlh0UzNIdENEVWRzOU4valFsQWlMWWN0OXVvNVdRdEVMSnJhT3RPTm8KVUlTRmVHcTc3d1laay9hNGNaaTEzWG1EaEdaRldJQ0pUV1M3aklaRldJQ2s3ZTRiQkl4YTVZWUpLMTFHOHlLc0F3dEhPNHgycVdHTwpvOE5vUTRRMXgzRWZtTFhOallNbHdMcUtka1RZSW15cTBsVzBKTUlXTUttaFZ4bkFBNlZSY29CNTZab1VJdXd3NkxDZUV0T2VHaGFQCndpWWVLT0E5QXVTbGExS0VvcUY1N1g0U21JVi9pZjhIR1RjaWNFTWh3b2IvcjRNa2lCczFEQ3JHalFqY1VJaXdaYXJOZ3NLWStKWXoKYmtUZ2h0LzlsMXU2TndpSk8rSnZyamR1"
                            "Vk9lRzRsQ1dzaXYzRWowMzRxZS9qQnZWdWFFUVlVdlBJdlNaay9nQmgzR2pPamNVSW16cApmU1FCdzByMDlJTnhvem8zL0tGb2hXOTZvSjdMUmplZGNhTTZOL3htcXhJTHFKZVVSYzkrR1RjcWMwT1IrYW8waDlBdVlZOCtVZWsyCk54YkxHaXVQeFEyRkNGdHRENGx5RGZzamNXUHg5bjQ4MWxoL0xHNGtmck5WQ3hPVm84ckRjR1Axc2I0WXJNWW1ZbkhEbjcwY1ZueFQKQmZzZWhodFhZdHdGTnhRaWJGVWRURGRYK2Z2Y21HOCsxd1dEMWRoU0pHN1VJTUlpcUJ6SFgrZkcxeWN3V0kxdFJlSkdMU0lzZ09xbwo5TC9PamZ4NGQ5eW9TWVIxb2NtT0dqZmlJUkkzNmhKaEhXajJSaGszNGlFT04yb1VZUXZRYkhMNDZ6bnorK09HNGxDV0NNbHNUY0FSCi9WdzQ0MFpGYnRRcHdoYWc0RWIwUDhpNFVaRWJ0WXF3Ti9pcDhlZlg5dHdmTnhveW1yK1orSWZDR1RlcWNVT2hkY1NZUHloaTBmaG4Kd2hrM3FuR2pkaEZXM1V6OEhiSEdqV3JjU1B4R2k3Rld6OStNTDZySittbWFuUGZNcGVrczAvRkk1RVkyVFVlbjJsN1N0QjhjYTQ5UApELys4VEhKK0crWHpWYmlSYjViTHorMTIrN2xjZnVkZi92SlJ1T0ZQV0ZZVllTL3dhNzJTbnRjZndkZWN2TXo4L0dDNU1aaStnTnFtCjJnOWdQQjBSMGZ2VGlIT3VoVDJwMzhoZ0R0Z21GMjg3OE9ENjg5dkREd1UzY2d4MzEyd0RJcXl5R1RhcXliamRrME1mUFJodURGS3EKd3NULzlRK21DYy94U1VJT1dVYzE2RGJuMys5MDhkMm1HamMyUkpYZ2ovY2JMY1lKajRwbW1HQmdLbnFjUkdRSDNjUnNVcXF5M3RTNwpuWUs2TTdzYU4rYkxOZi9BV2xoVTZPWEdBdGYzRGpiYk55SEM2cG9oblhyZk94WkpCcVY2TWhBc0xGd2hOeDZwbHFEZ083TXJjV1AxCkxqL3lublB2NitQR0hOZThYb0F5aXExRkVhaWhTTEJSZXQ1QXMvRnB3dnMxZ2h2UGNueVZsTy9BdjI3QWtha0NOK1lmL29jNDErSGoKeGhaWHRZSjFOQ0xDYXBvaHJOSlg3bXhoTHlMRzNIajJWY25WcFQ3dUhkNFdWSjRiODUzbXFVLzYxQlVQTjVhNEloUytLQ1N3R0ljdApLWnJCWDcvKzlIM3U5aWJFamJHZmJVemtIZkF5THJ0S2MyT2hvc1lwZ0NUSklYTmpoYXY1UUZVMEk4SnFOdHlpcUNaUlcrTmtEem9tCmdzWDZtaFZHOUxjUWNFMkU2MmpMY21QK3JuMXVHOHlOcjdXbUVrV1hZNGl3Q3EyM0NqVU9UTzRXRnRJZEIwSitEQ0ZYaURpejhaTGMKMEEwb1AzZ0w1QVpSTitWOEdsa1BxR2tHNm5tQjFLQ0hsY0E2cmxWUk01OFFiamdWbE9TR0lneTlZWVhmVitJR3JodE5VWFQvWGpzaQpiUGpSKzVSRnkzR0RERG1Dcmg0cURrdmx1TEhTUDNZMkxmN3FCVzRRU2ErYzZIRjNSRmpYa1plNXNZT1lUNVhrQnBYUmNiZ3hlVXBuClA2ZFN6a1pVQ0ZNTVIwdHhZMDVrdk5ZZjMrZTA5dWFOR0czd3FNSmJmNEhySmpPc2lzK3pEUkYyUUFZR3cxRzJ2eEJuU2lmUk1ZdloKMWlaSi8xelZuam5Na1BDVnQ2RDlOWFdIcjhFTXYyMkI2ZHNia0ZHM0RncDFZcSsvTFl3YmkwLzBNMUpYV0c0UU1TNmVvcHlSQkJxdApKUHpOdUNJczVjQ2RmUFNlVkVSUXlNRzFsdTV2TlpGaE1nNWVzaXVwaUxnR0g0aElUNFRWT3V3WDhobmZib0hWMm1kZWxodVlWMXY2CkpUb2p3anBmS3BVTmdlbVAvWXVuRXA0YlE5ZThsTy9FODlnTE55WXBreGxEanJFYU42RGJ3S0VpSEJoUXhNRnhBeWU5ZHN5UnhWNmIKdFNMQ29zK1F6Ri9nVWloT0lKdDYzWU5TUkk0SFh4SjI1c2FJMS9GZlBHOFN4QTNvTnFoWkJLd0xPQmFPRytnVjZDbEtyLzVEV2ZUTgpGUDlMd20yUU9SWk1EdWc0cUphSStRd1JEcUVjUjRhVmtpTGdPNU4vbTVZYjhOdGVLUW9CZVozaEJwSDB5cG1YNktZSWkyM09wR1p4CjFnU1lqMnFwcjZvSURTclBubzhFdkRUcGJyWGNBTkVpSFNyK0I4d01vbEdhQW5pS3d5NEM2WXdJVzR4cThIa00zTGkyUnlXQlNZbVcKeUxxd1l3dmVkZ0VHSmpJcnBPVEc0aWhhL1FyZ09NQ2dRbklEVDM5bzNwM2hqeEViRW1HTEZzT3hJVHRWUW9NQk1DblJFbDJYMXdQNQpvZmltbE54NDA1a1BSQ1dmN3E4VU4zRFNpNW1pOUxvcXdyNEV2QU1pdHp0aXFQdUR3OUZnaFJGTSthZ2lTbTRBeDcvaVduU1hZS3pkCkh3bHU0S1RYanI5VnBac2lyUEpUdndCRk1xN3RjVU9jTzBDdUxYZ2pGWEE5VkJFZE4rWkh5ZVlGZ0VIRm5XOWdidUNrRnpkRklmOVoKL1g4WmdqQVJGbzM5MHJDR1hKS2Jqam1vNjBwZ3lXQVpDZnlaVkF5djR3WW94YnQ5VU5DTktqRTNjTklyRjdyVEdSRzJhREpFV0hFcApNMHJlT1NrSTFCQTcyVUMrTFRnWWpjWU40QTc0OWNKZlVrSEVBNXowRXRlcCsyUEVGa1JZRkc2SXJndjVwRXhzbVoyUjQ1aElhblZ3CjNyb0ViaUViK2x2U2NlTlRiVUhKd2NDbU1EWDRLVXF2cXlJczhnUmk1VlB4alFNTWpyNFRqcEpaK3FSWnhscWVHMkNWNzI3THdpMzQKTG5JRGdSK3J5UDhWb3lFUnRtZ0grSnM4aTBiRWMyTElnTHJRd0VlNm1QNkw5dUQrOHR6d1dwVkRVQzA3K2VKSFJZell2QWlMdEJmUApzQ1lXaHo4SzRoQWF5ckJ4NmUxdzNlSEdQS0FXYVlweVJpZEZXTmtSVk9TR01FU2lFQmpOM21kQjkxYTJ3STA4b0JaNVJPbW9DSnRKClB5bzZNWlIrRE9FR0tEdldibDZxeW8zOFdCWWgzRGpLZHpCMFI0VHRTOFVEdVhHUWZpelBEZStlcHc1d3cwbWdoakVKUWhFak5pVEMKRnFPYWJuSkR1OE91Vlc0NHJzQmJlaTBGb3dvUk5zYWhMUDVtbkdFQWNjTXpyalhDaldDdjBUMXU0SVVidXg2UFRvcXdtQnVCODVRNgp1REVJdWdLNW05ellZSEpRVzU3K2RkamZ2NFpFV01kaWdkeVFpd2R3UTBxd2twUDlZWkk2WnpuRnlwbC9IY3RDNUFZK05FaFFlQlVpCmJJeERXUlROT0g4al"
                            "R0Wkc1SWJBTXlIM1JkQjdNa0pwMDJoNlNrM2NJTFMyTlhjdVZDZEZXTUtlaDcxVVBlckZpMVNYTUVpaVpNL04KdUFsNnBSSHhUZ24zZUVWdWZDeTF5R1Z1elBVaFJ5ZEYyQjRSbjRpVEpXUzNzbm9LS3ZvYmg2UEJsOTYwRHpwYW5odGdhWStvbHZMQQozS0QyVVRJaFIyZEVXQkRWSURLSmsxZ1VKVTdGeGxtZTRTek03MDlJZHFMZDZhdS9wVkphVzhtTFFnbHVFS01LSFhJb1JOZ1laMGdyCm1nSEphVFFJU1JURm9ZQmpPUFFyeXpPVTdMbDVNemdKWjZJd0JRdExyZC93WmJjWlVOeWd6dmlpUW81dWlyQTlLbmpkQjFUdkxzbEIKVmJFQkI4ckMzT0lXNEpvWWpRazZudkxjZ0N0K1pjR1VBOFVOYW41TTZiR2RFV0ZoRElEbjFzS2FWUlJCdXBreWRaLzJxR0RLVmNKNApVL2gvbHVjR25NU1dDemhJYnNBbDdHY1FTM3dhdWhuRHIvVStlUi9oMVdBOFlyazh3cTB4bHNYdTdkZTIwQ0V3M25USVBWK0FjcDA1CjhQemxCaFdhRzlSQlVaaDdYcHMxSmNJaWEyRTdzWU1ienNlN1dYNkM4UFFBTmVRcjBnd1dSQ3lyNGdZOVhIeVFaZzBFelEzcXhGbTAKbEtPYkl1d0ZPTDRjcW1zSGZOYjJDZ2RmcjJ3ak5EZFV5OGJ5bzhycWNLNHBDUjhzdUthSXd5Tmh5TkZORWZZSDJCdlFOTjNqcngwUQpqV3FQbUlIaXZaT0ZGbFhjNlB2ZTVBTDAwVEx6VTVpazRvV1BLL0M0d05LUU9QVUhoQnlKMzJqTmlMQkVWRU00bTZtdWN1aGdxQWFICmU4MWJQck52UTAxaG55VnlDUVpqUEFLS0dEM2hhTDQ3ZXB2NjVRWnhwQk9vdjVzaTdEOFFjVEpCanNSZml1N1kzbDlSZ1dRWi85TVYKZXlMaVZuR0RHVlMramlIa3lNL0pNajAzZW9UbzVvUWNIUlZoR1hOUTVjYUVQWkRaR05hN3d4aEJEY2M1d045UThFd2VrVTV5QXgwaQp2dE5Gb3llM3oyUTU1cHVmbVVjQU42aWp6SXMzSURSME0wYW9DQ3VaYTFoMENtTnl5VGVxaTJselVqanZLL09kODRmbjFJQWNNK1hCCmRLVE5DK1RJYjlFSG9kTy9VNjRqLzdnT0VDSGNJQTVvS2U3Qzc0NElTMFkxQS9Mdm5pVFQ4MEdCNHl5bHd4aWN1MkJiUFZkMUdndXkKbE02L3BISW5DalRkYzllN2tOd2dUdlpjdjUwdk84cFhiN3RpSW9PWVRSemZsODVrODJ2elViQnhDRGVvMXlnYzM5RlZFZllLaGNQQgpGc00wSzFITGhUbE9UWlFrOUhQQTZDemxPMGh5WTM2VVVPQUdjNWo1ZXJ0Y3J2Sjh1WHpiZ204L2lCdVU2SGJiaGw4aVhWa0dmak53ClVZM0M0MEJ6UFpkcG53UVlUZ04zSHdqY0lJMUNjWVBLVVlrSTR3WjF0TzF2eU9IdlcwTWlMQnZWSktIR29LYTU1YWdCZlpraU9EdGgKNkZLSXppcUxSMUU3eWZITk1RaGgzQ0RmNHhweStMdmFrQWpMSnRnR211c3NQTlNBM2RTdEZzY09TSFA3MHlGenVjSDRYZWwyQS9jVQpsdVV4QklIY0lJL1MvOVp5b3gwUnRrZ09sVVZFYXNCdVBxbEdLbHpWUUVHcVVVL0ZqVnh2NExkakFFSzVRUVkwQ3gwMzJoSmhBNmwxCmZWdkcvYURXRkh5aldPYmZuNUwwZE53UUxRNktoZ3dyb2R3Z1NmcXpuY2tiWHJVbHdqcVlLcmNNdlhKT0RuRmo0TzA0N1lCODVFZ1EKbFZuVzcvUUd6b1g3UDZ0eWd5VHBKZUx4ZmordDNJeUJvTnVnekw4cjRvYlBHYkdYZ0Q2TElzT0Y0aUJueEwyVGNLRVNMaXZPYTRwZgpmRGczeVBkWTloUzVyOVpFV0lCcHpQdGhMOSt5NUl5RVk2bUY4R2ZTcDdyTDFzUWJuQ2ljYjQ5K3JKZEJkK3Y4dzRLcUtsZk1MbHNUCllRUFpFWFN2OUkrZkh5ZmMyOGpPTW1OZTVIb0NQc2pYQ1RWOU0yTUZXZGpMRHZydWNUODN5Sm5RT2VUd2ZJNVJEbVdKdGN1QnZZLysKZGVhaE1OUGNtS3B3Nkt2c1JGTTh4RTF1NUFSRHFFVGErUWZKanB3dS9mWEdYL200KzJiMnBtbnFwa2FWcmRmZnR5akMwdlJBQjdDOQpKbFAvTkR0emNSc3hCdFBFK1RwZVJ6cjVhRHdyMG1QeU1oMndyY2xNbTI4K0FUMjJieXQrUmZuWDVnTVpjaTAra1FOUUpiOXlBbDdECk5TVENCaVhZQmxrLy9jRXNpeUVFRHJMWlQzWDlzT0RxT2Z0NUxLdWFBbHJrdjdzVjh5OVYrYzMxZ2UrekRXdUQ3RGhhdUJuRDBCbkkKWjByRWFDSHNaZ3hEaHlCbEh4b1NZV01rMkF4MVFGREMyaFpoRFcwallZM1d3czBZaG02QkpVZnJJcXloZFRCVGlZWkUyQ2k3SEF4MQpZYXE5Y2pzY2ZyY1JJNm94MUlleGVtOUZJS3FMc0liV1FXeXZhQ2p6RlNPNWFhZ1YrT3FIWmtSWUMwWHZBWU9wWThrV2JzWXdkQmlECmZ2cnZ4ckhKVTR5VVZFd1IxdkMzRUZ1RU5md2R4RmdQYVBpYk1CSFd3TUh2Tmt5RWZWQTBkUFdzNFE1aElxeUJRK0xuUnR1dmFHZ0oKSnNJYU9QamRSb3hkRG9ZN1JFTkh6Um51RUNiQ0dqaFlLR3JnNE0rS21najdxUEJ6dzlZRFBpcjgzREFSOWxIaFAzUE5STmhIaGZmdwp5Q2k3SEF6M0NLL1VaaUxzNDhLM1d0UkUyTWVGTC9sbEl1emp3bmVTcngzSzhzQ1FIWWV0QjN4b2lDcTlpYkFQamJFMHFwZ0krOWlRCmRIb0xSUjhjd3ByUnRsL04wRGI2M0xCaUlxeUJ1enpBUkZnRGQzbUFIY3BpNkRFWDY1b0lhemlEdUpIQ1JGakRQMlJ3cFkrRm9vWmYKZ1B0S1RJUTFGTkVmM1pMb3RoNnd5L2dmRE9vdEl3M0VGN0VBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSgpUVkJYZ1E0WEFBQUFKWFJGV0hSa1lYUmxPbU55WldGMFpRQXlNREkxTFRBeExUSXlWREUwT2pReU9qRXdLekF3T2pBdzVsdU1Ed0FBCkFDVjBSVmgwWkdGMFpUcHRiMlJwWm5rQU1qQXlOUzB3TVMweU1sUXhORG8wTWpveE1Dc3dNRG93TUpjR05MTUFBQUFvZEVWWWRHUmgKZEdVNmRHbHRaWE4wWVcxd0FESXdNalV0TURFdE1qSlVNVFE2TkRJNk1UQXJNREE2TUREQUV4VnNBQUFBRzNSRldIUnBZMk02WTI5dwpl"
                            "WEpwWjJoMEFGQjFZbXhwWXlCRWIyMWhhVzYya1RGYkFBQUFJblJGV0hScFkyTTZaR1Z6WTNKcGNIUnBiMjRBUjBsTlVDQmlkV2xzCmRDMXBiaUJ6VWtkQ1RHZEJFd0FBQUJWMFJWaDBhV05qT20xaGJuVm1ZV04wZFhKbGNnQkhTVTFRVEo2UXlnQUFBQTUwUlZoMGFXTmoKT20xdlpHVnNBSE5TUjBKYllFbERBQUFBQUVsRlRrU3VRbUNDIiAvPgo8L3N2Zz4K"
                        }
                    }
                },
                {
                    "Flask": {
                        "url": "https://flask.palletsprojects.com/en/latest/",
                        "logo": {
                            "style": "height: 50px;",
                            "src": "https://flask.palletsprojects.com/en/latest/_images/flask-logo.png"
                        },
                        "text": "The Python micro framework for building web applications."
                    }
                }
            ]

    *(optional)* **BEMSERVER_UI_PLUGINS = None**
        List of absolute file paths that locate the ``__init__.py`` file from each UI plugin package to load